diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/agenda/EndExecutionOperation.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/agenda/EndExecutionOperation.java index 614fe8911fc3c6cd3c456b26adeb55106352393b..9c3312c64deb52d2424f8781422495dbd7f5d107 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/agenda/EndExecutionOperation.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/agenda/EndExecutionOperation.java @@ -87,7 +87,7 @@ public class EndExecutionOperation extends AbstractOperation { Collection executions = executionEntityManager.findChildExecutionsByProcessInstanceId(processInstanceId); int activeExecutions = 0; for (ExecutionEntity execution : executions) { - if (execution.isActive()) { + if (execution.isActive() && !processInstanceId.equals(execution.getId())) { activeExecutions++; } } diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/StartProcessInstanceCmd.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/StartProcessInstanceCmd.java index c54ddc2c8bbc04b647bf354284454c82c3d5d706..3ec4665ed66760ae6849dc8f690e5f6493086c1d 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/StartProcessInstanceCmd.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cmd/StartProcessInstanceCmd.java @@ -27,10 +27,6 @@ import org.activiti.engine.ActivitiIllegalArgumentException; import org.activiti.engine.ActivitiObjectNotFoundException; import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.compatibility.Activiti5CompatibilityHandler; -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.deploy.DeploymentManager; @@ -40,7 +36,6 @@ import org.activiti.engine.impl.runtime.ProcessInstanceBuilderImpl; import org.activiti.engine.impl.util.ProcessDefinitionUtil; import org.activiti.engine.repository.ProcessDefinition; import org.activiti.engine.runtime.ProcessInstance; -import org.activiti.engine.task.IdentityLinkType; /** * @author Tom Baeyens @@ -152,7 +147,10 @@ public class StartProcessInstanceCmd implements Command, Ser if (initialFlowElement instanceof StartEvent) { initiatorVariableName = ((StartEvent) initialFlowElement).getInitiator(); } - ExecutionEntity processInstance = createProcessInstance(commandContext, processDefinition, businessKey, initiatorVariableName, initialFlowElement); + + ExecutionEntity processInstance = commandContext.getExecutionEntityManager().createProcessInstanceExecution( + processDefinition.getId(), businessKey, processDefinition.getTenantId(), initiatorVariableName); + commandContext.getHistoryManager().recordProcessInstanceStart(processInstance, initialFlowElement); processInstance.setVariables(processDataObjects(process.getDataObjects())); @@ -177,42 +175,6 @@ public class StartProcessInstanceCmd implements Command, Ser return processInstance; } - protected ExecutionEntity createProcessInstance(CommandContext commandContext, - ProcessDefinitionEntity processDefinitionEntity, String businessKey, - String initiatorVariableName, FlowElement initialFlowElement) { - - ExecutionEntity processInstance = new ExecutionEntity(); - processInstance.setProcessDefinitionId(processDefinitionEntity.getId()); - processInstance.setBusinessKey(businessKey); - processInstance.setScope(true); // process instance is always a scope - // for all child executions - - // Inherit tenant id (if any) - if (processDefinitionEntity.getTenantId() != null) { - processInstance.setTenantId(processDefinitionEntity.getTenantId()); - } - - String authenticatedUserId = Authentication.getAuthenticatedUserId(); - if (initiatorVariableName != null) { - processInstance.setVariable(initiatorVariableName, authenticatedUserId); - } - if (authenticatedUserId != null) { - processInstance.addIdentityLink(authenticatedUserId, null, IdentityLinkType.STARTER); - } - - // Store in database - commandContext.getExecutionEntityManager().insert(processInstance); - - // Fire events - commandContext.getHistoryManager().recordProcessInstanceStart(processInstance, initialFlowElement); - - if (Context.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) { - Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_CREATED, processInstance)); - } - - return processInstance; - } - protected Map processDataObjects(Collection dataObjects) { Map variablesMap = new HashMap(); // convert data objects to process variables diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/ExecutionEntityManager.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/ExecutionEntityManager.java index 3d5b0234c5278731274477369d6a30db4e1a6f6a..bf3e932223ba625a85a8a1d552401ccabb651fc4 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/ExecutionEntityManager.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/persistence/entity/ExecutionEntityManager.java @@ -23,14 +23,18 @@ import java.util.List; import java.util.Map; import org.activiti.engine.ActivitiObjectNotFoundException; +import org.activiti.engine.delegate.event.ActivitiEventType; +import org.activiti.engine.delegate.event.impl.ActivitiEventBuilder; import org.activiti.engine.impl.ExecutionQueryImpl; import org.activiti.engine.impl.Page; import org.activiti.engine.impl.ProcessInstanceQueryImpl; import org.activiti.engine.impl.context.Context; +import org.activiti.engine.impl.identity.Authentication; import org.activiti.engine.impl.interceptor.CommandContext; import org.activiti.engine.impl.persistence.CachedEntityMatcher; import org.activiti.engine.runtime.Execution; import org.activiti.engine.runtime.ProcessInstance; +import org.activiti.engine.task.IdentityLinkType; /** * @author Tom Baeyens @@ -43,52 +47,10 @@ public class ExecutionEntityManager extends AbstractEntityManager processInstanceIds = getDbSqlSession().selectList("selectProcessInstanceIdsByProcessDefinitionId", processDefinitionId); - - for (String processInstanceId : processInstanceIds) { - deleteProcessInstance(processInstanceId, deleteReason, cascade); - } - - if (cascade) { - Context.getCommandContext().getHistoricProcessInstanceEntityManager().deleteHistoricProcessInstanceByProcessDefinitionId(processDefinitionId); - } - } - - public void deleteProcessInstance(String processInstanceId, String deleteReason) { - deleteProcessInstance(processInstanceId, deleteReason, false); - } - - public void deleteProcessInstance(String processInstanceId, String deleteReason, boolean cascade) { - ExecutionEntity execution = findExecutionById(processInstanceId); - - if (execution == null) { - throw new ActivitiObjectNotFoundException("No process instance found for id '" + processInstanceId + "'", ProcessInstance.class); - } - - deleteProcessInstanceCascade(execution, deleteReason, cascade); - } - - private void deleteProcessInstanceCascade(ExecutionEntity execution, String deleteReason, boolean deleteHistory) { - for (ExecutionEntity subExecutionEntity : execution.getExecutions()) { - if (subExecutionEntity.getSubProcessInstance() != null) { - deleteProcessInstanceCascade(subExecutionEntity.getSubProcessInstance(), deleteReason, deleteHistory); - } - } - - CommandContext commandContext = Context.getCommandContext(); - commandContext.getTaskEntityManager().deleteTasksByProcessInstanceId(execution.getId(), deleteReason, deleteHistory); - - // delete the execution BEFORE we delete the history, otherwise we will - // produce orphan HistoricVariableInstance instances - execution.deleteCascade(deleteReason); - - if (deleteHistory) { - commandContext.getHistoricProcessInstanceEntityManager().deleteHistoricProcessInstanceById(execution.getId()); - } - } - + + // FIND METHODS + + public ExecutionEntity findSubProcessInstanceBySuperExecutionId(String superExecutionId) { return (ExecutionEntity) getDbSqlSession().selectOne("selectSubProcessInstanceBySuperExecutionId", superExecutionId); } @@ -206,6 +168,51 @@ public class ExecutionEntityManager extends AbstractEntityManager parameterMap) { return (Long) getDbSqlSession().selectOne("selectExecutionCountByNativeQuery", parameterMap); } + + + + // CREATE METHODS + + + public ExecutionEntity createProcessInstanceExecution(String processDefinitionId, String businessKey, String tenantId, String initiatorVariableName) { + + ExecutionEntity processInstanceExecution = new ExecutionEntity(); + processInstanceExecution.setProcessDefinitionId(processDefinitionId); + processInstanceExecution.setBusinessKey(businessKey); + processInstanceExecution.setScope(true); // process instance is always a scope for all child executions + + // Inherit tenant id (if any) + if (tenantId != null) { + processInstanceExecution.setTenantId(tenantId); + } + + String authenticatedUserId = Authentication.getAuthenticatedUserId(); + if (initiatorVariableName != null) { + processInstanceExecution.setVariable(initiatorVariableName, authenticatedUserId); + } + if (authenticatedUserId != null) { + processInstanceExecution.addIdentityLink(authenticatedUserId, null, IdentityLinkType.STARTER); + } + + // Store in database + Context.getCommandContext().getExecutionEntityManager().insert(processInstanceExecution); + + // Need to be after insert, cause we need the id + processInstanceExecution.setProcessInstanceId(processInstanceExecution.getId()); + + // Fire events + if (Context.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) { + Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_CREATED, processInstanceExecution)); + } + + return processInstanceExecution; + } + + + + // UPDATE METHODS + + public void updateExecutionTenantIdForDeployment(String deploymentId, String newTenantId) { HashMap params = new HashMap(); @@ -229,6 +236,62 @@ public class ExecutionEntityManager extends AbstractEntityManager processInstanceIds = getDbSqlSession().selectList("selectProcessInstanceIdsByProcessDefinitionId", processDefinitionId); + + for (String processInstanceId : processInstanceIds) { + deleteProcessInstance(processInstanceId, deleteReason, cascade); + } + + if (cascade) { + Context.getCommandContext().getHistoricProcessInstanceEntityManager().deleteHistoricProcessInstanceByProcessDefinitionId(processDefinitionId); + } + } + + public void deleteProcessInstance(String processInstanceId, String deleteReason) { + deleteProcessInstance(processInstanceId, deleteReason, false); + } + + public void deleteProcessInstance(String processInstanceId, String deleteReason, boolean cascade) { + ExecutionEntity execution = findExecutionById(processInstanceId); + + if (execution == null) { + throw new ActivitiObjectNotFoundException("No process instance found for id '" + processInstanceId + "'", ProcessInstance.class); + } + + deleteProcessInstanceCascade(execution, deleteReason, cascade); + } + + private void deleteProcessInstanceCascade(ExecutionEntity execution, String deleteReason, boolean deleteHistory) { + for (ExecutionEntity subExecutionEntity : execution.getExecutions()) { + if (subExecutionEntity.getSubProcessInstance() != null) { + deleteProcessInstanceCascade(subExecutionEntity.getSubProcessInstance(), deleteReason, deleteHistory); + } + } + + CommandContext commandContext = Context.getCommandContext(); + commandContext.getTaskEntityManager().deleteTasksByProcessInstanceId(execution.getId(), deleteReason, deleteHistory); + + // delete the execution BEFORE we delete the history, otherwise we will + // produce orphan HistoricVariableInstance instances + execution.deleteCascade(deleteReason); + + if (deleteHistory) { + commandContext.getHistoricProcessInstanceEntityManager().deleteHistoricProcessInstanceById(execution.getId()); + } + } + + + // OTHER METHODS + public void clearProcessInstanceLockTime(String processInstanceId) { HashMap params = new HashMap(); diff --git a/modules/activiti-engine/src/main/resources/org/activiti/db/mapping/entity/Execution.xml b/modules/activiti-engine/src/main/resources/org/activiti/db/mapping/entity/Execution.xml index 662aaf429c9a6226cd1cf520f2c841bb561c7575..9275669f7ce99aabe2227192d01c6e1cf7987525 100644 --- a/modules/activiti-engine/src/main/resources/org/activiti/db/mapping/entity/Execution.xml +++ b/modules/activiti-engine/src/main/resources/org/activiti/db/mapping/entity/Execution.xml @@ -352,7 +352,7 @@ inner join ${prefix}ACT_RU_VARIABLE A${index} on RES.ID_ = A${index}.EXECUTION_ID_ - inner join ${prefix}ACT_RU_VARIABLE A${index} on RES.ID_ = A${index}.PROC_INST_ID_ + inner join ${prefix}ACT_RU_VARIABLE A${index} on RES.PROC_INST_ID_ = A${index}.PROC_INST_ID_