package org.jbpm.instantiation; import java.util.ArrayList; import java.util.List; import org.jbpm.AbstractJbpmTestCase; import org.jbpm.JbpmConfiguration; import org.jbpm.JbpmContext; import org.jbpm.context.exe.ContextInstance; import org.jbpm.graph.def.Action; import org.jbpm.graph.def.ActionHandler; import org.jbpm.graph.def.ProcessDefinition; import org.jbpm.graph.exe.ExecutionContext; import org.jbpm.graph.exe.ProcessInstance; import org.jbpm.graph.exe.Token; import org.jbpm.taskmgmt.def.AssignmentHandler; import org.jbpm.taskmgmt.def.TaskControllerHandler; import org.jbpm.taskmgmt.exe.Assignable; import org.jbpm.taskmgmt.exe.TaskInstance; public class UserCodeInterceptorTest extends AbstractJbpmTestCase { static List logs = new ArrayList(); private JbpmContext jbpmContext; protected void setUp() throws Exception { super.setUp(); JbpmConfiguration jbpmConfiguration = JbpmConfiguration.parseXmlString("<jbpm-configuration>" + " <jbpm-context />" + " <bean name='jbpm.user.code.interceptor' class='" + TestInterceptor.class.getName() + "' singleton='true'/>" + "</jbpm-configuration>"); jbpmContext = jbpmConfiguration.createJbpmContext(); } protected void tearDown() throws Exception { jbpmContext.close(); jbpmContext.getJbpmConfiguration().close(); logs.clear(); super.tearDown(); } public void testAction() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition>" + " <start-state name='start'>" + " <event type='node-leave'>" + " <action name='takingthetransition' class='" + TestAction.class.getName() + "' />" + " </event>" + " <transition to='end'/>" + " </start-state>" + " <state name='end'/>" + "</process-definition>"); // create the process instance ProcessInstance processInstance = new ProcessInstance(processDefinition); processInstance.signal(); List expectedLogs = new ArrayList(); expectedLogs.add("before action takingthetransition in node start"); expectedLogs.add("action executed"); expectedLogs.add("after action takingthetransition in node start"); assertEquals(expectedLogs, logs); } public void testInterceptControllerInitialization() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition>" + " <start-state name='start'>" + " <transition to='t'/>" + " </start-state>" + " <task-node name='t'>" + " <task>" + " <controller class='" + TestController.class.getName() + "'/>" + " </task>" + " <transition to='end'/>" + " </task-node>" + " <state name='end' />" + "</process-definition>"); // create the process instance ProcessInstance processInstance = new ProcessInstance(processDefinition); processInstance.signal(); List expectedLogs = new ArrayList(); expectedLogs.add("before task controller initialization"); expectedLogs.add("initializing task variables for TaskInstance(t)"); expectedLogs.add("after task controller initialization"); assertEquals(expectedLogs, logs); } public void testInterceptControllerSubmission() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition>" + " <start-state name='start'>" + " <transition to='t'/>" + " </start-state>" + " <task-node name='t'>" + " <task>" + " <controller class='" + TestController.class.getName() + "'/>" + " </task>" + " <transition to='end'/>" + " </task-node>" + " <state name='end' />" + "</process-definition>"); // create the process instance ProcessInstance processInstance = new ProcessInstance(processDefinition); processInstance.signal(); TaskInstance ti = (TaskInstance) processInstance.getTaskMgmtInstance() .getTaskInstances() .iterator() .next(); ti.end(); List expectedLogs = new ArrayList(); expectedLogs.add("before task controller initialization"); expectedLogs.add("initializing task variables for TaskInstance(t)"); expectedLogs.add("after task controller initialization"); expectedLogs.add("before task controller submission"); expectedLogs.add("submitting task variables for TaskInstance(t)"); expectedLogs.add("after task controller submission"); assertEquals(expectedLogs.get(0), logs.get(0)); assertEquals(expectedLogs.get(1), logs.get(1)); assertEquals(expectedLogs.get(2), logs.get(2)); assertEquals(expectedLogs.get(3), logs.get(3)); assertEquals(expectedLogs.get(4), logs.get(4)); assertEquals(expectedLogs.get(5), logs.get(5)); } public void testNodeBehaviour() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition>" + " <start-state name='start'>" + " <transition to='auto'/>" + " </start-state>" + " <node name='auto'>" + " <action name='theautonode' class='" + TestAutoAction.class.getName() + "' />" + " <transition to='end'/>" + " </node>" + " <state name='end' />" + "</process-definition>"); // create the process instance ProcessInstance processInstance = new ProcessInstance(processDefinition); processInstance.signal(); List expectedLogs = new ArrayList(); expectedLogs.add("before action theautonode in node auto"); expectedLogs.add("auto action executed"); expectedLogs.add("after action theautonode in node end"); assertEquals(expectedLogs, logs); } public void testReferencedNodeBehaviour() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition>" + " <start-state name='start'>" + " <transition to='auto'/>" + " </start-state>" + " <node name='auto'>" + " <action name='reference' ref-name='referenced' />" + " <transition to='end'/>" + " </node>" + " <state name='end' />" + " <action name='referenced' class='" + TestAutoAction.class.getName() + "' />" + "</process-definition>"); // create the process instance ProcessInstance processInstance = new ProcessInstance(processDefinition); processInstance.signal(); List expectedLogs = new ArrayList(); expectedLogs.add("before action reference in node auto"); expectedLogs.add("auto action executed"); expectedLogs.add("after action reference in node end"); assertEquals(expectedLogs, logs); } public void testReferencedAction() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition>" + " <start-state name='start'>" + " <transition to='auto'/>" + " </start-state>" + " <node name='auto'>" + " <event type='node-enter'>" + " <action name='reference' ref-name='referenced' />" + " </event>" + " <transition to='end'/>" + " </node>" + " <state name='end' />" + " <action name='referenced' class='" + TestAction.class.getName() + "' />" + "</process-definition>"); // create the process instance ProcessInstance processInstance = new ProcessInstance(processDefinition); processInstance.signal(); List expectedLogs = new ArrayList(); expectedLogs.add("before action reference in node auto"); expectedLogs.add("action executed"); expectedLogs.add("after action reference in node auto"); assertEquals(expectedLogs, logs); } public void testInterceptAssignment() { ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition>" + " <start-state name='start'>" + " <transition to='t'/>" + " </start-state>" + " <task-node name='t'>" + " <task>" + " <assignment class='" + TestAssignment.class.getName() + "' />" + " </task>" + " <transition to='end'/>" + " </task-node>" + " <state name='end' />" + "</process-definition>"); // create the process instance ProcessInstance processInstance = new ProcessInstance(processDefinition); processInstance.signal(); List expectedLogs = new ArrayList(); expectedLogs.add("before assignment"); expectedLogs.add("assigning TaskInstance(t)"); expectedLogs.add("after assignment"); assertEquals(expectedLogs, logs); } public static class TestInterceptor implements UserCodeInterceptor { public void executeAction(Action action, ExecutionContext executionContext) throws Exception { logs.add("before action " + action.getName() + " in node " + executionContext.getNode().getName()); action.execute(executionContext); logs.add("after action " + action.getName() + " in node " + executionContext.getNode().getName()); } public void executeAssignment(AssignmentHandler assignmentHandler, Assignable assignable, ExecutionContext executionContext) throws Exception { logs.add("before assignment"); assignmentHandler.assign(assignable, executionContext); logs.add("after assignment"); } public void executeTaskControllerInitialization(TaskControllerHandler taskControllerHandler, TaskInstance taskInstance, ContextInstance contextInstance, Token token) { logs.add("before task controller initialization"); taskControllerHandler.initializeTaskVariables(taskInstance, contextInstance, token); logs.add("after task controller initialization"); } public void executeTaskControllerSubmission(TaskControllerHandler taskControllerHandler, TaskInstance taskInstance, ContextInstance contextInstance, Token token) { logs.add("before task controller submission"); taskControllerHandler.submitTaskVariables(taskInstance, contextInstance, token); logs.add("after task controller submission"); } } public static class TestAction implements ActionHandler { private static final long serialVersionUID = 1L; public void execute(ExecutionContext executionContext) throws Exception { logs.add("action executed"); } } public static class TestAutoAction implements ActionHandler { private static final long serialVersionUID = 1L; public void execute(ExecutionContext executionContext) throws Exception { logs.add("auto action executed"); executionContext.leaveNode(); } } public static class TestAssignment implements AssignmentHandler { private static final long serialVersionUID = 1L; public void assign(Assignable assignable, ExecutionContext executionContext) throws Exception { logs.add("assigning " + assignable); assignable.setActorId("shipper"); } } public static class TestController implements TaskControllerHandler { private static final long serialVersionUID = 1L; public void initializeTaskVariables(TaskInstance taskInstance, ContextInstance contextInstance, Token token) { logs.add("initializing task variables for " + taskInstance); } public void submitTaskVariables(TaskInstance taskInstance, ContextInstance contextInstance, Token token) { logs.add("submitting task variables for " + taskInstance); } } }