package org.molgenis.file.ingest.execution;
import org.molgenis.data.DataService;
import org.molgenis.data.Entity;
import org.molgenis.data.jobs.JobExecutionUpdater;
import org.molgenis.data.jobs.Progress;
import org.molgenis.data.jobs.ProgressImpl;
import org.molgenis.data.meta.model.EntityTypeMetadata;
import org.molgenis.file.ingest.meta.FileIngestJobExecution;
import org.molgenis.file.ingest.meta.FileIngestMetaData;
import org.molgenis.security.core.runas.RunAsSystem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailSender;
import org.springframework.security.access.intercept.RunAsUserToken;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.support.TransactionTemplate;
import static java.util.Objects.requireNonNull;
import static org.molgenis.file.ingest.meta.FileIngestJobExecutionMetaData.FILE_INGEST_JOB_EXECUTION;
@Component
public class FileIngestJobFactory
{
private final DataService dataService;
private final UserDetailsService userDetailsService;
private final JobExecutionUpdater jobExecutionUpdater;
private final PlatformTransactionManager transactionManager;
private final FileIngester fileIngester;
private final MailSender mailSender;
@Autowired
public FileIngestJobFactory(DataService dataService, UserDetailsService userDetailsService,
JobExecutionUpdater jobExecutionUpdater, PlatformTransactionManager transactionManager,
FileIngester fileIngester, MailSender mailSender)
{
this.dataService = requireNonNull(dataService);
this.userDetailsService = requireNonNull(userDetailsService);
this.jobExecutionUpdater = requireNonNull(jobExecutionUpdater);
this.transactionManager = requireNonNull(transactionManager);
this.fileIngester = requireNonNull(fileIngester);
this.mailSender = requireNonNull(mailSender);
}
@RunAsSystem
public FileIngestJob createJob(FileIngestJobExecution fileIngestJobExecution)
{
dataService.add(FILE_INGEST_JOB_EXECUTION, fileIngestJobExecution);
String username = fileIngestJobExecution.getUser();
Progress progress = new ProgressImpl(fileIngestJobExecution, jobExecutionUpdater, mailSender);
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
RunAsUserToken runAsAuthentication = new RunAsUserToken("Job Execution", username, null,
userDetailsService.loadUserByUsername(username).getAuthorities(), null);
Entity fileIngestEntity = fileIngestJobExecution.getFileIngest();
Entity targetEntityEntity = fileIngestEntity.getEntity(FileIngestMetaData.ENTITY_META_DATA);
String targetEntityName = targetEntityEntity.getString(EntityTypeMetadata.FULL_NAME);
String url = fileIngestEntity.getString(FileIngestMetaData.URL);
String loader = fileIngestEntity.getString(FileIngestMetaData.LOADER);
String failureEmail = fileIngestEntity.getString(FileIngestMetaData.FAILURE_EMAIL);
return new FileIngestJob(progress, transactionTemplate, runAsAuthentication, fileIngester, targetEntityName,
url, loader, failureEmail, fileIngestJobExecution.getIdentifier());
}
}