/*
* 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 " + System.lineSeparator());
bufferWriter.write("\t\t\t " + System.lineSeparator());
addComponents(title.getComponents(), bufferWriter);
bufferWriter.write("\t\t " + 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 " ";
}
}
}