package org.jbpm.taskmgmt.exe; import java.util.Collection; import org.jbpm.db.AbstractDbTestCase; import org.jbpm.graph.def.ActionHandler; import org.jbpm.graph.def.ProcessDefinition; import org.jbpm.graph.exe.ExecutionContext; import org.jbpm.graph.exe.ProcessInstance; public class EndTasksDbTest extends AbstractDbTestCase { public static class Buzz implements ActionHandler { private static final long serialVersionUID = 1L; public void execute(ExecutionContext executionContext) throws Exception { throw new RuntimeException("buzz"); } } public void testCancel() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition name='endtasksprocess'>" + " <start-state>" + " <transition to='approval' />" + " </start-state>" + " <task-node name='approval' end-tasks='true'>" + " <task name='approve' description='Review order'>" + " <assignment pooled-actors='reviewers' />" + " </task>" + " <transition name='approve' to='process'>" + " <action class='" + Buzz.class.getName() + "' />" + " </transition>" + " <transition name='cancel' to='cancelled'/>" + " </task-node>" + " <state name='process' />" + " <state name='cancelled' />" + "</process-definition>"); deployProcessDefinition(processDefinition); ProcessInstance processInstance = jbpmContext.newProcessInstance("endtasksprocess"); processInstance.signal(); processInstance = saveAndReload(processInstance); assertEquals("approval", processInstance.getRootToken().getNode().getName()); processInstance = saveAndReload(processInstance); processInstance.signal("cancel"); assertEquals("cancelled", processInstance.getRootToken().getNode().getName()); } public void testApprove() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition name='endtasksprocess'>" + " <start-state>" + " <transition to='approval' />" + " </start-state>" + " <task-node name='approval' end-tasks='true'>" + " <task name='approve' description='Review order'>" + " <assignment pooled-actors='reviewers' />" + " </task>" + " <transition name='approve' to='process'/>" + " <transition name='reject' to='cancelled'/>" + " <transition name='cancel' to='cancelled'/>" + " </task-node>" + " <state name='process' />" + " <state name='cancelled' />" + "</process-definition>"); deployProcessDefinition(processDefinition); ProcessInstance processInstance = jbpmContext.newProcessInstanceForUpdate("endtasksprocess"); processInstance.signal(); processInstance = saveAndReload(processInstance); assertEquals("approval", processInstance.getRootToken().getNode().getName()); TaskInstance taskInstance = (TaskInstance) processInstance.getTaskMgmtInstance() .getTaskInstances() .iterator() .next(); taskInstance.end("approve"); assertEquals("process", processInstance.getRootToken().getNode().getName()); } public void testReject() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition name='endtasksprocess'>" + " <start-state>" + " <transition to='approval' />" + " </start-state>" + " <task-node name='approval' end-tasks='true'>" + " <task name='approve' description='Review order'>" + " <assignment pooled-actors='reviewers' />" + " </task>" + " <transition name='approve' to='process'/>" + " <transition name='reject' to='cancelled'/>" + " <transition name='cancel' to='cancelled'/>" + " </task-node>" + " <state name='process' />" + " <state name='cancelled' />" + "</process-definition>"); deployProcessDefinition(processDefinition); ProcessInstance processInstance = jbpmContext.newProcessInstanceForUpdate("endtasksprocess"); processInstance.signal(); processInstance = saveAndReload(processInstance); assertEquals("approval", processInstance.getRootToken().getNode().getName()); TaskInstance taskInstance = (TaskInstance) processInstance.getTaskMgmtInstance() .getTaskInstances() .iterator() .next(); taskInstance.end("reject"); assertEquals("cancelled", processInstance.getRootToken().getNode().getName()); } public void testTaskInstancesAfterCancellation() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition name='endtasksprocess'>" + " <start-state>" + " <transition to='approval' />" + " </start-state>" + " <task-node name='approval' end-tasks='true'>" + " <task name='approve' description='Review order'>" + " <assignment pooled-actors='reviewers' />" + " </task>" + " <transition name='approve' to='process'/>" + " <transition name='reject' to='cancelled'/>" + " <transition name='cancel' to='cancelled'/>" + " </task-node>" + " <state name='process' />" + " <state name='cancelled' />" + "</process-definition>"); deployProcessDefinition(processDefinition); ProcessInstance processInstance = jbpmContext.newProcessInstanceForUpdate("endtasksprocess"); processInstance.signal(); processInstance = saveAndReload(processInstance); processInstance = saveAndReload(processInstance); processInstance.signal("cancel"); Collection taskInstances = processInstance.getTaskMgmtInstance().getTaskInstances(); assertEquals(1, taskInstances.size()); TaskInstance taskInstance = (TaskInstance) taskInstances.iterator().next(); assert taskInstance.hasEnded() : taskInstance; assert !taskInstance.isCancelled() : taskInstance; assert !taskInstance.isBlocking() : taskInstance; assert !taskInstance.isSignalling() : taskInstance; } }