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/metadata/JsonFdxParsedDataRow.java | 267 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 267 insertions(+), 0 deletions(-)
diff --git a/fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/metadata/JsonFdxParsedDataRow.java b/fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/metadata/JsonFdxParsedDataRow.java
new file mode 100644
index 0000000..609d237
--- /dev/null
+++ b/fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/metadata/JsonFdxParsedDataRow.java
@@ -0,0 +1,267 @@
+/*
+ * 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.metadata;
+
+import com.megatim.fdxcommons.model.enumeration.TypeDonnee;
+import com.megatim.fdxcommons.model.integration.json.JsonStructure;
+import com.megatim.fdxcommons.model.pojo.JsonColumnDefinition;
+import com.megatim.fdxcommons.tools.database.exceptions.BadDataValueException;
+import com.megatim.fdxcommons.tools.database.exceptions.ColumnNotFoundException;
+import com.megatim.fdxcommons.tools.database.exceptions.LocalDateTimeValueParseError;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.apache.commons.validator.GenericValidator;
+
+/**
+ *
+ * @author ASUS
+ */
+public class JsonFdxParsedDataRow {
+
+ private final Map<String, Object> data;
+ private final Map<String, Object> row = new LinkedHashMap<>();
+ private final Map<String, JsonColumnDefinition> columnNameToColumnDefinition = new HashMap<>();
+
+ public JsonFdxParsedDataRow(Map<String, Object> data, JsonStructure jsonStructure) {
+ this.data = data;
+ columnNameToJsonColumnDefinition(jsonStructure);
+ }
+
+ public Map<String, Object> dataRow() throws ColumnNotFoundException, BadDataValueException, LocalDateTimeValueParseError {
+ Set<String> foundColumns = new HashSet<>();
+
+ if (row.isEmpty()) {
+
+ for (Map.Entry<String, Object> entry : data.entrySet()) {
+
+ String key = entry.getKey();
+ Object value = entry.getValue();
+
+ JsonColumnDefinition jsonColumnDefinition = columnNameToColumnDefinition.get(key.trim().toLowerCase());
+
+ if (jsonColumnDefinition == null) {
+ throw new ColumnNotFoundException("La colonne " + key + " n'est pas une colonne de ce type de fichier");
+ }
+ foundColumns.add(key.toLowerCase());
+
+ if (value == null) {
+
+ if (jsonColumnDefinition.isRequired()) {
+ throw new BadDataValueException("La valeur de la colonne " + jsonColumnDefinition.getName() + " est obligatoire");
+ }
+ return row;
+ }
+ if (jsonColumnDefinition.getTypeDonnee().equals(TypeDonnee.OBJET)) {
+ if (jsonColumnDefinition.isCollection()) {
+ if (value instanceof List) {
+ List<Object> objectsList = (List<Object>) value;
+ List<Object> parsedValues = new ArrayList<>();
+ int i = 0;
+
+ for (Object obj : objectsList) {
+ parsedValues.add(dataRow((Map<String, Object>) obj, jsonColumnDefinition.getColumnNameToColumnDefinition(), jsonColumnDefinition.getName(), i + 1));
+ i++;
+ }
+ row.put(key.trim(), parsedValues);
+ } else {
+ throw new BadDataValueException("La valeur de la colonne " + jsonColumnDefinition.getName() + " doit être une liste de données");
+ }
+ } else {
+ row.put(key.trim(), dataRow((Map<String, Object>) value, jsonColumnDefinition.getColumnNameToColumnDefinition(), jsonColumnDefinition.getName(), 0));
+ }
+ } else {
+ if (jsonColumnDefinition.isCollection()) {
+ if (value instanceof List) {
+ List<Object> objectsList = (List<Object>) value;
+ List<Object> parsedValues = new ArrayList<>();
+ int i = 0;
+
+ for (Object obj : objectsList) {
+ parsedValues.add(parse(jsonColumnDefinition, obj, "", i + 1));
+ i++;
+ }
+ row.put(key.trim(), parsedValues);
+ } else {
+ throw new BadDataValueException("La valeur de la colonne " + jsonColumnDefinition.getName() + " doit être un tableau de données");
+ }
+ } else {
+ row.put(key.trim(), parse(jsonColumnDefinition, value, "", 0));
+ }
+ }
+ }
+ //Cherche les colonnes obligatoires qui sont absentes
+ stopIfRequiredColumnIsAbsent(foundColumns, columnNameToColumnDefinition, "");
+ }
+ return row;
+ }
+
+ private void columnNameToJsonColumnDefinition(JsonStructure jsonStructure) {
+ for (JsonStructure j : jsonStructure.getFields()) {
+ if (j.getTypeDonnee().equals(TypeDonnee.OBJET)) {
+ JsonColumnDefinition jsonCol = new JsonColumnDefinition(j.getTypeDonnee(), j.getName(), j.getLengthh(), j.getFormatDate(), j.isRequired(), j.isCollection());
+
+ for (JsonStructure field : j.getFields()) {
+ jsonCol.getColumnNameToColumnDefinition().put(field.getName().toLowerCase(), jsonColumnDefinition(field));
+ }
+ columnNameToColumnDefinition.put(j.getName().toLowerCase(), jsonCol);
+ } else {
+ columnNameToColumnDefinition.put(j.getName().toLowerCase(), new JsonColumnDefinition(j.getTypeDonnee(), j.getName(), j.getLengthh(), j.getFormatDate(), j.isRequired(), j.isCollection()));
+ }
+ }
+ }
+
+ private JsonColumnDefinition jsonColumnDefinition(JsonStructure jsonStruct) {
+ JsonColumnDefinition jsonCol = new JsonColumnDefinition(jsonStruct.getTypeDonnee(), jsonStruct.getName(), jsonStruct.getLengthh(), jsonStruct.getFormatDate(), jsonStruct.isRequired(), jsonStruct.isCollection());
+
+ if (jsonStruct.getTypeDonnee().equals(TypeDonnee.OBJET)) {
+ for (JsonStructure j : jsonStruct.getFields()) {
+ jsonCol.getColumnNameToColumnDefinition().put(j.getName().toLowerCase(), jsonColumnDefinition(j));
+ }
+ }
+ return jsonCol;
+ }
+
+ private Map<String, Object> dataRow(Map<String, Object> subData, Map<String, JsonColumnDefinition> subColumnNameToColumnDefinition, String parentName, int rangElement) throws ColumnNotFoundException, BadDataValueException, LocalDateTimeValueParseError {
+ Map<String, Object> subRow = new LinkedHashMap<>();
+ Set<String> foundColumns = new HashSet<>();
+
+ for (Map.Entry<String, Object> entry : subData.entrySet()) {
+
+ String key = entry.getKey();
+ Object value = entry.getValue();
+
+ JsonColumnDefinition jsonColumnDefinition = subColumnNameToColumnDefinition.get(key.trim().toLowerCase());
+
+ if (jsonColumnDefinition == null) {
+ throw new ColumnNotFoundException("La colonne " + key + " n'est pas présente pour ce fichier");
+ }
+ foundColumns.add(key.toLowerCase());
+
+ if (value == null) {
+
+ if (jsonColumnDefinition.isRequired()) {
+ throw new BadDataValueException("La valeur de la colonne " + jsonColumnDefinition.getName() + " est obligatoire");
+ }
+ return subRow;
+ }
+
+ if (jsonColumnDefinition.getTypeDonnee().equals(TypeDonnee.OBJET)) {
+ parentName += "." + jsonColumnDefinition.getName();
+
+ if (jsonColumnDefinition.isCollection()) {
+ if (value instanceof List) {
+ List<Object> objectsList = (List<Object>) value;
+ List<Object> parsedValues = new ArrayList<>();
+ int i = 0;
+
+ for (Object obj : objectsList) {
+ parsedValues.add(dataRow((Map<String, Object>) obj, jsonColumnDefinition.getColumnNameToColumnDefinition(), parentName, rangElement));
+ i++;
+ }
+ subRow.put(key.trim(), parsedValues);
+ } else {
+ throw new BadDataValueException("La valeur de la colonne " + jsonColumnDefinition.getName() + " doit être une liste de données");
+ }
+ } else {
+ subRow.put(key.trim(), dataRow((Map<String, Object>) value, jsonColumnDefinition.getColumnNameToColumnDefinition(), parentName, rangElement));
+ }
+ } else {
+ if (jsonColumnDefinition.isCollection()) {
+ if (value instanceof List) {
+ List<Object> objectsList = (List<Object>) value;
+ List<Object> parsedValues = new ArrayList<>();
+ int i = 0;
+
+ for (Object obj : objectsList) {
+ parsedValues.add(parse(jsonColumnDefinition, obj, "", i + 1));
+ i++;
+ }
+ subRow.put(key.trim(), parsedValues);
+ } else {
+ throw new BadDataValueException("La valeur de la colonne " + jsonColumnDefinition.getName() + " doit être un tableau de données");
+ }
+ } else {
+ subRow.put(key.trim(), parse(jsonColumnDefinition, value, parentName, rangElement));
+ }
+ }
+ }
+ //Cherche les colonnes obligatoires qui sont absentes
+ stopIfRequiredColumnIsAbsent(foundColumns, subColumnNameToColumnDefinition, parentName);
+
+ return subRow;
+ }
+
+ private Object parse(JsonColumnDefinition columnDefinition, Object value, String parentName, int rangElement) throws BadDataValueException, LocalDateTimeValueParseError {
+
+ TypeDonnee typeDonnee = columnDefinition.getTypeDonnee();
+
+ if (typeDonnee.equals(TypeDonnee.ALPHANUMERIQUE) && (value == null
+ || (value instanceof String && lengthLowerOrEquals((String) value, columnDefinition.getLengthh())))) {
+
+ return value != null ? value.toString().trim() : value;
+
+ } else if (typeDonnee.equals(TypeDonnee.NUMERIQUE)) {
+
+ if (value == null) {
+ return 0L;
+ }
+
+ String stringValue = value.toString();
+ if (lengthLowerOrEquals(stringValue, columnDefinition.getLengthh()) && GenericValidator.isLong(stringValue)) {
+ return Long.valueOf(stringValue);
+ }
+
+ } else if (typeDonnee.equals(TypeDonnee.DECIMAL)) {
+
+ if (value == null) {
+ return 0.0;
+ }
+
+ String stringValue = value.toString();
+ if (lengthLowerOrEquals(stringValue, columnDefinition.getLengthh()) && GenericValidator.isDouble(stringValue)) {
+ return Double.valueOf(stringValue);
+ }
+
+ } else if (typeDonnee.equals(TypeDonnee.DATE)) {
+
+ if (value == null) {
+ return null;
+ }
+ String stringValue = value.toString();
+
+ if (lengthEquals(stringValue, columnDefinition.getLengthh()) && GenericValidator.isDate(stringValue, columnDefinition.getFormatDate(), true)) {
+ return new InsertionLocalDateTimeValue(columnDefinition.getFormatDate(), value).value();
+ }
+ }
+ String rangDescription = rangElement == 0 ? "" : "le " + rangElement + "ème élément de ";
+ String fullQualifiedNameOfColumn = parentName == null || parentName.isEmpty() ? columnDefinition.getName() : parentName + "." + columnDefinition.getName();
+
+ throw new BadDataValueException("La valeur " + value + " ne correspond pas au format attendu pour " + rangDescription + " la colonne " + fullQualifiedNameOfColumn);
+ }
+
+ 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 void stopIfRequiredColumnIsAbsent(Set<String> foundColumns, Map<String, JsonColumnDefinition> allColumns, String parentName) throws BadDataValueException {
+
+ for (String columnName : allColumns.keySet()) {
+ String fullQualifiedName = parentName.isEmpty() ? columnName : parentName + "." + columnName;
+
+ if (allColumns.get(columnName).isRequired() && !foundColumns.contains(columnName.toLowerCase())) {
+ throw new BadDataValueException("La valeur de la colonne " + fullQualifiedName + " est obligatoire");
+ }
+ }
+ }
+}
--
Gitblit v1.10.0