package com.mossle.bpm.cmd;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.mossle.core.spring.ApplicationContextHelper;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.impl.ExecutionQueryImpl;
import org.activiti.engine.impl.HistoricActivityInstanceQueryImpl;
import org.activiti.engine.impl.JobQueryImpl;
import org.activiti.engine.impl.db.DbSqlSession;
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.HistoricProcessInstanceEntityManager;
import org.activiti.engine.impl.persistence.entity.IdentityLinkEntity;
import org.activiti.engine.impl.persistence.entity.IdentityLinkEntityManager;
import org.activiti.engine.impl.persistence.entity.JobEntity;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.impl.persistence.entity.TaskEntityManager;
import org.activiti.engine.impl.pvm.delegate.ActivityExecution;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.impl.pvm.process.ProcessDefinitionImpl;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.Job;
import org.activiti.engine.runtime.ProcessInstance;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.util.Assert;
public class MigrateCmd implements Command<Void> {
private String processInstanceId;
private String processDefinitionId;
public MigrateCmd(String processInstanceId, String processDefinitionId) {
this.processInstanceId = processInstanceId;
this.processDefinitionId = processDefinitionId;
}
public Void execute(CommandContext commandContext) {
ExecutionEntity processInstance = commandContext
.getExecutionEntityManager().findExecutionById(
processInstanceId);
ProcessDefinitionEntity processDefinition = commandContext
.getProcessDefinitionEntityManager().findProcessDefinitionById(
processDefinitionId);
if (processDefinition.findActivity(processInstance
.getCurrentActivityId()) == null) {
throw new IllegalStateException(processDefinitionId
+ " didnot contains "
+ processInstance.getCurrentActivityId()
+ ", cannot migrate");
}
// 操作修改运行表中的PROC_DEF_ID_字段的值
String processInstanceId = processInstance.getId();
String processDefinitionId = processDefinition.getId();
DbSqlSession dbSqlSession = commandContext.getDbSqlSession();
// 操作Task表
TaskEntityManager taskEntityManager = commandContext
.getTaskEntityManager();
List<TaskEntity> tasks = taskEntityManager
.findTasksByProcessInstanceId(processInstanceId);
for (TaskEntity taskEntity : tasks) {
taskEntity.setProcessDefinitionId(processDefinitionId);
taskEntity.update();
}
// 操作Execution表
List<Execution> executions = new ExecutionQueryImpl(commandContext)
.processInstanceId(processInstanceId).list();
for (Execution execution : executions) {
if (execution instanceof ExecutionEntity) {
((ExecutionEntity) execution)
.setProcessDefinitionId(processDefinitionId);
dbSqlSession.update((ExecutionEntity) execution);
}
}
// 操作Job表
List<Job> jobs = new JobQueryImpl(commandContext).processInstanceId(
processInstanceId).list();
for (Job job : jobs) {
((JobEntity) job).setProcessDefinitionId(processDefinitionId);
dbSqlSession.update((JobEntity) job);
}
JdbcTemplate jdbcTemplate = ApplicationContextHelper
.getBean(JdbcTemplate.class);
// 操作Identitylink表
IdentityLinkEntityManager identityLinkEntityManager = commandContext
.getIdentityLinkEntityManager();
List<IdentityLinkEntity> identityLinks = identityLinkEntityManager
.findIdentityLinksByProcessInstanceId(processInstanceId);
for (IdentityLinkEntity identityLinkEntity : identityLinks) {
// identityLinkEntity.setProcessDefId(processDefinitionId);
// dbSqlSession.update(identityLinkEntity);
jdbcTemplate
.update("update ACT_RU_IDENTITYLINK set PROC_DEF_ID_=? where ID_=?",
processDefinitionId, identityLinkEntity.getId());
}
// 操作historicProcessInstance表
HistoricProcessInstanceEntityManager historicProcessInstanceEntityManager = commandContext
.getHistoricProcessInstanceEntityManager();
HistoricProcessInstanceEntity historicProcessInstance = historicProcessInstanceEntityManager
.findHistoricProcessInstance(processInstanceId);
historicProcessInstance.setProcessDefinitionId(processDefinitionId);
dbSqlSession.update(historicProcessInstance);
return null;
}
}