package com.mossle.bpm.cmd;
import java.util.ArrayList;
import java.util.List;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.impl.bpmn.parser.BpmnParse;
import org.activiti.engine.impl.cmd.GetDeploymentProcessDefinitionCmd;
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.HistoricProcessInstanceEntity;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.impl.pvm.runtime.InterpretableExecution;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ReOpenProcessCmd implements Command<Void> {
private static Logger logger = LoggerFactory
.getLogger(ReOpenProcessCmd.class);
private String historicProcessInstanceId;
public ReOpenProcessCmd(String historicProcessInstanceId) {
this.historicProcessInstanceId = historicProcessInstanceId;
}
public Void execute(CommandContext commandContext) {
HistoricProcessInstanceEntity historicProcessInstanceEntity = commandContext
.getHistoricProcessInstanceEntityManager()
.findHistoricProcessInstance(historicProcessInstanceId);
if (historicProcessInstanceEntity.getEndTime() == null) {
logger.info("historicProcessInstanceId is running");
return null;
}
historicProcessInstanceEntity.setEndActivityId(null);
historicProcessInstanceEntity.setEndTime(null);
String processDefinitionId = historicProcessInstanceEntity
.getProcessDefinitionId();
String initiator = historicProcessInstanceEntity.getStartUserId();
String businessKey = historicProcessInstanceEntity.getBusinessKey();
ProcessDefinitionEntity processDefinition = new GetDeploymentProcessDefinitionCmd(
processDefinitionId).execute(commandContext);
// ExecutionEntity processInstance = processDefinition
// .createProcessInstance(businessKey);
ExecutionEntity processInstance = this.createProcessInstance(
historicProcessInstanceEntity.getId(), businessKey, initiator,
processDefinition);
try {
Authentication.setAuthenticatedUserId(initiator);
// start
processInstance.start();
} finally {
Authentication.setAuthenticatedUserId(null);
}
return null;
}
public ExecutionEntity createProcessInstance(String processInstanceId,
String businessKey, String authenticatedUserId,
ProcessDefinitionEntity processDefinition) {
// ExecutionEntity processInstance = (ExecutionEntity) this
// .createProcessInstance(processDefinition);
// ExecutionEntity processInstance = (ExecutionEntity) processDefinition
// .createProcessInstanceForInitial(processDefinition.getInitial());
// processInstance.setId(processInstanceId);
ExecutionEntity processInstance = (ExecutionEntity) this
.createProcessInstance(processDefinition, processInstanceId);
processInstance.setExecutions(new ArrayList<ExecutionEntity>());
processInstance.setProcessDefinition(processDefinition);
// Do not initialize variable map (let it happen lazily)
if (businessKey != null) {
processInstance.setBusinessKey(businessKey);
}
// Reset the process instance in order to have the db-generated process instance id available
processInstance.setProcessInstance(processInstance);
String initiatorVariableName = (String) processDefinition
.getProperty(BpmnParse.PROPERTYNAME_INITIATOR_VARIABLE_NAME);
if (initiatorVariableName != null) {
processInstance.setVariable(initiatorVariableName,
authenticatedUserId);
}
// if (authenticatedUserId != null) {
// processInstance.addIdentityLink(authenticatedUserId,
// IdentityLinkType.STARTER);
// }
// Context.getCommandContext().getHistoryManager()
// .recordProcessInstanceStart(processInstance);
return processInstance;
}
public ExecutionEntity createProcessInstance(
ProcessDefinitionEntity processDefinition, String id) {
ActivityImpl initial = processDefinition.getInitial();
if (initial == null) {
throw new ActivitiException(
"Cannot start process instance, initial activity where the process instance should start is null.");
}
ExecutionEntity processInstance = new ExecutionEntity(initial);
processInstance.setId(id);
processInstance.insert();
processInstance.setProcessDefinition(processDefinition);
processInstance.setTenantId(processDefinition.getTenantId());
processInstance.setProcessInstance(processInstance);
processInstance.initialize();
InterpretableExecution scopeInstance = processInstance;
List<ActivityImpl> initialActivityStack = processDefinition
.getInitialActivityStack(initial);
for (ActivityImpl initialActivity : initialActivityStack) {
if (initialActivity.isScope()) {
scopeInstance = (InterpretableExecution) scopeInstance
.createExecution();
scopeInstance.setActivity(initialActivity);
if (initialActivity.isScope()) {
scopeInstance.initialize();
}
}
}
scopeInstance.setActivity(initial);
return processInstance;
}
}