/* * 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 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 dynamicFields, String rootClass, int nbThreads) { Map dynamicFieldsToMap = dynamicFields.stream().collect(Collectors.toMap(JsonField::getName, Function.identity())); List nodes = constructList(parentNode); ForkJoinPool pool = new ForkJoinPool(); return pool.invoke(new DataRetrieverAction(nodes, classOfEntity, dynamicFields, rootClass, nbThreads)); } private List constructList(JsonNode parent) { List 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; } }