CLOUD-2167: notification sent after other task-listeners have been called

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@57881 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Frederik Heremans
2013-11-13 13:55:54 +00:00
parent fa8910384a
commit f49eee3b08
3 changed files with 27 additions and 84 deletions

View File

@@ -66,6 +66,7 @@
<bean id="activitiUserTaskParseHandler" class="org.alfresco.repo.workflow.activiti.AlfrescoUserTaskBpmnParseHandler"> <bean id="activitiUserTaskParseHandler" class="org.alfresco.repo.workflow.activiti.AlfrescoUserTaskBpmnParseHandler">
<property name="createTaskListener" ref="activitiCreateTaskListener" /> <property name="createTaskListener" ref="activitiCreateTaskListener" />
<property name="completeTaskListener" ref="activitiCompleteTaskListener" /> <property name="completeTaskListener" ref="activitiCompleteTaskListener" />
<property name="notificationTaskListener" ref="activitiTaskNotificationListener" />
</bean> </bean>
<!-- --> <!-- -->
@@ -225,6 +226,11 @@
class="org.alfresco.repo.workflow.activiti.tasklistener.TaskCreateListener" class="org.alfresco.repo.workflow.activiti.tasklistener.TaskCreateListener"
depends-on="activitiWorkflowManager"> depends-on="activitiWorkflowManager">
<property name="propertyConverter" ref="activitiPropertyConverter" /> <property name="propertyConverter" ref="activitiPropertyConverter" />
</bean>
<bean id="activitiTaskNotificationListener"
class="org.alfresco.repo.workflow.activiti.tasklistener.TaskNotificationListener"
depends-on="activitiWorkflowManager">
<property name="workflowNotification" ref="workflowNotification" /> <property name="workflowNotification" ref="workflowNotification" />
</bean> </bean>

View File

@@ -38,6 +38,7 @@ public class AlfrescoUserTaskBpmnParseHandler extends AbstractBpmnParseHandler<U
{ {
private TaskListener completeTaskListener; private TaskListener completeTaskListener;
private TaskListener createTaskListener; private TaskListener createTaskListener;
private TaskListener notificationTaskListener;
protected Class<? extends BaseElement> getHandledType() protected Class<? extends BaseElement> getHandledType()
{ {
@@ -72,6 +73,10 @@ public class AlfrescoUserTaskBpmnParseHandler extends AbstractBpmnParseHandler<U
{ {
addTaskListenerAsFirst(completeTaskListener, TaskListener.EVENTNAME_COMPLETE, activityBehavior); addTaskListenerAsFirst(completeTaskListener, TaskListener.EVENTNAME_COMPLETE, activityBehavior);
} }
if(notificationTaskListener != null)
{
addTaskListenerAsLast(notificationTaskListener, TaskListener.EVENTNAME_CREATE, activityBehavior);
}
} }
public void setCompleteTaskListener(TaskListener completeTaskListener) public void setCompleteTaskListener(TaskListener completeTaskListener)
@@ -84,13 +89,28 @@ public class AlfrescoUserTaskBpmnParseHandler extends AbstractBpmnParseHandler<U
this.createTaskListener = createTaskListener; this.createTaskListener = createTaskListener;
} }
public void setNotificationTaskListener(TaskListener notificationTaskListener)
{
this.notificationTaskListener = notificationTaskListener;
}
protected void addTaskListenerAsFirst(TaskListener taskListener, String eventName, UserTaskActivityBehavior userTask) protected void addTaskListenerAsFirst(TaskListener taskListener, String eventName, UserTaskActivityBehavior userTask)
{
getOrCreateListenerList(eventName, userTask).add(0, taskListener);
}
protected void addTaskListenerAsLast(TaskListener taskListener, String eventName, UserTaskActivityBehavior userTask)
{
getOrCreateListenerList(eventName, userTask).add(taskListener);
}
protected List<TaskListener> getOrCreateListenerList(String eventName, UserTaskActivityBehavior userTask)
{ {
List<TaskListener> taskEventListeners = userTask.getTaskDefinition().getTaskListeners().get(eventName); List<TaskListener> taskEventListeners = userTask.getTaskDefinition().getTaskListeners().get(eventName);
if (taskEventListeners == null) { if (taskEventListeners == null) {
taskEventListeners = new ArrayList<TaskListener>(); taskEventListeners = new ArrayList<TaskListener>();
userTask.getTaskDefinition().getTaskListeners().put(eventName, taskEventListeners); userTask.getTaskDefinition().getTaskListeners().put(eventName, taskEventListeners);
} }
taskEventListeners.add(0, taskListener); return taskEventListeners;
} }
} }

