package com.megatim.apifdxweb.core.impl.helper; import com.megatim.apifdxweb.core.ifaces.helper.FileDataReader; import com.megatim.apifdxweb.core.ifaces.integration.ColumnDefinitionManager; import com.megatim.fdxcommons.core.impl.tools.CommonUtilities; import com.megatim.fdxcommons.model.integration.ColumnDefinition; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.enterprise.context.Dependent; import javax.inject.Inject; import java.nio.charset.Charset; import java.util.LinkedHashMap; /** * * @author lenovo */ @Dependent public class FileDataReaderImpl implements FileDataReader { @Inject private ColumnDefinitionManager columnDefinitionManager; @Override public List> getDatas(String referentielVersion, String codeTypeFichier, File dataFile) throws Exception { List> datas = new ArrayList<>(); List columnsDefinition = columnDefinitionManager.findByReferentielAndTypeFichier(referentielVersion, codeTypeFichier); //Ranger les olonnes par ordre croissant de position Collections.sort(columnsDefinition, (ColumnDefinition c1, ColumnDefinition c2) -> Integer.valueOf(c1.getPosition()).compareTo(c2.getPosition())); //On détermine l'encodage du fichier Charset charset = CommonUtilities.getCharset(dataFile); try ( FileInputStream fis = new FileInputStream(dataFile); InputStreamReader isr = new InputStreamReader(fis, charset); BufferedReader reader = new BufferedReader(isr)) { String line; while ((line = reader.readLine()) != null) { LinkedHashMap dataLine = getLine(line, columnsDefinition); datas.add(dataLine); } } return datas; } private LinkedHashMap getLine(final String line, final List columnsDefinition) { LinkedHashMap dataLine = new LinkedHashMap<>(); int index = 0; for (ColumnDefinition c : columnsDefinition) { //traitement des colonnes du type fichier String data = line.substring(index, index + c.getTaille()); dataLine.put(c.getName(), data); index += c.getTaille(); } return dataLine; } }