/*
|
* 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.queries.metadata;
|
|
import com.megatim.fdxcommons.model.enumeration.TypeDonnee;
|
import com.megatim.fdxcommons.model.integration.json.JsonStructure;
|
import com.megatim.fdxcommons.model.pojo.JsonColumnDefinition;
|
import com.megatim.fdxcommons.tools.database.exceptions.BadDataValueException;
|
import com.megatim.fdxcommons.tools.database.exceptions.ColumnNotFoundException;
|
import com.megatim.fdxcommons.tools.database.exceptions.LocalDateTimeValueParseError;
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.HashSet;
|
import java.util.LinkedHashMap;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.Set;
|
import org.apache.commons.validator.GenericValidator;
|
|
/**
|
*
|
* @author ASUS
|
*/
|
public class JsonFdxParsedDataRow {
|
|
private final Map<String, Object> data;
|
private final Map<String, Object> row = new LinkedHashMap<>();
|
private final Map<String, JsonColumnDefinition> columnNameToColumnDefinition = new HashMap<>();
|
|
public JsonFdxParsedDataRow(Map<String, Object> data, JsonStructure jsonStructure) {
|
this.data = data;
|
columnNameToJsonColumnDefinition(jsonStructure);
|
}
|
|
public Map<String, Object> dataRow() throws ColumnNotFoundException, BadDataValueException, LocalDateTimeValueParseError {
|
Set<String> foundColumns = new HashSet<>();
|
|
if (row.isEmpty()) {
|
|
for (Map.Entry<String, Object> entry : data.entrySet()) {
|
|
String key = entry.getKey();
|
Object value = entry.getValue();
|
|
JsonColumnDefinition jsonColumnDefinition = columnNameToColumnDefinition.get(key.trim().toLowerCase());
|
|
if (jsonColumnDefinition == null) {
|
throw new ColumnNotFoundException("La colonne " + key + " n'est pas une colonne de ce type de fichier");
|
}
|
foundColumns.add(key.toLowerCase());
|
|
if (value == null) {
|
|
if (jsonColumnDefinition.isRequired()) {
|
throw new BadDataValueException("La valeur de la colonne " + jsonColumnDefinition.getName() + " est obligatoire");
|
}
|
return row;
|
}
|
if (jsonColumnDefinition.getTypeDonnee().equals(TypeDonnee.OBJET)) {
|
if (jsonColumnDefinition.isCollection()) {
|
if (value instanceof List) {
|
List<Object> objectsList = (List<Object>) value;
|
List<Object> parsedValues = new ArrayList<>();
|
int i = 0;
|
|
for (Object obj : objectsList) {
|
parsedValues.add(dataRow((Map<String, Object>) obj, jsonColumnDefinition.getColumnNameToColumnDefinition(), jsonColumnDefinition.getName(), i + 1));
|
i++;
|
}
|
row.put(key.trim(), parsedValues);
|
} else {
|
throw new BadDataValueException("La valeur de la colonne " + jsonColumnDefinition.getName() + " doit être une liste de données");
|
}
|
} else {
|
row.put(key.trim(), dataRow((Map<String, Object>) value, jsonColumnDefinition.getColumnNameToColumnDefinition(), jsonColumnDefinition.getName(), 0));
|
}
|
} else {
|
if (jsonColumnDefinition.isCollection()) {
|
if (value instanceof List) {
|
List<Object> objectsList = (List<Object>) value;
|
List<Object> parsedValues = new ArrayList<>();
|
int i = 0;
|
|
for (Object obj : objectsList) {
|
parsedValues.add(parse(jsonColumnDefinition, obj, "", i + 1));
|
i++;
|
}
|
row.put(key.trim(), parsedValues);
|
} else {
|
throw new BadDataValueException("La valeur de la colonne " + jsonColumnDefinition.getName() + " doit être un tableau de données");
|
}
|
} else {
|
row.put(key.trim(), parse(jsonColumnDefinition, value, "", 0));
|
}
|
}
|
}
|
//Cherche les colonnes obligatoires qui sont absentes
|
stopIfRequiredColumnIsAbsent(foundColumns, columnNameToColumnDefinition, "");
|
}
|
return row;
|
}
|
|
private void columnNameToJsonColumnDefinition(JsonStructure jsonStructure) {
|
for (JsonStructure j : jsonStructure.getFields()) {
|
if (j.getTypeDonnee().equals(TypeDonnee.OBJET)) {
|
JsonColumnDefinition jsonCol = new JsonColumnDefinition(j.getTypeDonnee(), j.getName(), j.getLengthh(), j.getFormatDate(), j.isRequired(), j.isCollection());
|
|
for (JsonStructure field : j.getFields()) {
|
jsonCol.getColumnNameToColumnDefinition().put(field.getName().toLowerCase(), jsonColumnDefinition(field));
|
}
|
columnNameToColumnDefinition.put(j.getName().toLowerCase(), jsonCol);
|
} else {
|
columnNameToColumnDefinition.put(j.getName().toLowerCase(), new JsonColumnDefinition(j.getTypeDonnee(), j.getName(), j.getLengthh(), j.getFormatDate(), j.isRequired(), j.isCollection()));
|
}
|
}
|
}
|
|
private JsonColumnDefinition jsonColumnDefinition(JsonStructure jsonStruct) {
|
JsonColumnDefinition jsonCol = new JsonColumnDefinition(jsonStruct.getTypeDonnee(), jsonStruct.getName(), jsonStruct.getLengthh(), jsonStruct.getFormatDate(), jsonStruct.isRequired(), jsonStruct.isCollection());
|
|
if (jsonStruct.getTypeDonnee().equals(TypeDonnee.OBJET)) {
|
for (JsonStructure j : jsonStruct.getFields()) {
|
jsonCol.getColumnNameToColumnDefinition().put(j.getName().toLowerCase(), jsonColumnDefinition(j));
|
}
|
}
|
return jsonCol;
|
}
|
|
private Map<String, Object> dataRow(Map<String, Object> subData, Map<String, JsonColumnDefinition> subColumnNameToColumnDefinition, String parentName, int rangElement) throws ColumnNotFoundException, BadDataValueException, LocalDateTimeValueParseError {
|
Map<String, Object> subRow = new LinkedHashMap<>();
|
Set<String> foundColumns = new HashSet<>();
|
|
for (Map.Entry<String, Object> entry : subData.entrySet()) {
|
|
String key = entry.getKey();
|
Object value = entry.getValue();
|
|
JsonColumnDefinition jsonColumnDefinition = subColumnNameToColumnDefinition.get(key.trim().toLowerCase());
|
|
if (jsonColumnDefinition == null) {
|
throw new ColumnNotFoundException("La colonne " + key + " n'est pas présente pour ce fichier");
|
}
|
foundColumns.add(key.toLowerCase());
|
|
if (value == null) {
|
|
if (jsonColumnDefinition.isRequired()) {
|
throw new BadDataValueException("La valeur de la colonne " + jsonColumnDefinition.getName() + " est obligatoire");
|
}
|
return subRow;
|
}
|
|
if (jsonColumnDefinition.getTypeDonnee().equals(TypeDonnee.OBJET)) {
|
parentName += "." + jsonColumnDefinition.getName();
|
|
if (jsonColumnDefinition.isCollection()) {
|
if (value instanceof List) {
|
List<Object> objectsList = (List<Object>) value;
|
List<Object> parsedValues = new ArrayList<>();
|
int i = 0;
|
|
for (Object obj : objectsList) {
|
parsedValues.add(dataRow((Map<String, Object>) obj, jsonColumnDefinition.getColumnNameToColumnDefinition(), parentName, rangElement));
|
i++;
|
}
|
subRow.put(key.trim(), parsedValues);
|
} else {
|
throw new BadDataValueException("La valeur de la colonne " + jsonColumnDefinition.getName() + " doit être une liste de données");
|
}
|
} else {
|
subRow.put(key.trim(), dataRow((Map<String, Object>) value, jsonColumnDefinition.getColumnNameToColumnDefinition(), parentName, rangElement));
|
}
|
} else {
|
if (jsonColumnDefinition.isCollection()) {
|
if (value instanceof List) {
|
List<Object> objectsList = (List<Object>) value;
|
List<Object> parsedValues = new ArrayList<>();
|
int i = 0;
|
|
for (Object obj : objectsList) {
|
parsedValues.add(parse(jsonColumnDefinition, obj, "", i + 1));
|
i++;
|
}
|
subRow.put(key.trim(), parsedValues);
|
} else {
|
throw new BadDataValueException("La valeur de la colonne " + jsonColumnDefinition.getName() + " doit être un tableau de données");
|
}
|
} else {
|
subRow.put(key.trim(), parse(jsonColumnDefinition, value, parentName, rangElement));
|
}
|
}
|
}
|
//Cherche les colonnes obligatoires qui sont absentes
|
stopIfRequiredColumnIsAbsent(foundColumns, subColumnNameToColumnDefinition, parentName);
|
|
return subRow;
|
}
|
|
private Object parse(JsonColumnDefinition columnDefinition, Object value, String parentName, int rangElement) throws BadDataValueException, LocalDateTimeValueParseError {
|
|
TypeDonnee typeDonnee = columnDefinition.getTypeDonnee();
|
|
if (typeDonnee.equals(TypeDonnee.ALPHANUMERIQUE) && (value == null
|
|| (value instanceof String && lengthLowerOrEquals((String) value, columnDefinition.getLengthh())))) {
|
|
return value != null ? value.toString().trim() : value;
|
|
} else if (typeDonnee.equals(TypeDonnee.NUMERIQUE)) {
|
|
if (value == null) {
|
return 0L;
|
}
|
|
String stringValue = value.toString();
|
if (lengthLowerOrEquals(stringValue, columnDefinition.getLengthh()) && GenericValidator.isLong(stringValue)) {
|
return Long.valueOf(stringValue);
|
}
|
|
} else if (typeDonnee.equals(TypeDonnee.DECIMAL)) {
|
|
if (value == null) {
|
return 0.0;
|
}
|
|
String stringValue = value.toString();
|
if (lengthLowerOrEquals(stringValue, columnDefinition.getLengthh()) && GenericValidator.isDouble(stringValue)) {
|
return Double.valueOf(stringValue);
|
}
|
|
} else if (typeDonnee.equals(TypeDonnee.DATE)) {
|
|
if (value == null) {
|
return null;
|
}
|
String stringValue = value.toString();
|
|
if (lengthEquals(stringValue, columnDefinition.getLengthh()) && GenericValidator.isDate(stringValue, columnDefinition.getFormatDate(), true)) {
|
return new InsertionLocalDateTimeValue(columnDefinition.getFormatDate(), value).value();
|
}
|
}
|
String rangDescription = rangElement == 0 ? "" : "le " + rangElement + "ème élément de ";
|
String fullQualifiedNameOfColumn = parentName == null || parentName.isEmpty() ? columnDefinition.getName() : parentName + "." + columnDefinition.getName();
|
|
throw new BadDataValueException("La valeur " + value + " ne correspond pas au format attendu pour " + rangDescription + " la colonne " + fullQualifiedNameOfColumn);
|
}
|
|
private boolean lengthEquals(String value, int columnMaxLength) {
|
return value.trim().length() == columnMaxLength;
|
}
|
|
private boolean lengthLowerOrEquals(String value, int columnMaxLength) {
|
return value.trim().length() <= columnMaxLength;
|
}
|
|
private void stopIfRequiredColumnIsAbsent(Set<String> foundColumns, Map<String, JsonColumnDefinition> allColumns, String parentName) throws BadDataValueException {
|
|
for (String columnName : allColumns.keySet()) {
|
String fullQualifiedName = parentName.isEmpty() ? columnName : parentName + "." + columnName;
|
|
if (allColumns.get(columnName).isRequired() && !foundColumns.contains(columnName.toLowerCase())) {
|
throw new BadDataValueException("La valeur de la colonne " + fullQualifiedName + " est obligatoire");
|
}
|
}
|
}
|
}
|