package com.megatim.apifdxweb.core.impl.helper; import com.megatim.apifdxweb.core.ifaces.helper.ApiRequestDataExporter; import com.megatim.apifdxweb.tools.exceptions.ApplicationServerException; import com.megatim.fdxcommons.core.ifaces.helper.DataInMemoryHandler; import com.megatim.fdxcommons.tools.integration.FdxConsultationIntegrationData; import com.megatim.fdxcommons.model.enumeration.TypeDonnee; import com.megatim.fdxcommons.model.integration.ColumnDefinition; import java.io.BufferedWriter; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.sql.Timestamp; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.enterprise.context.Dependent; import javax.inject.Inject; import com.megatim.fdxcommons.tools.database.queries.metadata.SelectQueryResult; import com.megatim.fdxcommons.tools.database.tables.FdxApiTable; import com.megatim.fdxcommons.tools.database.tables.dto.FdxTableRowDto; import com.megatim.fdxcommons.tools.mappers.FdxTableMapper; import java.util.Collections; /** * * @author ASUS */ @Dependent public class ApiRequestDataExporterImpl implements ApiRequestDataExporter { @Inject private DataInMemoryHandler dataInMemoryHandler; @Inject private FdxTableMapper fdxTableMapper; @Override public File export(FdxConsultationIntegrationData fileIntegrationData, String exportDirectory) { Path path = constructFileName(fileIntegrationData.getDataProduction().getCodeTypeFichier(), exportDirectory); try { List columnsDefinition = new ArrayList(dataInMemoryHandler .getDataInMemory() .getTypeFichierToColumnDefinitions() .get(fileIntegrationData.getDataProduction() .getCodeTypeFichier()) .values()); saveToFile(fileIntegrationData.getRows(), path, columnsDefinition); } catch (IOException ex) { Logger.getLogger(ApiRequestDataExporterImpl.class.getName()).log(Level.SEVERE, ex.getMessage(), ex); throw new ApplicationServerException(); } return path.toFile(); } @Override public File exportAll(String codeTypeFichier, String exportDirectory) { Path path = constructFileName(codeTypeFichier, exportDirectory); try { SelectQueryResult result = new FdxApiTable( codeTypeFichier, dataInMemoryHandler.getDataInMemory().getReferentielEnCours().getVersion(), null ).selectResult(null); List columnsDefinition = new ArrayList(dataInMemoryHandler.getDataInMemory().getTypeFichierToColumnDefinitions().get(codeTypeFichier).values()); saveToFile(fdxTableMapper.fdxTableRowListToFdxTableRowDtoList(result.rows()), path, columnsDefinition); } catch (Exception ex) { Logger.getLogger(ApiRequestDataExporterImpl.class.getName()).log(Level.SEVERE, ex.getMessage(), ex); throw new ApplicationServerException(); } return path.toFile(); } private void saveToFile(List rows, Path path, List columnsDefinition) throws IOException { Collections.sort(columnsDefinition, (ColumnDefinition c1, ColumnDefinition c2) -> Integer.valueOf(c1.getPosition()).compareTo(c2.getPosition())); try ( BufferedWriter bufferWriter = Files.newBufferedWriter(path, StandardCharsets.UTF_8, StandardOpenOption.APPEND, StandardOpenOption.CREATE, StandardOpenOption.SYNC)) { for (FdxTableRowDto fdxTableRow : rows) { String line = getLineFromColumnData(fdxTableRow, columnsDefinition); bufferWriter.write(line + System.lineSeparator()); } } } private String getLineFromColumnData(FdxTableRowDto fdxTableRow, List columnsDefinition) { StringBuilder line = new StringBuilder(""); for (ColumnDefinition columnDefinition : columnsDefinition) { fdxTableRow.getDataColumns().stream().filter(p -> p.getName().trim().equalsIgnoreCase(columnDefinition.getName().trim())).findFirst().ifPresent(c -> { line.append(normalizeValue(c.getValue(), columnDefinition)); }); } return line.toString(); } private String normalizeValue(Object value, ColumnDefinition columnDefinition) { String stringValue = value != null ? value.toString() : ""; if (columnDefinition.getTypeDonnee().equals(TypeDonnee.DATE.getValue())) { if (stringValue.isEmpty()) { stringValue = generateUnknown(columnDefinition.getTaille(), " "); } else { Timestamp timestamp = null; if (value instanceof Timestamp) { timestamp = (Timestamp) value; } else { timestamp = new Timestamp((long) value); } stringValue = formatDateToString(timestamp, columnDefinition); } } if (stringValue.length() < columnDefinition.getTaille()) { stringValue = formatData(TypeDonnee.fromValeur(columnDefinition.getTypeDonnee()), stringValue, columnDefinition.getTaille()); } return stringValue; } private String generateUnknown(int nbOfCharacter, String character) { StringBuilder str = new StringBuilder(""); for (int i = 0; i < nbOfCharacter; i++) { str.append(character); } return str.toString(); } private String formatData(TypeDonnee typeDonnee, String data, int columnSize) { if (typeDonnee != null) { switch (typeDonnee) { case NUMERIQUE: case DECIMAL: return generateUnknown(columnSize - data.length(), "0") + data; case ALPHANUMERIQUE: case DATE: default: return data + generateUnknown(columnSize - data.length(), " "); } } else { throw new IllegalArgumentException(); } } private Path constructFileName(String codeTypeFichier, String exportDirectory) { LocalDateTime date = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); Path path = Paths.get(exportDirectory, codeTypeFichier.toUpperCase() + date.format(formatter) + ".txt"); return path; } private String formatDateToString(Object obj, ColumnDefinition columnDefinition) { if (obj == null) { return generateUnknown(columnDefinition.getTaille(), " "); } Timestamp data = (Timestamp) obj; LocalDateTime localDateTime = data.toLocalDateTime(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern(columnDefinition.getFormatDate()); if (formatter == null) { return localDateTime.toString().substring(0, columnDefinition.getTaille()); } else { return localDateTime.format(formatter); } } }