package org.molgenis.data.importer;
import org.molgenis.data.DataService;
import org.molgenis.data.MolgenisDataException;
import org.molgenis.security.core.runas.RunAsSystem;
import org.molgenis.security.user.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailException;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Component;
import java.util.Date;
import static java.util.Objects.requireNonNull;
import static org.molgenis.data.importer.ImportRunMetaData.IMPORT_RUN;
@Component
public class ImportRunService
{
private static final Logger LOG = LoggerFactory.getLogger(ImportRunService.class);
private final DataService dataService;
private final MailSender mailSender;
private final UserService userService;
private final ImportRunFactory importRunFactory;
@Autowired
public ImportRunService(DataService dataService, MailSender mailSender, UserService userService,
ImportRunFactory importRunFactory)
{
this.dataService = requireNonNull(dataService);
this.mailSender = requireNonNull(mailSender);
this.userService = requireNonNull(userService);
this.importRunFactory = requireNonNull(importRunFactory);
}
@RunAsSystem
public ImportRun addImportRun(String userName, boolean notify)
{
ImportRun importRun = importRunFactory.create();
importRun.setStartDate(new Date());
importRun.setProgress(0);
importRun.setStatus(ImportStatus.RUNNING.toString());
importRun.setUsername(userName); // required and visible
importRun.setOwner(userName); // not required and not visible
importRun.setNotify(notify);
dataService.add(IMPORT_RUN, importRun);
return importRun;
}
@RunAsSystem
public void finishImportRun(String importRunId, String message, String importedEntities)
{
ImportRun importRun = dataService.findOneById(IMPORT_RUN, importRunId, ImportRun.class);
try
{
if (importRun != null)
{
importRun.setStatus(ImportStatus.FINISHED.toString());
importRun.setEndDate(new Date());
importRun.setMessage(message);
importRun.setImportedEntities(importedEntities);
dataService.update(IMPORT_RUN, importRun);
}
}
catch (Exception e)
{
LOG.error("Error updating run status", e);
}
if (importRun.getNotify()) createAndSendStatusMail(importRun);
}
private void createAndSendStatusMail(ImportRun importRun)
{
try
{
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setTo(userService.getUser(importRun.getUsername()).getEmail());
mailMessage.setSubject(createMailTitle(importRun));
mailMessage.setText(createMailText(importRun));
mailSender.send(mailMessage);
}
catch (MailException mce)
{
LOG.error("Could not send import status mail", mce);
throw new MolgenisDataException("An error occurred. Please contact the administrator.");
}
}
private String createMailText(ImportRun importRun)
{
return "The import started by you at: " + importRun.getStartDate() + " has finished with status: " + importRun
.getStatus() + "\nMessage:\n" + importRun.getMessage();
}
private String createMailTitle(ImportRun importRun)
{
return "importRun " + importRun.getStatus();
}
@RunAsSystem
public void failImportRun(String importRunId, String message)
{
ImportRun importRun = dataService.findOneById(IMPORT_RUN, importRunId, ImportRun.class);
try
{
if (importRun != null)
{
importRun.setStatus(ImportStatus.FAILED.toString());
importRun.setEndDate(new Date());
importRun.setMessage(message);
dataService.update(IMPORT_RUN, importRun);
}
}
catch (Exception e)
{
LOG.error("Error updating run status", e);
}
if (importRun.getNotify()) createAndSendStatusMail(importRun);
}
}