PeremptionVerreService.java

package com.sintia.ffl.admin.optique.catalogue.batch.batchservice;

import com.sintia.ffl.admin.optique.catalogue.batch.config.loadcatalog.LoadCatalogBatchConfiguration;
import com.sintia.ffl.admin.optique.services.dto.MakerProvider;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.JobParametersInvalidException;
import org.springframework.batch.core.launch.support.SimpleJobLauncher;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.repository.JobRestartException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.task.SyncTaskExecutor;
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Service;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
@RequiredArgsConstructor
@Slf4j
public class PeremptionVerreService {
	
	private final JobRepository jobRepository;
	
	private final Job peremptionVerreJob;
	
	private final Job peremptionVerresAbsentsJob;

	private final TaskExecutor asyncExecutor;
	
	@Value("${missingglassesexpirationjob.file}")
	private String missingGlassesExpirationFile;
	
	private static final Logger LOGGER = LoggerFactory.getLogger(PeremptionVerreService.class);
	
	public BatchStatus handleExpirationGlasses(String jobDate) {
		LOGGER.info("Launching glasses expiration job manually");
		Date date = parseDate(jobDate);
		SimpleJobLauncher simpleJobLauncher = getSimpleJobLauncher();

		JobParameters jobParameters = new JobParametersBuilder()
				.addLong("time", System.currentTimeMillis())
				.addDate("scriptDate", date)
				.toJobParameters();
		
		try {
			JobExecution status = simpleJobLauncher.run(peremptionVerreJob, jobParameters);
			return status.getStatus();
		} catch (JobExecutionAlreadyRunningException | JobRestartException
				| JobInstanceAlreadyCompleteException
				| JobParametersInvalidException e) {
			LOGGER.error("Error executing job 'peremptionVerreJob'", e); return BatchStatus.FAILED;
		} finally {
			LOGGER.info("Batch started");
		}
	}
	
	public BatchStatus handleExpirationMissingGlasses(String jobDate, String mode, List<MakerProvider> listFabricant) {
		LOGGER.info("Launching missing glasses expiration job manually");
		Date date = parseDate(jobDate);
		SimpleJobLauncher simpleJobLauncher = getSimpleJobLauncher();

		initializeMakersProfilers(listFabricant);
		
		JobParameters jobParameters = new JobParametersBuilder()
				.addString("expirationMode", mode)
				.addDate("scriptDate", date)
				.addString("simulatedGlassesToExpireFileName", missingGlassesExpirationFile)
				.toJobParameters();
		
		try {
			JobExecution status = simpleJobLauncher.run(peremptionVerresAbsentsJob, jobParameters);
			// If missing glasses expiration job done launch the Expiration glasses Job
			if(status.getStatus() == BatchStatus.COMPLETED){
				// launching job with the previous job param from execution
				status = simpleJobLauncher.run(peremptionVerreJob, status.getJobParameters());
			}
			return status.getStatus();
		} catch (JobExecutionAlreadyRunningException | JobRestartException
				| JobInstanceAlreadyCompleteException
				| JobParametersInvalidException e) {
			LOGGER.error("Error executing job 'peremptionVerresAbsentsJob'", e);  return BatchStatus.FAILED;
		} finally {
			LOGGER.info("Batch started");
		}
		
	}

	private SimpleJobLauncher getSimpleJobLauncher() {
		SimpleJobLauncher simpleJobLauncher = new SimpleJobLauncher();
		simpleJobLauncher.setTaskExecutor(asyncExecutor);
		simpleJobLauncher.setJobRepository(jobRepository);
		return simpleJobLauncher;
	}

	private static Date parseDate(String jobDate) {
		LocalDateTime localDateTime = LocalDateTime.parse(jobDate);
		return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
	}

	private static void initializeMakersProfilers(List<MakerProvider> listFabricant) {
		LoadCatalogBatchConfiguration.makersProfilers = new ArrayList<>();
		LoadCatalogBatchConfiguration.makersProfilers.addAll(listFabricant);
	}
	
}