diff --git a/config/alfresco/extension/lifecycle_processdefinition.xml b/config/alfresco/extension/lifecycle_processdefinition.xml
index f8683c3d8f..e7dba487fc 100644
--- a/config/alfresco/extension/lifecycle_processdefinition.xml
+++ b/config/alfresco/extension/lifecycle_processdefinition.xml
@@ -27,7 +27,9 @@
-
+
+ #{bpm_assignee}
+
diff --git a/config/alfresco/model/workflowModel.xml b/config/alfresco/model/workflowModel.xml
deleted file mode 100644
index 0185344dee..0000000000
--- a/config/alfresco/model/workflowModel.xml
+++ /dev/null
@@ -1,160 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Submit Review Task
- bpm:workflowTask
-
-
-
-
- Review Due Date
- d:date
-
-
-
- Review Priority
- d:int
- 2
-
-
-
-
-
-
-
-
-
-
- Reviewer
-
- false
- false
-
-
- cm:person
- true
- false
-
-
-
-
-
-
-
-
- workflow_collection_actions
-
-
-
- workflow_item_collection_actions
-
-
-
-
-
-
-
-
- Review Task
- bpm:workflowTask
-
-
-
-
- workflow_item_edit_actions
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- bpm:workflowTask
-
-
-
- Description
- d:text
-
-
-
-
-
- Submit Adhoc Task
- wf:baseAdhocTask
-
-
-
- Due Date
- d:date
-
-
-
- Priority
- d:int
- 2
-
-
-
-
-
-
- Email Notification
- d:boolean
-
-
-
-
-
- Assignee
-
- false
- false
-
-
- cm:person
- true
- false
-
-
-
-
-
-
- Adhoc Task
- wf:baseAdhocTask
-
-
-
- Completed Adhoc Task
- wf:baseAdhocTask
-
-
-
-
-
\ No newline at end of file
diff --git a/config/alfresco/workflow/adhoc_processdefinition.xml b/config/alfresco/workflow/adhoc_processdefinition.xml
index 2c359035f7..18f41ea967 100644
--- a/config/alfresco/workflow/adhoc_processdefinition.xml
+++ b/config/alfresco/workflow/adhoc_processdefinition.xml
@@ -10,7 +10,9 @@
-
+
+ #{bpm_assignee}
+
diff --git a/config/alfresco/workflow/parallelreview_processdefinition.xml b/config/alfresco/workflow/parallelreview_processdefinition.xml
index e84952af3a..0e797ff026 100644
--- a/config/alfresco/workflow/parallelreview_processdefinition.xml
+++ b/config/alfresco/workflow/parallelreview_processdefinition.xml
@@ -27,13 +27,9 @@
-
-
-
-
-
+
+ #{reviewer}
+
diff --git a/config/alfresco/workflow/review_processdefinition.xml b/config/alfresco/workflow/review_processdefinition.xml
index e26c57d889..cba8bbaa36 100644
--- a/config/alfresco/workflow/review_processdefinition.xml
+++ b/config/alfresco/workflow/review_processdefinition.xml
@@ -10,7 +10,9 @@
-
+
+ #{bpm_assignee}
+
diff --git a/config/alfresco/workflow/submit_processdefinition.xml b/config/alfresco/workflow/submit_processdefinition.xml
index baa7f06707..b5f8057c5b 100644
--- a/config/alfresco/workflow/submit_processdefinition.xml
+++ b/config/alfresco/workflow/submit_processdefinition.xml
@@ -55,13 +55,9 @@
-
-
-
-
-
+
+ #{bpm_assignees.get(wcmwf_approveCnt)}
+
@@ -90,13 +86,9 @@
-
-
-
-
-
+
+ #{reviewer}
+
diff --git a/source/java/org/alfresco/repo/workflow/WorkflowInterpreter.java b/source/java/org/alfresco/repo/workflow/WorkflowInterpreter.java
index d2056ee152..617e918a14 100644
--- a/source/java/org/alfresco/repo/workflow/WorkflowInterpreter.java
+++ b/source/java/org/alfresco/repo/workflow/WorkflowInterpreter.java
@@ -443,6 +443,17 @@ public class WorkflowInterpreter
out.println("id: " + task.id + " , name " + task.name + " , properties: " + task.properties.size() + " , workflow: " + task.path.instance.id + " , path: " + task.path.id);
}
}
+
+ else if (command[2].equals("pooled"))
+ {
+ out.println(AuthenticationUtil.getCurrentUserName() + ":");
+ List tasks = workflowService.getPooledTasks(AuthenticationUtil.getCurrentUserName());
+ for (WorkflowTask task : tasks)
+ {
+ out.println("id: " + task.id + " , name " + task.name + " , properties: " + task.properties.size() + " , workflow: " + task.path.instance.id + " , path: " + task.path.id);
+ }
+ }
+
else
{
return "Syntax Error.\n";
diff --git a/source/java/org/alfresco/repo/workflow/jbpm/AlfrescoAssignment.java b/source/java/org/alfresco/repo/workflow/jbpm/AlfrescoAssignment.java
new file mode 100644
index 0000000000..de072856a6
--- /dev/null
+++ b/source/java/org/alfresco/repo/workflow/jbpm/AlfrescoAssignment.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2005 Alfresco, Inc.
+ *
+ * Licensed under the Mozilla Public License version 1.1
+ * with a permitted attribution clause. You may obtain a
+ * copy of the License at
+ *
+ * http://www.alfresco.org/legal/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific
+ * language governing permissions and limitations under the
+ * License.
+ */
+package org.alfresco.repo.workflow.jbpm;
+
+import java.util.Collection;
+
+import org.alfresco.model.ContentModel;
+import org.alfresco.service.cmr.workflow.WorkflowException;
+import org.dom4j.Element;
+import org.jbpm.graph.exe.ExecutionContext;
+import org.jbpm.jpdl.el.impl.JbpmExpressionEvaluator;
+import org.jbpm.taskmgmt.def.AssignmentHandler;
+import org.jbpm.taskmgmt.exe.Assignable;
+
+
+/**
+ * Assignment Handler for assigning Alfresco People and Groups to Tasks
+ * and Swimlanes
+ *
+ * @author davidc
+ */
+public class AlfrescoAssignment implements AssignmentHandler
+{
+ private static final long serialVersionUID = 1025667849552265719L;
+
+ private Element actor;
+ private Element pooledactors;
+
+
+ /* (non-Javadoc)
+ * @see org.jbpm.taskmgmt.def.AssignmentHandler#assign(org.jbpm.taskmgmt.exe.Assignable, org.jbpm.graph.exe.ExecutionContext)
+ */
+ public void assign(Assignable assignable, ExecutionContext executionContext) throws Exception
+ {
+ if (actor == null && pooledactors == null)
+ {
+ throw new WorkflowException("no actor or pooled actors has been specified");
+ }
+
+ //
+ // extract actor
+ //
+
+ String assignedActor = null;
+ if (actor != null)
+ {
+ String actorValStr = actor.getTextTrim();
+ if (actorValStr != null && actorValStr.length() > 0)
+ {
+ if (actorValStr.startsWith("#{"))
+ {
+ Object eval = JbpmExpressionEvaluator.evaluate(actorValStr, executionContext);
+ if (eval == null)
+ {
+ throw new WorkflowException("actor expression '" + actorValStr + "' evaluates to null");
+ }
+
+ if (eval instanceof String)
+ {
+ assignedActor = (String)eval;
+ }
+ else if (eval instanceof JBPMNode)
+ {
+ JBPMNode node = (JBPMNode)eval;
+ if (!node.getType().equals(ContentModel.TYPE_PERSON))
+ {
+ throw new WorkflowException("actor expression does not evaluate to a person");
+ }
+ assignedActor = (String)node.getProperties().get(ContentModel.PROP_USERNAME);
+ }
+ else
+ {
+ throw new WorkflowException("actor expression does not evaluate to a person");
+ }
+ }
+ else
+ {
+ assignedActor = actorValStr;
+ }
+ }
+ }
+
+ //
+ // extract pooled actors
+ //
+
+ String[] assignedPooledActors = null;
+ if (pooledactors != null)
+ {
+ String pooledactorValStr = pooledactors.getTextTrim();
+ if (pooledactorValStr != null && pooledactorValStr.length() > 0)
+ {
+ if (pooledactorValStr.startsWith("#{"))
+ {
+ Object eval = JbpmExpressionEvaluator.evaluate(pooledactorValStr, executionContext);
+ if (eval == null)
+ {
+ throw new WorkflowException("pooledactors expression '" + pooledactorValStr + "' evaluates to null");
+ }
+
+ if (eval instanceof Collection)
+ {
+ Collection coll = (Collection)eval;
+ assignedPooledActors = new String[coll.size()];
+
+ int i = 0;
+ for (Object obj : coll)
+ {
+ if (!(obj instanceof JBPMNode))
+ {
+ throw new WorkflowException("pooledactors does not refer to a collection of people");
+ }
+ JBPMNode node = (JBPMNode)obj;
+ if (!node.getType().equals(ContentModel.TYPE_PERSON))
+ {
+ throw new WorkflowException("pooledactors expression does not evaluate to a collection of people");
+ }
+ assignedPooledActors[i++] = (String)node.getProperties().get(ContentModel.PROP_USERNAME);
+ }
+ }
+ else if (eval instanceof JBPMNode)
+ {
+ JBPMNode node = (JBPMNode)eval;
+ if (node.getType().equals(ContentModel.TYPE_PERSON))
+ {
+ assignedPooledActors[0] = (String)node.getProperties().get(ContentModel.PROP_USERNAME);
+ }
+ // TODO: Support Group
+ else
+ {
+ throw new WorkflowException("pooledactors expression does not evaluate to a collection of people");
+ }
+ }
+ else
+ {
+ throw new WorkflowException("pooledactor expression does not evaluate to a group or collection of people");
+ }
+ }
+ else
+ {
+ assignedPooledActors[0] = pooledactorValStr;
+ }
+ }
+ }
+
+ //
+ // make the assignment
+ //
+ if (assignedActor != null)
+ {
+ assignable.setActorId(assignedActor);
+ }
+ if (assignedPooledActors != null)
+ {
+ assignable.setPooledActors(assignedPooledActors);
+ }
+ }
+
+}
diff --git a/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngine.java b/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngine.java
index 66e0168323..bed046e892 100644
--- a/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngine.java
+++ b/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngine.java
@@ -82,6 +82,7 @@ import org.jbpm.jpdl.par.ProcessArchive;
import org.jbpm.jpdl.xml.JpdlXmlReader;
import org.jbpm.jpdl.xml.Problem;
import org.jbpm.taskmgmt.def.Task;
+import org.jbpm.taskmgmt.exe.PooledActor;
import org.jbpm.taskmgmt.exe.TaskInstance;
import org.springframework.util.StringUtils;
import org.springmodules.workflow.jbpm31.JbpmCallback;
@@ -1369,9 +1370,9 @@ public class JBPMEngine extends BPMEngine
if (pooledActors != null)
{
List pooledNodeRefs = new ArrayList(pooledActors.size());
- for (String pooledActor : (Set)pooledActors)
+ for (PooledActor pooledActor : (Set)pooledActors)
{
- NodeRef pooledNodeRef = mapNameToAuthority(pooledActor);
+ NodeRef pooledNodeRef = mapNameToAuthority(pooledActor.getActorId());
if (pooledNodeRef != null)
{
pooledNodeRefs.add(pooledNodeRef);
@@ -1746,7 +1747,7 @@ public class JBPMEngine extends BPMEngine
if (isMany)
{
// convert single node ref to list of node refs
- JBPMNodeList values = new JBPMNodeList();
+ JBPMNodeList values = new JBPMNodeList(serviceRegistry);
values.add(new JBPMNode((NodeRef)value, serviceRegistry));
value = (Serializable)values;
}
@@ -1759,7 +1760,7 @@ public class JBPMEngine extends BPMEngine
{
if (isMany)
{
- JBPMNodeList values = new JBPMNodeList();
+ JBPMNodeList values = new JBPMNodeList(serviceRegistry);
for (NodeRef nodeRef : (List)value)
{
values.add(new JBPMNode(nodeRef, serviceRegistry));
diff --git a/source/java/org/alfresco/repo/workflow/jbpm/JBPMNodeList.java b/source/java/org/alfresco/repo/workflow/jbpm/JBPMNodeList.java
index 7293641f3b..f079671d05 100644
--- a/source/java/org/alfresco/repo/workflow/jbpm/JBPMNodeList.java
+++ b/source/java/org/alfresco/repo/workflow/jbpm/JBPMNodeList.java
@@ -1,9 +1,112 @@
+/*
+ * Copyright (C) 2005 Alfresco, Inc.
+ *
+ * Licensed under the Mozilla Public License version 1.1
+ * with a permitted attribution clause. You may obtain a
+ * copy of the License at
+ *
+ * http://www.alfresco.org/legal/license.txt
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific
+ * language governing permissions and limitations under the
+ * License.
+ */
package org.alfresco.repo.workflow.jbpm;
import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Map;
+
+import org.alfresco.service.ServiceRegistry;
+import org.alfresco.service.namespace.NamespacePrefixResolver;
+import org.alfresco.service.namespace.QNameMap;
+/**
+ * List of jBPM Nodes
+ *
+ * @author davidc
+ */
public class JBPMNodeList extends ArrayList
{
private static final long serialVersionUID = 1376915749912156471L;
+
+ protected ServiceRegistry services;
+
+
+ /**
+ * Construct
+ *
+ * @param nodeRef node reference
+ * @param services services
+ */
+ public JBPMNodeList(ServiceRegistry services)
+ {
+ super();
+ this.services = services;
+ }
+
+ /**
+ * Accessor to retrieve a named property on all nodes in the list
+ *
+ * @param propertyName the name of the property to retrieve
+ * @return a collection of property name values
+ */
+ public Map> getValues(String propertyName)
+ {
+ ValuesMap> values = new ValuesMap>(null);
+
+ for (int i = 0; i < JBPMNodeList.this.size(); i++)
+ {
+ JBPMNode node = JBPMNodeList.this.get(i);
+ Map nodeValues = node.getProperties();
+ for (String key : nodeValues.keySet())
+ {
+ values.put(key, null);
+ }
+ }
+
+ return values;
+ }
+
+
+ public class ValuesMap extends QNameMap
+ {
+ /**
+ *
+ */
+ private static final long serialVersionUID = -6463958742416258009L;
+
+
+ public ValuesMap(NamespacePrefixResolver resolver)
+ {
+ super(resolver);
+ // TODO Auto-generated constructor stub
+ }
+
+
+ @Override
+ public Object get(Object key)
+ {
+ Collection