/* * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ package com.megatim.reporting.adhoc.process; import com.megatim.dynamic.reports.pojo.DisplayCondition; import com.megatim.reporting.adhoc.pojo.Constantes; import com.megatim.reporting.adhoc.pojo.components.Border; import com.megatim.reporting.adhoc.pojo.components.Component; import com.megatim.reporting.adhoc.pojo.components.Image; import com.megatim.reporting.adhoc.pojo.components.Label; import com.megatim.reporting.adhoc.pojo.components.Line; import com.megatim.reporting.adhoc.pojo.components.Paragraph; import com.megatim.reporting.adhoc.pojo.components.TextField; import com.megatim.reporting.adhoc.pojo.components.ValueElement; import com.megatim.reporting.adhoc.pojo.enums.ReportOrientation; import static com.megatim.reporting.adhoc.pojo.enums.ValueElementType.FIELD; import static com.megatim.reporting.adhoc.pojo.enums.ValueElementType.GENERATE; import static com.megatim.reporting.adhoc.pojo.enums.ValueElementType.PARAMETER; import com.megatim.reporting.adhoc.pojo.layouts.ColumnData; import com.megatim.reporting.adhoc.pojo.layouts.ColumnHeader; import com.megatim.reporting.adhoc.pojo.layouts.MainReport; import com.megatim.reporting.adhoc.pojo.layouts.PageFooter; import com.megatim.reporting.adhoc.pojo.layouts.PageHeader; import com.megatim.reporting.adhoc.pojo.layouts.Report; import com.megatim.reporting.adhoc.pojo.layouts.SubReport; import com.megatim.reporting.adhoc.pojo.layouts.Title; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.util.List; import java.util.UUID; /** * * @author ASUS */ public class GenerateJRXML { // private final String JRXML_EXTENSION = "jrxml"; private final String REPORT_PARTS = "report-parts"; private final ClassLoader classLoader = GenerateJRXML.class.getClassLoader(); public void generateJrxml(Report report, String jrxmlFolder) throws Exception { Path jrxmlPath = Paths.get(jrxmlFolder, report.getName() + ".jrxml"); generateReport(report, jrxmlPath); for (SubReport sub : report.getSubReports()) { jrxmlPath = Paths.get(jrxmlFolder, sub.getName() + ".jrxml"); generateReport(sub, jrxmlPath); } } private void generateReport(MainReport report, Path reportPath) throws Exception { try ( BufferedWriter bufferWriter = Files.newBufferedWriter(reportPath, StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.SYNC)) { bufferWriter.write("" + System.lineSeparator()); bufferWriter.write("" + System.lineSeparator()); addPageProperties(bufferWriter); addParameters(report, bufferWriter); addFields(report, bufferWriter); addVariables(bufferWriter); addGroups(bufferWriter); addtitle(report.getTitle(), bufferWriter); addPageHeader(report.getPageHeader(), bufferWriter); if (report.isDetail()) { if (report instanceof Report) { Report rep = (Report) report; addDetailDetail(report.getColumnHeader(), report.getColumnData(), rep.getSubReports(), bufferWriter); } else { addDetailDetail(report.getColumnHeader(), report.getColumnData(), null, bufferWriter); } } else { addListeColumnHeader(report.getColumnHeader(), bufferWriter); if (report instanceof Report) { Report rep = (Report) report; addListeDetail(report.getColumnData(), rep.getSubReports(), bufferWriter); } else { addListeDetail(report.getColumnData(), null, bufferWriter); } } addPageFooter(report.getPageFooter(), bufferWriter); bufferWriter.write(""); } } private void addPageProperties(BufferedWriter bufferWriter) throws IOException { InputStream inputStream = classLoader.getResourceAsStream(REPORT_PARTS + "/page-properties.xml"); readFile(inputStream, bufferWriter); } /** * Méthode qui ajoute les paramètres à l'état * * @param bufferWriter * @throws IOException */ private void addParameters(MainReport report, BufferedWriter bufferWriter) throws IOException { InputStream inputStream = classLoader.getResourceAsStream(REPORT_PARTS + "/parameters.xml"); readFile(inputStream, bufferWriter); for (ValueElement param : report.getParameters().values()) { bufferWriter.write("\t" + System.lineSeparator()); } bufferWriter.write("" + System.lineSeparator()); } /** * Méthode qui ajoute les champs de l'entité à l'état * * @param bufferWriter */ private void addFields(MainReport report, BufferedWriter bufferWriter) throws IOException { for (ValueElement field : report.getFields().values()) { bufferWriter.write("\t" + System.lineSeparator()); bufferWriter.write("\t\t" + System.lineSeparator()); bufferWriter.write("\t" + System.lineSeparator()); } bufferWriter.write("\t" + System.lineSeparator()); } /** * Méthode qui ajoute les variables * * @param bufferWriter * @throws IOException */ private void addVariables(BufferedWriter bufferWriter) throws IOException { InputStream inputStream = classLoader.getResourceAsStream(REPORT_PARTS + "/variables.xml"); readFile(inputStream, bufferWriter); } /** * Méthode qui ajoute les groupes * * @param bufferWriter * @throws IOException */ private void addGroups(BufferedWriter bufferWriter) throws IOException { InputStream inputStream = classLoader.getResourceAsStream(REPORT_PARTS + "/groups.xml"); readFile(inputStream, bufferWriter); } private void addtitle(Title title, BufferedWriter bufferWriter) throws Exception { if (title != null) { bufferWriter.write("\t " + System.lineSeparator()); bufferWriter.write("\t\t <band height=\"" + title.getHeight() + setSplitType(title.getSplitType()) + " >" + System.lineSeparator()); bufferWriter.write("\t\t\t <property name=\"com.jaspersoft.studio.unit.height\" value=\"px\"/>" + System.lineSeparator()); addComponents(title.getComponents(), bufferWriter); bufferWriter.write("\t\t </band>" + System.lineSeparator()); bufferWriter.write("\t " + System.lineSeparator()); } } private void addPageHeader(PageHeader pageHeader, BufferedWriter bufferWriter) throws Exception { if (pageHeader != null) { bufferWriter.write("\t " + System.lineSeparator()); bufferWriter.write("\t\t " + System.lineSeparator()); bufferWriter.write("\t\t " + System.lineSeparator()); addComponents(pageHeader.getComponents(), bufferWriter); bufferWriter.write("\t\t " + System.lineSeparator()); bufferWriter.write("\t " + System.lineSeparator()); } } private void addListeColumnHeader(ColumnHeader columnHeader, BufferedWriter bufferWriter) throws Exception { if (columnHeader != null) { bufferWriter.write("\t " + System.lineSeparator()); bufferWriter.write("\t\t " + System.lineSeparator()); bufferWriter.write("\t\t " + System.lineSeparator()); addComponents(columnHeader.getComponents(), bufferWriter); bufferWriter.write("\t\t " + System.lineSeparator()); bufferWriter.write("\t " + System.lineSeparator()); } } private void addListeDetail(ColumnData columnData, List subReports, BufferedWriter bufferWriter) throws Exception { if (columnData != null || (subReports != null && !subReports.isEmpty())) { bufferWriter.write("\t " + System.lineSeparator()); addListeColumnData(columnData, bufferWriter); addSubReports(subReports, bufferWriter); bufferWriter.write("\t " + System.lineSeparator()); } } private void addDetailDetail(ColumnHeader columnHeader, ColumnData columnData, List subReports, BufferedWriter bufferWriter) throws Exception { bufferWriter.write("\t " + System.lineSeparator()); if ((columnData != null && columnHeader != null)) { bufferWriter.write("\t\t " + System.lineSeparator()); bufferWriter.write("\t\t " + System.lineSeparator()); addComponents(columnData.getComponents(), bufferWriter); addComponents(columnHeader.getComponents(), bufferWriter); bufferWriter.write("\t\t " + System.lineSeparator()); } if (subReports != null && !subReports.isEmpty()) { addSubReports(subReports, bufferWriter); } bufferWriter.write("\t " + System.lineSeparator()); } private void addListeColumnData(ColumnData columnData, BufferedWriter bufferWriter) throws Exception { if (columnData != null) { bufferWriter.write("\t\t " + System.lineSeparator()); bufferWriter.write("\t\t " + System.lineSeparator()); addComponents(columnData.getComponents(), bufferWriter); bufferWriter.write("\t\t " + System.lineSeparator()); } } private void addSubReports(List subReports, BufferedWriter bufferWriter) throws Exception { if (subReports != null && !subReports.isEmpty()) { for (SubReport sub : subReports) { bufferWriter.write("\t\t " + System.lineSeparator()); bufferWriter.write("\t\t\t " + System.lineSeparator()); bufferWriter.write("\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t\t" + System.lineSeparator()); writeUnits(bufferWriter); bufferWriter.write("\t\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t" + System.lineSeparator()); } } } private void addPageFooter(PageFooter pageFooter, BufferedWriter bufferWriter) throws Exception { if (pageFooter != null) { bufferWriter.write("\t " + System.lineSeparator()); bufferWriter.write("\t\t " + System.lineSeparator()); bufferWriter.write("\t\t " + System.lineSeparator()); addComponents(pageFooter.getComponents(), bufferWriter); bufferWriter.write("\t\t " + System.lineSeparator()); bufferWriter.write("\t " + System.lineSeparator()); } } private void setComponentBorder(Border border, BufferedWriter bufferWriter) throws IOException { if (border != null && (border.getLeftBorder() > 0 || border.getTopBorder() > 0 || border.getRightBorder() > 0 || border.getBottomBorder() > 0)) { bufferWriter.write("\t\t\t\t 0) { bufferWriter.write("leftPadding=\"" + border.getLeftPadding() + "\" "); } if (border.getRightPadding() > 0) { bufferWriter.write("rightPadding=\"" + border.getRightPadding() + "\" "); } if (border.getTopPadding() > 0) { bufferWriter.write("topPadding=\"" + border.getTopPadding() + "\""); } if (border.getBottomPadding() > 0) { bufferWriter.write("bottomPadding=\"" + border.getBottomPadding() + "\""); } bufferWriter.write(" >" + System.lineSeparator()); bufferWriter.write("\t\t\t\t\t" + System.lineSeparator()); if (border.getTopBorder() > 0) { bufferWriter.write("\t\t\t\t\t" + System.lineSeparator()); } if (border.getLeftBorder() > 0) { bufferWriter.write("\t\t\t\t\t" + System.lineSeparator()); } if (border.getBottomBorder() > 0) { bufferWriter.write("\t\t\t\t\t" + System.lineSeparator()); } if (border.getRightBorder() > 0) { bufferWriter.write("\t\t\t\t\t" + System.lineSeparator()); } bufferWriter.write("\t\t\t\t" + System.lineSeparator()); } } private String setSplitType(String splitType) { if (splitType != null && !splitType.isEmpty()) { return "\" splitType=\"" + splitType + "\" "; } else { return ""; } } private String setClasse(Class classe) { if (classe != null) { return "\" class=\"" + classe.getName() + "\" "; } else { return "java.lang.String"; } } private String setForeColor(String color) { if (color != null && !color.isEmpty()) { return " forecolor=\"" + color + "\" "; } else { return ""; } } private String setLineColor(String color) { StringBuilder colorMessage = new StringBuilder(""); if (color != null && !color.isEmpty()) { colorMessage.append(" lineColor=\"").append(color).append("\" "); } else { colorMessage.append(" lineColor=\"#000000\" "); } return colorMessage.toString(); } private String setLineStyle(String lineStyle) { StringBuilder lineMessage = new StringBuilder(" lineWidth=\"1.0\" "); if (lineStyle != null && !lineStyle.isEmpty()) { lineMessage.append("lineStyle=\"").append(lineStyle).append("\" "); } else { lineMessage.append("lineStyle=\"Solid\" "); } return lineMessage.toString(); } private void addComponents(List components, BufferedWriter bufferWriter) throws Exception { for (Component c : components) { if (c instanceof Image) { Image image = (Image) c; addImage(image, bufferWriter); } else if (c instanceof TextField) { TextField textField = (TextField) c; addTextField(textField, bufferWriter); } else if (c instanceof Label) { Label label = (Label) c; addLabel(label, bufferWriter); } else if (c instanceof Line) { Line line = (Line) c; addLine(line, bufferWriter); } } } private void writeValueElement(BufferedWriter bufferWriter, ValueElement valueElt) throws IOException, InstantiationException, IllegalAccessException { if (valueElt != null) { switch (valueElt.getValueElementType()) { case PARAMETER: bufferWriter.write("$P{" + valueElt.getName() + "}"); break; case FIELD: bufferWriter.write("$F{" + valueElt.getName() + "}"); break; case GENERATE: bufferWriter.write(generateValue(valueElt)); break; default: bufferWriter.write(valueElt.getValue()); break; } } else { bufferWriter.write("" + null); } } //Génère une instance de la classe java.util.Date() private String generateValue(ValueElement valueElt) throws InstantiationException, IllegalAccessException { Class classe = valueElt.getClasse(); return "new " + classe.getName() + "()"; } private void writeUnits(BufferedWriter bufferWriter) throws IOException { bufferWriter.write("\t\t\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t\t\t" + System.lineSeparator()); } private void readFile(InputStream inputStream, BufferedWriter bufferWriter) throws IOException { try ( InputStreamReader isr = new InputStreamReader(inputStream, StandardCharsets.UTF_8); BufferedReader reader = new BufferedReader(isr)) { String line = ""; while ((line = reader.readLine()) != null) { bufferWriter.write(line + System.lineSeparator()); } } } private void addImage(Image image, BufferedWriter bufferWriter) throws Exception { if (image != null) { bufferWriter.write("\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t" + System.lineSeparator()); writeUnits(bufferWriter); bufferWriter.write(setPrintWhenExpression(image.getDisplayCondition()) + System.lineSeparator()); bufferWriter.write("\t\t\t\t" + System.lineSeparator()); setComponentBorder(image.getBorder(), bufferWriter); bufferWriter.write("\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t" + System.lineSeparator()); } } private void addTextField(TextField textField, BufferedWriter bufferWriter) throws Exception { if (textField != null) { bufferWriter.write("\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t\t " + System.lineSeparator()); writeUnits(bufferWriter); bufferWriter.write(setPrintWhenExpression(textField.getDisplayCondition()) + System.lineSeparator()); bufferWriter.write("\t\t\t\t" + System.lineSeparator()); setComponentBorder(textField.getBorder(), bufferWriter); bufferWriter.write("\t\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t\t\t" + System.lineSeparator()); bufferWriter.write(setParagraph(textField.getParagraph()) + System.lineSeparator()); bufferWriter.write("\t\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t" + System.lineSeparator()); } } private String addEvaluationTime(TextField textField) { if (textField.isPageNumber()) { return " evaluationTime=\"Auto\" "; } else { return ""; } } private String addPattern(String pattern) { if (pattern != null && !pattern.isEmpty()) { return " pattern=\"" + pattern + "\" "; } else { return ""; } } private void addLabel(Label label, BufferedWriter bufferWriter) throws IOException { if (label != null) { bufferWriter.write("\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t\t " + System.lineSeparator()); writeUnits(bufferWriter); bufferWriter.write(setPrintWhenExpression(label.getDisplayCondition()) + System.lineSeparator()); bufferWriter.write("\t\t\t\t" + System.lineSeparator()); setComponentBorder(label.getBorder(), bufferWriter); bufferWriter.write("\t\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t\t\t" + System.lineSeparator()); bufferWriter.write(setParagraph(label.getParagraph()) + System.lineSeparator()); bufferWriter.write("\t\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t" + System.lineSeparator()); } } private void addLine(Line line, BufferedWriter bufferWriter) throws IOException { if (line != null) { bufferWriter.write("\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t\t " + System.lineSeparator()); writeUnits(bufferWriter); bufferWriter.write(setPrintWhenExpression(line.getDisplayCondition()) + System.lineSeparator()); bufferWriter.write("\t\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t\t" + System.lineSeparator()); bufferWriter.write("\t\t\t" + System.lineSeparator()); } } private String setStretchType(String stretchType) { if (stretchType != null && !stretchType.isEmpty()) { return " stretchType=\"" + stretchType + "\""; } else { return ""; } } private String setWhenNoDataType(String whenNoDataType) { if (whenNoDataType != null && !whenNoDataType.isEmpty()) { return " whenNoDataType=\"" + whenNoDataType + "\" "; } else { return ""; } } private String setWhenResourceMissingType(String whenResourceMissingType) { if (whenResourceMissingType != null && !whenResourceMissingType.isEmpty()) { return " whenResourceMissingType=\"" + whenResourceMissingType + "\" "; } else { return ""; } } private String setOverflowType(String overflowType) { if (overflowType != null && !overflowType.isEmpty()) { return " overflowType=\"" + overflowType + "\" "; } else { return ""; } } private String setPrintWhenExpression(DisplayCondition condition) { StringBuilder chaine = new StringBuilder(); if (condition != null && condition.getLeftOperand() != null && condition.getRightOperand() != null && condition.getOperator() != null && condition.getOperandType() != null && !condition.getLeftOperand().isEmpty() && !condition.getRightOperand().isEmpty() && !condition.getOperator().isEmpty() && !condition.getOperandType().isEmpty()) { chaine.append(""); return chaine.toString(); } else { return ""; } } private String setParagraph(Paragraph paragraph) { StringBuilder chaine = new StringBuilder(""); if (paragraph != null) { chaine.append("\t\t\t\t\t"); } return chaine.toString(); } private String orientation(ReportOrientation orientation) { if (orientation != null && orientation.equals(ReportOrientation.LANDSCAPE)) { return " orientation=\"" + ReportOrientation.LANDSCAPE.toString() + "\" "; } else { return " "; } } }