package com.mossle.bpm.cmd; import java.util.Map; import org.activiti.engine.ActivitiException; import org.activiti.engine.delegate.TaskListener; import org.activiti.engine.delegate.event.ActivitiEventType; import org.activiti.engine.delegate.event.impl.ActivitiEventBuilder; import org.activiti.engine.impl.context.Context; import org.activiti.engine.impl.identity.Authentication; import org.activiti.engine.impl.interceptor.Command; import org.activiti.engine.impl.interceptor.CommandContext; import org.activiti.engine.impl.persistence.entity.ExecutionEntity; import org.activiti.engine.impl.persistence.entity.TaskEntity; import org.activiti.engine.task.DelegationState; import org.activiti.engine.task.IdentityLinkType; public class CompleteTaskWithCommentCmd implements Command<Object> { private String taskId; private String comment; private Map<String, Object> variables; public CompleteTaskWithCommentCmd(String taskId, Map<String, Object> variables, String comment) { this.taskId = taskId; this.variables = variables; this.comment = comment; } public Object execute(CommandContext commandContext) { TaskEntity taskEntity = commandContext.getTaskEntityManager() .findTaskById(taskId); if (variables != null) { taskEntity.setExecutionVariables(variables); } boolean localScope = false; if ((taskEntity.getDelegationState() != null) && taskEntity.getDelegationState().equals( DelegationState.PENDING)) { throw new ActivitiException( "A delegated task cannot be completed, but should be resolved instead."); } taskEntity.fireEvent(TaskListener.EVENTNAME_COMPLETE); if ((Authentication.getAuthenticatedUserId() != null) && (taskEntity.getProcessInstanceId() != null)) { taskEntity.getProcessInstance().involveUser( Authentication.getAuthenticatedUserId(), IdentityLinkType.PARTICIPANT); } if (Context.getProcessEngineConfiguration().getEventDispatcher() .isEnabled()) { Context.getProcessEngineConfiguration() .getEventDispatcher() .dispatchEvent( ActivitiEventBuilder .createEntityWithVariablesEvent( ActivitiEventType.TASK_COMPLETED, taskEntity, variables, localScope)); } Context.getCommandContext().getTaskEntityManager() .deleteTask(taskEntity, comment, false); if (taskEntity.getExecutionId() != null) { ExecutionEntity execution = taskEntity.getExecution(); execution.removeTask(taskEntity); try { Context.setExecutionContext(execution); execution.signal(null, null); } finally { Context.removeExecutionContext(); } } return null; } }