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/ParseXMLTemplate.java | 1027 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 1,027 insertions(+), 0 deletions(-)
diff --git a/reporting-adhoc/src/main/java/com/megatim/reporting/adhoc/process/ParseXMLTemplate.java b/reporting-adhoc/src/main/java/com/megatim/reporting/adhoc/process/ParseXMLTemplate.java
new file mode 100644
index 0000000..bf2e74f
--- /dev/null
+++ b/reporting-adhoc/src/main/java/com/megatim/reporting/adhoc/process/ParseXMLTemplate.java
@@ -0,0 +1,1027 @@
+/*
+ * 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.reporting.adhoc.pojo.Constantes;
+import com.megatim.reporting.adhoc.pojo.layouts.Report;
+import com.megatim.reporting.adhoc.pojo.xml.ReportTag;
+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.TextComponent;
+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 com.megatim.reporting.adhoc.pojo.enums.ValueElementType;
+import com.megatim.reporting.adhoc.pojo.layouts.ColumnData;
+import com.megatim.reporting.adhoc.pojo.layouts.ColumnHeader;
+import com.megatim.reporting.adhoc.pojo.layouts.Layout;
+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.SubReport;
+import com.megatim.reporting.adhoc.pojo.layouts.Title;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ *
+ * @author ASUS
+ */
+public class ParseXMLTemplate {
+
+ private ReportTag reportTag;
+
+ /**
+ * Méthode qui parse le fichier de xml de description de l'état
+ *
+ * @param file
+ * @return
+ * @throws Exception
+ */
+ public Report parse(File file) throws Exception {
+ reportTag = new ReportTag();
+ Report report = new Report();
+
+ Document doc = intialize(file);
+
+ //Liste des noeud <report>
+ NodeList reportList = doc.getElementsByTagName(Constantes.TAG_REPORT);
+
+ if (reportList.getLength() > 0) {
+
+ Node reportNode = reportList.item(0);
+
+ //Attributs de <report>
+ NamedNodeMap reportAttributes = reportNode.getAttributes();
+
+ setReportProperties(reportAttributes, report);
+
+ //Liste des balises enfant du 1er Noeud <report>
+ NodeList reportChildren = reportNode.getChildNodes();
+
+ getFieldsAndParameters(reportChildren);
+ report.setParameters(reportTag.getParameters());
+ report.setFields(reportTag.getFields());
+
+ if (reportTag.getTitle() != null) {
+ Title title = getTitle(reportTag.getTitle());
+ report.setTitle(title);
+ }
+
+ if (reportTag.getPageHeader() != null) {
+ PageHeader pHeader = getPageHeader(reportTag.getPageHeader());
+ report.setPageHeader(pHeader);
+ }
+
+ if (reportTag.getColumnHeader() != null) {
+ ColumnHeader cHeader = getColumnHeader(reportTag.getColumnHeader());
+ report.setColumnHeader(cHeader);
+ }
+
+ if (reportTag.getColumnData() != null) {
+ ColumnData cData = getColumnData(reportTag.getColumnData());
+ report.setColumnData(cData);
+ }
+
+ if (reportTag.getPageFooter() != null) {
+ PageFooter pageFooter = getPageFooter(reportTag.getPageFooter());
+ report.setPageFooter(pageFooter);
+ }
+
+ NodeList subReportList = doc.getElementsByTagName(Constantes.TAG_SUB_REPORT);
+
+ if (subReportList.getLength() > 0) {
+ List<SubReport> subReports = getAllSubReports(subReportList);
+
+ report.getSubReports().addAll(subReports);
+
+// for (SubReport sub : subReports) {
+// ValueElement valueElt = new ValueElement(sub.getDataSource(), java.util.List.class, ValueElementType.FIELD);
+// report.getFields().putIfAbsent(sub.getDataSource(), valueElt);
+// }
+ }
+
+ }
+
+ return report;
+ }
+
+ /**
+ * Méthode qui construit le composant 'Titre' du rapport à partir d'un noeud
+ *
+ * @param node : Noeud representant la balise 'title' extrait du fichier xml
+ * @return
+ * @throws ClassNotFoundException
+ */
+ private Title getTitle(Node node) throws ClassNotFoundException {
+ NamedNodeMap attributes = node.getAttributes();
+ Title title = new Title();
+
+ //Parcours des attributs de la balise <Title>
+ for (int i = 0; i < attributes.getLength(); i++) {
+ String nodeName = attributes.item(i).getNodeName();
+ String nodeValue = attributes.item(i).getNodeValue();
+
+ if (nodeName.equalsIgnoreCase(Constantes.ATTRIBUTE_STYLE)) {
+ title = (Title) getLayoutStyle(nodeValue, title);
+ }
+
+ }
+
+ List<Component> components = getComponents(node.getChildNodes());
+ title.setComponents(components);
+
+ return title;
+ }
+
+ /**
+ * Méthode qui construit le composant 'PageHeader' du rapport à partir d'un
+ * noeud
+ *
+ * @param node : Noeud representant la balise 'pageHeader' extrait du
+ * fichier xml
+ * @return
+ * @throws ClassNotFoundException
+ */
+ private PageHeader getPageHeader(Node node) throws Exception {
+ NamedNodeMap attributes = node.getAttributes();
+ PageHeader pageHeader = new PageHeader();
+
+ //Prcours des attributs de la balise <Title>
+ for (int i = 0; i < attributes.getLength(); i++) {
+ String nodeName = attributes.item(i).getNodeName();
+ String nodeValue = attributes.item(i).getNodeValue();
+
+ if (nodeName.equalsIgnoreCase(Constantes.ATTRIBUTE_STYLE)) {
+ pageHeader = (PageHeader) getLayoutStyle(nodeValue, pageHeader);
+ }
+
+ }
+
+ List<Component> components = getComponents(node.getChildNodes());
+ pageHeader.setComponents(components);
+
+ return pageHeader;
+ }
+
+ /**
+ * Méthode qui crée le composant 'ColumnHeader' du rapport à partir d'un
+ * noeud
+ *
+ * @param node : Noeud representant la balise 'columnHeader' extrait du
+ * fichier xml
+ * @return
+ * @throws ClassNotFoundException
+ */
+ private ColumnHeader getColumnHeader(Node node) throws Exception {
+ NamedNodeMap attributes = node.getAttributes();
+ ColumnHeader columnHeader = new ColumnHeader();
+
+ //Parcours des attributs de la balise <Title>
+ for (int i = 0; i < attributes.getLength(); i++) {
+ String nodeName = attributes.item(i).getNodeName();
+ String nodeValue = attributes.item(i).getNodeValue();
+
+ if (nodeName.equalsIgnoreCase(Constantes.ATTRIBUTE_STYLE)) {
+ columnHeader = (ColumnHeader) getLayoutStyle(nodeValue, columnHeader);
+
+ } else if (nodeName.equalsIgnoreCase(Constantes.ATTRIBUTE_COLUMN_STYLE)) {
+ columnHeader.setColumnStyle(nodeValue);
+ }
+
+ }
+
+ List<Component> components = getComponents(node.getChildNodes());
+ columnHeader.setComponents(components);
+
+ return columnHeader;
+ }
+
+ /**
+ * Méthode qui crée le composant 'ColumnData'(Detail) du rapport à partir
+ * d'un noeud
+ *
+ * @param node : Noeud representant la balise 'columnData' extrait du
+ * fichier xml
+ * @return
+ * @throws ClassNotFoundException
+ */
+ private ColumnData getColumnData(Node node) throws ClassNotFoundException {
+ ColumnData columnData = new ColumnData();
+ NamedNodeMap attributes = node.getAttributes();
+
+ //Parcours des attributs de la balise <ColumnData>
+ for (int i = 0; i < attributes.getLength(); i++) {
+ String nodeName = attributes.item(i).getNodeName();
+ String nodeValue = attributes.item(i).getNodeValue();
+
+ if (nodeName.equalsIgnoreCase(Constantes.ATTRIBUTE_STYLE)) {
+ columnData = (ColumnData) getLayoutStyle(nodeValue, columnData);
+
+ } else if (nodeName.equalsIgnoreCase(Constantes.ATTRIBUTE_COLUMN_STYLE)) {
+ columnData.setColumnStyle(nodeValue);
+ }
+
+ }
+
+ List<Component> components = getComponents(node.getChildNodes());
+ columnData.setComponents(components);
+
+ return columnData;
+
+ }
+
+ /**
+ * Méthode qui crée le composant 'PageFooter' du rapport à partir d'un noeud
+ *
+ * @param node : Noeud representant la balise 'pageFooter' extrait du
+ * fichier xml
+ * @return
+ * @throws ClassNotFoundException
+ */
+ private PageFooter getPageFooter(Node node) throws ClassNotFoundException {
+ PageFooter pageFooter = new PageFooter();
+ NamedNodeMap attributes = node.getAttributes();
+
+ //Parcours des attributs de la balise <ColumnData>
+ for (int i = 0; i < attributes.getLength(); i++) {
+ String nodeName = attributes.item(i).getNodeName();
+ String nodeValue = attributes.item(i).getNodeValue();
+
+ if (nodeName.equalsIgnoreCase(Constantes.ATTRIBUTE_STYLE)) {
+ pageFooter = (PageFooter) getLayoutStyle(nodeValue, pageFooter);
+ }
+
+ }
+
+ List<Component> components = getComponents(node.getChildNodes());
+ pageFooter.setComponents(components);
+
+ return pageFooter;
+
+ }
+
+ /**
+ *
+ * @param attributeValue
+ * @param layout
+ * @return
+ */
+ private Layout getLayoutStyle(String attributeValue, Layout layout) {
+ String[] styles = attributeValue.trim().split(";");
+
+ for (String style : styles) {
+
+ String[] tab = style.split(":");
+
+ if (tab.length == 2) {
+
+ if (tab[0].equals(Constantes.ATTRIBUTE_HEIGHT)) {
+ layout.setHeight(Integer.parseInt(tab[1]));
+
+ } else if (tab[0].equals(Constantes.ATTRIBUTE_SPLIT_TYPE)) {
+ layout.setSplitType(tab[1]);
+
+ }
+ }
+ }
+ return layout;
+ }
+
+ /**
+ * Méthode qui recupère tous les enfants d'une balise qui représente une
+ * section(Title, PageHeader, ColumnHeader,Detail, PageFooter) d'un état et
+ * construis
+ *
+ * @param childNodes : Balises enfant
+ * @return
+ * @throws ClassNotFoundException
+ */
+ private List<Component> getComponents(NodeList childNodes) throws ClassNotFoundException {
+ List<Component> components = new ArrayList<>();
+
+ for (int i = 0; i < childNodes.getLength(); i++) {
+
+ Node child = childNodes.item(i);
+
+ if (child.getNodeName().equalsIgnoreCase(Constantes.TAG_IMAGE)) {
+
+ Image image = getImageTag(child);
+ components.add(image);
+
+ } else if (child.getNodeName().equalsIgnoreCase(Constantes.TAG_TEXT_FIELD)) {
+
+ TextField textField = getTextFieldTag(child);
+ components.add(textField);
+
+ } else if (child.getNodeName().equalsIgnoreCase(Constantes.TAG_LABEL)) {
+
+ Label label = getLabelTag(child);
+ components.add(label);
+
+ } else if (child.getNodeName().equalsIgnoreCase(Constantes.TAG_LINE)) {
+
+ Line line = getLineTag(child);
+ components.add(line);
+
+ } else if (child.getNodeName().equalsIgnoreCase(Constantes.TAG_LINE_NUMBER)) {
+
+ TextField textField = getTextFieldTag(child);
+ textField.setLineNumber(true);
+ components.add(textField);
+
+ } else if (child.getNodeName().equalsIgnoreCase(Constantes.TAG_PAGE_NUMBER)) {
+
+ TextField textField = getTextFieldTag(child);
+ textField.setPageNumber(true);
+ components.add(textField);
+ }
+ }
+ return components;
+ }
+
+// private void get
+ /**
+ * Méthode qui extrait les attributs communs aux composants de type
+ * Text(Label,TextField)
+ *
+ * @param attributeValue : contenu de l'attribut 'style' de la balise parent
+ * @param textComponent : Objet auquel sera affecté les attributs extraits
+ */
+ public static void getTextComponentAttributes(String attributeValue, TextComponent textComponent) {
+ String[] styles = attributeValue.trim().split(";");
+
+ for (String style : styles) {
+ String[] tab = style.trim().split(":");
+
+ if (tab.length == 2 && tab[1] != null && !tab[1].isEmpty()) {
+
+ if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_FONT_NAME)) {
+ textComponent.setFontName(tab[1]);
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_BOLD)) {
+ textComponent.setBold(Boolean.parseBoolean(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_UNDERLINE)) {
+ textComponent.setUnderLine(Boolean.parseBoolean(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_TEXT_ADJUST)) {
+ textComponent.setTextAdjust(tab[1]);
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_IS_BLANK_WHEN_NULL)) {
+ textComponent.setBlankWhenNull(Boolean.parseBoolean(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_IS_PRINT_IN_FIRST_WHOLE_BAND)) {
+ textComponent.setPrintInFirtWholeBand(Boolean.parseBoolean(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_IS_PRINT_WHEN_DETAIL_OVER_FLOWS)) {
+ textComponent.setPrintWhenDetailOverflows(Boolean.parseBoolean(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_SIZE)) {
+ textComponent.setSize(Integer.parseInt(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_FORE_COLOR)) {
+ textComponent.setForeColor(tab[1]);
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_RIGHT_INDENT)) {
+ textComponent.getParagraph().setRightIndent(Integer.parseInt(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_LEFT_INDENT)) {
+ textComponent.getParagraph().setLeftIndent(Integer.parseInt(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_SPACING_AFTER)) {
+ textComponent.getParagraph().setSpacingAfter(Integer.parseInt(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_SPACING_BEFORE)) {
+ textComponent.getParagraph().setSpacingBefore(Integer.parseInt(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_FIRST_LINE_INDENT)) {
+ textComponent.getParagraph().setFirstLineIndent(Integer.parseInt(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_LINE_SPACING_SIZE)) {
+ textComponent.getParagraph().setLineSpacingSize(Double.parseDouble(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_LINE_SPACING)) {
+ textComponent.getParagraph().setLineSpacing(tab[1]);
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_REMOVE_LINE_WHEN_BLANK)) {
+ textComponent.setRemoveLineWhenBlank(Boolean.parseBoolean(tab[1]));
+
+ }
+
+ }
+ }
+ }
+
+ /**
+ * Méthode qui extrait les attributs communs à tous les composants
+ *
+ * @param attributeValue : contenu de l'attribut 'style' de la balise parent
+ * @param component : Objet auquel sera affecté les attributs extraits
+ */
+ public static void getComponentAttributes(String attributeValue, Component component) {
+
+ String[] styles = attributeValue.trim().split(";");
+
+ for (String style : styles) {
+
+ String[] tab = style.trim().split(":");
+
+ if (tab.length == 2 && tab[1] != null && !tab[1].isEmpty()) {
+
+ if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_HEIGHT)) {
+ component.setHeight(Integer.parseInt(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_X)) {
+ component.setX(Integer.parseInt(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_Y)) {
+ component.setY(Integer.parseInt(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_WIDTH)) {
+ component.setWidth(Integer.parseInt(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_H_ALIGN)) {
+ component.sethAlign(tab[1]);
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_V_ALIGN)) {
+ component.setvAlign(tab[1]);
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_LEFT_BORDER)) {
+ component.getBorder().setLeftBorder(Float.parseFloat(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_TOP_BORDER)) {
+ component.getBorder().setTopBorder(Float.parseFloat(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_BOTTOM_BORDER)) {
+ component.getBorder().setBottomBorder(Float.parseFloat(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_RIGHT_BORDER)) {
+ component.getBorder().setRightBorder(Float.parseFloat(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_RIGHT_PADDING)) {
+ component.getBorder().setRightPadding(Integer.parseInt(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_LEFT_PADDING)) {
+ component.getBorder().setLeftPadding(Integer.parseInt(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_TOP_PADDING)) {
+ component.getBorder().setTopPadding(Integer.parseInt(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_BOTTOM_PADDING)) {
+ component.getBorder().setBottomPadding(Integer.parseInt(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_LINE_STYLE)) {
+ component.getBorder().setLineStyle(tab[1]);
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_LINE_COLOR)) {
+ component.getBorder().setLineColor(tab[1]);
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_OPERAND_TYPE)) {
+ component.getDisplayCondition().setOperandType(tab[1]);
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_LEFT_OPERAND)) {
+ component.getDisplayCondition().setLeftOperand(tab[1]);
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_RIGHT_OPERAND)) {
+ component.getDisplayCondition().setRightOperand(tab[1]);
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_OPERATOR)) {
+ component.getDisplayCondition().setOperator(tab[1]);
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_STRETCH_TYPE)) {
+ component.setStretchType(tab[1]);
+
+ }
+ }
+ }
+ }
+
+ /**
+ * Méthode qui parse une balise <image> et construis l'objet Image
+ * correspondant
+ *
+ * @param node
+ * @return
+ */
+ private Image getImageTag(Node node) throws ClassNotFoundException {
+ Image image = new Image();
+ NamedNodeMap attributes = node.getAttributes();
+
+ for (int i = 0; i < attributes.getLength(); i++) {
+
+ String attributeName = attributes.item(i).getNodeName();
+ String attributeValue = attributes.item(i).getNodeValue();
+
+ if (attributeName.equalsIgnoreCase(Constantes.ATTRIBUTE_STYLE) || attributeName.equalsIgnoreCase(Constantes.ATTRIBUTE_DISPLAY_CONDITION)) {
+
+ //Récupérer les attributs communs à tous les 'Component'
+ getComponentAttributes(attributeValue, image);
+
+ } else if (attributeName.equalsIgnoreCase(Constantes.ATTRIBUTE_SCALE_IMAGE)) {
+ image.setScaleImage(attributeValue);
+ }
+ }
+
+ NodeList imageChildren = node.getChildNodes();
+
+ ValueElement valueElt = getValueElement(imageChildren);
+ image.setValueElement(valueElt);
+
+ return image;
+ }
+
+ /**
+ * Méthode qui parse une balise <textField> et construis l'objet textField
+ * correspondant
+ *
+ * @param node
+ * @return
+ */
+ private TextField getTextFieldTag(Node node) throws ClassNotFoundException {
+ NamedNodeMap attributes = node.getAttributes();
+ TextField textField = new TextField();
+
+ //Parcours des attributs de la balise <textField>
+ for (int i = 0; i < attributes.getLength(); i++) {
+
+ String attributeName = attributes.item(i).getNodeName();
+ String attributeValue = attributes.item(i).getNodeValue();
+
+ if (attributeName.equalsIgnoreCase(Constantes.ATTRIBUTE_STYLE)) {
+
+ //Recuperer la valeur des attributs communs à tous les 'Component'
+ getComponentAttributes(attributeValue, textField);
+
+ //Recuperer la valeur des attributs communs à tous 'TextComponent'
+ getTextComponentAttributes(attributeValue, textField);
+
+ //Recupérer les attibuts spécifiques à 'TextField'
+ } else if (attributeName.equalsIgnoreCase(Constantes.ATTRIBUTE_PATTERN) && attributeValue != null && !attributeValue.isEmpty()) {
+ textField.setPattern(attributeValue.trim());
+
+ } else if (attributeName.equalsIgnoreCase(Constantes.ATTRIBUTE_DISPLAY_CONDITION)) {
+ getComponentAttributes(attributeValue, textField);
+ }
+ }
+ NodeList textFieldChildren = node.getChildNodes();
+
+ ValueElement valueElt = getValueElement(textFieldChildren);
+ textField.setValueElement(valueElt);
+
+ return textField;
+ }
+
+ /**
+ *
+ * @param node
+ * @throws Exception
+ */
+ private List<SubReport> getAllSubReports(NodeList subReportList) throws Exception {
+ List<SubReport> subReports = new ArrayList<>();
+
+ for (int i = 0; i < subReportList.getLength(); i++) {
+ Node subReportTag = subReportList.item(i);
+
+ subReports.add(getSubReportTag(subReportTag));
+
+ }
+
+ return subReports;
+ }
+
+ private SubReport getSubReportTag(Node subReportTag) throws Exception {
+ NamedNodeMap attributes = subReportTag.getAttributes();
+ SubReport subReport = new SubReport();
+
+ //Parcours des attributs de la balise <subReport>
+ for (int j = 0; j < attributes.getLength(); j++) {
+
+ String attributeName = attributes.item(j).getNodeName();
+ String attributeValue = attributes.item(j).getNodeValue();
+
+ if (attributeName.equalsIgnoreCase(Constantes.ATTRIBUTE_STYLE)) {
+ setReportStyle(attributeValue, subReport);
+
+ } else if (attributeName.equalsIgnoreCase(Constantes.ATTRIBUTE_NAME)) {
+ subReport.setName(attributeValue);
+
+ } else if (attributeName.equalsIgnoreCase(Constantes.ATTRIBUTE_DATASOURCE)) {
+ subReport.setDataSource(attributeValue);
+
+ } else if (attributeName.equalsIgnoreCase(Constantes.ATTRIBUTE_BAND_STYLE)) {
+ String[] styles = attributeValue.split(";");
+
+ for (String style : styles) {
+ String[] tab = style.trim().split(":");
+
+ if (tab.length == 2 && tab[1] != null && !tab[1].isEmpty()) {
+
+ if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_IS_PRINT_IN_FIRST_WHOLE_BAND)) {
+ subReport.setPrintInFirtWholeBand(Boolean.parseBoolean(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_IS_PRINT_WHEN_DETAIL_OVER_FLOWS)) {
+ subReport.setPrintWhenDetailOverflows(Boolean.parseBoolean(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_HEIGHT)) {
+ subReport.setHeight(Integer.parseInt(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_X)) {
+ subReport.setX(Integer.parseInt(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_Y)) {
+ subReport.setY(Integer.parseInt(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_WIDTH)) {
+ subReport.setWidth(Integer.parseInt(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_SPLIT_TYPE)) {
+ subReport.setSplitType(tab[1]);
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_STRETCH_TYPE)) {
+ subReport.setStretchType(tab[1]);
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_RUN_TO_BOTTOM)) {
+ subReport.setRunToBottom(Boolean.parseBoolean(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_USING_CACHE)) {
+ subReport.setUsingCache(Boolean.parseBoolean(tab[1]));
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_OVERFLOW_TYPE)) {
+ subReport.setOverflowType(tab[1]);
+
+ }
+ }
+ }
+ } else if (attributeName.equalsIgnoreCase(Constantes.ATTRIBUTE_PAGE_TITLE_STYLE)) {
+ subReport.setPageTitleStyle(attributeValue);
+ }
+ }
+
+ reportTag = new ReportTag();
+ getFieldsAndParameters(subReportTag.getChildNodes());
+
+ subReport.setParameters(reportTag.getParameters());
+ subReport.setFields(reportTag.getFields());
+
+ if (reportTag.getTitle() != null) {
+ Title title = getTitle(reportTag.getTitle());
+ subReport.setTitle(title);
+ }
+
+ if (reportTag.getPageHeader() != null) {
+ PageHeader pHeader = getPageHeader(reportTag.getPageHeader());
+ subReport.setPageHeader(pHeader);
+ }
+
+ if (reportTag.getColumnHeader() != null) {
+ ColumnHeader cHeader = getColumnHeader(reportTag.getColumnHeader());
+ subReport.setColumnHeader(cHeader);
+ }
+
+ if (reportTag.getColumnData() != null) {
+ ColumnData cData = getColumnData(reportTag.getColumnData());
+ subReport.setColumnData(cData);
+ }
+
+ if (reportTag.getPageFooter() != null) {
+ PageFooter pageFooter = getPageFooter(reportTag.getPageFooter());
+ subReport.setPageFooter(pageFooter);
+ }
+
+ return subReport;
+ }
+
+ private ValueElement getValueElement(NodeList children) throws ClassNotFoundException {
+ ValueElement valueElt = null;
+
+ for (int i = 0; i < children.getLength(); i++) {
+ Node child = children.item(i);
+
+ if (child.getNodeName().equalsIgnoreCase(Constantes.TAG_PARAMETER) || child.getNodeName().equalsIgnoreCase(Constantes.TAG_FIELD)) {
+ NamedNodeMap textFieldChildAttributes = child.getAttributes();
+ String classe = "java.lang.String";
+ String name = null;
+
+ for (int j = 0; j < textFieldChildAttributes.getLength(); j++) {
+ Node attNode = textFieldChildAttributes.item(j);
+ String attributeValue = attNode.getNodeValue();
+ String attributeName = attNode.getNodeName();
+
+ if (attributeName.equalsIgnoreCase(Constantes.ATTRIBUTE_CLASSE)) {
+ classe = attributeValue;
+
+ } else if (attributeName.equalsIgnoreCase(Constantes.ATTRIBUTE_NAME)) {
+ name = attributeValue;
+ }
+
+ }
+ Class<?> clazz = Class.forName(classe);
+
+ if (child.getNodeName().equalsIgnoreCase(Constantes.TAG_PARAMETER)) {
+ valueElt = new ValueElement(name, clazz, ValueElementType.PARAMETER);
+
+ } else if (child.getNodeName().equalsIgnoreCase(Constantes.TAG_FIELD)) {
+ valueElt = new ValueElement(name, clazz, ValueElementType.FIELD);
+ }
+
+ } else if (child.getNodeName().equalsIgnoreCase(Constantes.TAG_TEXT)) {
+ NamedNodeMap textFieldChildAttributes = child.getAttributes();
+ valueElt = new ValueElement(ValueElementType.TEXT);
+
+ for (int j = 0; j < textFieldChildAttributes.getLength(); j++) {
+ Node attNode = textFieldChildAttributes.item(j);
+ String attributeValue = attNode.getNodeValue();
+ String attributeName = attNode.getNodeName();
+
+ if (attributeName.equalsIgnoreCase(Constantes.ATTRIBUTE_VALUE)) {
+ valueElt.setValue(attributeValue);
+ }
+
+ }
+
+ } else if (child.getNodeName().equalsIgnoreCase(Constantes.TAG_GENERATE)) {
+ NamedNodeMap textFieldChildAttributes = child.getAttributes();
+ valueElt = new ValueElement(ValueElementType.GENERATE);
+
+ for (int j = 0; j < textFieldChildAttributes.getLength(); j++) {
+ Node attNode = textFieldChildAttributes.item(j);
+ String attributeValue = attNode.getNodeValue();
+ String attributeName = attNode.getNodeName();
+
+ if (attributeName.equalsIgnoreCase(Constantes.ATTRIBUTE_PATTERN)) {
+ valueElt.setPattern(attributeValue);
+
+ } else if (attributeName.equalsIgnoreCase(Constantes.ATTRIBUTE_CLASSE)) {
+ valueElt.setClasse(Class.forName(attributeValue));
+ }
+
+ }
+
+ }
+ }
+ return valueElt;
+ }
+
+ /**
+ * Méthode qui parse une balise <label> et construis l'objet label
+ * correspondant
+ *
+ * @param node
+ * @return
+ */
+ private Label getLabelTag(Node node) {
+ NamedNodeMap attributes = node.getAttributes();
+ Label label = new Label();
+
+ //Parcours des attributs de la balise <label>
+ for (int i = 0; i < attributes.getLength(); i++) {
+
+ String attributeName = attributes.item(i).getNodeName();
+ String attributeValue = attributes.item(i).getNodeValue();
+
+ if (attributeName.equalsIgnoreCase(Constantes.ATTRIBUTE_STYLE)) {
+
+ //Récuperer la valeur des attributs communs à tous les 'Component'
+ getComponentAttributes(attributeValue, label);
+
+ //Récuperer la valeur des attributs communs à tous les 'TextComponent'
+ getTextComponentAttributes(attributeValue, label);
+
+ } else if (attributeName.equalsIgnoreCase(Constantes.ATTRIBUTE_VALUE)) { //Recupérer les attibuts spécifiques à 'Label'
+ label.setValue(attributeValue);
+
+ } else if (attributeName.equalsIgnoreCase(Constantes.ATTRIBUTE_DISPLAY_CONDITION)) {
+ getComponentAttributes(attributeValue, label);
+ }
+ }
+ return label;
+ }
+
+ /**
+ * Méthode qui parse une balise <line> et construis l'objet line
+ * correspondant
+ *
+ * @param node
+ * @return
+ */
+ private Line getLineTag(Node node) {
+ NamedNodeMap attributes = node.getAttributes();
+ Line line = new Line();
+
+ //Parcours des attributs de la balise <line>
+ for (int i = 0; i < attributes.getLength(); i++) {
+
+ String attributeName = attributes.item(i).getNodeName();
+ String attributeValue = attributes.item(i).getNodeValue();
+
+ if (attributeName.equals(Constantes.ATTRIBUTE_STYLE)) {
+
+ //Recupérer la valeur des attributs commun à 'Component'
+ getComponentAttributes(attributeValue, line);
+
+ //Recupérer les attibuts spécifiques à 'Line'
+ String[] styles = attributeValue.trim().split(";");
+
+ for (String style : styles) {
+
+ String[] tab = style.trim().split(":");
+
+ if (tab.length == 2 && tab[1] != null && !tab[1].isEmpty()) {
+
+ if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_LINE_STYLE)) {
+ line.setLineStyle(tab[1]);
+
+ } else if (tab[0].equalsIgnoreCase(Constantes.ATTRIBUTE_LINE_WIDTH)) {
+ line.setLineWidth(Float.parseFloat(tab[1]));
+
+ }
+
+ }
+ }
+ } else if (attributeName.equals(Constantes.ATTRIBUTE_DISPLAY_CONDITION)) {
+ getComponentAttributes(attributeValue, line);
+ }
+ }
+ return line;
+ }
+
+ /**
+ * Méthode qui recupère tous les champs et paramètres trouvés dans le
+ * fichier xml de template
+ *
+ * @param reportChildren
+ * @throws ClassNotFoundException
+ */
+ private void getFieldsAndParameters(NodeList reportChildren) throws ClassNotFoundException {
+
+ for (int i = 0; i < reportChildren.getLength(); i++) {
+ Node child = reportChildren.item(i);
+
+ if (child.getNodeName().equalsIgnoreCase(Constantes.TAG_TITLE)) {
+ reportTag.setTitle(child);
+
+ } else if (child.getNodeName().equalsIgnoreCase(Constantes.TAG_PAGE_HEADER)) {
+ reportTag.setPageHeader(child);
+
+ } else if (child.getNodeName().equalsIgnoreCase(Constantes.TAG_COLUMN_HEADER)) {
+ reportTag.setColumnHeader(child);
+
+ } else if (child.getNodeName().equalsIgnoreCase(Constantes.TAG_COLUMN_DATA)) {
+ reportTag.setColumnData(child);
+
+ } else if (child.getNodeName().equalsIgnoreCase(Constantes.TAG_PAGE_FOOTER)) {
+ reportTag.setPageFooter(child);
+
+ }
+
+ if (child.getNodeName().equals(Constantes.TAG_PARAMETER) || child.getNodeName().equals(Constantes.TAG_FIELD)) {
+ NamedNodeMap valueElementeterAttributes = child.getAttributes();
+ String classe = "java.lang.String";
+ String name = null;
+ String defaultValue = null;
+
+ for (int j = 0; j < valueElementeterAttributes.getLength(); j++) {
+ String nodeName = valueElementeterAttributes.item(j).getNodeName();
+ String nodeValue = valueElementeterAttributes.item(j).getNodeValue();
+
+ if (nodeName.equalsIgnoreCase(Constantes.ATTRIBUTE_CLASSE)) {
+ classe = nodeValue;
+
+ } else if (nodeName.equalsIgnoreCase(Constantes.ATTRIBUTE_NAME)) {
+ name = nodeValue;
+
+ } else if (nodeName.equalsIgnoreCase(Constantes.ATTRIBUTE_DEFAULT_VALUE)) {
+ defaultValue = nodeValue;
+ }
+ }
+ ValueElement valueElement = null;
+ final Class<?> clazz = Class.forName(classe);
+
+ if (child.getNodeName().equals(Constantes.TAG_PARAMETER)) {
+ valueElement = new ValueElement(name, clazz, ValueElementType.PARAMETER);
+
+ if (defaultValue != null) {
+ valueElement.setValue(defaultValue);
+ }
+
+ reportTag.getParameters().merge(valueElement.getName(), valueElement, (v1, v2) -> v1.getValue() != null ? v2 : v1);
+
+ } else if (child.getNodeName().equals(Constantes.TAG_FIELD)) {
+ valueElement = new ValueElement(name, clazz, ValueElementType.FIELD);
+
+ reportTag.getFields().putIfAbsent(valueElement.getName(), valueElement);
+
+ }
+ } else {
+ if (child.getChildNodes().getLength() > 0 && !child.getNodeName().equalsIgnoreCase(Constantes.TAG_SUB_REPORT)) {
+ getFieldsAndParameters(child.getChildNodes());
+ }
+ }
+ }
+
+ }
+
+ /**
+ * Méthode qui recherche les attributs de la balise <report>
+ *
+ * @param reportAttributes
+ * @return
+ * @throws Exception
+ */
+ private Report setReportProperties(NamedNodeMap reportAttributes, Report report) throws Exception {
+
+ for (int i = 0; i < reportAttributes.getLength(); i++) {
+ String nodeName = reportAttributes.item(i).getNodeName();
+ String nodeValue = reportAttributes.item(i).getNodeValue();
+
+ if (nodeName.equalsIgnoreCase(Constantes.ATTRIBUTE_NAME)) {
+ report.setName(nodeValue);
+
+ } else if (nodeName.equalsIgnoreCase(Constantes.ATTRIBUTE_STYLE)) {
+ setReportStyle(nodeValue, report);
+ }
+ }
+ return report;
+ }
+
+ private MainReport setReportStyle(String styles, MainReport report) {
+
+ if (styles != null && !styles.isEmpty()) {
+ String[] tab = styles.split(";");
+
+ for (String str : tab) {
+ String[] style = str.split(":");
+
+ if (style.length == 2 && style[1] != null && !style[1].isEmpty()) {
+
+ if (style[0].equalsIgnoreCase(Constantes.ATTRIBUTE_BOTTOM_MARGIN)) {
+ report.setBottomMargin(Integer.parseInt(style[1]));
+
+ } else if (style[0].equalsIgnoreCase(Constantes.ATTRIBUTE_TOP_MARGIN)) {
+ report.setTopMargin(Integer.parseInt(style[1]));
+
+ } else if (style[0].equalsIgnoreCase(Constantes.ATTRIBUTE_LEFT_MARGIN)) {
+ report.setLeftMargin(Integer.parseInt(style[1]));
+
+ } else if (style[0].equalsIgnoreCase(Constantes.ATTRIBUTE_RIGHT_MARGIN)) {
+ report.setRightMargin(Integer.parseInt(style[1]));
+
+ } else if (style[0].equalsIgnoreCase(Constantes.ATTRIBUTE_ORIENTATION)) {
+ report.setOrientation(ReportOrientation.reportOrientation(style[1]));
+
+ } else if (style[0].equalsIgnoreCase(Constantes.ATTRIBUTE_PAGE_HEIGHT)) {
+ report.setPageHeight(Integer.parseInt(style[1]));
+
+ } else if (style[0].equalsIgnoreCase(Constantes.ATTRIBUTE_PAGE_WIDTH)) {
+ report.setPageWidth(Integer.parseInt(style[1]));
+
+ } else if (style[0].equalsIgnoreCase(Constantes.ATTRIBUTE_COLUMN_WIDTH)) {
+ report.setColumnWidth(Integer.parseInt(style[1]));
+
+ }
+ }
+
+ }
+ }
+ return report;
+ }
+
+ /**
+ * Méthode utilitaire pour extraire les données dans un fichier xml
+ *
+ * @valueElement array
+ * @return
+ * @throws Exception
+ */
+ private Document intialize(File file) throws Exception {
+
+ /**
+ * Défini un factory qui aide à obtenir un parseur qui produit un arbre
+ * d'objets DOM à partir d'un docuent XML.
+ */
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+
+ /**
+ * création d'un objet du builder pour parser le fichier XML.
+ */
+ DocumentBuilder db = dbf.newDocumentBuilder();
+
+ Document doc = db.parse(file);
+
+ doc.getDocumentElement().normalize();
+
+ return doc;
+ }
+}
--
Gitblit v1.10.0