View File

@@ -19,25 +19,18 @@
package org.alfresco.repo.workflow.activiti.tasklistener; package org.alfresco.repo.workflow.activiti.tasklistener;
import java.util.ArrayList;
import java.util.List;
import org.activiti.engine.delegate.DelegateTask; import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener; import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.form.FormData; import org.activiti.engine.form.FormData;
import org.activiti.engine.impl.form.TaskFormHandler; import org.activiti.engine.impl.form.TaskFormHandler;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.persistence.entity.IdentityLinkEntity;
import org.activiti.engine.impl.persistence.entity.TaskEntity; import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.task.IdentityLinkType; import org.activiti.engine.task.IdentityLinkType;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.repo.workflow.WorkflowConstants; import org.alfresco.repo.workflow.WorkflowConstants;
import org.alfresco.repo.workflow.WorkflowNotificationUtils;
import org.alfresco.repo.workflow.activiti.ActivitiConstants; import org.alfresco.repo.workflow.activiti.ActivitiConstants;
import org.alfresco.repo.workflow.activiti.ActivitiScriptNode; import org.alfresco.repo.workflow.activiti.ActivitiScriptNode;
import org.alfresco.repo.workflow.activiti.properties.ActivitiPropertyConverter; import org.alfresco.repo.workflow.activiti.properties.ActivitiPropertyConverter;
import org.alfresco.service.cmr.dictionary.TypeDefinition; import org.alfresco.service.cmr.dictionary.TypeDefinition;
import org.alfresco.service.cmr.repository.NodeRef;
/** /**
* Tasklistener that is notified when a task is created. This will set all * Tasklistener that is notified when a task is created. This will set all
@@ -51,15 +44,6 @@ public class TaskCreateListener implements TaskListener
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private ActivitiPropertyConverter propertyConverter; private ActivitiPropertyConverter propertyConverter;
private WorkflowNotificationUtils workflowNotificationUtils;
/**
* @param services the service registry
*/
public void setWorkflowNotification(WorkflowNotificationUtils service)
{
this.workflowNotificationUtils = service;
}
@Override @Override
public void notify(DelegateTask task) public void notify(DelegateTask task)
@@ -82,73 +66,6 @@ public class TaskCreateListener implements TaskListener
if(initiatorNode != null) { if(initiatorNode != null) {
task.addUserIdentityLink((String) initiatorNode.getProperties().get(ContentModel.PROP_USERNAME.toPrefixString()), IdentityLinkType.STARTER); task.addUserIdentityLink((String) initiatorNode.getProperties().get(ContentModel.PROP_USERNAME.toPrefixString()), IdentityLinkType.STARTER);
} }
// Determine whether we need to send the workflow notification or not
ExecutionEntity executionEntity = ((ExecutionEntity)task.getExecution()).getProcessInstance();
Boolean value = (Boolean)executionEntity.getVariable(WorkflowNotificationUtils.PROP_SEND_EMAIL_NOTIFICATIONS);
if (Boolean.TRUE.equals(value) == true)
{
// Get the workflow package node
NodeRef workflowPackage = null;
ActivitiScriptNode scriptNode = (ActivitiScriptNode)executionEntity.getVariable(WorkflowNotificationUtils.PROP_PACKAGE);
if (scriptNode != null)
{
workflowPackage = scriptNode.getNodeRef();
}
// Determine whether the task is pooled or not
String[] authorities = null;
boolean isPooled = false;
if (task.getAssignee() == null)
{
// Task is pooled
isPooled = true;
// Get the pool of user/groups for this task
List<IdentityLinkEntity> identities = ((TaskEntity)task).getIdentityLinks();
List<String> temp = new ArrayList<String>(identities.size());
for (IdentityLinkEntity item : identities)
{
String group = item.getGroupId();
if (group != null)
{
temp.add(group);
}
String user = item.getUserId();
if (user != null)
{
temp.add(user);
}
}
authorities = temp.toArray(new String[temp.size()]);
}
else
{
// Get the assigned user or group
authorities = new String[]{task.getAssignee()};
}
String title;
if (task.getName() != null)
{
title = task.getName();
}
else
{
title = taskFormKey.replace(":", "_");
}
// Send email notification
workflowNotificationUtils.sendWorkflowAssignedNotificationEMail(
ActivitiConstants.ENGINE_ID + "$" + task.getId(),
title,
task.getDescription(),
task.getDueDate(),
Integer.valueOf(task.getPriority()),
workflowPackage,
authorities,
isPooled);
}
} }
private String getFormKey(DelegateTask task) private String getFormKey(DelegateTask task)