ChargementItemReader.java

package com.sintia.ffl.admin.optique.specifique.isea.reader;

import com.sintia.ffl.admin.optique.services.services.DistributeurIteService;
import com.sintia.ffl.admin.optique.services.services.FabricantIteService;
import com.sintia.ffl.admin.optique.specifique.isea.models.*;
import com.sintia.ffl.admin.optique.specifique.isea.reporter.ChargementReporter;
import com.sintia.ffl.admin.optique.specifique.isea.utils.Constants;
import com.sintia.ffl.admin.optique.specifique.isea.utils.FileReaderUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.StepExecutionListener;
import org.springframework.batch.core.configuration.annotation.StepScope;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

@Component
@StepScope
public class ChargementItemReader implements Tasklet, StepExecutionListener {
	
	private static final Logger LOGGER = LoggerFactory.getLogger(ChargementItemReader.class);
	
	@Autowired
	private ChargementReporter chargementReporter;
	
	@Autowired
	private FileReaderUtil fileReaderUtil;
	
	@Autowired
	private DistributeurIteService distributeurIteService;
	
	@Autowired
	private FabricantIteService fabricantIteService;
	
	private List<FournisseurCSV> fournisseurCSVList;
	private List<FabricantCSV> fabricantCSVList;
	private List<VerreCSV> verreCSVList;
	private List<SupplementCSV> supplementCSVList;
	private List<VerreSupplementAssoCSV> verreSupplementAssoCSVList;
	
	
	@Override
	public void beforeStep(StepExecution stepExecution) {
		try {
			List<String> fileStructureErrors = fileReaderUtil.getFileStructureErrors(fileReaderUtil.getFile());
			if ( fileStructureErrors.isEmpty() ) {
				List<LigneOptimeyes> fichierImporte = fileReaderUtil.processcsvfile(fileReaderUtil.getFile());

				fabricantCSVList = fileReaderUtil.getListFabricants(fichierImporte);
				fournisseurCSVList = fileReaderUtil.getListfournisseurs(fichierImporte);
				verreCSVList = fileReaderUtil.getListverres(fichierImporte);
				supplementCSVList = fileReaderUtil.getListsupplements(fichierImporte);
				verreSupplementAssoCSVList = fileReaderUtil.getListverreSupplementAssos(fichierImporte);
				
				ExecutionContext executionContext = stepExecution.getJobExecution().getExecutionContext();
				executionContext.put("verres", this.verreCSVList);
				executionContext.put("fournisseurs", this.fournisseurCSVList);
				executionContext.put("supplements", this.supplementCSVList);
				executionContext.put("fabricants", this.fabricantCSVList);
				executionContext.put("verresupplements", this.verreSupplementAssoCSVList);
			
			} else {
				chargementReporter.addError(Constants.TRAITEMENT_ARRETE_CAUSE_STRUCTURE_FICHIER_INCORRECTE + " : " + String.join(" ", fileStructureErrors));
				throw new Exception(Constants.TRAITEMENT_ARRETE_CAUSE_STRUCTURE_FICHIER_INCORRECTE);
			}
			
			if(verreCSVList == null && fabricantCSVList == null && fournisseurCSVList == null && supplementCSVList == null){
				chargementReporter.addError(Constants.TRAITEMENT_ARRETE_CAUSE_STRUCTURE_FICHIER_INCORRECTE + " : Ni les verres, ni les fabricants, ni les fournisseurs, ni les suppléments n'ont pu être récupérés.");
				throw new Exception(Constants.TRAITEMENT_ARRETE_CAUSE_STRUCTURE_FICHIER_INCORRECTE);
			}
		} catch (Exception e){
			throw new RuntimeException(Constants.TRAITEMENT_ARRETE_CAUSE_STRUCTURE_FICHIER_INCORRECTE );
		}
	
	}
	
	@Override
	public ExitStatus afterStep(StepExecution stepExecution) {
		LOGGER.debug("Lecture terminée");
		return ExitStatus.COMPLETED;
	}
	
	@Override
	public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
		fournisseurCSVList = (List<FournisseurCSV>)  stepContribution.getStepExecution().getJobExecution().getExecutionContext().get("fournisseurs");
		fabricantCSVList = (List<FabricantCSV>)  stepContribution.getStepExecution().getJobExecution().getExecutionContext().get("fabricants");


		if(fournisseurCSVList == null  || !distributeurIteService.exist(fournisseurCSVList.get(0).getCodeFournisseur())){
			chargementReporter.addError(Constants.TRAITEMENT_ARRETE_CAUSE_FOURNISSEUR_INEXISTANT_DANS_LE_REFERENTIEL + " : " + (fournisseurCSVList == null ? "" : fournisseurCSVList.get(0).getCodeFournisseur()));
			throw new RuntimeException(Constants.TRAITEMENT_ARRETE_CAUSE_FOURNISSEUR_INEXISTANT_DANS_LE_REFERENTIEL);
		}

		if(fabricantCSVList == null || !fabricantIteService.exist(fabricantCSVList.get(0).getCodeFabricant()))
		{
			chargementReporter.addError(Constants.TRAITEMENT_ARRETE_CAUSE_FABRICANT_INEXISTANT_DANS_LE_REFERENTIEL + " : " + (fabricantCSVList == null ? "" : fabricantCSVList.get(0).getCodeFabricant()));
			throw new RuntimeException(Constants.TRAITEMENT_ARRETE_CAUSE_FABRICANT_INEXISTANT_DANS_LE_REFERENTIEL);
		}

		return RepeatStatus.FINISHED;
	}
	
}