/* * 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.ColumnDefinition; 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.sql.SQLException; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.validator.GenericValidator; /** * * @author ASUS */ public class JsonDataRowToUpdate { private final Map dataToSet; private final String parentTableName; private final List columnsDefinition; public JsonDataRowToUpdate(Map data, String parentTableName, List columnsDefinition) { this.dataToSet = data; this.parentTableName = parentTableName; this.columnsDefinition = columnsDefinition; } public Map> dataRow() throws ColumnNotFoundException, SQLException, BadDataValueException, LocalDateTimeValueParseError { Map> tableToDataRow = new HashMap<>(); for (Map.Entry entry : dataToSet.entrySet()) { if (nomColonneIsValid(entry.getKey())) { String tableName = tableName(parentTableName, entry.getKey()); Map dataToSetToTable = tableToDataRow.get(tableName); if (dataToSetToTable == null) { dataToSetToTable = new HashMap<>(); } ColumnDefinition columnDefinition = columnsDefinition.stream().filter(c -> c.getName().equalsIgnoreCase(entry.getKey())).findFirst().get(); Object data = parse(columnDefinition, entry.getValue()); dataToSetToTable.put(cleanFieldName(entry.getKey()), data); tableToDataRow.put(tableName, dataToSetToTable); } else { throw new ColumnNotFoundException("La colonne " + entry.getKey() + " n'est pas présente pour cette strcuture JSON"); } } return tableToDataRow; } private String cleanFieldName(String fieldName) { int index = fieldName.lastIndexOf("."); if (index > 0) { String cleanFieldName = fieldName.substring(index + 1); return cleanFieldName; } else { return fieldName; } } private String tableName(String rootTable, String fieldName) { int index = fieldName.lastIndexOf("."); ColumnDefinition columnDefinition = columnsDefinition.stream().filter(c -> c.getName().equalsIgnoreCase(fieldName)).findFirst().get(); if (columnDefinition.isCollection()) { if (index <= 0) { return (rootTable + "_" + fieldName).toLowerCase(); } else { String name = fieldName.substring(index); return (rootTable + "_" + name).toLowerCase(); } } else { if (index <= 0) { return rootTable; } else { String name = fieldName.subSequence(0, index).toString().replaceAll("\\.", "_"); return (rootTable + "_" + name).toLowerCase(); } } } private boolean nomColonneIsValid(String nomColonne) { return nomColonne != null && columnsDefinition .stream() .filter(c -> c.getName().equalsIgnoreCase(nomColonne)) .findFirst() .isPresent(); } private Object parse(ColumnDefinition columnDefinition, Object value) throws BadDataValueException, LocalDateTimeValueParseError { String typeDonnee = columnDefinition.getTypeDonnee(); if (typeDonnee.equals(TypeDonnee.ALPHANUMERIQUE.toString()) && (value == null || (value instanceof String && lengthLowerOrEquals((String) value, columnDefinition.getTaille())))) { return value != null ? value.toString().trim() : value; } else if (typeDonnee.equals(TypeDonnee.NUMERIQUE.toString())) { if (value == null) { return 0L; } String stringValue = value.toString(); if (lengthLowerOrEquals(stringValue, columnDefinition.getTaille()) && GenericValidator.isLong(stringValue)) { return Long.valueOf(stringValue); } } else if (typeDonnee.equals(TypeDonnee.DECIMAL.toString())) { if (value == null) { return 0.0; } String stringValue = value.toString(); if (lengthLowerOrEquals(stringValue, columnDefinition.getTaille()) && GenericValidator.isDouble(stringValue)) { return Double.valueOf(stringValue); } } else if (typeDonnee.equals(TypeDonnee.DATE.toString())) { if (value == null) { return null; } String stringValue = value.toString(); if (lengthEquals(stringValue, columnDefinition.getTaille()) && GenericValidator.isDate(stringValue, columnDefinition.getFormatDate(), true)) { return new InsertionLocalDateTimeValue(columnDefinition.getFormatDate(), value).value(); } } throw new BadDataValueException("La valeur " + value + " ne correspond pas au format attendu pour la colonne " + columnDefinition.getName()); } private boolean lengthEquals(String value, int columnMaxLength) { return value.trim().length() == columnMaxLength; } private boolean lengthLowerOrEquals(String value, int columnMaxLength) { return value.trim().length() <= columnMaxLength; } }