BatchStatusService.java

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

import com.sintia.ffl.admin.optique.catalogue.util.BatchCatalogueOptique;
import com.sintia.ffl.adminui.commons.dto.BatchInfoDTO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.EnumUtils;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.explore.JobExplorer;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.Optional;

import static org.springframework.batch.core.BatchStatus.COMPLETED;
import static org.springframework.batch.core.BatchStatus.FAILED;
import static org.springframework.batch.core.BatchStatus.STARTED;

@Service
@Slf4j
public class BatchStatusService {
	
	private  final JobExplorer jobExplorer;
	
	public BatchStatusService(JobExplorer jobExplorer) {
		this.jobExplorer = jobExplorer;
	}
	
	public BatchInfoDTO statutByJobName(String jobName) {

		// Pas d'exécution en cours, retourner le statut de la dernière exécution.
		JobInstance jobInstance = jobExplorer.getLastJobInstance(jobName);
		if(jobInstance != null) {
			JobExecution lastJobExecution = jobExplorer.getLastJobExecution(jobInstance);
			return Optional.ofNullable(lastJobExecution)
					.map(je -> new BatchInfoDTO(je.getCreateTime(), mapBatchStatus(je.getStatus())))
					.orElse(null);
		} else {
			return null;
		}

	}

	private BatchStatus mapBatchStatus(BatchStatus batchStatus){
		switch (batchStatus){
			case STARTED:
			case STARTING:
				return STARTED;
			case FAILED:
			case STOPPED:
			case UNKNOWN:
			case ABANDONED:
				return FAILED;
			default:
				return COMPLETED;
		}
	}

	public BatchInfoDTO statutTousJobs(String jobName) {
		BatchInfoDTO batchInfoDTO =null;
		if(BatchCatalogueOptique.JOB_PEREMPTION_VERRES.getJobName().equals(jobName)){
			BatchInfoDTO batchInfoDTOPeremption = this.statutByJobName(jobName);
			BatchInfoDTO batchInfoDTOPeremptionVerresAbsents = this.statutByJobName(BatchCatalogueOptique.JOB_PEREMPTION_VERRES_ABSENTS.getJobName());
			if(batchInfoDTOPeremption != null){
				if(batchInfoDTOPeremptionVerresAbsents != null){
					if(batchInfoDTOPeremptionVerresAbsents.getStartDate().after(batchInfoDTOPeremption.getStartDate())){
						batchInfoDTO = batchInfoDTOPeremptionVerresAbsents;
					}
					else{
						batchInfoDTO = batchInfoDTOPeremption;
					}
				} else {
					batchInfoDTO = batchInfoDTOPeremption;
				}

			} else if (batchInfoDTOPeremptionVerresAbsents != null){
				batchInfoDTO = batchInfoDTOPeremptionVerresAbsents;
			}
		} else {
			batchInfoDTO = this.statutByJobName(jobName);
		}
			if(batchInfoDTO == null){
			log.debug("Batch {} : no previous execution", jobName);
			} else {
				log.debug(
					"Batch {} : status {}, started at {}",
					jobName,
						batchInfoDTO.getBatchStatus(),
					batchInfoDTO.getStartDate()
				);
				}
		return batchInfoDTO;

	}
}