From 23a46b4be35277e06ec89f48730eeb694e686be8 Mon Sep 17 00:00:00 2001
From: Kenmegne <stephanie.kenmegne@gmail.com>
Date: Thu, 18 Jun 2026 15:40:06 +0000
Subject: [PATCH] add fdx-commons and fdx-consultation

---
 fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/validation/JsonDataValidationError.java |  293 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 293 insertions(+), 0 deletions(-)

diff --git a/fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/validation/JsonDataValidationError.java b/fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/validation/JsonDataValidationError.java
new file mode 100644
index 0000000..390a1b1
--- /dev/null
+++ b/fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/validation/JsonDataValidationError.java
@@ -0,0 +1,293 @@
+/*
+ * 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.fdxcommons.tools.database.queries.validation;
+
+import com.megatim.fdxcommons.model.enumeration.TypeDonnee;
+import com.megatim.fdxcommons.model.integration.json.JsonStructure;
+import com.megatim.fdxcommons.tools.database.exceptions.LocalDateTimeValueParseError;
+import com.megatim.fdxcommons.tools.database.queries.metadata.InsertionLocalDateTimeValue;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import org.apache.commons.validator.GenericValidator;
+
+/**
+ *
+ * @author ASUS
+ */
+public class JsonDataValidationError {
+
+    private final ArrayList<String> errors = new ArrayList<>();
+    private final List<LinkedHashMap<String, Object>> data;
+    private final JsonStructure jsonStructure;
+
+    public JsonDataValidationError(List<LinkedHashMap<String, Object>> data, JsonStructure jsonStructure) {
+        this.data = data;
+        this.jsonStructure = jsonStructure;
+    }
+
+    public String validationError() {
+        if (errors.isEmpty()) {
+            int index = 1;
+            for (Map<String, Object> dataItem : data) {
+                String error = processDataItem(dataItem, jsonStructure);
+
+                if (error != null && !error.trim().isEmpty()) {
+                    errors.add(elementNumberString(index++) + " : " + error);
+                }
+            }
+        }
+        return error();
+    }
+
+    private String processDataItem(Map<String, Object> dataItem, JsonStructure jsonStruct) {
+        StringBuilder lineError = new StringBuilder("");
+
+        //Vérifie si une colonne obligatoire est absente
+        lineError.append(addErrorForNotFoundColumn(dataItem, jsonStruct.getFields()));
+
+        for (Map.Entry<String, Object> dataItemEntry : dataItem.entrySet()) {
+
+            String columnName = dataItemEntry.getKey();
+            Object columnValue = dataItemEntry.getValue();
+
+            Optional<JsonStructure> optField = jsonStruct.getFields().stream().filter(f -> f.getName().equalsIgnoreCase(columnName)).findFirst();
+
+            if (!optField.isPresent()) {
+                lineError.append("La colonne ").append(columnName).append(" n'existe pas pour ce fichier;");
+                continue;
+            }
+            JsonStructure field = optField.get();
+
+            if (field.isCollection() || field.getTypeDonnee().equals(TypeDonnee.OBJET)) {
+                if (field.getTypeDonnee().equals(TypeDonnee.OBJET)) {
+
+                    if (field.isCollection()) {
+                        if (columnValue instanceof List) {
+                            List liste = (List) columnValue;
+                            int i = 1;
+
+                            for (Object obj : liste) {
+                                if (obj instanceof Map) {
+                                    lineError.append(processDataItem((Map<String, Object>) obj, field));
+                                } else {
+                                    lineError.append("L'élément No ").append(i++).append(" de la colonne '").append(columnName).append("' doit être un objet;");
+                                }
+                            }
+                        } else {
+                            lineError.append(" La donnée de la colonne '").append(columnName).append("' doit être une liste;");
+                        }
+                    } else {
+                        if (columnValue instanceof Map) {
+                            lineError.append(processDataItem((Map<String, Object>) columnValue, field));
+                        } else {
+                            lineError.append(" La donnée de la colonne '").append(columnName).append("' doit être un objet;");
+                        }
+                    }
+                } else {
+                    if (columnValue instanceof List) {
+                        simpleListValueError(columnValue, field);
+                    } else {
+                        lineError.append(" La donnée de la colonne '").append(columnName).append("' doit être une liste;");
+                    }
+                }
+            } else {
+                columnValueError(lineError, field, columnValue);
+            }
+        }
+        return lineError.toString();
+    }
+
+    private String simpleListValueError(Object columnValue, JsonStructure field) {
+        List liste = (List) columnValue;
+        StringBuilder arrayError = new StringBuilder("");
+        int i = 1;
+
+        for (Object obj : liste) {
+            arrayError.append(columnValueError(obj, field, i++));
+        }
+        return arrayError.toString().trim();
+    }
+
+    private void columnValueError(StringBuilder lineError, JsonStructure field, Object columnValue) {
+        String error = columnValueError(columnValue, field);
+        if (error != null && !error.trim().isEmpty()) {
+            lineError.append(error.trim());
+        }
+    }
+
+    private String error() {
+        StringBuilder stringBuilder = new StringBuilder("");
+        errors.forEach(e -> {
+            if (e != null && !e.trim().isEmpty()) {
+                stringBuilder.append(e.trim()).append("\n");
+            }
+        }
+        );
+        return stringBuilder.toString();
+    }
+
+    private String addErrorForNotFoundColumn(Map<String, Object> dataItem, List<JsonStructure> fields) {
+        StringBuilder message = new StringBuilder("");
+
+        fields.forEach(f -> {
+            String error = addErrorForNotFoundColumn(dataItem, f);
+            if (!error.isEmpty()) {
+                message.append("\n").append(error);
+            }
+        });
+        return message.toString();
+    }
+
+    private String addErrorForNotFoundColumn(Map<String, Object> dataItem, JsonStructure jsonStruct) {
+        String fieldName = jsonStruct.getName().toLowerCase();
+        if (jsonStruct.isRequired() && !columnNameExist(dataItem, fieldName)) {
+            return "La colonne " + fieldName + " est manquante. ";
+        }
+        return "";
+    }
+
+    private String columnValueError(Object columnValue, JsonStructure jsonStruct, int i) {
+        TypeDonnee typeDonnee = jsonStruct.getTypeDonnee();
+
+        switch (typeDonnee) {
+            case ALPHANUMERIQUE:
+                if (!isAlphaNumericColumn(columnValue)) {
+                    return "L'élément No " + i + " doit être alphanumérique";
+                } else if (!lengthLowerOrEquals((String) columnValue, jsonStruct.getLengthh())) {
+                    return "La taille de l'élément No " + i + " doit être inférieure ou égale à" + jsonStruct.getLengthh() + ";";
+                }
+                break;
+            case DECIMAL:
+                if (columnValue != null) {
+
+                    String stringValue = columnValue.toString();
+                    if (!GenericValidator.isDouble(stringValue)) {
+                        return "L'élément No " + i + " doit être décimale";
+                    } else if (!lengthLowerOrEquals(stringValue, jsonStruct.getLengthh())) {
+                        return "La taille de l'élément No " + i + " doit être inférieure ou égale à " + jsonStruct.getLengthh() + ";";
+                    }
+
+                }
+                break;
+            case NUMERIQUE:
+                if (columnValue != null) {
+
+                    String stringValue = columnValue.toString();
+                    if (!GenericValidator.isLong(stringValue)) {
+                        return "L'élément No " + i + " doit être numérique;";
+                    } else if (!lengthLowerOrEquals(stringValue, jsonStruct.getLengthh())) {
+                        return "La taille de l'élément No " + i + " doit être inférieure ou égale à " + jsonStruct.getLengthh() + ";";
+                    }
+
+                }
+                break;
+            case DATE:
+                if (columnValue != null) {
+
+                    String stringValue = columnValue.toString();
+                    if (!GenericValidator.isDate(stringValue, jsonStruct.getFormatDate(), true)) {
+                        return "L'élément No " + i + " doit être une date";
+                    } else if (!lengthEquals(stringValue, jsonStruct.getLengthh())) {
+                        return "La taille de l'élément No " + i + " doit être égale à " + jsonStruct.getLengthh() + ";";
+                    }
+
+                    try {
+                        new InsertionLocalDateTimeValue(jsonStruct.getFormatDate(), columnValue).value();
+                    } catch (LocalDateTimeValueParseError ex) {
+                        return "Impossible de parser la valeur " + stringValue + " au format " + jsonStruct.getFormatDate() + " pour l'élément No " + i + ";";
+                    }
+
+                }
+                break;
+            default:
+                break;
+        }
+
+        return "";
+    }
+
+    private String columnValueError(Object columnValue, JsonStructure jsonStruct) {
+        TypeDonnee typeDonnee = jsonStruct.getTypeDonnee();
+
+        switch (typeDonnee) {
+            case ALPHANUMERIQUE:
+                if (!isAlphaNumericColumn(columnValue)) {
+                    return "La colonne " + jsonStruct.getName() + " doit être alphanumérique;";
+                } else if (!lengthLowerOrEquals((String) columnValue, jsonStruct.getLengthh())) {
+                    return "La taille de la colonne " + jsonStruct.getName() + " doit être inférieure ou égale à" + jsonStruct.getLengthh() + ";";
+                }
+                break;
+            case DECIMAL:
+                if (columnValue != null) {
+
+                    String stringValue = columnValue.toString();
+                    if (!GenericValidator.isDouble(stringValue)) {
+                        return "La colonne " + jsonStruct.getName() + " doit être décimale";
+                    } else if (!lengthLowerOrEquals(stringValue, jsonStruct.getLengthh())) {
+                        return "La taille de la colonne " + jsonStruct.getName() + " doit être inférieure ou égale à " + jsonStruct.getLengthh() + ";";
+                    }
+
+                }
+                break;
+            case NUMERIQUE:
+                if (columnValue != null) {
+
+                    String stringValue = columnValue.toString();
+                    if (!GenericValidator.isLong(stringValue)) {
+                        return "La colonne " + jsonStruct.getName() + " doit être numérique;";
+                    } else if (!lengthLowerOrEquals(stringValue, jsonStruct.getLengthh())) {
+                        return "La taille de la colonne " + jsonStruct.getName() + " doit être inférieure ou égale à " + jsonStruct.getLengthh() + ";";
+                    }
+
+                }
+                break;
+            case DATE:
+                if (columnValue != null) {
+
+                    String stringValue = columnValue.toString();
+                    if (!GenericValidator.isDate(stringValue, jsonStruct.getFormatDate(), true)) {
+                        return "La colonne " + jsonStruct.getName() + " doit être une date;";
+                    } else if (!lengthEquals(stringValue, jsonStruct.getLengthh())) {
+                        return "La taille de la colonne " + jsonStruct.getName() + " doit être égale à " + jsonStruct.getLengthh() + ";";
+                    }
+
+                    try {
+                        new InsertionLocalDateTimeValue(jsonStruct.getFormatDate(), columnValue).value();
+                    } catch (LocalDateTimeValueParseError ex) {
+                        return "Impossible de parser la valeur " + stringValue + " au format " + jsonStruct.getFormatDate() + " pour la colonne " + jsonStruct.getName() + ";";
+                    }
+
+                }
+                break;
+            default:
+                break;
+        }
+
+        return "";
+    }
+
+    private boolean isAlphaNumericColumn(Object columnValue) {
+        return (columnValue == null || columnValue instanceof String);
+    }
+
+    private boolean lengthEquals(String value, int columnMaxLength) {
+        return value.trim().length() == columnMaxLength;
+    }
+
+    private boolean lengthLowerOrEquals(String value, int columnMaxLength) {
+        return value.trim().length() <= columnMaxLength;
+    }
+
+    private String elementNumberString(int index) {
+        return "Elément No" + index;
+    }
+
+    private boolean columnNameExist(Map<String, Object> dataItem, String jsonStructName) {
+        return dataItem.entrySet().stream().map(e -> e.getKey()).filter(key -> key.trim().toLowerCase().equals(jsonStructName)).findAny().isPresent();
+    }
+}

--
Gitblit v1.10.0