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