package edu.stanford.sulair.dlss.dor.service; import java.util.List; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import edu.stanford.sulair.dlss.dor.admin.Workflow; import edu.stanford.sulair.dlss.dor.admin.Process; import edu.stanford.sulair.dlss.dor.dao.ProcessDao; import org.springframework.context.ApplicationContext; //TODO: methods need to be revised if we ever store another type of workflow public class WorkflowServiceImpl implements WorkflowService { private Logger logger = Logger.getLogger(WorkflowService.class); @Autowired ProcessDao processDao; @Autowired ApplicationContext appCtx; @Transactional(propagation = Propagation.NESTED ) public void persist(Process p, String repoName) { persistOneProcess(repoName, p); MessagingService msgService = (MessagingService)appCtx.getBean(repoName + ".messaging"); msgService.sendObjectUpdatedMessage(p.getDruid()); } private void persistOneProcess(String repository, Process p) { Process pOld = processDao.findProcess(repository, p.getDruid(), p.getDatastream(), p.getName()); if(pOld != null){ p.setId(pOld.getId()); p.setAttempts(pOld.getAttempts() + 1); p.setLifecycle(pOld.getLifecycle()); } else{ p.setAttempts(1); } processDao.persistProcess(p); } @Transactional(propagation = Propagation.NESTED ) public void persist(Workflow gwf, String repoName) { RepositoryService repoService = (RepositoryService)appCtx.getBean(repoName); MessagingService msgService = (MessagingService)appCtx.getBean(repoName + ".messaging"); List<Process> procs = gwf.getProcesses(); Process p1 = gwf.getProcesses().get(0); //If any processes exist in the database //then delete all process rows, persist new rows, and send message //else persist all rows then create object in fedora //Delete all process rows List<Process> existingProcs = processDao.findProcessesByDruidAndDatastream(repoName, p1.getDruid(), p1.getDatastream()); if(existingProcs.size() > 0){ //TODO save off the number of attempts per pre-existing row logger.debug("Deleting all existing process rows by druid"); processDao.deleteProcessesByRepoDruidAndWorkflowName(repoName, p1.getDruid(), p1.getDatastream()); //Add each process row logger.debug("Persisting new processes"); for(Process p: procs){ processDao.persistProcess(p); } logger.debug("Sending object updated message"); msgService.sendObjectUpdatedMessage(p1.getDruid()); } else { logger.debug("Creating new process rows"); for(Process p: procs){ processDao.persistProcess(p); } //create in fedora logger.debug("Creating workflow datastream in fedora"); repoService.createWorkflowDatastream(p1.getDruid(), p1.getDatastream()); } } public Workflow findWorkflow(String repository, String druid, String datastreamName) { List<Process> procs = processDao.findProcessesByDruidAndDatastream(repository, druid, datastreamName); Workflow gwf = new Workflow(); gwf.setProcesses(procs); gwf.setId(datastreamName); gwf.setObjectId(druid); return gwf; } }