From 8cbaa370347e6fc997381cf35d6c295685b90f98 Mon Sep 17 00:00:00 2001
From: Kenmegne <stephanie.kenmegne@gmail.com>
Date: Fri, 19 Jun 2026 11:29:14 +0000
Subject: [PATCH] move to new repo
---
dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/extender/RuntimeClassBuilder.java | 153 +++++
dynamicjsonparser/target/classes/.netbeans_automatic_build | 0
dynamicjsonparser/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst | 16
dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/extender/SourceCompiler.java | 35 +
dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/enums/TypeDonnee.java | 46 +
dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/CustomError.java | 33 +
dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/App.java | 21
dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/generated/CompteBancaire.java | 54 ++
dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/extender/JsonDataProcessor.java | 432 ++++++++++++++++
dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/JsonDataType.java | 138 +++++
dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/JsonParsedData.java | 40 +
dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/utils/Utility.java | 37 +
dynamicjsonparser/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst | 16
dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/extender/DataRetrieverAction.java | 79 ++
dynamicjsonparser/pom.xml | 61 ++
dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/generated/Personne.java | 79 ++
dynamicjsonparser/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst | 0
dynamicjsonparser/target/test-classes/.netbeans_automatic_build | 0
dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/JsonField.java | 130 ++++
dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/extender/JsonDataValidator.java | 103 +++
dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/Indexe.java | 46 +
dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/Node.java | 40 +
dynamicjsonparser/target/maven-archiver/pom.properties | 5
23 files changed, 1,564 insertions(+), 0 deletions(-)
diff --git a/dynamicjsonparser/pom.xml b/dynamicjsonparser/pom.xml
new file mode 100644
index 0000000..725f4ad
--- /dev/null
+++ b/dynamicjsonparser/pom.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.megatim</groupId>
+ <artifactId>dynamicjsonparser</artifactId>
+ <version>1.0</version>
+ <packaging>jar</packaging>
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <maven.compiler.source>1.8</maven.compiler.source>
+ <maven.compiler.target>1.8</maven.compiler.target>
+ <exec.mainClass>com.megatim.dynamicjsonparser.Example</exec.mainClass>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.burningwave</groupId>
+ <artifactId>core</artifactId>
+ <version>12.64.2</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.dataformat</groupId>
+ <artifactId>jackson-dataformat-xml</artifactId>
+ <version>2.15.2</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-validator</groupId>
+ <artifactId>commons-validator</artifactId>
+ <version>1.6</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <version>3.0.0</version>
+ <configuration>
+ <archive>
+ <manifest>
+ <addClasspath>true</addClasspath>
+ <mainClass>com.megatim.dynamicjsonparser.Example</mainClass>
+ </manifest>
+ </archive>
+ <descriptorRefs>
+ <descriptorRef>jar-with-dependencies</descriptorRef>
+ </descriptorRefs>
+ </configuration>
+ <executions>
+ <execution>
+ <id>make-my-jar-with-dependencies</id>
+ <phase>package</phase>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
\ No newline at end of file
diff --git a/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/App.java b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/App.java
new file mode 100644
index 0000000..4cfa681
--- /dev/null
+++ b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/App.java
@@ -0,0 +1,21 @@
+/*
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Project/Maven2/JavaApp/src/main/java/${packagePath}/${mainClassName}.java to edit this template
+ */
+package com.megatim.dynamicjsonparser;
+
+import java.io.IOException;
+
+/**
+ *
+ * @author ASUS
+ */
+public class App {
+
+ static String packageName = "com.megatim.dynamicjsonparser.generated";
+
+ public static void main(String[] args) throws IOException {
+
+ }
+
+}
diff --git a/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/enums/TypeDonnee.java b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/enums/TypeDonnee.java
new file mode 100644
index 0000000..898eb21
--- /dev/null
+++ b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/enums/TypeDonnee.java
@@ -0,0 +1,46 @@
+/*
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Enum.java to edit this template
+ */
+package com.megatim.dynamicjsonparser.enums;
+
+/**
+ *
+ * @author STEPHANIE
+ */
+public enum TypeDonnee {
+ ALPHANUMERIQUE("ALPHANUMERIQUE"),
+ NUMERIQUE("NUMERIQUE"),
+ DECIMAL("DECIMAL"),
+ DATE("DATE"),
+ OBJET("OBJET");
+
+ private final String value;
+
+ private TypeDonnee(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static TypeDonnee fromValeur(String value) {
+ if (value.equalsIgnoreCase("ALPHANUMERIQUE")) {
+ return TypeDonnee.ALPHANUMERIQUE;
+ } else if (value.equalsIgnoreCase("DATE")) {
+ return TypeDonnee.DATE;
+ } else if (value.equalsIgnoreCase("NUMERIQUE")) {
+ return TypeDonnee.NUMERIQUE;
+ } else if (value.equalsIgnoreCase("DECIMAL")) {
+ return TypeDonnee.DECIMAL;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
diff --git a/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/extender/DataRetrieverAction.java b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/extender/DataRetrieverAction.java
new file mode 100644
index 0000000..04093f3
--- /dev/null
+++ b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/extender/DataRetrieverAction.java
@@ -0,0 +1,79 @@
+/*
+ * 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.dynamicjsonparser.extender;
+
+import com.megatim.dynamicjsonparser.pojo.CustomError;
+import com.megatim.dynamicjsonparser.pojo.JsonField;
+import com.megatim.dynamicjsonparser.pojo.JsonParsedData;
+import com.megatim.dynamicjsonparser.pojo.Node;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Deque;
+import java.util.List;
+import java.util.concurrent.ConcurrentLinkedDeque;
+import java.util.concurrent.ForkJoinTask;
+import java.util.concurrent.RecursiveTask;
+import org.burningwave.core.Virtual;
+
+/**
+ *
+ * @author ASUS
+ */
+public class DataRetrieverAction extends RecursiveTask<JsonParsedData> {
+
+ //Liste des données extraites du fichier json
+ private final List<Virtual> finalVirtuals = Collections.synchronizedList(new ArrayList<>());
+
+ //Liste des erreurs recontrées dans le fichier json
+ private final Deque<CustomError> deque = new ConcurrentLinkedDeque<>();
+
+ private final List<Node> nodes;
+ private final Class classOfEntity;
+ private final List<JsonField> jsonFields;
+ private final String rootClass;
+ private final int nbThreads;
+
+ public DataRetrieverAction(List<Node> nodes, Class classOfEntity, List<JsonField> jsonFields, String rootClass, int nbThreads) {
+ this.nodes = nodes;
+ this.classOfEntity = classOfEntity;
+ this.jsonFields = jsonFields;
+ this.rootClass = rootClass;
+ this.nbThreads = nbThreads;
+ }
+
+ @Override
+ protected JsonParsedData compute() {
+ if (nbThreads > 1) {
+ ForkJoinTask
+ .invokeAll(createSubtasks())
+ .stream()
+ .map(DataRetrieverAction::join)
+ .forEach(p -> {
+ deque.addAll(p.getErrors());
+ finalVirtuals.addAll(p.getVirtuals());
+ });
+ return new JsonParsedData(finalVirtuals, new ArrayList<>(deque));
+ } else {
+ return new JsonDataProcessor(nodes, classOfEntity, jsonFields, rootClass).iterateThroughNodes();
+ }
+ }
+
+ private List<DataRetrieverAction> createSubtasks() {
+ List<DataRetrieverAction> subtasks = new ArrayList<>();
+ int nbEltsPerTask = nodes.size() / nbThreads;
+ int remainder = nodes.size() % nbThreads;
+
+ for (int i = 0; i < nbThreads; i++) {
+ if (remainder > 0 && i == nbThreads - 1) {
+ subtasks.add(new DataRetrieverAction(nodes.subList(nbEltsPerTask * i, nbEltsPerTask * i + nbEltsPerTask + remainder), classOfEntity, jsonFields, rootClass, 1));
+ } else {
+ subtasks.add(new DataRetrieverAction(nodes.subList(nbEltsPerTask * i, nbEltsPerTask * i + nbEltsPerTask), classOfEntity, jsonFields, rootClass, 1));
+ }
+ }
+
+ return subtasks;
+ }
+
+}
diff --git a/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/extender/JsonDataProcessor.java b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/extender/JsonDataProcessor.java
new file mode 100644
index 0000000..f2a5454
--- /dev/null
+++ b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/extender/JsonDataProcessor.java
@@ -0,0 +1,432 @@
+/*
+ * 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.dynamicjsonparser.extender;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.megatim.dynamicjsonparser.pojo.CustomError;
+import com.megatim.dynamicjsonparser.pojo.JsonField;
+import com.megatim.dynamicjsonparser.pojo.JsonParsedData;
+import com.megatim.dynamicjsonparser.pojo.Node;
+import com.megatim.dynamicjsonparser.pojo.Indexe;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import org.apache.commons.validator.GenericValidator;
+import org.burningwave.core.Virtual;
+import org.burningwave.core.classes.Constructors;
+
+/**
+ *
+ * @author ASUS
+ */
+public class JsonDataProcessor {
+
+ private final List<Node> nodes;
+ private final Class classOfEntity;
+ private final List<JsonField> jsonFields;
+ private final String rootClass;
+
+ private final JsonParsedData parsedData = new JsonParsedData();
+
+ public JsonDataProcessor(List<Node> nodes, Class classOfEntity, List<JsonField> jsonFields, String rootClass) {
+ this.nodes = nodes;
+ this.classOfEntity = classOfEntity;
+ this.jsonFields = jsonFields;
+ this.rootClass = rootClass;
+ }
+
+ public JsonParsedData iterateThroughNodes() {
+ for (Node node : nodes) {
+
+ Virtual virtualObject = traverseNode(node.getNode(), classOfEntity, jsonFields, Arrays.asList(new Indexe(node.getIndex())),
+ rootClass);
+
+ //Ajout de l'objet extrait dans la liste
+ parsedData.getVirtuals().add(virtualObject);
+ }
+ return parsedData;
+ }
+
+ private JsonField retrieveField(List<JsonField> jsonFields, String fieldName) {
+ Optional<JsonField> optJsonField = jsonFields.stream().filter(j -> j.getName().equalsIgnoreCase(fieldName)).findFirst();
+ if (optJsonField.isPresent()) {
+ return optJsonField.get();
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Méthode permettant de parcourir recursivement les noeuds du fichier json
+ *
+ * @param node : noeud à parcourir
+ * @param classOfEntity : classe Java du noeud à parcourir
+ * @param map : map contenant tous champs de la classe Java à utiliser lors
+ * de l'extraction
+ * @param indexes : tableau contenant la hiérarchie des index, cad les index
+ * permettant de déterminer la posotion précise du noeud dans le fichier
+ * @return
+ */
+ private Virtual traverseNode(final JsonNode node, final Class classOfEntity, final List<JsonField> jsonFields, List<Indexe> indexes, String fullQualifiedNameOfField) {
+ if (node != null && classOfEntity != null && jsonFields != null && !jsonFields.isEmpty()) {
+ Iterator<Map.Entry<String, JsonNode>> nodeFields = node.fields();
+ Virtual virtualObject = new Constructors().newInstanceOf(classOfEntity);
+ Set<String> foundFields = new HashSet<>();//contient les champs rencontrés dans chaque noeud json
+
+ Integer index = indexes.get(0).getPosition();
+
+ while (nodeFields.hasNext()) {
+
+ Map.Entry<String, JsonNode> entry = nodeFields.next();
+ final JsonField dynamicField = retrieveField(jsonFields, entry.getKey());
+
+ //Si c'est un attribut de l'objet en cours de traitement
+ if (dynamicField != null) {
+ foundFields.add(entry.getKey());
+
+ if (entry.getValue().toString().equals("null")) {//si la valeur du noeud est à null
+ if (dynamicField.isRequired()) {
+ parsedData.getErrors().add(requiredErrorMessage(entry.getKey(), fullQualifiedNameOfField, indexes));
+ }
+ } else {
+ //Si la donnée que contient le noeud est un tableau
+ if (entry.getValue().isArray() && entry.getValue().size() > 0) {
+
+ JsonNode firstElement = entry.getValue().get(0);
+
+ //Si c'est un tableau d'objets
+ if (firstElement.isObject()) { //si c'est un tableau d'objets
+ traverseArrayOfObjectNodes(virtualObject, entry, dynamicField, indexes, fullQualifiedNameOfField);
+ } else {
+ traverseArrayOfTextualNodes(virtualObject, entry, dynamicField, indexes, fullQualifiedNameOfField);
+ }
+ } else if (entry.getValue().isObject()) {
+ traverseSingleObjectNode(virtualObject, entry, dynamicField, indexes, fullQualifiedNameOfField);
+ } else {
+ traverseSingleTextualNode(virtualObject, entry, dynamicField, indexes, fullQualifiedNameOfField);
+ }
+ }
+ } else {
+ CustomError customError = constructErrorMessage(indexes);
+ customError.getMessage().append("Attribut ").append("\"").append(fullQualifiedNameOfField).append(".").append(entry.getKey()).append("\"")
+ .append(" inexistant dans la définition de l'entité ").append("\"")
+ .append(jsonFields.get(0).getClassName())
+ .append("\"");
+ parsedData.getErrors().add(customError);
+ }
+
+ }
+ //Vérifier si des champs obligatoirs sont absents
+ checkIfRequiredFieldIsAbsent(foundFields, jsonFields, indexes, fullQualifiedNameOfField);
+ index++;
+
+ return virtualObject;
+ } else {
+ return null;
+ }
+ }
+
+ private void checkIfRequiredFieldIsAbsent(Set<String> foundFields, final List<JsonField> jsonFields, List<Indexe> indexes, String fullQualifiedNameOfField) {
+ jsonFields.forEach(j -> {
+ if (j.isRequired() && !foundFields.stream().filter(f->f.equalsIgnoreCase(j.getName())).findFirst().isPresent()) {
+ parsedData.getErrors().add(requiredErrorMessage(j.getName(), fullQualifiedNameOfField, indexes));
+ }
+ });
+ }
+
+ private CustomError requiredErrorMessage(String key, String fullQualifiedNameOfField, List<Indexe> indexes) {
+ CustomError customError = constructErrorMessage(indexes);
+ customError.getMessage().append("La valeur de l'attribut ").append("\"").append(fullQualifiedNameOfField).append(".").append(key).append("\"")
+ .append(" ne peut être nulle ");
+
+ return customError;
+ }
+
+ private void traverseArrayOfTextualNodes(Virtual virtualObject, Map.Entry<String, JsonNode> entry, JsonField dynamicField, List<Indexe> indexes, String fullQualifiedNameOfField) {
+
+ if (entry.getValue().toString().equals("null") || entry.getValue().size() == 0) {
+ if (dynamicField.isRequired()) {
+ parsedData.getErrors().add(requiredErrorMessage(entry.getKey(), fullQualifiedNameOfField, indexes));
+ }
+ return;
+ }
+ Class classOfField = dynamicField.getClazz();
+ CustomError customError = constructErrorMessage(indexes);
+ customError.getMessage().append("\"").append(fullQualifiedNameOfField).append(".").append(entry.getKey()).append("\"").append(" {");
+
+ boolean isTextFormatted = true;
+ List<Object> values = new ArrayList<>();
+
+ //On valide chaque élément du tableau
+ for (int i = 0; i < entry.getValue().size(); i++) {
+ Object finalObject = validateValue(entry.getValue().get(i).asText(), dynamicField);
+
+ //Si l'objet retourné après validation est nul, alors la validation a échoué
+ if (finalObject == null) {
+ customError.getMessage().append(" Elément N°").append(i + 1).append(" est mal formaté").append(", ");//On renseigne la position de l'élément qui a échoué
+ isTextFormatted = false;
+
+ } else if (finalObject.toString().length() > dynamicField.getLengthh()) {
+ customError.getMessage().append(" Elément N°").append(i + 1).append(" La taille de la donnée est supérieure à la taille attendue").append(", ");//On renseigne la position de l'élément qui a échoué
+ isTextFormatted = false;
+ }
+ values.add(finalObject);// ajouter l'élément au tableau final
+ }
+
+ if (!isTextFormatted) {
+ customError.getMessage().replace(customError.getMessage().length() - 2, customError.getMessage().length(), " }");
+ parsedData.getErrors().add(customError);
+ }
+
+ List finalValues = convertToRealType(values, classOfField);
+ virtualObject.invoke(setterofField(dynamicField.getName()), finalValues);
+ }
+
+ private void traverseArrayOfObjectNodes(Virtual virtualObject, Map.Entry<String, JsonNode> entry, JsonField dynamicField, List<Indexe> indexes, String fullQualifiedNameOfField) {
+ if (entry.getValue().toString().equals("null") || entry.getValue().size() == 0) {
+ if (dynamicField.isRequired()) {
+ parsedData.getErrors().add(requiredErrorMessage(entry.getKey(), fullQualifiedNameOfField, indexes));
+ }
+ return;
+ }
+ List<Virtual> virtuals = new ArrayList<>();
+ List<Indexe> subIndexes = new ArrayList<>();
+ subIndexes.addAll(indexes);
+
+ subIndexes.add(new Indexe(1, fullQualifiedNameOfField + "." + entry.getKey()));
+
+ for (int i = 0; i < entry.getValue().size(); i++) {
+
+ //Valider de façon récursive les objets du tableau
+ virtuals.add(traverseNode(entry.getValue().get(i), dynamicField.getClazz(), dynamicField.getDynamicFields(), subIndexes, fullQualifiedNameOfField + "." + entry.getKey()));
+
+ int subPosition = subIndexes.get(subIndexes.size() - 1).getPosition();
+ subIndexes.get(subIndexes.size() - 1).setPosition(subPosition + 1);
+ }
+
+ virtualObject.invoke(setterofField(dynamicField.getName()), virtuals);
+ }
+
+ private void traverseSingleTextualNode(Virtual virtualObject, Map.Entry<String, JsonNode> entry, JsonField dynamicField, List<Indexe> indexes, String fullQualifiedNameOfField) {
+ if (entry.getValue().toString().equals("null") || entry.getValue().asText().isEmpty()) {
+ if (dynamicField.isRequired()) {
+ parsedData.getErrors().add(requiredErrorMessage(entry.getKey(), fullQualifiedNameOfField, indexes));
+ }
+ return;
+ }
+ Object finalValue = validateValue(entry.getValue().asText(), dynamicField);
+
+ if (finalValue == null) {
+ CustomError customError = constructErrorMessage(indexes);
+ customError.getMessage().append("\"").append(fullQualifiedNameOfField).append(".").append(entry.getKey()).append("\"").append(" est mal formaté");
+ parsedData.getErrors().add(customError);
+
+ } else if (finalValue.toString().length() > dynamicField.getLengthh()) {
+ CustomError customError = constructErrorMessage(indexes);
+ customError.getMessage().append("\"").append(fullQualifiedNameOfField).append(".").append(entry.getKey()).append("\"").append(" La taille de la donnée est supérieure à la taille attendue");
+ parsedData.getErrors().add(customError);
+ } else {
+ virtualObject.invoke(setterofField(dynamicField.getName()), finalValue);
+ }
+ }
+
+ private void traverseSingleObjectNode(Virtual virtualObject, Map.Entry<String, JsonNode> entry, JsonField dynamicField, List<Indexe> indexes, String fullQualifiedNameOfField) {
+ List<Indexe> subIndexes = new ArrayList<>();
+ subIndexes.addAll(indexes);
+ subIndexes.add(new Indexe(entry.getKey()));
+
+ if (entry.getValue().toString().equals("null")) {
+ if (dynamicField.isRequired()) {
+ parsedData.getErrors().add(requiredErrorMessage(entry.getKey(), fullQualifiedNameOfField, indexes));
+ }
+ return;
+ }
+ Virtual virtual = traverseNode(entry.getValue(), dynamicField.getClazz(), dynamicField.getDynamicFields(), subIndexes, fullQualifiedNameOfField + "." + entry.getKey());
+
+ virtualObject.invoke(setterofField(dynamicField.getName()), virtual);
+ }
+
+ private boolean validateDate(String value, String formatDate, String separateurDate) {
+ boolean result = false;
+
+ StringBuilder dateToValidate = new StringBuilder(0);
+
+ if (separateurDate != null && !separateurDate.isEmpty()) {
+
+ String[] dateArray = value.split(separateurDate);
+
+ for (String d : dateArray) {
+ dateToValidate.append(d);
+ }
+ } else {
+ dateToValidate = new StringBuilder(value);
+ }
+
+ if (formatDate != null && !formatDate.isEmpty()) {
+ result = GenericValidator.isDate(dateToValidate.toString(), formatDate, false);
+ }
+ return result;
+ }
+
+ /**
+ * Méthode qui validate une donnée
+ *
+ * @param value
+ * @param classOfField
+ * @return
+ */
+ private Object validateValue(String value, JsonField dynamicField) {
+ Object finalValue = null;
+ Class classOfField = dynamicField.getClazz();
+
+ try {
+ if (classOfField.isAssignableFrom(LocalDate.class)) {
+
+ boolean isFormatted = validateDate(value, dynamicField.getFormatDate(), dynamicField.getSeparateurDate());
+
+ if (isFormatted) {
+ finalValue = value;
+ }
+
+ } else if (classOfField.isAssignableFrom(Long.class)) {
+
+ finalValue = Long.valueOf(value);
+ } else if (classOfField.isAssignableFrom(BigDecimal.class)) {
+ finalValue = new BigDecimal(value);
+
+ } else {
+ finalValue = value;
+ }
+ } catch (Exception ex) {
+ }
+ return finalValue;
+ }
+
+ private List<LocalDate> convertListOfDate(List<Object> genericValues) {
+ List<LocalDate> listeLocalDate = new ArrayList<>();
+
+ genericValues.forEach(g -> {
+
+ LocalDate localDate = null;
+
+ if (g != null) {
+ localDate = (LocalDate) g;
+ }
+
+ listeLocalDate.add(localDate);
+ });
+ return listeLocalDate;
+ }
+
+ private List<Long> convertListOfLong(List<Object> genericValues) {
+ List<Long> listeLong = new ArrayList<>();
+
+ genericValues.forEach(g -> {
+
+ Long longValue = null;
+
+ if (g != null) {
+ longValue = (Long) g;
+ }
+ listeLong.add(longValue);
+ });
+
+ return listeLong;
+ }
+
+ private List<BigDecimal> convertListOfBigDecimal(List<Object> genericValues) {
+ List<BigDecimal> listeBigDecimal = new ArrayList<>();
+
+ genericValues.forEach(g -> {
+
+ BigDecimal bigDecimalValue = null;
+
+ if (g != null) {
+ bigDecimalValue = (BigDecimal) g;
+ }
+
+ listeBigDecimal.add(bigDecimalValue);
+ });
+
+ return listeBigDecimal;
+ }
+
+ private List<String> convertListOfString(List<Object> genericValues) {
+ List<String> listeString = new ArrayList<>();
+
+ genericValues.forEach(g -> {
+
+ String str = null;
+
+ if (g != null) {
+ str = (String) g;
+ }
+
+ listeString.add(str);
+ });
+ return listeString;
+ }
+
+ /**
+ * Méthode qui converti une liste d'objets en une liste d'un type précis
+ *
+ * @param genericValues
+ * @param classOfField
+ * @return
+ */
+ private List convertToRealType(List<Object> genericValues, Class classOfField) {
+
+ if (classOfField.isAssignableFrom(LocalDate.class)) {
+ return convertListOfDate(genericValues);
+
+ } else if (classOfField.isAssignableFrom(Long.class)) {
+ return convertListOfLong(genericValues);
+
+ } else if (classOfField.isAssignableFrom(BigDecimal.class)) {
+ return convertListOfBigDecimal(genericValues);
+
+ } else {
+ return convertListOfString(genericValues);
+ }
+ }
+
+ private CustomError constructErrorMessage(List<Indexe> indexes) {
+ StringBuilder error = new StringBuilder();
+ CustomError customError = new CustomError();
+ customError.setEltNumber(indexes.get(0).getPosition());
+
+ indexes.forEach(indexe -> {
+
+ if (indexe.getFullQualifiedNameOfField() != null && !indexe.getFullQualifiedNameOfField().isEmpty() && indexe.getPosition() != 0) {
+ error.append("\"").append(indexe.getFullQualifiedNameOfField()).append("\"").append(" : ").append("Elément N° ").append(indexe.getPosition()).append(" : ");
+
+ } else if (indexe.getFullQualifiedNameOfField() != null && !indexe.getFullQualifiedNameOfField().isEmpty()) {
+ error.append("\"").append(indexe.getFullQualifiedNameOfField()).append("\"").append(" : ");
+
+ } else if (indexe.getPosition() != 0) {
+ error.append("Elément N° ").append(indexe.getPosition()).append(" : ");
+ }
+ });
+
+ customError.setMessage(error);
+ return customError;
+ }
+
+ private static String setterofField(String fieldName) {
+
+ String name = String.valueOf(fieldName.charAt(0)).toUpperCase() + fieldName.substring(1);
+
+ return "set" + name;
+ }
+}
diff --git a/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/extender/JsonDataValidator.java b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/extender/JsonDataValidator.java
new file mode 100644
index 0000000..754b602
--- /dev/null
+++ b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/extender/JsonDataValidator.java
@@ -0,0 +1,103 @@
+/*
+ * 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.dynamicjsonparser.extender;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.megatim.dynamicjsonparser.pojo.CustomError;
+import com.megatim.dynamicjsonparser.pojo.JsonField;
+import com.megatim.dynamicjsonparser.pojo.JsonParsedData;
+import com.megatim.dynamicjsonparser.pojo.Node;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import org.burningwave.core.assembler.ComponentContainer;
+import org.burningwave.core.assembler.ComponentSupplier;
+import org.burningwave.core.classes.ClassFactory;
+import org.burningwave.core.classes.UnitSourceGenerator;
+import java.util.Collections;
+import java.util.concurrent.ForkJoinPool;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * Classe permettant d'extraire les données d'un fichier json, de les valider
+ *
+ * @author ASUS
+ */
+public class JsonDataValidator {
+
+ private JsonParsedData parsedData;
+
+ public JsonParsedData getParsedData() {
+ return parsedData;
+ }
+
+ /**
+ * Méthode permettant d'extraire les données d'in fichier json
+ *
+ * @param dynamicFields
+ * @param storePath
+ * @param packageName : nom du package de la classe
+ * @param dataFile : fichier Json d'où proviennent les données à valider
+ * @param nbThreads
+ * @return : retourne vrai si la validation a été un succès, faux sinon
+ * @throws IOException
+ */
+ public boolean validateDatas(List<JsonField> dynamicFields, String storePath, String packageName, final File dataFile, int nbThreads) throws IOException {
+
+ // objet qui contient ls informations sur la classe dont on veut parser les instances
+ UnitSourceGenerator unitSG = RuntimeClassBuilder.createRuntimeClass(packageName, dynamicFields, storePath);
+
+ if (unitSG != null && packageName != null && !packageName.isEmpty() && dynamicFields != null && !dynamicFields.isEmpty() && dataFile != null) {
+ unitSG.make();
+
+ ComponentSupplier componentSupplier = ComponentContainer.getInstance();
+ ClassFactory classFactory = componentSupplier.getClassFactory();
+
+ try ( ClassFactory.ClassRetriever classRetriever = classFactory.loadOrBuildAndDefine(unitSG)) {
+ Class classOfEntity = classRetriever.get(packageName + "." + dynamicFields.get(0).getClassName());
+
+ ObjectMapper mapper = new ObjectMapper();
+ JsonNode parentNode = mapper.readTree(dataFile);
+
+ parsedData = process(parentNode, classOfEntity, dynamicFields, dynamicFields.get(0).getClassName(), nbThreads);
+ }
+ }
+ parsedData.getErrors().removeIf(c -> c == null || c.getEltNumber() == null);
+ Collections.sort(parsedData.getErrors(), (CustomError c1, CustomError c2) -> c1.getEltNumber().compareTo(c2.getEltNumber()));
+
+ return parsedData.getErrors().isEmpty();
+ }
+
+ /**
+ *
+ * @param parentNode
+ * @param classOfEntity
+ * @param rootClass
+ */
+ private JsonParsedData process(JsonNode parentNode, Class classOfEntity, List<JsonField> dynamicFields, String rootClass, int nbThreads) {
+ Map<String, JsonField> dynamicFieldsToMap = dynamicFields.stream().collect(Collectors.toMap(JsonField::getName, Function.identity()));
+ List<Node> nodes = constructList(parentNode);
+
+ ForkJoinPool pool = new ForkJoinPool();
+ return pool.invoke(new DataRetrieverAction(nodes, classOfEntity, dynamicFields, rootClass, nbThreads));
+ }
+
+ private List<Node> constructList(JsonNode parent) {
+ List<Node> nodes = new ArrayList<>();
+
+ if (parent.isArray()) {//Si les données sont dans un tableau {
+ for (int j = 0; j < parent.size(); j++) {
+ nodes.add(new Node(parent.get(j), j + 1));
+ }
+ } else if (!parent.isEmpty()) {
+ nodes.add(new Node(parent, 1));
+ }
+ return nodes;
+ }
+}
diff --git a/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/extender/RuntimeClassBuilder.java b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/extender/RuntimeClassBuilder.java
new file mode 100644
index 0000000..2b24335
--- /dev/null
+++ b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/extender/RuntimeClassBuilder.java
@@ -0,0 +1,153 @@
+/*
+ * 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.dynamicjsonparser.extender;
+
+import com.megatim.dynamicjsonparser.pojo.JsonField;
+import java.io.Serializable;
+import java.lang.reflect.Modifier;
+import java.time.LocalDate;
+import java.util.List;
+import org.burningwave.core.Virtual;
+import org.burningwave.core.assembler.ComponentContainer;
+import org.burningwave.core.assembler.ComponentSupplier;
+import org.burningwave.core.classes.AnnotationSourceGenerator;
+import org.burningwave.core.classes.ClassFactory;
+import org.burningwave.core.classes.ClassSourceGenerator;
+import org.burningwave.core.classes.FunctionSourceGenerator;
+import org.burningwave.core.classes.GenericSourceGenerator;
+import org.burningwave.core.classes.TypeDeclarationSourceGenerator;
+import org.burningwave.core.classes.UnitSourceGenerator;
+import org.burningwave.core.classes.VariableSourceGenerator;
+
+/**
+ *
+ * @author ASUS
+ */
+public class RuntimeClassBuilder {
+
+ /**
+ * Méthode qui crée dynamiquement une classe Java
+ * @param packagename : nom du package de la classe
+ * @param fields : liste des chmaps de la classe
+ * @param classPathFolder : chemin où sera stocké la classe sur le disque
+ * @return
+ */
+ public static UnitSourceGenerator createRuntimeClass(final String packagename, List<JsonField> fields,String classPathFolder) {
+ final String className = fields.get(0).getClassName();
+
+ //Ajout modificateur d'accès de la classe
+ ClassSourceGenerator clazz = ClassSourceGenerator
+ .create(TypeDeclarationSourceGenerator.create(className))
+ .addModifier(Modifier.PUBLIC);
+
+ //Ajout des interfaces à implémenter
+ clazz.addConcretizedType(Serializable.class)
+ .addConcretizedType(Virtual.class);
+
+ //Déclaration des champs de la classe
+ fields.forEach(f -> {
+
+ //Si le type du champ est encore à construire
+ if (f.getDynamicFields() != null && !f.getDynamicFields().isEmpty()) {
+
+ //Appel récursif afin de construire le sous-type
+ UnitSourceGenerator subUnitSG = createRuntimeClass(packagename, f.getDynamicFields(),classPathFolder);
+
+ ComponentSupplier componentSupplier = ComponentContainer.getInstance();
+ ClassFactory classFactory = componentSupplier.getClassFactory();
+
+ try ( ClassFactory.ClassRetriever classRetriever = classFactory.loadOrBuildAndDefine(subUnitSG)) {
+
+ Class classOfField = classRetriever.get(packagename + "." + f.getDynamicFields().get(0).getClassName());
+ f.setClazz(classOfField);
+ }
+
+ }
+
+ //Si le type du champ est connu
+ if (f.getClazz() != null) {
+
+ if (f.isCollection()) {
+ clazz.addField(VariableSourceGenerator.create(TypeDeclarationSourceGenerator.create(List.class).addGeneric(GenericSourceGenerator.create(f.getClazz())), f.getName())
+ .addModifier(Modifier.PRIVATE));
+ } else {
+ Class realClass = f.getClazz().equals(LocalDate.class) ? String.class : f.getClazz();
+ clazz.addField(
+ VariableSourceGenerator.create(realClass, f.getName())
+ .addModifier(Modifier.PRIVATE)
+ );
+ }
+
+ }
+ });
+
+ //Déclaration du constructeur sans argument
+ clazz.addConstructor(FunctionSourceGenerator.create().addModifier(Modifier.PUBLIC).addBodyCodeLine());
+
+ fields.forEach(f -> {
+ String fieldName = String.valueOf(f.getName().charAt(0)).toUpperCase() + f.getName().substring(1);
+
+ if (f.getClazz() != null) {
+
+ //Déclaration du getter de chaque attribut
+ FunctionSourceGenerator getter = FunctionSourceGenerator.create("get" + fieldName)
+ .addModifier(Modifier.PUBLIC)
+ .addBodyCodeLine("return this." + f.getName() + ";");
+
+ Class realClass = f.getClazz().equals(LocalDate.class) ? String.class : f.getClazz();
+
+ if(f.isCollection()) {
+ getter.setReturnType(TypeDeclarationSourceGenerator.create(List.class).addGeneric(GenericSourceGenerator.create(realClass)));
+
+ } else {
+ getter.setReturnType(realClass);
+ }
+ clazz.addMethod(getter);
+
+ //Déclaration du setter de chaque attribut
+ FunctionSourceGenerator setter = FunctionSourceGenerator.create("set" + fieldName)
+ .addModifier(Modifier.PUBLIC)
+ .setReturnType(void.class)
+ .addBodyCodeLine("this." + f.getName() + " = " + f.getName() + ";");
+
+ if(f.isCollection()) {
+ setter.addParameter(VariableSourceGenerator.create(TypeDeclarationSourceGenerator.create(List.class).addGeneric(GenericSourceGenerator.create(realClass)), f.getName()));
+ } else {
+ setter.addParameter(VariableSourceGenerator.create(realClass, f.getName()));
+ }
+ clazz.addMethod(setter);
+ }
+ });
+
+ //Définition de la valeur de retour de la méthode toString()
+ StringBuilder toString = new StringBuilder();
+ for (JsonField f : fields) {
+ toString.append("this.").append(f.getName()).append("+").append("\",\"").append("+");
+ }
+
+ //Retirer les caractères +","+
+ toString.replace(toString.length() - 5, toString.length(), "");
+
+ //Déclaration de la méthode toString
+ clazz.addMethod(
+ FunctionSourceGenerator.create("toString")
+ .addAnnotation(AnnotationSourceGenerator.create(Override.class))
+ .addModifier(Modifier.PUBLIC)
+ .setReturnType(String.class)
+ .addBodyCodeLine("return " + toString + ";")
+ );
+
+ UnitSourceGenerator unitSG = UnitSourceGenerator.create(packagename).addClass(clazz);
+ unitSG.make();
+
+ //Enregistre la classe sur le disque
+ if(classPathFolder != null && !classPathFolder.isEmpty()) {
+ unitSG.storeToClassPath(classPathFolder);
+ }
+
+ return unitSG;
+ }
+
+}
diff --git a/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/extender/SourceCompiler.java b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/extender/SourceCompiler.java
new file mode 100644
index 0000000..5d1afb8
--- /dev/null
+++ b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/extender/SourceCompiler.java
@@ -0,0 +1,35 @@
+/*
+ * 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.dynamicjsonparser.extender;
+
+import org.burningwave.core.assembler.ComponentContainer;
+import static org.burningwave.core.assembler.StaticComponentContainer.ClassLoaders;
+import org.burningwave.core.classes.JavaMemoryCompiler;
+import org.burningwave.core.classes.JavaMemoryCompiler.Compilation;
+import org.burningwave.core.classes.UnitSourceGenerator;
+import org.burningwave.core.concurrent.QueuedTaskExecutor.ProducerTask;
+
+/**
+ *
+ * @author ASUS
+ */
+public class SourceCompiler {
+
+ public static Class<?> compileAndLoad(UnitSourceGenerator unitSG, String binaryFilePath, String fullQualifiedName) throws ClassNotFoundException {
+ ComponentContainer componentContainer = ComponentContainer.getInstance();
+ JavaMemoryCompiler javaMemoryCompiler = componentContainer.getJavaMemoryCompiler();
+
+ ProducerTask<Compilation.Result> compilationTask = javaMemoryCompiler.compile(
+ Compilation.Config.forUnitSourceGenerator(unitSG).storeCompiledClassesTo(binaryFilePath));
+ Compilation.Result compilationResult = compilationTask.join();
+
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ ClassLoaders.addClassPaths(classLoader, compilationResult.getDependencies());
+ ClassLoaders.addClassPath(classLoader, compilationResult.getClassPath().getAbsolutePath());
+
+ return classLoader.loadClass(fullQualifiedName);
+ }
+
+}
diff --git a/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/generated/CompteBancaire.java b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/generated/CompteBancaire.java
new file mode 100644
index 0000000..1ac3941
--- /dev/null
+++ b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/generated/CompteBancaire.java
@@ -0,0 +1,54 @@
+package com.megatim.dynamicjsonparser.generated;
+
+import java.io.Serializable;
+import java.lang.Override;
+import java.lang.String;
+import java.math.BigDecimal;
+import org.burningwave.core.Virtual;
+
+public class CompteBancaire implements Serializable, Virtual {
+
+ private String dateCreation;
+ private String rib;
+ private BigDecimal solde;
+
+ public CompteBancaire() {
+
+ }
+
+ public String getDateCreation() {
+ return this.dateCreation;
+ }
+
+ public void setDateCreation(
+ String dateCreation
+ ) {
+ this.dateCreation = dateCreation;
+ }
+
+ public String getRib() {
+ return this.rib;
+ }
+
+ public void setRib(
+ String rib
+ ) {
+ this.rib = rib;
+ }
+
+ public BigDecimal getSolde() {
+ return this.solde;
+ }
+
+ public void setSolde(
+ BigDecimal solde
+ ) {
+ this.solde = solde;
+ }
+
+ @Override
+ public String toString() {
+ return this.dateCreation+","+this.rib+","+this.solde;
+ }
+
+}
\ No newline at end of file
diff --git a/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/generated/Personne.java b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/generated/Personne.java
new file mode 100644
index 0000000..9c5833e
--- /dev/null
+++ b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/generated/Personne.java
@@ -0,0 +1,79 @@
+package com.megatim.dynamicjsonparser.generated;
+
+import com.megatim.dynamicjsonparser.generated.CompteBancaire;
+import java.io.Serializable;
+import java.lang.Long;
+import java.lang.Override;
+import java.lang.String;
+import java.math.BigDecimal;
+import java.util.List;
+import org.burningwave.core.Virtual;
+
+public class Personne implements Serializable, Virtual {
+
+ private List<Long> numeros;
+ private Long nbreEnfants;
+ private String dateNaissance;
+ private BigDecimal salaire;
+ private List<CompteBancaire> cptBanque;
+
+ public Personne() {
+
+ }
+
+ public List<Long> getNumeros() {
+ return this.numeros;
+ }
+
+ public void setNumeros(
+ List<Long> numeros
+ ) {
+ this.numeros = numeros;
+ }
+
+ public Long getNbreEnfants() {
+ return this.nbreEnfants;
+ }
+
+ public void setNbreEnfants(
+ Long nbreEnfants
+ ) {
+ this.nbreEnfants = nbreEnfants;
+ }
+
+ public String getDateNaissance() {
+ return this.dateNaissance;
+ }
+
+ public void setDateNaissance(
+ String dateNaissance
+ ) {
+ this.dateNaissance = dateNaissance;
+ }
+
+ public BigDecimal getSalaire() {
+ return this.salaire;
+ }
+
+ public void setSalaire(
+ BigDecimal salaire
+ ) {
+ this.salaire = salaire;
+ }
+
+ public List<CompteBancaire> getCptBanque() {
+ return this.cptBanque;
+ }
+
+ public void setCptBanque(
+ List<CompteBancaire> cptBanque
+ ) {
+ this.cptBanque = cptBanque;
+ }
+
+ @Override
+ public String toString() {
+ return this.numeros+","+this.nbreEnfants+","+this.dateNaissance+","+this.salaire+","+this.cptBanque;
+ }
+
+}
\ No newline at end of file
diff --git a/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/CustomError.java b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/CustomError.java
new file mode 100644
index 0000000..50dd836
--- /dev/null
+++ b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/CustomError.java
@@ -0,0 +1,33 @@
+/*
+ * 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.dynamicjsonparser.pojo;
+
+/**
+ *
+ * @author ASUS
+ */
+public class CustomError {
+ private StringBuilder message;
+
+ private Integer eltNumber;
+
+ public StringBuilder getMessage() {
+ return message;
+ }
+
+ public void setMessage(StringBuilder message) {
+ this.message = message;
+ }
+
+ public Integer getEltNumber() {
+ return eltNumber;
+ }
+
+ public void setEltNumber(Integer eltNumber) {
+ this.eltNumber = eltNumber;
+ }
+
+
+}
diff --git a/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/Indexe.java b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/Indexe.java
new file mode 100644
index 0000000..544a73d
--- /dev/null
+++ b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/Indexe.java
@@ -0,0 +1,46 @@
+/*
+ * 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.dynamicjsonparser.pojo;
+
+/**
+ *
+ * @author ASUS
+ */
+public class Indexe {
+ private int position;
+
+ private String fullQualifiedNameOfField;
+
+ public Indexe(int position) {
+ this.position = position;
+ }
+
+ public Indexe(int position, String fullQualifiedNameOfField) {
+ this.position = position;
+ this.fullQualifiedNameOfField = fullQualifiedNameOfField;
+ }
+
+ public Indexe(String fullQualifiedNameOfField) {
+ this.fullQualifiedNameOfField = fullQualifiedNameOfField;
+ }
+
+ public int getPosition() {
+ return position;
+ }
+
+ public void setPosition(int position) {
+ this.position = position;
+ }
+
+ public String getFullQualifiedNameOfField() {
+ return fullQualifiedNameOfField;
+ }
+
+ public void setFullQualifiedNameOfField(String fullQualifiedNameOfField) {
+ this.fullQualifiedNameOfField = fullQualifiedNameOfField;
+ }
+
+
+}
diff --git a/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/JsonDataType.java b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/JsonDataType.java
new file mode 100644
index 0000000..3f337d1
--- /dev/null
+++ b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/JsonDataType.java
@@ -0,0 +1,138 @@
+/*
+ * 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.dynamicjsonparser.pojo;
+
+import com.megatim.dynamicjsonparser.enums.TypeDonnee;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author ASUS
+ */
+public class JsonDataType {
+
+ //nom du champ
+ private String fieldName;
+
+ //Type du champ si ce type est un primitif
+ private TypeDonnee typeDonnee;
+
+ // Liste des attributs de l'objet, si le type du champ est un objet Java à définir
+ private List<JsonDataType> jsonDataTypes = new ArrayList<>();
+
+ //Renseigne si ce champ est une collection(liste)
+ private boolean collection;
+
+ //Nom de la classe à laquelle appartient ce champ
+ private String className;
+
+ private String formatDate;
+
+ private String separateurDate;
+
+ private boolean required;
+
+ public JsonDataType(String fieldName, TypeDonnee typeDonnee, String className, boolean collection) {
+ this.fieldName = fieldName;
+ this.typeDonnee = typeDonnee;
+ this.className = className;
+ this.collection = collection;
+ }
+
+ public JsonDataType(String fieldName, List<JsonDataType> jsonDataTypes, String className, boolean collection) {
+ this.fieldName = fieldName;
+ this.jsonDataTypes = jsonDataTypes;
+ this.className = className;
+ this.collection = collection;
+ this.typeDonnee = TypeDonnee.OBJET;
+ }
+
+ public JsonDataType(String fieldName, TypeDonnee typeDonnee, String className, boolean required, boolean collection) {
+ this.fieldName = fieldName;
+ this.typeDonnee = typeDonnee;
+ this.className = className;
+ this.required = required;
+ this.collection = collection;
+ }
+
+ public JsonDataType(String fieldName, List<JsonDataType> jsonDataTypes, String className, boolean required, boolean collection) {
+ this.fieldName = fieldName;
+ this.jsonDataTypes = jsonDataTypes;
+ this.className = className;
+ this.required = required;
+ this.collection = collection;
+ this.typeDonnee = TypeDonnee.OBJET;
+ }
+
+ @Override
+ public String toString() {
+ return "JsonDataType{" + "fieldName=" + fieldName + ", typeDonnee=" + typeDonnee + ", jsonDataTypes=" + jsonDataTypes + ", collection=" + collection + ", className=" + className + ", formatDate=" + formatDate + ", separateurDate=" + separateurDate + ", required=" + required + '}';
+ }
+
+ public String getFieldName() {
+ return fieldName;
+ }
+
+ public void setFieldName(String fieldName) {
+ this.fieldName = fieldName;
+ }
+
+ public TypeDonnee getTypeDonnee() {
+ return typeDonnee;
+ }
+
+ public void setTypeDonnee(TypeDonnee typeDonnee) {
+ this.typeDonnee = typeDonnee;
+ }
+
+ public List<JsonDataType> getJsonDataTypes() {
+ return jsonDataTypes;
+ }
+
+ public void setJsonDataTypes(List<JsonDataType> jsonDataTypes) {
+ this.jsonDataTypes = jsonDataTypes;
+ }
+
+ public String getClassName() {
+ return className;
+ }
+
+ public void setClassName(String className) {
+ this.className = className;
+ }
+
+ public boolean isCollection() {
+ return collection;
+ }
+
+ public void setCollection(boolean collection) {
+ this.collection = collection;
+ }
+
+ public String getFormatDate() {
+ return formatDate;
+ }
+
+ public void setFormatDate(String formatDate) {
+ this.formatDate = formatDate;
+ }
+
+ public String getSeparateurDate() {
+ return separateurDate;
+ }
+
+ public void setSeparateurDate(String separateurDate) {
+ this.separateurDate = separateurDate;
+ }
+
+ public boolean isRequired() {
+ return required;
+ }
+
+ public void setRequired(boolean required) {
+ this.required = required;
+ }
+}
diff --git a/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/JsonField.java b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/JsonField.java
new file mode 100644
index 0000000..2cd3a5d
--- /dev/null
+++ b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/JsonField.java
@@ -0,0 +1,130 @@
+/*
+ * 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.dynamicjsonparser.pojo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author ASUS
+ */
+public class JsonField {
+
+ private Class clazz;
+
+ private final String name;
+
+ private final String className;
+
+ private int lengthh;
+
+ private List<JsonField> dynamicFields = new ArrayList<>();
+
+ private final boolean collection;
+
+ private boolean required;
+
+ private String formatDate;
+
+ private String separateurDate;
+
+ public JsonField(Class clazz, String name, String className, boolean collection) {
+ this.clazz = clazz;
+ this.name = name;
+ this.className = className;
+ this.collection = collection;
+ }
+
+ public JsonField(String name, List<JsonField> dynamicFields, String className, boolean collection) {
+ this.name = name;
+ this.dynamicFields = dynamicFields;
+ this.className = className;
+ this.collection = collection;
+ }
+
+ public JsonField(Class clazz, String name, String className, int lengthh, boolean required, boolean collection) {
+ this.clazz = clazz;
+ this.name = name;
+ this.className = className;
+ this.lengthh = lengthh;
+ this.required = required;
+ this.collection = collection;
+ }
+
+ public JsonField(String name, List<JsonField> dynamicFields, String className, int lengthh, boolean required, boolean collection) {
+ this.name = name;
+ this.dynamicFields = dynamicFields;
+ this.className = className;
+ this.lengthh = lengthh;
+ this.required = required;
+ this.collection = collection;
+ }
+
+ @Override
+ public String toString() {
+ return "DynamicField{" + "clazz=" + clazz + ", name=" + name + ", className=" + className + ", dynamicFields=" + dynamicFields + ", collection=" + collection + ", required=" + required + ", formatDate=" + formatDate + ", separateurDate=" + separateurDate + '}';
+ }
+
+ public Class getClazz() {
+ return clazz;
+ }
+
+ public void setClazz(Class clazz) {
+ this.clazz = clazz;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getClassName() {
+ return className;
+ }
+
+ public List<JsonField> getDynamicFields() {
+ return dynamicFields;
+ }
+
+ public void setDynamicFields(List<JsonField> dynamicFields) {
+ this.dynamicFields = dynamicFields;
+ }
+
+ public boolean isCollection() {
+ return collection;
+ }
+
+ public String getFormatDate() {
+ return formatDate;
+ }
+
+ public void setFormatDate(String formatDate) {
+ this.formatDate = formatDate;
+ }
+
+ public String getSeparateurDate() {
+ return separateurDate;
+ }
+
+ public void setSeparateurDate(String separateurDate) {
+ this.separateurDate = separateurDate;
+ }
+
+ public boolean isRequired() {
+ return required;
+ }
+
+ public void setRequired(boolean required) {
+ this.required = required;
+ }
+
+ public int getLengthh() {
+ return lengthh;
+ }
+
+ public void setLengthh(int lengthh) {
+ this.lengthh = lengthh;
+ }
+}
diff --git a/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/JsonParsedData.java b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/JsonParsedData.java
new file mode 100644
index 0000000..a8adb94
--- /dev/null
+++ b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/JsonParsedData.java
@@ -0,0 +1,40 @@
+/*
+ * 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.dynamicjsonparser.pojo;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import org.burningwave.core.Virtual;
+
+/**
+ *
+ * @author ASUS
+ */
+public class JsonParsedData {
+
+ //Liste des données
+ private List<Virtual> virtuals = Collections.synchronizedList(new ArrayList<>());
+
+ //Liste des erreurs
+ private List<CustomError> errors = new ArrayList<>();
+
+ public JsonParsedData() {
+ }
+
+ public JsonParsedData(List<Virtual> virtuals, List<CustomError> errors) {
+ this.errors = errors;
+ this.virtuals = virtuals;
+ }
+
+ public List<Virtual> getVirtuals() {
+ return virtuals;
+ }
+
+ public List<CustomError> getErrors() {
+ return errors;
+ }
+
+}
diff --git a/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/Node.java b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/Node.java
new file mode 100644
index 0000000..5744d46
--- /dev/null
+++ b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/pojo/Node.java
@@ -0,0 +1,40 @@
+/*
+ * 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.dynamicjsonparser.pojo;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+/**
+ *
+ * @author ASUS
+ */
+public class Node {
+ private JsonNode node;
+
+ private int index;
+
+ public Node(JsonNode node, int index) {
+ this.node = node;
+ this.index = index;
+ }
+
+ public JsonNode getNode() {
+ return node;
+ }
+
+ public void setNode(JsonNode node) {
+ this.node = node;
+ }
+
+ public int getIndex() {
+ return index;
+ }
+
+ public void setIndex(int index) {
+ this.index = index;
+ }
+
+
+}
diff --git a/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/utils/Utility.java b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/utils/Utility.java
new file mode 100644
index 0000000..1012a6f
--- /dev/null
+++ b/dynamicjsonparser/src/main/java/com/megatim/dynamicjsonparser/utils/Utility.java
@@ -0,0 +1,37 @@
+/*
+ * 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.dynamicjsonparser.utils;
+
+import com.megatim.dynamicjsonparser.pojo.CustomError;
+import java.io.BufferedWriter;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
+import java.util.List;
+
+/**
+ *
+ * @author ASUS
+ */
+public class Utility {
+ /**
+ * Méthode qui écrit une liste de String dans un fichier
+ *
+ * @param errors
+ * @param errorPath : Chemin du fichier
+ */
+ public static void writeToFile(List<CustomError> errors, Path errorPath) {
+
+ try ( BufferedWriter bufferWriter = Files.newBufferedWriter(errorPath, StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.CREATE, StandardOpenOption.SYNC)) {
+
+ for (CustomError c : errors) {
+ bufferWriter.write(c.getMessage() + System.lineSeparator());
+ }
+ } catch (Exception ex) {
+
+ }
+ }
+}
diff --git a/dynamicjsonparser/target/classes/.netbeans_automatic_build b/dynamicjsonparser/target/classes/.netbeans_automatic_build
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/dynamicjsonparser/target/classes/.netbeans_automatic_build
diff --git a/dynamicjsonparser/target/maven-archiver/pom.properties b/dynamicjsonparser/target/maven-archiver/pom.properties
new file mode 100644
index 0000000..dc23f3f
--- /dev/null
+++ b/dynamicjsonparser/target/maven-archiver/pom.properties
@@ -0,0 +1,5 @@
+#Generated by Maven
+#Fri Jun 19 12:10:24 WAT 2026
+version=1.0
+groupId=com.megatim
+artifactId=dynamicjsonparser
diff --git a/dynamicjsonparser/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/dynamicjsonparser/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
new file mode 100644
index 0000000..0d2f319
--- /dev/null
+++ b/dynamicjsonparser/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
@@ -0,0 +1,16 @@
+com\megatim\dynamicjsonparser\generated\Personne.class
+com\megatim\dynamicjsonparser\pojo\CustomError.class
+com\megatim\dynamicjsonparser\extender\JsonDataProcessor.class
+com\megatim\dynamicjsonparser\extender\JsonDataValidator.class
+com\megatim\dynamicjsonparser\pojo\JsonParsedData.class
+com\megatim\dynamicjsonparser\App.class
+com\megatim\dynamicjsonparser\extender\DataRetrieverAction.class
+com\megatim\dynamicjsonparser\pojo\JsonDataType.class
+com\megatim\dynamicjsonparser\enums\TypeDonnee.class
+com\megatim\dynamicjsonparser\generated\CompteBancaire.class
+com\megatim\dynamicjsonparser\extender\RuntimeClassBuilder.class
+com\megatim\dynamicjsonparser\pojo\JsonField.class
+com\megatim\dynamicjsonparser\extender\SourceCompiler.class
+com\megatim\dynamicjsonparser\utils\Utility.class
+com\megatim\dynamicjsonparser\pojo\Indexe.class
+com\megatim\dynamicjsonparser\pojo\Node.class
diff --git a/dynamicjsonparser/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/dynamicjsonparser/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
new file mode 100644
index 0000000..1515d11
--- /dev/null
+++ b/dynamicjsonparser/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
@@ -0,0 +1,16 @@
+C:\Users\ASUS\Documents\NetBeansProjects\share_sources\dynamicjsonparser\src\main\java\com\megatim\dynamicjsonparser\utils\Utility.java
+C:\Users\ASUS\Documents\NetBeansProjects\share_sources\dynamicjsonparser\src\main\java\com\megatim\dynamicjsonparser\enums\TypeDonnee.java
+C:\Users\ASUS\Documents\NetBeansProjects\share_sources\dynamicjsonparser\src\main\java\com\megatim\dynamicjsonparser\extender\DataRetrieverAction.java
+C:\Users\ASUS\Documents\NetBeansProjects\share_sources\dynamicjsonparser\src\main\java\com\megatim\dynamicjsonparser\generated\Personne.java
+C:\Users\ASUS\Documents\NetBeansProjects\share_sources\dynamicjsonparser\src\main\java\com\megatim\dynamicjsonparser\pojo\Indexe.java
+C:\Users\ASUS\Documents\NetBeansProjects\share_sources\dynamicjsonparser\src\main\java\com\megatim\dynamicjsonparser\pojo\Node.java
+C:\Users\ASUS\Documents\NetBeansProjects\share_sources\dynamicjsonparser\src\main\java\com\megatim\dynamicjsonparser\extender\JsonDataValidator.java
+C:\Users\ASUS\Documents\NetBeansProjects\share_sources\dynamicjsonparser\src\main\java\com\megatim\dynamicjsonparser\extender\RuntimeClassBuilder.java
+C:\Users\ASUS\Documents\NetBeansProjects\share_sources\dynamicjsonparser\src\main\java\com\megatim\dynamicjsonparser\App.java
+C:\Users\ASUS\Documents\NetBeansProjects\share_sources\dynamicjsonparser\src\main\java\com\megatim\dynamicjsonparser\extender\SourceCompiler.java
+C:\Users\ASUS\Documents\NetBeansProjects\share_sources\dynamicjsonparser\src\main\java\com\megatim\dynamicjsonparser\pojo\JsonField.java
+C:\Users\ASUS\Documents\NetBeansProjects\share_sources\dynamicjsonparser\src\main\java\com\megatim\dynamicjsonparser\pojo\JsonDataType.java
+C:\Users\ASUS\Documents\NetBeansProjects\share_sources\dynamicjsonparser\src\main\java\com\megatim\dynamicjsonparser\pojo\JsonParsedData.java
+C:\Users\ASUS\Documents\NetBeansProjects\share_sources\dynamicjsonparser\src\main\java\com\megatim\dynamicjsonparser\extender\JsonDataProcessor.java
+C:\Users\ASUS\Documents\NetBeansProjects\share_sources\dynamicjsonparser\src\main\java\com\megatim\dynamicjsonparser\pojo\CustomError.java
+C:\Users\ASUS\Documents\NetBeansProjects\share_sources\dynamicjsonparser\src\main\java\com\megatim\dynamicjsonparser\generated\CompteBancaire.java
diff --git a/dynamicjsonparser/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/dynamicjsonparser/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/dynamicjsonparser/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
diff --git a/dynamicjsonparser/target/test-classes/.netbeans_automatic_build b/dynamicjsonparser/target/test-classes/.netbeans_automatic_build
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/dynamicjsonparser/target/test-classes/.netbeans_automatic_build
--
Gitblit v1.10.0