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 values = null; + if (containsKey(key)) + { + values = new ArrayList(this.size()); + + for (int i = 0; i < JBPMNodeList.this.size(); i++) + { + JBPMNode node = JBPMNodeList.this.get(i); + Object value = node.getProperties().get(key); + values.add(value); + } + } + + return values; + } + + } + } diff --git a/source/java/org/alfresco/repo/workflow/jbpm/NodeListConverter.java b/source/java/org/alfresco/repo/workflow/jbpm/NodeListConverter.java index fd94dc2d1c..84e5847501 100644 --- a/source/java/org/alfresco/repo/workflow/jbpm/NodeListConverter.java +++ b/source/java/org/alfresco/repo/workflow/jbpm/NodeListConverter.java @@ -83,7 +83,7 @@ public class NodeListConverter extends SerializableToByteArrayConverter BeanFactoryReference factory = jbpmFactoryLocator.useBeanFactory(null); ServiceRegistry serviceRegistry = (ServiceRegistry)factory.getFactory().getBean(ServiceRegistry.SERVICE_REGISTRY); - JBPMNodeList nodes = new JBPMNodeList(); + JBPMNodeList nodes = new JBPMNodeList(serviceRegistry); for (NodeRef nodeRef : nodeRefs) { nodes.add(new JBPMNode(nodeRef, serviceRegistry)); diff --git a/source/java/org/alfresco/repo/workflow/jbpm/adhoc_task_processdefinition.xml b/source/java/org/alfresco/repo/workflow/jbpm/adhoc_task_processdefinition.xml deleted file mode 100644 index 013fdb6115..0000000000 --- a/source/java/org/alfresco/repo/workflow/jbpm/adhoc_task_processdefinition.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/source/java/org/alfresco/repo/workflow/jbpm/review_and_approve_processdefinition.xml b/source/java/org/alfresco/repo/workflow/jbpm/review_and_approve_processdefinition.xml deleted file mode 100644 index db8f6309be..0000000000 --- a/source/java/org/alfresco/repo/workflow/jbpm/review_and_approve_processdefinition.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/source/java/org/alfresco/repo/workflow/jbpm/test_pooledtasks.xml b/source/java/org/alfresco/repo/workflow/jbpm/test_pooledtasks.xml new file mode 100644 index 0000000000..6bde9d0ef5 --- /dev/null +++ b/source/java/org/alfresco/repo/workflow/jbpm/test_pooledtasks.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + #{bpm_assignees} + + + + + + + + + + + \ No newline at end of file