From 6494941037ae2670876de9940853d50538eb5129 Mon Sep 17 00:00:00 2001
From: Kenmegne <stephanie.kenmegne@gmail.com>
Date: Fri, 19 Jun 2026 11:25:51 +0000
Subject: [PATCH] move to new repo
---
reporting-adhoc/src/main/java/com/megatim/reporting/adhoc/process/SecondProcessor.java | 501 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 501 insertions(+), 0 deletions(-)
diff --git a/reporting-adhoc/src/main/java/com/megatim/reporting/adhoc/process/SecondProcessor.java b/reporting-adhoc/src/main/java/com/megatim/reporting/adhoc/process/SecondProcessor.java
new file mode 100644
index 0000000..98b98d7
--- /dev/null
+++ b/reporting-adhoc/src/main/java/com/megatim/reporting/adhoc/process/SecondProcessor.java
@@ -0,0 +1,501 @@
+/*
+ * 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.LargestWidth;
+import com.megatim.reporting.adhoc.pojo.Constantes;
+import com.megatim.reporting.adhoc.pojo.components.Component;
+import com.megatim.reporting.adhoc.pojo.CustomField;
+import com.megatim.reporting.adhoc.pojo.ProcessorElements;
+import com.megatim.reporting.adhoc.pojo.components.Label;
+import com.megatim.reporting.adhoc.pojo.components.TextComponent;
+import com.megatim.reporting.adhoc.pojo.components.TextField;
+import com.megatim.reporting.adhoc.pojo.components.ValueElement;
+import com.megatim.reporting.adhoc.pojo.enums.ElementType;
+import com.megatim.reporting.adhoc.pojo.enums.Position;
+import com.megatim.reporting.adhoc.pojo.enums.Section;
+import com.megatim.reporting.adhoc.pojo.enums.ValueElementType;
+import com.megatim.reporting.adhoc.pojo.ElementToDisplay;
+import com.megatim.reporting.adhoc.pojo.MainReportDefinition;
+import com.megatim.reporting.adhoc.pojo.ReportDefinition;
+import com.megatim.reporting.adhoc.pojo.SubReportDefinition;
+import com.megatim.reporting.adhoc.pojo.layouts.MainReport;
+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.nio.file.Paths;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import net.sf.jasperreports.engine.JRException;
+import net.sf.jasperreports.engine.JasperCompileManager;
+
+/**
+ *
+ * @author ASUS
+ */
+public class SecondProcessor {
+
+ /**
+ * Point de de début des traitements en vue de générer le .jrxml et le
+ * .jasper
+ *
+ * @param elements
+ * @return : retourne le chemin absolu du fichier .jasper
+ * @throws Exception
+ */
+ public String generateJasperFile(ProcessorElements elements) throws Exception {
+ //Parcours du template .xml afin d'extraire certaines propriétés de l'état
+ Report report = (new ParseXMLTemplate()).parse(elements.getTemplateFile());
+
+ //Ajout des éléments provenant de l'interface
+ addReportElements(report, elements.getReportDefinition());
+
+ (new GenerateJRXML()).generateJrxml(report, elements.getJrxmlFolder());
+
+ //Compilation des sous-rapports
+ for (SubReport sub : report.getSubReports()) {
+ compileJrxmlToJasper(Paths.get(elements.getJrxmlFolder(), sub.getName() + ".jrxml").toString(),
+ Paths.get(elements.getJasperFolder(), sub.getName() + ".jasper").toString());
+ }
+
+ //Compilation du rapport parent
+ compileJrxmlToJasper(Paths.get(elements.getJrxmlFolder(), report.getName() + ".jrxml").toString(),
+ Paths.get(elements.getJasperFolder(), report.getName() + ".jasper").toString());
+
+ return Paths.get(elements.getJasperFolder(), report.getName() + ".jasper").toString();
+ }
+
+ /**
+ * Méthode qui compile le .jrxml en . jasper
+ *
+ * @param jrxmlPath
+ * @param jasperPath
+ * @throws JRException
+ */
+ private void compileJrxmlToJasper(String jrxmlPath, String jasperPath) throws JRException {
+
+ JasperCompileManager.compileReportToFile(jrxmlPath, jasperPath);
+ }
+
+ /**
+ * Méthode qui ajoute les éléments provenant de la vue
+ *
+ * @param report
+ * @param reportDefinition
+ */
+ private void addReportElements(MainReport report, MainReportDefinition reportDefinition) {
+ report.setDetail(reportDefinition.isDetail());
+
+ //Ajout des colonnes de données et leurs entêtes
+ addColumnsHeaderAndColumnsData(report, reportDefinition);
+
+ //Ajout des labels de l'entête
+ addElementsToDisplayToHeader(report, reportDefinition.getElementsToDisplay());
+
+ if (reportDefinition.getReportName() != null && !reportDefinition.getReportName().isEmpty()) {
+ report.setName(reportDefinition.getReportName());
+ }
+
+ for (CustomField f : reportDefinition.getCustomFields()) {
+ ValueElement valueElt = new ValueElement(f.getName(), f.getClasse(), ValueElementType.FIELD);
+ report.getFields().putIfAbsent(valueElt.getName(), valueElt);
+ }
+
+ //Ajout des sous-états
+ if ((report instanceof Report) && (reportDefinition instanceof ReportDefinition)) {
+ Report rep = (Report) report;
+ ReportDefinition repDef = (ReportDefinition) reportDefinition;
+
+ if (!repDef.getSubReportDefs().isEmpty() && !rep.getSubReports().isEmpty()) {
+ addSubReportsElelements(rep, repDef.getSubReportDefs());
+
+ } else {
+ //Retirer la description de subReport provenant du xml, afin de ne pas l'afficher car il n'ya pas de sous-rapport
+ //provenant de l'interface
+ rep.getSubReports().clear();
+ }
+ }
+
+ }
+
+ /**
+ * .
+ * @param report
+ * @param reportDefinition
+ */
+ private void addColumnsHeaderAndColumnsData(MainReport report, MainReportDefinition reportDefinition) {
+ //Filter afin de ne garder que les champs qui sont des nombres, chaines de caractères, date ou booleen
+ List<CustomField> fields = reportDefinition.getCustomFields().stream()
+ .filter(f -> String.class.isAssignableFrom(f.getClasse())
+ || Number.class.isAssignableFrom(f.getClasse())
+ || Boolean.class.isAssignableFrom(f.getClasse())
+ || java.util.Date.class.isAssignableFrom(f.getClasse())
+ || java.time.temporal.Temporal.class.isAssignableFrom(f.getClasse())
+ ).collect(Collectors.toList());
+
+ Collections.sort(fields, (CustomField f1, CustomField f2) -> Integer.valueOf(f1.getRang()).compareTo(f2.getRang()));
+
+ if (report.isDetail()) {
+ addDetailColumnsHeaderAndColumnsData(report, fields);
+
+ } else {
+ addListeColumnsHeaderAndColumnsData(report, reportDefinition.isHaveLineNumber(), fields);
+ }
+
+ }
+
+ private void addListeColumnsHeaderAndColumnsData(MainReport report, boolean isHaveLineNumber, List<CustomField> fields) {
+ int x = 0;
+ int i = 1;
+
+ String columnDataStyle = report.getColumnData().getColumnStyle();
+ String columnHeaderStyle = report.getColumnHeader().getColumnStyle();
+
+ if (isHaveLineNumber) {
+ x = 38;
+
+ TextField textField = new TextField();
+ textField.setLineNumber(true);
+
+ Label label = new Label();
+ label.setValue("N°");
+
+ setTextComponentStyle(textField, columnDataStyle);
+ setTextComponentStyle(label, columnHeaderStyle);
+
+ textField.setX(0);
+ label.setX(0);
+
+ textField.setWidth(x);
+ label.setWidth(x);
+
+ report.getColumnData().getComponents().add(textField);
+ report.getColumnHeader().getComponents().add(label);
+
+ }
+ int totalWidth = report.getPageWidth() - report.getRightMargin() - report.getLeftMargin() - x - 10;
+ int nbFieldsWithoutWidth = fields.size();
+
+ for (CustomField f : fields) {
+ if (f.getWidth() > 0) {
+ totalWidth -= f.getWidth();
+ nbFieldsWithoutWidth--;
+ }
+ }
+
+ for (CustomField f : fields) {
+ int width = f.getWidth() > 0 ? f.getWidth() : totalWidth / nbFieldsWithoutWidth;
+ f.setWidth(width);
+
+ TextField textField = new TextField();
+ Label label = new Label();
+
+ setTextComponentStyle(textField, columnDataStyle);
+ setTextComponentStyle(label, columnHeaderStyle);
+
+ ValueElement valueElement = new ValueElement(f.getName(), f.getClasse(), ValueElementType.FIELD);
+
+ textField.setValueElement(valueElement);
+ label.setValue(f.getLibelle());
+
+ textField.setX(x);
+ label.setX(x);
+
+ textField.setWidth(f.getWidth());
+ label.setWidth(f.getWidth());
+
+ textField.setPattern(f.getPattern());
+
+ report.getColumnData().getComponents().add(textField);
+ report.getColumnHeader().getComponents().add(label);
+
+ x = x + f.getWidth();
+
+ i++;
+ }
+
+ }
+
+ private void addDetailColumnsHeaderAndColumnsData(MainReport report, List<CustomField> fields) {
+ final int xColumnHeader = 10;
+
+ String columnDataStyle = report.getColumnData().getColumnStyle();
+ String columnHeaderStyle = report.getColumnHeader().getColumnStyle();
+
+ int totalWidth = report.getPageWidth() - report.getRightMargin() - report.getLeftMargin() - xColumnHeader - 20;
+
+ //Recherche du champ ayant le libellé le plus long
+ Optional<CustomField> optionalCustomField = fields.stream().max((c1, c2) -> Integer.valueOf(c1.getLibelle().length()).compareTo(c2.getLibelle().length()));
+ final int columnHeaderLength = (optionalCustomField.isPresent() ? optionalCustomField.get().getLibelle().length() : 0) * 7;
+ final int columnDataLength = totalWidth - columnHeaderLength;
+
+ final int xColumnData = xColumnHeader + columnHeaderLength;
+
+ int y = 10;
+ int columnDataHeight = y;
+
+ for (CustomField f : fields) {
+
+ TextField textField = new TextField();
+ Label label = new Label();
+
+ setTextComponentStyle(textField, columnDataStyle);
+ setTextComponentStyle(label, columnHeaderStyle);
+
+ ValueElement valueElement = new ValueElement(f.getName(), f.getClasse(), ValueElementType.FIELD);
+
+ textField.setValueElement(valueElement);
+ label.setValue(f.getLibelle());
+
+ label.setX(xColumnHeader);
+ textField.setX(xColumnData);
+ textField.setY(y);
+ label.setY(y);
+
+ textField.setWidth(columnDataLength);
+ label.setWidth(columnHeaderLength);
+
+ textField.setPattern(f.getPattern());
+
+ columnDataHeight += textField.getHeight();
+ y += textField.getHeight();
+
+ report.getColumnData().getComponents().add(textField);
+ report.getColumnHeader().getComponents().add(label);
+
+ }
+
+ report.getColumnData().setHeight(columnDataHeight);
+ report.getColumnHeader().setHeight(columnDataHeight);
+ }
+
+ /**
+ * Méthode qui applique la mise en forme sur les composants
+ *
+ * @param component
+ * @param attributeValue
+ */
+ private void setTextComponentStyle(TextComponent component, String attributeValue) {
+
+ if (attributeValue != null && !attributeValue.isEmpty()) {
+
+ ParseXMLTemplate.getComponentAttributes(attributeValue, component);
+ ParseXMLTemplate.getTextComponentAttributes(attributeValue, component);
+ }
+
+ }
+
+ private void addSubReportsElelements(Report report, List<SubReportDefinition> subReportDefs) {
+ List<SubReport> subReports = new ArrayList<>();
+
+ for (SubReportDefinition subReportDef : subReportDefs) {
+ SubReport subReport = report.getSubReports().get(0);
+ String pageTitleStyle = subReport.getPageTitleStyle();
+
+ Label label = new Label();
+ label.setValue(subReportDef.getTitle());
+
+ ParseXMLTemplate.getComponentAttributes(pageTitleStyle, label);
+ ParseXMLTemplate.getTextComponentAttributes(pageTitleStyle, label);
+
+ subReport.getPageHeader().getComponents().add(label);
+ subReport.setDataSource(subReportDef.getDataSource());
+
+ addReportElements(subReport, subReportDef);
+
+ subReports.add(subReport);
+
+ }
+ report.getSubReports().clear();
+ report.getSubReports().addAll(subReports);
+ }
+
+ private void addElementsToDisplayToHeader(MainReport report, List<ElementToDisplay> elementsToDisplay) {
+ List<ElementToDisplay> liste = elementsToDisplay.stream().filter(e -> e.getSection().equals(Section.TITLE))
+ .collect(Collectors.toList());
+
+ if (!liste.isEmpty()) {
+
+ if (report.getTitle() == null) {
+ report.setTitle(new Title());
+ }
+ List<Component> components = new ArrayList<>();
+ int y = 0;
+
+ for (Component c : report.getTitle().getComponents()) {
+ if (c != null) {
+ y += c.getY();
+ }
+ }
+ //Ajouter un espace avant les labels à ajouter
+ y += y > 0 ? 50 : 10;
+
+ LargestWidth largestWidth = getLargestWidth(elementsToDisplay);
+
+ int yLeft = y;
+ int yRight = y;
+
+ for (ElementToDisplay e : elementsToDisplay) {
+ int xLeft = 0;
+ int xRight = 0;
+
+ if (report.isDetail()) {
+ Component columnData = !report.getColumnData().getComponents().isEmpty() ? report.getColumnData().getComponents().get(0) : null;
+
+ xRight = report.getRightMargin() + report.getLeftMargin() + (columnData != null ? columnData.getWidth() + columnData.getX() : 0) + 10;
+ } else {
+ xRight = report.getRightMargin() + report.getLeftMargin() + report.getColumnData().getComponents().stream().mapToInt(c -> c.getWidth()).sum() + 10;
+ }
+
+ Label keyLabel = new Label();
+ Component labelValue = new Component();
+ Label deuxPointsLabel = new Label();
+
+ keyLabel.setValue(e.getLibelle());
+ deuxPointsLabel.setValue(":");
+
+ switch (e.getElementType()) {
+
+ case PARAMETRE:
+ ValueElement valueElt = new ValueElement(e.getValue(), java.lang.String.class, ValueElementType.PARAMETER);
+ try {
+ report.getParameters().put(e.getValue(), valueElt);
+ } catch (Exception ex) {
+ }
+ TextField textField = new TextField();
+ textField.setValueElement(valueElt);
+ textField.setSize(10);
+ labelValue = textField;
+ break;
+
+ case DATE_GENERE:
+ valueElt = new ValueElement(e.getValue(), java.util.Date.class, ValueElementType.GENERATE);
+ textField = new TextField();
+ textField.setValueElement(valueElt);
+ textField.setSize(10);
+ textField.setPattern("dd/MM/yyyy HH:mm:ss");
+ labelValue = textField;
+ break;
+
+ default:
+ Label label = new Label();
+ label.setValue(e.getValue());
+ label.setSize(10);
+ labelValue = label;
+ break;
+ }
+
+ keyLabel.setSize(10);
+ deuxPointsLabel.setSize(10);
+
+ keyLabel.setHeight(Constantes.LABEL_HEIGHT);
+ labelValue.setHeight(Constantes.LABEL_HEIGHT);
+ deuxPointsLabel.setHeight(Constantes.LABEL_HEIGHT);
+
+ deuxPointsLabel.setWidth(Constantes.DEUX_POINTS_WIDTH);
+
+ keyLabel.setvAlign(Constantes.V_ALIGN_MIDDLE);
+ labelValue.setvAlign(Constantes.V_ALIGN_MIDDLE);
+ deuxPointsLabel.setvAlign(Constantes.V_ALIGN_MIDDLE);
+
+ keyLabel.setBold(true);
+ deuxPointsLabel.setBold(true);
+
+ keyLabel.sethAlign(Constantes.H_ALIGN_LEFT);
+ labelValue.sethAlign(Constantes.H_ALIGN_LEFT);
+ deuxPointsLabel.sethAlign(Constantes.H_ALIGN_CENTER);
+
+ if (e.getPosition() == null) {
+ e.setPosition(Position.LEFT);
+ }
+
+ switch (e.getPosition()) {
+
+ case LEFT:
+ keyLabel.setY(yLeft);
+ labelValue.setY(yLeft);
+ deuxPointsLabel.setY(yLeft);
+
+ keyLabel.setX(xLeft);
+ deuxPointsLabel.setX(xLeft + largestWidth.getLeftLargestKey());
+ labelValue.setX(xLeft + largestWidth.getLeftLargestKey() + 2 * Constantes.DEUX_POINTS_WIDTH);
+
+ keyLabel.setWidth(largestWidth.getLeftLargestKey());
+ labelValue.setWidth(largestWidth.getLeftLargestValue());
+
+ keyLabel.setX(0);
+
+ yLeft += Constantes.LABEL_HEIGHT;
+
+ break;
+
+ case RIGHT:
+ keyLabel.setY(yRight);
+ labelValue.setY(yRight);
+ deuxPointsLabel.setY(yRight);
+
+ labelValue.setX(xRight - largestWidth.getRightLargestValue() - Constantes.DEUX_POINTS_WIDTH);
+ deuxPointsLabel.setX(xRight - largestWidth.getRightLargestValue() - Constantes.DEUX_POINTS_WIDTH * 3);
+ keyLabel.setX(xRight - largestWidth.getRightLargestValue() - Constantes.DEUX_POINTS_WIDTH * 3 - largestWidth.getRightLargestKey());
+
+ keyLabel.setWidth(largestWidth.getRightLargestKey());
+ labelValue.setWidth(largestWidth.getRightLargestValue());
+
+ yRight += Constantes.LABEL_HEIGHT;
+
+ break;
+ }
+ components.add(keyLabel);
+ components.add(labelValue);
+ components.add(deuxPointsLabel);
+
+ }
+ y = yLeft > yRight ? yLeft : yRight;
+
+ report.getTitle().getComponents().addAll(components);
+ report.getTitle().setHeight(y);
+ }
+ }
+
+ private LargestWidth getLargestWidth(List<ElementToDisplay> elementsToDisplay) {
+ DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss");
+ Integer leftLargestKey = 0;
+ Integer leftLargestValue = 0;
+ Integer rightLargestKey = 0;
+ Integer rightLargestValue = 0;
+
+ for (ElementToDisplay e : elementsToDisplay) {
+ //Fixer des valeurs qui permettront de calculer la longueur de chaque label
+ if (e.getElementType().equals(ElementType.DATE_GENERE)) {
+ e.setValue(dtf.format(LocalDateTime.now()));
+ }
+
+ if (e.getPosition() != null) {
+
+ if (e.getPosition().equals(Position.RIGHT)) {
+ rightLargestValue = e.getValue() != null && e.getValue().length() > rightLargestValue ? e.getValue().length() : rightLargestValue;
+ rightLargestKey = e.getLibelle() != null && e.getLibelle().length() > rightLargestKey ? e.getLibelle().length() : rightLargestKey;
+
+ } else if (e.getPosition().equals(Position.LEFT)) {
+ leftLargestValue = e.getValue() != null && e.getValue().length() > leftLargestValue ? e.getValue().length() : leftLargestValue;
+ leftLargestKey = e.getLibelle() != null && e.getLibelle().length() > leftLargestKey ? e.getLibelle().length() : leftLargestKey;
+ }
+ }
+
+ }
+
+ leftLargestKey = leftLargestKey * 6;
+ leftLargestValue = leftLargestValue * 6;
+ rightLargestValue = rightLargestValue * 6;
+ rightLargestKey = rightLargestKey * 6;
+
+ return new LargestWidth(leftLargestKey, leftLargestValue, rightLargestKey, rightLargestValue);
+ }
+}
--
Gitblit v1.10.0