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<String, Object> data;
|
private final Map<String, ColumnDefinition> columnNameToColumnDefinition;
|
private final TableDefinition tableDefinition;
|
private final Map<String, Object> row = new LinkedHashMap<>();
|
|
public FdxParsedDataRow(Map<String, Object> 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<String, Object> dataRow() throws ColumnNotFoundException, BadDataValueException, LocalDateTimeValueParseError {
|
|
if (row.isEmpty()) {
|
|
for (Map.Entry<String, Object> 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;
|
}
|
|
}
|