diff --git a/config/alfresco/hibernate-context.xml b/config/alfresco/hibernate-context.xml
index b656dfaf0e..9c1884298d 100644
--- a/config/alfresco/hibernate-context.xml
+++ b/config/alfresco/hibernate-context.xml
@@ -132,7 +132,10 @@
org/jbpm/taskmgmt/log/TaskEndLog.hbm.xml
org/jbpm/taskmgmt/log/SwimlaneLog.hbm.xml
org/jbpm/taskmgmt/log/SwimlaneCreateLog.hbm.xml
- org/jbpm/taskmgmt/log/SwimlaneAssignLog.hbm.xml
+ org/jbpm/taskmgmt/log/SwimlaneAssignLog.hbm.xml
+
+
+ org/alfresco/repo/workflow/jbpm/WorkflowTaskInstance.hbm.xml
diff --git a/config/alfresco/model/bpmModel.xml b/config/alfresco/model/bpmModel.xml
index 6faf5bffcd..45cd982c46 100644
--- a/config/alfresco/model/bpmModel.xml
+++ b/config/alfresco/model/bpmModel.xml
@@ -103,7 +103,6 @@
Status
d:text
- true
true
Not Yet Started
@@ -171,18 +170,6 @@
-
-
-
-
- Workflow Definition Id
- d:text
-
-
- Workflow Instance Id
- d:text
-
-
@@ -249,6 +236,22 @@
+
+
+
+
+ Workflow Definition Id
+ d:text
+
+
+ Workflow Definition Name
+ d:text
+
+
+ Workflow Instance Id
+ d:text
+
+
diff --git a/source/java/org/alfresco/repo/workflow/WorkflowModel.java b/source/java/org/alfresco/repo/workflow/WorkflowModel.java
index 0eeebf1e63..9f72746f5c 100644
--- a/source/java/org/alfresco/repo/workflow/WorkflowModel.java
+++ b/source/java/org/alfresco/repo/workflow/WorkflowModel.java
@@ -45,12 +45,16 @@ public interface WorkflowModel
// workflow task contstants
static final QName TYPE_WORKFLOW_TASK = QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "workflowTask");
static final QName PROP_CONTEXT = QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "context");
- static final QName PROP_WORKFLOW_DEFINITION_ID = QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "workflowDefinitionId");
- static final QName PROP_WORKFLOW_INSTANCE_ID = QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "workflowInstanceId");
+ static final QName PROP_OUTCOME = QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "outcome");
+ static final QName PROP_PACKAGE_ACTION_GROUP = QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "packageActionGroup");
+ static final QName PROP_PACKAGE_ITEM_ACTION_GROUP = QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "packageItemActionGroup");
static final QName ASSOC_PACKAGE = QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "package");
-
+
// workflow package
static final QName ASPECT_WORKFLOW_PACKAGE = QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "workflowPackage");
+ static final QName PROP_WORKFLOW_DEFINITION_ID = QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "workflowDefinitionId");
+ static final QName PROP_WORKFLOW_DEFINITION_NAME = QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "workflowDefinitionName");
+ static final QName PROP_WORKFLOW_INSTANCE_ID = QName.createQName(NamespaceService.BPM_MODEL_1_0_URI, "workflowInstanceId");
//
diff --git a/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngine.java b/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngine.java
index 19b45f385e..1fe09531f4 100644
--- a/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngine.java
+++ b/source/java/org/alfresco/repo/workflow/jbpm/JBPMEngine.java
@@ -40,6 +40,7 @@ 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.ClassDefinition;
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.cmr.dictionary.PropertyDefinition;
@@ -748,8 +749,8 @@ public class JBPMEngine extends BPMEngine
*/
public WorkflowTask startTask(String taskId)
{
- // TODO Auto-generated method stub
- return null;
+ // TODO:
+ throw new UnsupportedOperationException();
}
/* (non-Javadoc)
@@ -757,8 +758,8 @@ public class JBPMEngine extends BPMEngine
*/
public WorkflowTask suspendTask(String taskId)
{
- // TODO Auto-generated method stub
- return null;
+ // TODO:
+ throw new UnsupportedOperationException();
}
/* (non-Javadoc)
@@ -882,7 +883,6 @@ public class JBPMEngine extends BPMEngine
}
}
-
/**
* Construct a Process Definition from the provided Process Definition stream
*
@@ -974,12 +974,28 @@ public class JBPMEngine extends BPMEngine
{
List aspects = typeDef.getDefaultAspects();
List aspectNames = new ArrayList(aspects.size());
- for (AspectDefinition aspect : aspects)
- {
- aspectNames.add(aspect.getName());
- }
+ getMandatoryAspects(typeDef, aspectNames);
return dictionaryService.getAnonymousType(typeDef.getName(), aspectNames);
}
+
+ /**
+ * Gets a flattened list of all mandatory aspects for a given class
+ *
+ * @param classDef the class
+ * @param aspects a list to hold the mandatory aspects
+ */
+ private void getMandatoryAspects(ClassDefinition classDef, List aspects)
+ {
+ for (AspectDefinition aspect : classDef.getDefaultAspects())
+ {
+ QName aspectName = aspect.getName();
+ if (!aspects.contains(aspectName))
+ {
+ aspects.add(aspect.getName());
+ getMandatoryAspects(aspect, aspects);
+ }
+ }
+ }
/**
* Get JBoss JBPM Id from Engine Global Id
@@ -1075,6 +1091,7 @@ public class JBPMEngine extends BPMEngine
properties.put(WorkflowModel.PROP_DUE_DATE, instance.getDueDate());
properties.put(WorkflowModel.PROP_COMPLETION_DATE, instance.getEnd());
properties.put(WorkflowModel.PROP_PRIORITY, instance.getPriority());
+ properties.put(ContentModel.PROP_CREATED, instance.getCreate());
properties.put(ContentModel.PROP_OWNER, instance.getActorId());
// map jBPM task instance collections to associations
@@ -1230,6 +1247,57 @@ public class JBPMEngine extends BPMEngine
instance.setVariableLocally(name, value);
}
}
+
+ /**
+ * Sets Default Properties of Task
+ *
+ * @param instance task instance
+ */
+ protected void setDefaultTaskProperties(TaskInstance instance)
+ {
+ Map existingValues = null;
+ Map defaultValues = new HashMap();
+
+ // construct an anonymous type that flattens all mandatory aspects
+ ClassDefinition classDef = getAnonymousTaskDefinition(getTaskDefinition(instance.getTask()));
+ Map propertyDefs = classDef.getProperties();
+
+ // for each property, determine if it has a default value
+ for (Map.Entry entry : propertyDefs.entrySet())
+ {
+ String defaultValue = entry.getValue().getDefaultValue();
+ if (defaultValue != null)
+ {
+ if (existingValues == null)
+ {
+ existingValues = getTaskProperties(instance);
+ }
+ if (existingValues.get(entry.getKey()) == null)
+ {
+ defaultValues.put(entry.getKey(), defaultValue);
+ }
+ }
+ }
+
+ // assign the default values to the task
+ if (defaultValues.size() > 0)
+ {
+ setTaskProperties(instance, defaultValues);
+ }
+ }
+
+ /**
+ * Set Task Outcome based on specified Transition
+ *
+ * @param instance task instance
+ * @param transition transition
+ */
+ protected void setTaskOutcome(TaskInstance instance, Transition transition)
+ {
+ Map outcome = new HashMap();
+ outcome.put(WorkflowModel.PROP_OUTCOME, transition.getName());
+ setTaskProperties(instance, outcome);
+ }
/**
* Convert a Repository association to JBPMNodeList or JBPMNode
@@ -1479,6 +1547,8 @@ public class JBPMEngine extends BPMEngine
{
WorkflowTaskDefinition taskDef = new WorkflowTaskDefinition();
taskDef.id = task.getName();
+ Node node = (task.getStartState() == null ? task.getTaskNode() : task.getStartState());
+ taskDef.node = createWorkflowNode(node);
taskDef.metadata = getTaskDefinition(task);
return taskDef;
}
diff --git a/source/java/org/alfresco/repo/workflow/jbpm/ReviewAndApproveTest.java b/source/java/org/alfresco/repo/workflow/jbpm/ReviewAndApproveTest.java
index 8d0179e8c8..a8f0379d5e 100644
--- a/source/java/org/alfresco/repo/workflow/jbpm/ReviewAndApproveTest.java
+++ b/source/java/org/alfresco/repo/workflow/jbpm/ReviewAndApproveTest.java
@@ -109,7 +109,10 @@ public class ReviewAndApproveTest extends BaseSpringTest
WorkflowTask task = tasks1.get(0);
assertTrue(task.properties.containsKey(WorkflowModel.ASSOC_PACKAGE));
- taskComponent.endTask(task.id, null);
+ WorkflowTask endedTask = taskComponent.endTask(task.id, null);
+ assertNotNull(endedTask);
+ assertTrue(endedTask.properties.containsKey(WorkflowModel.PROP_OUTCOME));
+ assertEquals("", endedTask.properties.get(WorkflowModel.PROP_OUTCOME));
List assignedTasks = taskComponent.getAssignedTasks("admin", WorkflowTaskState.IN_PROGRESS);
assertNotNull(assignedTasks);
diff --git a/source/java/org/alfresco/repo/workflow/jbpm/WorkflowTaskInstance.hbm.xml b/source/java/org/alfresco/repo/workflow/jbpm/WorkflowTaskInstance.hbm.xml
new file mode 100644
index 0000000000..8806b04c1c
--- /dev/null
+++ b/source/java/org/alfresco/repo/workflow/jbpm/WorkflowTaskInstance.hbm.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
diff --git a/source/java/org/alfresco/repo/workflow/jbpm/WorkflowTaskInstance.java b/source/java/org/alfresco/repo/workflow/jbpm/WorkflowTaskInstance.java
new file mode 100644
index 0000000000..33559d47ee
--- /dev/null
+++ b/source/java/org/alfresco/repo/workflow/jbpm/WorkflowTaskInstance.java
@@ -0,0 +1,109 @@
+/*
+ * 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.service.cmr.workflow.WorkflowException;
+import org.jbpm.graph.def.Transition;
+import org.jbpm.graph.exe.ExecutionContext;
+import org.jbpm.taskmgmt.exe.TaskInstance;
+import org.springframework.beans.factory.access.BeanFactoryLocator;
+import org.springframework.beans.factory.access.BeanFactoryReference;
+import org.springmodules.workflow.jbpm31.JbpmFactoryLocator;
+
+
+/**
+ * Alfresco specific implementation of a jBPM task instance
+ *
+ * @author davidc
+ */
+public class WorkflowTaskInstance extends TaskInstance
+{
+ private static final long serialVersionUID = 6824116036569411964L;
+
+ /** Alfresco JBPM Engine */
+ private static JBPMEngine jbpmEngine = null;
+
+ /**
+ * Gets the JBPM Engine instance
+ *
+ * @return JBPM Engine
+ */
+ private JBPMEngine getJBPMEngine()
+ {
+ if (jbpmEngine == null)
+ {
+ BeanFactoryLocator factoryLocator = new JbpmFactoryLocator();
+ BeanFactoryReference factory = factoryLocator.useBeanFactory(null);
+ jbpmEngine = (JBPMEngine)factory.getFactory().getBean("jbpm_engine");
+ if (jbpmEngine == null)
+ {
+ throw new WorkflowException("Failed to retrieve JBPMEngine component");
+ }
+ }
+ return jbpmEngine;
+ }
+
+ /**
+ * Construct
+ */
+ public WorkflowTaskInstance()
+ {
+ super();
+ }
+
+ /**
+ * Construct
+ *
+ * @param taskName
+ * @param actorId
+ */
+ public WorkflowTaskInstance(String taskName, String actorId)
+ {
+ super(taskName, actorId);
+ }
+
+ /**
+ * Construct
+ *
+ * @param taskName
+ */
+ public WorkflowTaskInstance(String taskName)
+ {
+ super(taskName);
+ }
+
+ @Override
+ public void create(ExecutionContext executionContext)
+ {
+ super.create(executionContext);
+ getJBPMEngine().setDefaultTaskProperties(this);
+ }
+
+ @Override
+ public void end(Transition transition)
+ {
+ // NOTE: Set the outcome first, so it's available during the submission of
+ // task variables to the process context
+ Transition outcome = (transition == null) ? token.getNode().getDefaultLeavingTransition() : transition;
+ if (outcome != null)
+ {
+ getJBPMEngine().setTaskOutcome(this, outcome);
+ }
+ super.end(transition);
+ }
+
+}
diff --git a/source/java/org/alfresco/repo/workflow/jbpm/WorkflowTaskInstanceFactory.java b/source/java/org/alfresco/repo/workflow/jbpm/WorkflowTaskInstanceFactory.java
new file mode 100644
index 0000000000..967956828e
--- /dev/null
+++ b/source/java/org/alfresco/repo/workflow/jbpm/WorkflowTaskInstanceFactory.java
@@ -0,0 +1,41 @@
+/*
+ * 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.jbpm.graph.exe.ExecutionContext;
+import org.jbpm.taskmgmt.TaskInstanceFactory;
+import org.jbpm.taskmgmt.exe.TaskInstance;
+
+
+/**
+ * jBPM factory for creating Alfresco derived Task Instances
+ *
+ * @author davidc
+ */
+public class WorkflowTaskInstanceFactory implements TaskInstanceFactory
+{
+ private static final long serialVersionUID = -8097108150047415711L;
+
+
+ /* (non-Javadoc)
+ * @see org.jbpm.taskmgmt.TaskInstanceFactory#createTaskInstance(org.jbpm.graph.exe.ExecutionContext)
+ */
+ public TaskInstance createTaskInstance(ExecutionContext executionContext)
+ {
+ return new WorkflowTaskInstance();
+ }
+}
diff --git a/source/java/org/alfresco/repo/workflow/jbpm/jbpm.cfg.xml b/source/java/org/alfresco/repo/workflow/jbpm/jbpm.cfg.xml
index c4cca54ac8..e15d0b62a3 100644
--- a/source/java/org/alfresco/repo/workflow/jbpm/jbpm.cfg.xml
+++ b/source/java/org/alfresco/repo/workflow/jbpm/jbpm.cfg.xml
@@ -21,7 +21,7 @@
-
+
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
index 9dc0642e16..9e694b7a84 100644
--- 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
@@ -25,7 +25,7 @@
diff --git a/source/java/org/alfresco/service/cmr/workflow/WorkflowTaskDefinition.java b/source/java/org/alfresco/service/cmr/workflow/WorkflowTaskDefinition.java
index 4bc09113dd..4339d7e2a5 100644
--- a/source/java/org/alfresco/service/cmr/workflow/WorkflowTaskDefinition.java
+++ b/source/java/org/alfresco/service/cmr/workflow/WorkflowTaskDefinition.java
@@ -31,6 +31,9 @@ public class WorkflowTaskDefinition
{
/** Unique id of Workflow Task Definition */
public String id;
+
+ /** Workflow Node this task created from */
+ public WorkflowNode node;
/** Task Metadata */
public TypeDefinition metadata;