package com.megatim.fdxconvert.service; import com.megatim.typefichier.validator.Validator; import com.megatim.typefichier.validator.model.ConfigJsonValidator; import com.megatim.typefichier.validator.model.ConfigStreamValidator; import static com.megatim.typefichier.validator.utilities.Utilities.getCharset; import com.megatim.fdxconvert.controller.FileToValidateEditDialogController; import com.megatim.fdxconvert.dao.TypeFichierJsonDAO; import com.megatim.fdxconvert.dao.ValidateurDAO; import com.megatim.fdxconvert.enums.DataType; import static com.megatim.fdxconvert.enums.DataType.CSV; import static com.megatim.fdxconvert.enums.DataType.TXT; import static com.megatim.fdxconvert.enums.DataType.XLS; import static com.megatim.fdxconvert.enums.DataType.XLSX; import com.megatim.fdxconvert.enums.JournalStatut; import com.megatim.fdxconvert.model.AlphaNumeriqueField; import com.megatim.fdxconvert.model.Configuration; import com.megatim.fdxconvert.model.Journal; import com.megatim.fdxconvert.model.MetaAlphaNumeriqueField; import com.megatim.fdxconvert.model.Tache; import com.megatim.fdxconvert.model.TypeFichierJson; import com.megatim.fdxconvert.model.Validateur; import com.megatim.fdxconvert.util.ImportData; import com.megatim.fdxconvert.pojo.FileToValidateDescription; import com.megatim.fdxconvert.util.TypeFichierJsonConverter; import com.megatim.fdxconvert.util.Utilities; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.Charset; import java.nio.file.Path; import java.nio.file.Paths; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.HashSet; import java.util.Optional; import java.util.Random; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.io.IOUtils; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; /** * * @author MGT_DEV3 */ public class TacheJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { JobDataMap dataMap = context.getJobDetail().getJobDataMap(); Tache tache = TacheService.getInstance().findByTacheId(dataMap.getString("tacheId")); //On peut concrètement exploitater la tâche ici !! File sourceDirectory = new File(tache.getRepertoireSource()); if (sourceDirectory.exists() && sourceDirectory.isDirectory()) { Configuration config = ConfigurationService.getInstance().getCurrentConfig(); for (File file : sourceDirectory.listFiles()) { if (file.isFile()) { try { if (tache.getDataType().equals(DataType.JSON)) { validateJsonFile(tache, file, config); } else { //On converti le fichier à valider en fichier generateAndParseTxtFile(tache, file, config); } } catch (Exception ex) { Logger.getLogger(TacheJob.class.getName()).log(Level.SEVERE, ex.getMessage(), ex); } } } } } private void generateAndParseTxtFile(Tache tache, File fileToValidate, Configuration config) throws Exception { Charset charset = getCharset(fileToValidate); long lignes = numberOfLines(fileToValidate, charset); if (config == null) { saveJournal(fileToValidate.getName(), Integer.parseInt("" + lignes), JournalStatut.ECHEC_REPERTOIRE, tache.getTypeFichier().getCode(), fileToValidate.getParent()); return; } Optional validateur = ValidateurDAO.findByCodeTypeFichier(tache.getTypeFichier().getCode()); if (!validateur.isPresent()) { saveJournal(fileToValidate.getName(), Integer.parseInt("" + lignes), JournalStatut.ECHEC_VALIDATEUR, tache.getTypeFichier().getCode(), fileToValidate.getParent()); return; } String fileName = tache.getTypeFichier().getCode() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + generateTierce() + ".txt"; File outputFile = new File(config.getDatasDir(), fileName); if (!outputFile.exists()) { //Creation du fichier outputFile.createNewFile(); } FileToValidateDescription raw; Set metaAlphaFields = tache.getMetaAlphaNumeriqueFields(); Set alphaFields = new HashSet<>(); metaAlphaFields.stream().forEach(m -> { alphaFields.add(m.getAlphaNumeriqueField()); }); switch (tache.getDataType()) { case TXT: raw = new FileToValidateDescription(fileToValidate, tache.getRowDeliminter(), tache.getColDeliminter()); if (tache.isStrictValidation()) { ImportData.parseFileByFieldLength(raw, validateur.get(), outputFile, tache.isWithHeader()); } else { ImportData.parseFileCharacterByCharacter(raw, validateur.get(), outputFile, tache.isWithHeader(), alphaFields); } break; case CSV: raw = new FileToValidateDescription(fileToValidate, tache.getRowDeliminter(), tache.getColDeliminter()); ImportData.parseCsvFile(raw, validateur.get(), outputFile, tache.isWithHeader(), alphaFields); break; case XLS: ImportData.parseXlsFile(fileToValidate.getAbsolutePath(), tache.isWithHeader(), outputFile, validateur.get(), alphaFields); break; case XLSX: ImportData.parseXlsxFile(fileToValidate.getAbsolutePath(), tache.isWithHeader(), outputFile, validateur.get(), alphaFields); break; default: break; } saveJournal(fileToValidate.getName(), Integer.parseInt("" + lignes), JournalStatut.SUCCES_GEN_TXT, tache.getTypeFichier().getCode(), fileToValidate.getParent()); validate(tache, outputFile, fileToValidate, config); } private void validateJsonFile(Tache tache, File fileToValidate, Configuration config) throws Exception { Path errorPath = Paths.get(tache.getRepertoireErreur(), tache.getTypeFichier().getCode() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + generateTierce() + "_JSON.txt"); Charset charset = getCharset(fileToValidate); int lignes = numberOfLines(fileToValidate, charset); if (config == null) { saveJournal(fileToValidate.getName(), lignes, JournalStatut.ECHEC_REPERTOIRE, tache.getTypeFichier().getCode(), fileToValidate.getParent()); return; } TypeFichierJson typefichierJson = TypeFichierJsonDAO.getByTypeFichier(tache.getTypeFichier().getCode()); if (typefichierJson == null) { saveJournal(fileToValidate.getName(), lignes, JournalStatut.ECHEC_MODELE_JSON, tache.getTypeFichier().getCode(), fileToValidate.getParent()); return; } Validator validator = new Validator(); ConfigJsonValidator configJson = new ConfigJsonValidator( errorPath.toString(), tache.getRepertoireDestination(), fileToValidate, new TypeFichierJsonConverter(typefichierJson).convert()); boolean result = validator.validate(configJson, "", true, true, Utilities.getNbThreads()); if (result) { saveJournal(fileToValidate.getName(), lignes, JournalStatut.SUCCES, tache.getTypeFichier().getCode(), tache.getRepertoireDestination()); } else { saveJournal(fileToValidate.getName(), lignes, JournalStatut.ECHEC, tache.getTypeFichier().getCode(), tache.getRepertoireErreur()); } } private void saveJournal(String fileName, int lignes, JournalStatut statut, String codeTypeFichier, String sourceDirectory) throws Exception { Journal journal = new Journal(LocalDateTime.now(), statut, codeTypeFichier); journal.setSourceDirectory(sourceDirectory); journal.setSourceFileName(fileName); journal.setNombreLignes(lignes); JournalService.getInstance().add(journal); } /** * * @param tache * @param fileToValidate : Fichier contenant les données normalisées * @param originalFile : Fichier d'origine contenant les données brutes * @param config * @throws Exception */ private void validate(Tache tache, File outputFile, File originalFile, Configuration config) throws Exception { Charset charset = getCharset(outputFile); final int lignes = numberOfLines(outputFile, charset); if (config == null) { saveJournal(outputFile.getName(), lignes, JournalStatut.ECHEC_REPERTOIRE, tache.getTypeFichier().getCode(), outputFile.getParent()); return; } Optional validateur = ValidateurDAO.findByCodeTypeFichier(tache.getTypeFichier().getCode()); if (!validateur.isPresent()) { saveJournal(outputFile.getName(), lignes, JournalStatut.ECHEC_VALIDATEUR, tache.getTypeFichier().getCode(), outputFile.getParent()); return; } byte[] targetArray = IOUtils.toByteArray(FileToValidateEditDialogController.class.getClassLoader().getResourceAsStream("predicatelogic-engine.xml")); ConfigStreamValidator configValidator = new ConfigStreamValidator(targetArray, validateur.get().getContent(), tache.getRepertoireErreur(), tache.getRepertoireDestination(), outputFile, originalFile); Validator validator = new Validator(); boolean result = validator.validate(configValidator, Boolean.TRUE, Boolean.TRUE, Utilities.getNbThreads()); if (result) { saveJournal(outputFile.getName(), lignes, JournalStatut.SUCCES, tache.getTypeFichier().getCode(), tache.getRepertoireDestination()); } else { saveJournal(outputFile.getName(), lignes, JournalStatut.ECHEC, tache.getTypeFichier().getCode(), tache.getRepertoireErreur()); } } private String generateTierce() { // Instance of random class Random rand = new Random(); int upperbound = 60; int random = rand.nextInt(upperbound); return String.format("%02d", random); } private int numberOfLines(File file, Charset charset) { int nb = 0; try ( FileInputStream fis = new FileInputStream(file); InputStreamReader isr = new InputStreamReader(fis, charset); BufferedReader reader = new BufferedReader(isr)) { while (reader.readLine() != null) { nb++; } } catch (IOException ex) { Logger.getLogger(TacheJob.class.getName()).log(Level.SEVERE, ex.getMessage(), ex); } return nb; } }