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.model.integration.TableDefinition; 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.math.BigDecimal; import java.util.LinkedHashMap; import java.util.Map; import java.util.stream.Collectors; import org.apache.commons.validator.GenericValidator; /** * * @author Gabuntu */ public class FdxParsedDataRow { private final Map data; private final Map columnNameToColumnDefinition; private final TableDefinition tableDefinition; private final Map row = new LinkedHashMap<>(); public FdxParsedDataRow(Map data, TableDefinition tableDefinition) { this.data = data; this.tableDefinition = tableDefinition; this.columnNameToColumnDefinition = tableDefinition.getColumnDefinitions() .stream() .collect(Collectors.toMap(c -> c.getName().trim().toLowerCase(), c -> c)); } public Map dataRow() throws ColumnNotFoundException, BadDataValueException, LocalDateTimeValueParseError { if (row.isEmpty()) { for (Map.Entry entry : data.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); ColumnDefinition columnDefinition = columnNameToColumnDefinition.get(key.trim().toLowerCase()); if (columnDefinition == null) { throw new ColumnNotFoundException("La colonne " + key + " n'est pas prĂ©sente pour ce fichier"); } row.put(key.trim(), parse(columnDefinition, value)); } } return row; } private Object parse(ColumnDefinition columnDefinition, Object value) throws BadDataValueException, LocalDateTimeValueParseError { String columnType = columnDefinition.getTypeDonnee(); if (columnType.equals(TypeDonnee.ALPHANUMERIQUE.toString()) && (value == null || (value instanceof String && lengthLowerOrEquals(((String) value).trim(), columnDefinition.getTaille())))) { return value != null ? value.toString().trim() : value; } else if (columnType.equals(TypeDonnee.NUMERIQUE.toString())) { if (value == null || value.toString().trim().isEmpty()) { return null; } String stringValue = value.toString().trim() .replaceAll("\\s+", "") .replaceAll("\\u00A0", "")//nbsp .replaceAll(" ", ""); if (lengthLowerOrEquals(stringValue, columnDefinition.getTaille()) && GenericValidator.isLong(stringValue)) { return Long.valueOf(stringValue); } } else if (columnType.equals(TypeDonnee.DECIMAL.toString())) { if (value == null || value.toString().trim().isEmpty()) { return null; } String stringValue = value .toString() .trim() .replaceAll("\\s+", "") .replaceAll("\\u00A0", "")//nbsp .replaceAll(" ", ""); if (lengthLowerOrEquals(stringValue, columnDefinition.getTaille() + columnDefinition.getTaillePartieDecimale() + 1)) { try { return new BigDecimal(stringValue); } catch (Exception ex) { } } } else if (columnType.equals(TypeDonnee.DATE.toString())) { if (value == null || value.toString().trim().isEmpty()) { return null; } String stringValue = value.toString().trim() .replaceAll("\\s+", "") .replaceAll("\\u00A0", "")//nbsp .replaceAll(" ", ""); 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; } }