diff --git a/source/java/org/alfresco/repo/workflow/activiti/AlfrescoUserTaskBpmnParseHandler.java b/source/java/org/alfresco/repo/workflow/activiti/AlfrescoUserTaskBpmnParseHandler.java index 39078c6d5a..f96dfdf8a2 100644 --- a/source/java/org/alfresco/repo/workflow/activiti/AlfrescoUserTaskBpmnParseHandler.java +++ b/source/java/org/alfresco/repo/workflow/activiti/AlfrescoUserTaskBpmnParseHandler.java @@ -18,6 +18,7 @@ import java.util.List; import org.activiti.bpmn.model.BaseElement; import org.activiti.bpmn.model.UserTask; import org.activiti.engine.delegate.TaskListener; +import org.activiti.engine.impl.bpmn.behavior.MultiInstanceActivityBehavior; import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior; import org.activiti.engine.impl.bpmn.parser.BpmnParse; import org.activiti.engine.impl.bpmn.parser.handler.AbstractBpmnParseHandler; @@ -49,18 +50,30 @@ public class AlfrescoUserTaskBpmnParseHandler extends AbstractBpmnParseHandler taskEventListeners = userTask.getTaskDefinition().getTaskListeners().get(eventName); + protected void addTaskListenerAsFirst(TaskListener taskListener, String eventName, UserTaskActivityBehavior userTask) + { + List taskEventListeners = userTask.getTaskDefinition().getTaskListeners().get(eventName); if (taskEventListeners == null) { taskEventListeners = new ArrayList(); userTask.getTaskDefinition().getTaskListeners().put(eventName, taskEventListeners); diff --git a/source/test-java/org/alfresco/repo/workflow/AbstractWorkflowServiceIntegrationTest.java b/source/test-java/org/alfresco/repo/workflow/AbstractWorkflowServiceIntegrationTest.java index 3c9f777366..4dafe83f86 100644 --- a/source/test-java/org/alfresco/repo/workflow/AbstractWorkflowServiceIntegrationTest.java +++ b/source/test-java/org/alfresco/repo/workflow/AbstractWorkflowServiceIntegrationTest.java @@ -38,6 +38,7 @@ import org.alfresco.repo.security.permissions.AccessDeniedException; import org.alfresco.repo.security.person.TestGroupManager; import org.alfresco.repo.security.person.TestPersonManager; import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; +import org.alfresco.repo.transaction.TransactionServiceImpl; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; @@ -59,7 +60,6 @@ import org.alfresco.service.cmr.workflow.WorkflowTaskState; import org.alfresco.service.cmr.workflow.WorkflowTimer; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; -import org.alfresco.repo.transaction.TransactionServiceImpl; import org.alfresco.util.BaseSpringTest; import org.alfresco.util.GUID; import org.alfresco.util.collections.CollectionUtils; diff --git a/source/test-java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowServiceIntegrationTest.java b/source/test-java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowServiceIntegrationTest.java index 7fbfb3aeb0..23d8ae0bcf 100644 --- a/source/test-java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowServiceIntegrationTest.java +++ b/source/test-java/org/alfresco/repo/workflow/activiti/ActivitiWorkflowServiceIntegrationTest.java @@ -22,6 +22,7 @@ package org.alfresco.repo.workflow.activiti; import java.io.Serializable; import java.util.Arrays; import java.util.Collections; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -211,6 +212,44 @@ public class ActivitiWorkflowServiceIntegrationTest extends AbstractWorkflowServ } } + /** + * Test to validate fix for ALF-19822 + */ + public void testMultiInstanceListenersCalled() throws Exception + { + // start pooled review and approve workflow + WorkflowDefinition workflowDef = deployDefinition(getParallelReviewDefinitionPath()); + assertNotNull(workflowDef); + + // Create workflow parameters + Map params = new HashMap(); + Serializable wfPackage = workflowService.createPackage(null); + params.put(WorkflowModel.ASSOC_PACKAGE, wfPackage); + Date dueDate = new Date(); + params.put(WorkflowModel.PROP_WORKFLOW_DUE_DATE, dueDate); + params.put(WorkflowModel.PROP_WORKFLOW_PRIORITY, 1); + params.put(WorkflowModel.PROP_WORKFLOW_DESCRIPTION, "This is the description"); + NodeRef group = groupManager.get(GROUP); + assertNotNull(group); + + List assignees = Arrays.asList(personManager.get(USER2), personManager.get(USER3)); + params.put(WorkflowModel.ASSOC_ASSIGNEES, (Serializable) assignees); + + // Start a workflow instance + WorkflowPath path = workflowService.startWorkflow(workflowDef.getId(), params); + assertNotNull(path); + assertTrue(path.isActive()); + String instnaceId = path.getInstance().getId(); + + WorkflowTask startTask = workflowService.getStartTask(instnaceId); + workflowService.endTask(startTask.getId(), null); + + personManager.setUser(USER2); + List tasks = workflowService.getAssignedTasks(USER2, WorkflowTaskState.IN_PROGRESS); + assertEquals(1, tasks.size()); + assertEquals("This is the description", tasks.get(0).getDescription()); + } + @Override protected void checkTaskQueryStartTaskCompleted(String workflowInstanceId, WorkflowTask startTask)