diff --git a/config/alfresco/model/bpmModel.xml b/config/alfresco/model/bpmModel.xml index 2229575aaa..6f9780c217 100644 --- a/config/alfresco/model/bpmModel.xml +++ b/config/alfresco/model/bpmModel.xml @@ -178,6 +178,18 @@ bpm:task + + + + + + Workflow Definition Id + d:text + + + Workflow Instance Id + d:text + @@ -188,6 +200,8 @@ d:noderef + + @@ -235,6 +249,8 @@ + + d:noderef diff --git a/config/alfresco/workflow-context.xml b/config/alfresco/workflow-context.xml index 9f7ce0a272..1d3cd3e1a0 100644 --- a/config/alfresco/workflow-context.xml +++ b/config/alfresco/workflow-context.xml @@ -47,7 +47,7 @@ - + @@ -61,6 +61,7 @@ + diff --git a/source/java/org/alfresco/repo/workflow/WorkflowDeployer.java b/source/java/org/alfresco/repo/workflow/WorkflowDeployer.java index faf01522ba..6108ffd661 100644 --- a/source/java/org/alfresco/repo/workflow/WorkflowDeployer.java +++ b/source/java/org/alfresco/repo/workflow/WorkflowDeployer.java @@ -16,7 +16,6 @@ */ package org.alfresco.repo.workflow; -import java.io.InputStream; import java.util.List; import java.util.Properties; diff --git a/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngine.java b/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngine.java index 1b5b67d3a0..f72efbf7d2 100644 --- a/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngine.java +++ b/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngine.java @@ -36,6 +36,7 @@ import org.alfresco.repo.workflow.TaskComponent; import org.alfresco.repo.workflow.WorkflowComponent; import org.alfresco.repo.workflow.WorkflowDefinitionComponent; import org.alfresco.repo.workflow.WorkflowModel; +import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.dictionary.AspectDefinition; import org.alfresco.service.cmr.dictionary.AssociationDefinition; import org.alfresco.service.cmr.dictionary.DictionaryService; @@ -86,6 +87,7 @@ public class JBPMEngine extends BPMEngine protected DictionaryService dictionaryService; protected NamespaceService namespaceService; protected NodeService nodeService; + protected ServiceRegistry serviceRegistry; protected PersonService personService; private JbpmTemplate jbpmTemplate; @@ -139,6 +141,16 @@ public class JBPMEngine extends BPMEngine this.personService = personService; } + /** + * Sets the Service Registry + * + * @param serviceRegistry + */ + public void setServiceRegistry(ServiceRegistry serviceRegistry) + { + this.serviceRegistry = serviceRegistry; + } + // // Workflow Definition... @@ -907,9 +919,18 @@ public class JBPMEngine extends BPMEngine { String key = entry.getKey(); Object value = entry.getValue(); - + + // // perform data conversions - // NOTE: Only convert Authority name to NodeRef for now + // + + // Convert Nodes to NodeRefs + if (value instanceof org.alfresco.repo.jscript.Node) + { + value = ((org.alfresco.repo.jscript.Node)value).getNodeRef(); + } + + // Convert Authority name to NodeRefs QName qname = QName.createQName(key, this.namespaceService); AssociationDefinition assocDef = taskAssocs.get(qname); if (assocDef != null && assocDef.getTargetClass().equals(ContentModel.TYPE_PERSON)) @@ -1030,13 +1051,29 @@ public class JBPMEngine extends BPMEngine if (assocDef.getTargetClass().getName().equals(ContentModel.TYPE_PERSON)) { String[] authorityNames = mapAuthorityToName((List)value); - value = ((assocDef.isTargetMany()) ? authorityNames : authorityNames[0]); + if (authorityNames != null && authorityNames.length > 0) + { + value = (Serializable) (assocDef.isTargetMany() ? authorityNames : authorityNames[0]); + } } // map association to specific jBPM task instance field if (key.equals(WorkflowModel.ASSOC_POOLED_ACTORS)) { - instance.setPooledActors((String[])value); + String[] pooledActors = null; + if (value instanceof String[]) + { + pooledActors = (String[])value; + } + else if (value instanceof String) + { + pooledActors = new String[] {(String)value}; + } + else + { + throw new WorkflowException("Pooled actors value '" + value + "' is invalid"); + } + instance.setPooledActors(pooledActors); continue; } } @@ -1044,14 +1081,10 @@ public class JBPMEngine extends BPMEngine // no specific mapping to jBPM task has been established, so place into // the generic task variable bag - String name = null; - if (key.getNamespaceURI().equals(NamespaceService.DEFAULT_URI)) + String name = key.toPrefixString(this.namespaceService); + if (value instanceof NodeRef) { - name = key.getLocalName(); - } - else - { - name = key.toPrefixString(this.namespaceService); + value = new org.alfresco.repo.jscript.Node((NodeRef)value, serviceRegistry, null); } instance.setVariableLocally(name, value); } diff --git a/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngineTest.java b/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngineTest.java index dcb4d35d35..d17a4b7e09 100644 --- a/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngineTest.java +++ b/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngineTest.java @@ -30,7 +30,10 @@ import org.alfresco.repo.workflow.TaskComponent; import org.alfresco.repo.workflow.WorkflowComponent; import org.alfresco.repo.workflow.WorkflowDefinitionComponent; import org.alfresco.repo.workflow.WorkflowModel; +import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.workflow.WorkflowDefinition; import org.alfresco.service.cmr.workflow.WorkflowException; import org.alfresco.service.cmr.workflow.WorkflowInstance; @@ -54,6 +57,7 @@ public class JBPMEngineTest extends BaseSpringTest WorkflowComponent workflowComponent; TaskComponent taskComponent; WorkflowDefinition testWorkflowDef; + NodeRef testNodeRef; //@Override @@ -72,6 +76,10 @@ public class JBPMEngineTest extends BaseSpringTest assertEquals("Test", testWorkflowDef.name); assertEquals("1", testWorkflowDef.version); assertTrue(workflowDefinitionComponent.isDefinitionDeployed(processDef.getInputStream(), MimetypeMap.MIMETYPE_XML)); + + // get valid node ref + NodeService nodeService = (NodeService)applicationContext.getBean(ServiceRegistry.NODE_SERVICE.getLocalName()); + testNodeRef = nodeService.getRootNode(new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "spacesStore")); } @@ -336,6 +344,25 @@ public class JBPMEngineTest extends BaseSpringTest } + public void testNodeRef() + { + WorkflowDefinition workflowDef = getTestDefinition(); + Map parameters = new HashMap(); + parameters.put(QName.createQName(NamespaceService.DEFAULT_URI, "reviewer"), "admin"); + parameters.put(QName.createQName(NamespaceService.DEFAULT_URI, "testNode"), testNodeRef); + WorkflowPath path = workflowComponent.startWorkflow(workflowDef.id, parameters); + assertNotNull(path); + assertNotNull(path); + List tasks1 = workflowComponent.getTasksForWorkflowPath(path.id); + assertNotNull(tasks1); + assertEquals(1, tasks1.size()); + assertEquals(WorkflowTaskState.IN_PROGRESS, tasks1.get(0).state); + WorkflowTask updatedTask = taskComponent.endTask(tasks1.get(0).id, null); + assertNotNull(updatedTask); + assertEquals(WorkflowTaskState.COMPLETED, updatedTask.state); + } + + /** * Locate the Test Workflow Definition * diff --git a/source/java/org/alfresco/repo/workflow/jbpm/NodeConverter.java b/source/java/org/alfresco/repo/workflow/jbpm/NodeConverter.java new file mode 100644 index 0000000000..42665f779a --- /dev/null +++ b/source/java/org/alfresco/repo/workflow/jbpm/NodeConverter.java @@ -0,0 +1,80 @@ +/* + * 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 org.alfresco.repo.jscript.Node; +import org.alfresco.service.ServiceRegistry; +import org.alfresco.service.cmr.repository.NodeRef; +import org.jbpm.context.exe.Converter; +import org.springframework.beans.factory.access.BeanFactoryLocator; +import org.springframework.beans.factory.access.BeanFactoryReference; +import org.springmodules.workflow.jbpm31.JbpmFactoryLocator; + + +/** + * jBPM Converter for transforming Alfresco Node to string and back + * + * @author davidc + */ +public class NodeConverter implements Converter +{ + + private static final long serialVersionUID = 1L; + private static BeanFactoryLocator jbpmFactoryLocator = new JbpmFactoryLocator(); + + + /* (non-Javadoc) + * @see org.jbpm.context.exe.Converter#supports(java.lang.Object) + */ + public boolean supports(Object value) + { + if (value == null) + { + return true; + } + return (value.getClass() == Node.class); + } + + /* (non-Javadoc) + * @see org.jbpm.context.exe.Converter#convert(java.lang.Object) + */ + public Object convert(Object o) + { + Object converted = null; + if (o != null) + { + converted = ((Node)o).getNodeRef().toString(); + } + return converted; + } + + /* (non-Javadoc) + * @see org.jbpm.context.exe.Converter#revert(java.lang.Object) + */ + public Object revert(Object o) + { + Object reverted = null; + if (o != null) + { + BeanFactoryReference factory = jbpmFactoryLocator.useBeanFactory(null); + ServiceRegistry serviceRegistry = (ServiceRegistry)factory.getFactory().getBean(ServiceRegistry.SERVICE_REGISTRY); + reverted = new Node(new NodeRef((String)o), serviceRegistry, null); + } + return reverted; + } + +} diff --git a/source/java/org/alfresco/repo/workflow/jbpm/jbpm.cfg.xml b/source/java/org/alfresco/repo/workflow/jbpm/jbpm.cfg.xml new file mode 100644 index 0000000000..c4cca54ac8 --- /dev/null +++ b/source/java/org/alfresco/repo/workflow/jbpm/jbpm.cfg.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/java/org/alfresco/repo/workflow/jbpm/jbpm.converter.properties b/source/java/org/alfresco/repo/workflow/jbpm/jbpm.converter.properties new file mode 100644 index 0000000000..c53f2fd949 --- /dev/null +++ b/source/java/org/alfresco/repo/workflow/jbpm/jbpm.converter.properties @@ -0,0 +1,18 @@ +# this file contains the mappings between converter types +# and the char that is used in the database. this mapping +# is used by the ConverterEnumType to store the VariableInstance +# converter field. The Converters class provides singleton access +# to these converter classes. + +B org.jbpm.context.exe.converter.BooleanToStringConverter +Y org.jbpm.context.exe.converter.BytesToByteArrayConverter +E org.jbpm.context.exe.converter.ByteToLongConverter +C org.jbpm.context.exe.converter.CharacterToStringConverter +A org.jbpm.context.exe.converter.DateToLongConverter +D org.jbpm.context.exe.converter.DoubleToStringConverter +F org.jbpm.context.exe.converter.FloatToStringConverter +G org.jbpm.context.exe.converter.FloatToDoubleConverter +I org.jbpm.context.exe.converter.IntegerToLongConverter +R org.jbpm.context.exe.converter.SerializableToByteArrayConverter +H org.jbpm.context.exe.converter.ShortToLongConverter +N org.alfresco.repo.workflow.jbpm.NodeConverter \ No newline at end of file diff --git a/source/java/org/alfresco/repo/workflow/jbpm/jbpm.varmapping.xml b/source/java/org/alfresco/repo/workflow/jbpm/jbpm.varmapping.xml new file mode 100644 index 0000000000..2fc5dd3e4a --- /dev/null +++ b/source/java/org/alfresco/repo/workflow/jbpm/jbpm.varmapping.xml @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/java/org/alfresco/repo/workflow/jbpm/test_processdefinition.xml b/source/java/org/alfresco/repo/workflow/jbpm/test_processdefinition.xml index b4ad00f47f..e41d513b34 100644 --- a/source/java/org/alfresco/repo/workflow/jbpm/test_processdefinition.xml +++ b/source/java/org/alfresco/repo/workflow/jbpm/test_processdefinition.xml @@ -6,6 +6,7 @@ + @@ -15,29 +16,18 @@ + + + - - - - - - - - - - - - - - - - - - + \ No newline at end of file