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;