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 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 153 insertions(+), 0 deletions(-)

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;
+    }
+
+}

--
Gitblit v1.10.0