package org.aperteworkflow.ext.activiti; import org.hibernate.Session; import pl.net.bluesoft.rnd.processtool.dao.UserProcessQueueDAO; import pl.net.bluesoft.rnd.processtool.model.BpmTask; import pl.net.bluesoft.rnd.processtool.model.ProcessInstance; import pl.net.bluesoft.rnd.processtool.model.QueueType; import pl.net.bluesoft.rnd.processtool.model.UserProcessQueue; import pl.net.bluesoft.rnd.processtool.model.nonpersistent.MutableBpmTask; import pl.net.bluesoft.rnd.processtool.userqueues.IUserProcessQueueManager; import java.util.Collection; /** * Manager for the process instance queues * * @author Maciej Pawlak * */ public class UserProcessQueueManager implements IUserProcessQueueManager { Session session; UserProcessQueueDAO queueDao; public UserProcessQueueManager(Session session, UserProcessQueueDAO userProcessQueueDAO) { this.session = session; this.queueDao = userProcessQueueDAO; } public void onTaskAssigne(BpmTask bpmTask) { processTaskAssigne(bpmTask); } @Override public void onQueueAssigne(MutableBpmTask bpmTask) { Long processId = bpmTask.getProcessInstance().getId(); String taskIdString = bpmTask.getInternalTaskId(); /* There is at least one owner - creator by default */ for(String ownerLogin: bpmTask.getProcessInstance().getOwners()) updateUserProcessQueue(taskIdString, processId, ownerLogin, QueueType.OWN_IN_QUEUE); } @Override public void onTaskFinished(BpmTask bpmTask) { String taskIdString = bpmTask.getInternalTaskId(); Long taskId = Long.parseLong(taskIdString); Collection<UserProcessQueue> userProcessQueues = queueDao.getAllUserProcessQueueByTaskId(taskId); /* Delete all process user task with assigned task id. It will delete all user queues * for creator, assigne and owners */ queueDao.delete(userProcessQueues); } @Override public void onProcessFinished(ProcessInstance processInstance, BpmTask bpmTask) { /* Get all queue elements for given process id and delete them */ Long processId = processInstance.getId(); String creatorLogin = bpmTask.getCreator(); /* Create new queue element that is stored as finished process */ UserProcessQueue finishedProcess = new UserProcessQueue(); finishedProcess.setLogin(creatorLogin); finishedProcess.setProcessId(processId); finishedProcess.setQueueType(QueueType.OWN_FINISHED); finishedProcess.setTaskId(Long.parseLong(bpmTask.getInternalTaskId())); queueDao.saveOrUpdate(finishedProcess); } @Override public void onProcessHalted(ProcessInstance processInstance, BpmTask task) { //deleteProcessAllocations(processInstance); /* NOP */ } private void processTaskAssigne(BpmTask bpmTask) { String assignee = bpmTask.getAssignee(); Long processId = bpmTask.getProcessInstance().getId(); String taskIdString = bpmTask.getInternalTaskId(); /* Is task assigned to one of the owners? */ boolean taskAssignedToOneOfOwners = false; /* There is at least one owner - creator by default */ for(String ownerLogin: bpmTask.getProcessInstance().getOwners()) { /* Assign process to its owner queue */ if(ownerLogin.equals(assignee)) { //updateUserProcessQueue(taskIdString, processId, ownerLogin, QueueType.OWN_ASSIGNED); updateUserProcessQueue(taskIdString, processId, ownerLogin, QueueType.ASSIGNED_TO_CURRENT_USER); taskAssignedToOneOfOwners = true; } /* Assign owner process to someone else. Create queue element to owner "mine assigned to others" * and element to other person queue "others assigned to me" */ else { /* If task is already assigned to assigne as it's own task or there is no assigne, * do not change queue to others-assigned */ boolean shouldAddToOthersAssignedQueue = !taskAssignedToOneOfOwners && assignee != null; if(shouldAddToOthersAssignedQueue) { //updateUserProcessQueue(taskIdString, processId, assignee, QueueType.OTHERS_ASSIGNED); updateUserProcessQueue(taskIdString, processId, assignee, QueueType.ASSIGNED_TO_CURRENT_USER); } updateUserProcessQueue(taskIdString, processId, ownerLogin, QueueType.OWN_IN_PROGRESS); } } } private void updateUserProcessQueue(String taskIdString, Long processId, String assigneLogin, QueueType type) { Long taskId = Long.parseLong(taskIdString); UserProcessQueue userProcessQueue = queueDao.getUserProcessQueueByTaskId(taskId, assigneLogin); /* The queue element for given process exists with type "mine assiegned to me". Change its type and save */ if(userProcessQueue != null) { userProcessQueue.setQueueType(type); } /* Otherwise, create new process queue with correct type */ else { userProcessQueue = new UserProcessQueue(); userProcessQueue.setLogin(assigneLogin); userProcessQueue.setProcessId(processId); userProcessQueue.setTaskId(taskId); userProcessQueue.setQueueType(type); } queueDao.saveOrUpdate(userProcessQueue); } }