/* * 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 data; private final Map row = new LinkedHashMap<>(); private final Map columnNameToColumnDefinition = new HashMap<>(); public JsonFdxParsedDataRow(Map data, JsonStructure jsonStructure) { this.data = data; columnNameToJsonColumnDefinition(jsonStructure); } public Map dataRow() throws ColumnNotFoundException, BadDataValueException, LocalDateTimeValueParseError { Set foundColumns = new HashSet<>(); if (row.isEmpty()) { for (Map.Entry 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 objectsList = (List) value; List parsedValues = new ArrayList<>(); int i = 0; for (Object obj : objectsList) { parsedValues.add(dataRow((Map) 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) value, jsonColumnDefinition.getColumnNameToColumnDefinition(), jsonColumnDefinition.getName(), 0)); } } else { if (jsonColumnDefinition.isCollection()) { if (value instanceof List) { List objectsList = (List) value; List 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 dataRow(Map subData, Map subColumnNameToColumnDefinition, String parentName, int rangElement) throws ColumnNotFoundException, BadDataValueException, LocalDateTimeValueParseError { Map subRow = new LinkedHashMap<>(); Set foundColumns = new HashSet<>(); for (Map.Entry 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 objectsList = (List) value; List parsedValues = new ArrayList<>(); int i = 0; for (Object obj : objectsList) { parsedValues.add(dataRow((Map) 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) value, jsonColumnDefinition.getColumnNameToColumnDefinition(), parentName, rangElement)); } } else { if (jsonColumnDefinition.isCollection()) { if (value instanceof List) { List objectsList = (List) value; List 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 foundColumns, Map 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"); } } } }