/* * 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.contrat; import com.megatim.fdxcommons.model.pojo.JsonTableDefinition; import com.megatim.fdxcommons.model.enumeration.TypeDonnee; import com.megatim.fdxcommons.model.integration.ColumnDefinition; import com.megatim.fdxcommons.model.integration.json.JsonStructure; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; /** * * @author ASUS */ public class JsonStructureIterator { private final JsonStructure jsonStructure; private final String tableName; public JsonStructureIterator(String tableName, JsonStructure jsonStructure) { this.jsonStructure = jsonStructure; this.tableName = tableName; } /** * ColumnDefinition mais avec le nom complet de la colonne (exples : * adresse.ville, cpteBanque.rib pour les colonnes de niveau 2) * * @return */ public List columnsDefinitionWithFullQualifiedName() { List columnsDefinition = new ArrayList<>(); List fields = jsonStructure.getFields(); List fieldsWithoutParent = fields.stream().filter(f -> !f.getTypeDonnee().equals(TypeDonnee.OBJET)).collect(Collectors.toList()); List fieldsWithParent = fields.stream().filter(f -> f.getTypeDonnee().equals(TypeDonnee.OBJET)).collect(Collectors.toList()); columnsDefinition.addAll(columnsDefinitionWithFullQualifiedName(fieldsWithoutParent, "")); fieldsWithParent.stream().forEach(j -> columnsDefinition.addAll(columnsDefinitionWithFullQualifiedName(j, ""))); return columnsDefinition; } public JsonTableDefinition tableDefinition() throws SQLException { List fields = jsonStructure.getFields(); List simpleFields = fields.stream().filter(f -> !f.isCollection() && !f.getTypeDonnee().equals(TypeDonnee.OBJET)).collect(Collectors.toList()); JsonTableDefinition tableDefinition = new JsonTableDefinition(tableName.toLowerCase(), columnsDefinition(simpleFields), null, ""); List objectFields = fields.stream().filter(f -> f.isCollection() || f.getTypeDonnee().equals(TypeDonnee.OBJET)).collect(Collectors.toList()); for (JsonStructure j : objectFields) { tableDefinition.getTablesDefinition().add(tableDefinition(j, tableName, j.getName())); } return tableDefinition; } private List columnsDefinitionWithFullQualifiedName(JsonStructure jsonStructure, String parentFullQualifiedName) { List columnsDefinition = new ArrayList<>(); for (JsonStructure j : jsonStructure.getFields()) { if (j.getTypeDonnee().equals(TypeDonnee.OBJET)) { if (parentFullQualifiedName.isEmpty()) { columnsDefinition.addAll(columnsDefinitionWithFullQualifiedName(j, jsonStructure.getName())); } else { columnsDefinition.addAll(columnsDefinitionWithFullQualifiedName(j, parentFullQualifiedName + "." + jsonStructure.getName())); } } else { if (parentFullQualifiedName.isEmpty()) { columnsDefinition.add(columnDefinitionWithFullQualifiedName(j, jsonStructure.getName())); } else { columnsDefinition.add(columnDefinitionWithFullQualifiedName(j, parentFullQualifiedName + "." + jsonStructure.getName())); } } } return columnsDefinition; } private JsonTableDefinition tableDefinition(JsonStructure jsonStruct, String parentTableName, String parentFieldName) { JsonTableDefinition tableDef = null; if (jsonStruct.getTypeDonnee().equals(TypeDonnee.OBJET)) { List simpleFields = jsonStruct.getFields().stream().filter(f -> !f.isCollection() && !f.getTypeDonnee().equals(TypeDonnee.OBJET)).collect(Collectors.toList()); tableDef = new JsonTableDefinition((parentTableName + "_" + jsonStruct.getName()).toLowerCase(), columnsDefinition(simpleFields), parentTableName.toLowerCase(), parentFieldName); List objectFields = jsonStruct.getFields().stream().filter(f -> f.isCollection() || f.getTypeDonnee().equals(TypeDonnee.OBJET)).collect(Collectors.toList()); for (JsonStructure j : objectFields) { String newParentTableName = parentTableName.isEmpty() ? jsonStruct.getName() : parentTableName + "_" + jsonStruct.getName(); String newParentFieldName = parentFieldName.isEmpty() ? jsonStruct.getName() : parentFieldName + "." + j.getName(); tableDef.getTablesDefinition().add(tableDefinition(j, newParentTableName, newParentFieldName)); } } else if (jsonStruct.isCollection()) { tableDef = new JsonTableDefinition((parentTableName + "_" + jsonStruct.getName()).toLowerCase(), columnsDefinition(Arrays.asList(jsonStruct)), parentTableName.toLowerCase(), parentFieldName); } return tableDef; } private List columnsDefinition(List fields) { List columnsDefinition = new ArrayList<>(); fields.stream().forEach(f -> columnsDefinition.add(new ColumnDefinition(f.getName(), f.getTypeDonnee().name(), f.getLengthh(), f.isRequired(), f.isCollection()))); return columnsDefinition; } private List columnsDefinitionWithFullQualifiedName(List fields, String parentFullQualifiedName) { List columnsDefinition = new ArrayList<>(); fields.stream().forEach(f -> { if (parentFullQualifiedName.isEmpty()) { columnsDefinition.add(new ColumnDefinition(f.getName(), f.getTypeDonnee().name(), f.getLengthh(), f.isRequired(), f.isCollection())); } else { columnsDefinition.add(new ColumnDefinition(parentFullQualifiedName + "." + f.getName(), f.getTypeDonnee().name(), f.getLengthh(), f.isRequired(), f.isCollection())); } } ); return columnsDefinition; } private ColumnDefinition columnDefinitionWithFullQualifiedName(JsonStructure f, String parentFullQualifiedName) { if (parentFullQualifiedName.isEmpty()) { return new ColumnDefinition(f.getName(), f.getTypeDonnee().name(), f.getLengthh(), f.isRequired(), f.isCollection()); } else { return new ColumnDefinition(parentFullQualifiedName + "." + f.getName(), f.getTypeDonnee().name(), f.getLengthh(), f.isRequired(), f.isCollection()); } } }