Author: rebody
Date: 2010-11-21 08:43:03 -0500 (Sun, 21 Nov 2010)
New Revision: 6837
Added:
jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/bpmn/test/task/UserTaskTest.java
jbpm4/trunk/modules/test-db/src/test/resources/org/jbpm/bpmn/userTask.bpmn.xml
Modified:
jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/AbstractTaskBinding.java
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/ReflectUtil.java
Log:
JBPM-2921 provide assignment-handler in BPMN
Modified:
jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/AbstractTaskBinding.java
===================================================================
---
jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/AbstractTaskBinding.java 2010-11-21
12:55:19 UTC (rev 6836)
+++
jbpm4/trunk/modules/bpmn/src/main/java/org/jbpm/bpmn/flownodes/AbstractTaskBinding.java 2010-11-21
13:43:03 UTC (rev 6837)
@@ -7,6 +7,8 @@
import org.jbpm.pvm.internal.el.Expression;
import org.jbpm.pvm.internal.task.TaskDefinitionImpl;
import org.jbpm.pvm.internal.util.XmlUtil;
+import org.jbpm.pvm.internal.wire.descriptor.ObjectDescriptor;
+import org.jbpm.pvm.internal.wire.usercode.UserCodeReference;
import org.jbpm.pvm.internal.xml.Parse;
import org.w3c.dom.Element;
@@ -72,6 +74,12 @@
taskDefinition.setAssigneeExpression(expression);
} else if (POTENTIAL_OWNER.equals(type) && "user".equals(scope))
{ // default is group
taskDefinition.setCandidateUsersExpression(expression);
+ } else if ("assignment-handler".equals(scope)) {
+ UserCodeReference assignmentHandlerReference = new UserCodeReference();
+
+ ObjectDescriptor objectDescriptor = new ObjectDescriptor(formalExpression);
+ assignmentHandlerReference.setDescriptor(objectDescriptor);
+ taskDefinition.setAssignmentHandlerReference(assignmentHandlerReference);
} else {
taskDefinition.setCandidateGroupsExpression(expression);
}
Modified:
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/ReflectUtil.java
===================================================================
---
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/ReflectUtil.java 2010-11-21
12:55:19 UTC (rev 6836)
+++
jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/util/ReflectUtil.java 2010-11-21
13:43:03 UTC (rev 6837)
@@ -199,7 +199,7 @@
}
public static Method findMethod(Class<?> clazz, String methodName,
List<ArgDescriptor> argDescriptors, Object[] args) {
- if (log.isTraceEnabled()) log.trace("searching for method
"+methodName+" in "+clazz.getName());
+ if (log.isTraceEnabled()) log.trace("searching for method " + methodName +
" in " + clazz.getName());
Method[] candidates = clazz.getDeclaredMethods();
for (int i=0; i<candidates.length; i++) {
Method candidate = candidates[i];
@@ -208,13 +208,13 @@
) {
if (log.isTraceEnabled()) {
- if (log.isTraceEnabled()) log.trace("found matching method
"+clazz.getName()+"."+methodName);
+ if (log.isTraceEnabled()) log.trace("found matching method " +
clazz.getName() + "." + methodName);
}
return candidate;
}
}
- if (clazz.getSuperclass()!=null) {
+ if (clazz.getSuperclass() != null) {
return findMethod(clazz.getSuperclass(), methodName, argDescriptors, args);
}
return null;
@@ -222,7 +222,7 @@
public static Constructor<?> findConstructor(Class<?> clazz,
List<ArgDescriptor> argDescriptors, Object[] args) {
Constructor<?>[] constructors = clazz.getDeclaredConstructors();
- for (int i=0; i<constructors.length; i++) {
+ for (int i = 0; i < constructors.length; i++) {
if (isArgumentMatch(constructors[i].getParameterTypes(), argDescriptors, args)) {
return constructors[i];
}
@@ -231,18 +231,18 @@
}
public static boolean isArgumentMatch(Class<?>[] parameterTypes,
List<ArgDescriptor> argDescriptors, Object[] args) {
- int nbrOfArgs = args!=null ? args.length : 0;
- int nbrOfParameterTypes = parameterTypes!=null ? parameterTypes.length : 0;
+ int nbrOfArgs = args != null ? args.length : 0;
+ int nbrOfParameterTypes = parameterTypes != null ? parameterTypes.length : 0;
- if (nbrOfArgs!=nbrOfParameterTypes) {
+ if (nbrOfArgs != nbrOfParameterTypes) {
return false;
}
- if (nbrOfArgs==0) {
+ if (nbrOfArgs == 0) {
return true;
}
- for (int i=0; i<parameterTypes.length; i++) {
+ for (int i = 0; i < parameterTypes.length; i++) {
Class<?> parameterType = parameterTypes[i];
String argTypeName;
if (argDescriptors == null || (argTypeName = argDescriptors.get(i).getTypeName())
== null) {
Added:
jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/bpmn/test/task/UserTaskTest.java
===================================================================
--- jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/bpmn/test/task/UserTaskTest.java
(rev 0)
+++
jbpm4/trunk/modules/test-db/src/test/java/org/jbpm/bpmn/test/task/UserTaskTest.java 2010-11-21
13:43:03 UTC (rev 6837)
@@ -0,0 +1,42 @@
+package org.jbpm.bpmn.test.task;
+
+import java.util.List;
+
+import org.jbpm.api.NewDeployment;
+import org.jbpm.api.ProcessInstance;
+import org.jbpm.api.model.OpenExecution;
+import org.jbpm.api.task.Assignable;
+import org.jbpm.api.task.AssignmentHandler;
+import org.jbpm.api.task.Task;
+import org.jbpm.test.JbpmTestCase;
+
+
+public class UserTaskTest extends JbpmTestCase {
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ NewDeployment deployment = repositoryService.createDeployment();
+ deployment.addResourceFromClasspath("org/jbpm/bpmn/userTask.bpmn.xml");
+ registerDeployment(deployment.deploy());
+ }
+
+ public void testAssignmentHandler() {
+ ProcessInstance pi =
executionService.startProcessInstanceByKey("userTaskProcess");
+
+ assertNotNull(pi.getId());
+
+ List<Task> allTasks = taskService.findPersonalTasks("johndoe");
+ assertEquals(1, allTasks.size());
+
+ taskService.completeTask(allTasks.get(0).getId());
+ assertProcessInstanceEnded(pi);
+ }
+
+ public static class TaskHandler implements AssignmentHandler {
+ public void assign(Assignable assignable, OpenExecution execution) {
+ assignable.setAssignee("johndoe");
+ }
+ }
+
+}
Added: jbpm4/trunk/modules/test-db/src/test/resources/org/jbpm/bpmn/userTask.bpmn.xml
===================================================================
--- jbpm4/trunk/modules/test-db/src/test/resources/org/jbpm/bpmn/userTask.bpmn.xml
(rev 0)
+++
jbpm4/trunk/modules/test-db/src/test/resources/org/jbpm/bpmn/userTask.bpmn.xml 2010-11-21
13:43:03 UTC (rev 6837)
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"
standalone="yes"?>
+<definitions id="sid-e471f2be-74cc-4f20-a201-09327449efdf"
+
typeLanguage="http://www.w3.org/2001/XMLSchema"
+
expressionLanguage="http://www.w3.org/1999/XPath"
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+
targetNamespace="http://www.omg.org/bpmn20"
+
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL
BPMN20.xsd"
+
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
+
xmlns:jbpm="http://jbpm.org/bpmn2">
+ <process id="userTaskProcess" name="userTaskProcess">
+ <startEvent name="Process start" id="start"/>
+ <sequenceFlow targetRef="userTask" sourceRef="start"
name="flow2Manual" id="flow1"/>
+ <userTask implementation="other" name="Sales operation"
id="userTask">
+ <potentialOwner jbpm:type="assignment-handler">
+ <resourceRef>sales</resourceRef>
+ <resourceAssignmentExpression>
+
<formalExpression>org.jbpm.bpmn.test.task.UserTaskTest$TaskHandler</formalExpression>
+ </resourceAssignmentExpression>
+ </potentialOwner>
+ </userTask>
+ <sequenceFlow targetRef="end" sourceRef="userTask"
name="flow2End" id="flow3"/>
+ <endEvent name="Process end" id="end"/>
+ </process>
+</definitions>