Kenmegne
7 days ago 23a46b4be35277e06ec89f48730eeb694e686be8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
 * 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<ColumnDefinition> columnsDefinitionWithFullQualifiedName() {
        List<ColumnDefinition> columnsDefinition = new ArrayList<>();
 
        List<JsonStructure> fields = jsonStructure.getFields();
        List<JsonStructure> fieldsWithoutParent = fields.stream().filter(f -> !f.getTypeDonnee().equals(TypeDonnee.OBJET)).collect(Collectors.toList());
        List<JsonStructure> 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<JsonStructure> fields = jsonStructure.getFields();
 
        List<JsonStructure> 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<JsonStructure> 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<ColumnDefinition> columnsDefinitionWithFullQualifiedName(JsonStructure jsonStructure, String parentFullQualifiedName) {
        List<ColumnDefinition> 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<JsonStructure> 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<JsonStructure> 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<ColumnDefinition> columnsDefinition(List<JsonStructure> fields) {
        List<ColumnDefinition> 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<ColumnDefinition> columnsDefinitionWithFullQualifiedName(List<JsonStructure> fields, String parentFullQualifiedName) {
        List<ColumnDefinition> 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());
        }
 
    }
}