package org.molgenis.file.ingest;
import org.molgenis.data.DataService;
import org.molgenis.file.ingest.execution.FileIngestJob;
import org.molgenis.file.ingest.execution.FileIngestJobFactory;
import org.molgenis.file.ingest.meta.FileIngest;
import org.molgenis.file.ingest.meta.FileIngestJobExecution;
import org.molgenis.file.ingest.meta.FileIngestJobExecutionFactory;
import org.molgenis.file.model.FileMeta;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import static org.molgenis.file.ingest.meta.FileIngestJobExecutionMetaData.FILE_INGEST_JOB_EXECUTION;
import static org.molgenis.file.ingest.meta.FileIngestMetaData.FILE_INGEST;
import static org.molgenis.file.model.FileMetaMetaData.FILE_META;
import static org.molgenis.security.core.runas.RunAsSystemProxy.runAsSystem;
/**
* FileIngester quartz job
* <p>
* It prevents concurrent execution of jobs with the same JobKey
*/
@DisallowConcurrentExecution
public class FileIngesterQuartzJob implements Job
{
public static final String ENTITY_KEY = "entity";
private static final Logger LOG = LoggerFactory.getLogger(FileIngesterQuartzJob.class);
@Autowired
private FileIngestJobFactory fileIngestJobFactory;
@Autowired
private FileIngestJobExecutionFactory fileIngestJobExecutionFactory;
@Autowired
private DataService dataService;
public FileIngesterQuartzJob()
{
}
public FileIngesterQuartzJob(FileIngestJobFactory fileIngestJobFactory, DataService dataService)
{
this.fileIngestJobFactory = fileIngestJobFactory;
this.dataService = dataService;
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException
{
Object fileIngestId = context.getMergedJobDataMap().get(ENTITY_KEY);
runAsSystem(() -> run(fileIngestId));
}
private void run(Object fileIngestId)
{
FileIngest fileIngest = dataService.findOneById(FILE_INGEST, fileIngestId, FileIngest.class);
FileIngestJobExecution jobExecution = fileIngestJobExecutionFactory.create();
jobExecution.setUser("admin");// TODO system
jobExecution.setFileIngest(fileIngest);
jobExecution.setFailureEmail(fileIngest.getFailureEmail());
try
{
jobExecution.setResultUrl(
"/menu/main/dataexplorer?entity=" + URLEncoder.encode(fileIngest.getTargetEntityName(), "UTF-8"));
}
catch (UnsupportedEncodingException ex)
{
LOG.error("UTF-8 not supported by URLEncoder", ex);
}
FileIngestJob job = fileIngestJobFactory.createJob(jobExecution);
FileMeta fileMeta = job.call();
dataService.add(FILE_META, fileMeta);
jobExecution.setFile(fileMeta);
dataService.update(FILE_INGEST_JOB_EXECUTION, jobExecution);
}
}