/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.xmlworkflow.state; import org.dspace.core.Context; import org.dspace.xmlworkflow.Role; import org.dspace.xmlworkflow.WorkflowConfigurationException; import org.dspace.xmlworkflow.WorkflowException; import org.dspace.xmlworkflow.WorkflowFactory; import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem; import java.io.IOException; import java.sql.SQLException; import java.util.HashMap; import java.util.LinkedHashMap; /** * Class that contains all the steps & roles involved in a certain * configured workflow * * @author Bram De Schouwer (bram.deschouwer at dot com) * @author Kevin Van de Velde (kevin at atmire dot com) * @author Ben Bosman (ben at atmire dot com) * @author Mark Diggory (markd at atmire dot com) */ public class Workflow { private String id; private Step firstStep; private HashMap<String, Step> steps; private LinkedHashMap<String, Role> roles; public Workflow(String workflowID, LinkedHashMap<String, Role> roles) { this.id = workflowID; this.roles = roles; this.steps = new HashMap<String, Step>(); } public Step getFirstStep() { return firstStep; } public String getID(){ return id; } /* * Return a step with a given id */ public Step getStep(String stepID) throws WorkflowConfigurationException, IOException { if(steps.get(id)!=null){ return steps.get(id); }else{ Step step = WorkflowFactory.createStep(this, stepID); if(step== null){ throw new WorkflowConfigurationException("Step definition not found for: "+stepID); } steps.put(stepID, step); return step; } } public Step getNextStep(Context context, XmlWorkflowItem wfi, Step currentStep, int outcome) throws IOException, WorkflowConfigurationException, WorkflowException, SQLException { String nextStepID = currentStep.getNextStepID(outcome); if(nextStepID != null){ Step nextStep = getStep(nextStepID); if(nextStep == null) throw new WorkflowException("Error while processing outcome, the following action was undefined: " + nextStepID); if(nextStep.isValidStep(context, wfi)){ return nextStep; } else { return getNextStep(context, wfi, nextStep, 0); } }else{ //No next step, archive it return null; } } public void setFirstStep(Step firstStep) { this.firstStep = firstStep; } public HashMap<String, Role> getRoles() { return roles; } }