提交 e78e2b57 编写于 作者: T Tijs Rademakers

Merge

上级 5c1055a9
......@@ -107,7 +107,7 @@ public class ExclusiveGatewayActivityBehavior extends GatewayActivityBehavior {
//No sequence flow could be found, not even a default one
throw new ActivitiException("No outgoing sequence flow of the exclusive gateway '"
+ execution.getActivity().getId() + "' could be selected for continuing the process");
+ exclusiveGateway.getId() + "' could be selected for continuing the process");
}
}
......
......@@ -15,6 +15,8 @@ package org.activiti.engine.impl.bpmn.parser.handler;
import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.BoundaryEvent;
import org.activiti.bpmn.model.CancelEventDefinition;
import org.activiti.bpmn.model.CompensateEventDefinition;
import org.activiti.bpmn.model.ErrorEventDefinition;
import org.activiti.bpmn.model.EventDefinition;
import org.activiti.bpmn.model.MessageEventDefinition;
import org.activiti.bpmn.model.SignalEventDefinition;
......@@ -48,10 +50,10 @@ public class BoundaryEventParseHandler extends AbstractFlowNodeBpmnParseHandler<
}
if (eventDefinition instanceof TimerEventDefinition
|| eventDefinition instanceof org.activiti.bpmn.model.ErrorEventDefinition
|| eventDefinition instanceof ErrorEventDefinition
|| eventDefinition instanceof SignalEventDefinition
|| eventDefinition instanceof CancelEventDefinition || eventDefinition instanceof MessageEventDefinition
|| eventDefinition instanceof org.activiti.bpmn.model.CompensateEventDefinition) {
|| eventDefinition instanceof CompensateEventDefinition) {
bpmnParse.getBpmnParserHandlers().parseElement(bpmnParse, eventDefinition);
......
......@@ -15,6 +15,8 @@ package org.activiti.engine.impl.cmd;
import java.util.Map;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.Process;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.ActivitiIllegalArgumentException;
import org.activiti.engine.ActivitiObjectNotFoundException;
......@@ -24,73 +26,89 @@ import org.activiti.engine.impl.persistence.deploy.DeploymentManager;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.persistence.entity.MessageEventSubscriptionEntity;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.impl.util.cache.ProcessDefinitionCacheUtil;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
/**
* @author Daniel Meyer
* @author Joram Barrez
<<<<<<< HEAD
* @author Vasile Dirla
=======
* @author Tijs Rademakers
>>>>>>> 14a1148... Fix history
*/
public class StartProcessInstanceByMessageCmd implements Command<ProcessInstance> {
protected final String messageName;
protected final String businessKey;
protected final Map<String, Object> processVariables;
protected final String tenantId;
public StartProcessInstanceByMessageCmd(String messageName, String businessKey, Map<String, Object> processVariables, String tenantId) {
this.messageName = messageName;
this.businessKey = businessKey;
this.processVariables = processVariables;
this.tenantId = tenantId;
}
public ProcessInstance execute(CommandContext commandContext) {
if (messageName == null) {
throw new ActivitiIllegalArgumentException("Cannot start process instance by message: message name is null");
}
MessageEventSubscriptionEntity messageEventSubscription = commandContext.getEventSubscriptionEntityManager()
.findMessageStartEventSubscriptionByName(messageName, tenantId);
if (messageEventSubscription == null) {
throw new ActivitiObjectNotFoundException("Cannot start process instance by message: no subscription to message with name '"+messageName+"' found.", MessageEventSubscriptionEntity.class);
}
String processDefinitionId = messageEventSubscription.getConfiguration();
if (processDefinitionId == null) {
throw new ActivitiException("Cannot start process instance by message: subscription to message with name '"+messageName+"' is not a message start event.");
}
protected final String messageName;
protected final String businessKey;
protected final Map<String, Object> processVariables;
protected final String tenantId;
public StartProcessInstanceByMessageCmd(String messageName, String businessKey, Map<String, Object> processVariables, String tenantId) {
this.messageName = messageName;
this.businessKey = businessKey;
this.processVariables = processVariables;
this.tenantId = tenantId;
}
public ProcessInstance execute(CommandContext commandContext) {
if (messageName == null) {
throw new ActivitiIllegalArgumentException("Cannot start process instance by message: message name is null");
}
MessageEventSubscriptionEntity messageEventSubscription = commandContext.getEventSubscriptionEntityManager().findMessageStartEventSubscriptionByName(
messageName, tenantId);
if (messageEventSubscription == null) {
throw new ActivitiObjectNotFoundException("Cannot start process instance by message: no subscription to message with name '" + messageName
+ "' found.", MessageEventSubscriptionEntity.class);
}
String processDefinitionId = messageEventSubscription.getConfiguration();
if (processDefinitionId == null) {
throw new ActivitiException("Cannot start process instance by message: subscription to message with name '" + messageName
+ "' is not a message start event.");
}
DeploymentManager deploymentCache = commandContext
.getProcessEngineConfiguration()
.getDeploymentManager();
ProcessDefinitionEntity processDefinition = deploymentCache.findDeployedProcessDefinitionById(processDefinitionId);
if (processDefinition == null) {
throw new ActivitiObjectNotFoundException("No process definition found for id '" + processDefinitionId + "'", ProcessDefinition.class);
}
// Do not start process a process instance if the process definition is suspended
// if (processDefinition.isSuspended()) {
// throw new ActivitiException("Cannot start process instance. Process definition "
// + processDefinition.getName() + " (id = " + processDefinition.getId() + ") is suspended");
// }
//
// ActivityImpl startActivity = processDefinition.findActivity(messageEventSubscription.getActivityId());
// ExecutionEntity processInstance = processDefinition.createProcessInstance(businessKey, startActivity);
// Do not start process a process instance if the process definition is suspended
if (processDefinition.isSuspended()) {
throw new ActivitiException("Cannot start process instance. Process definition "
+ processDefinition.getName() + " (id = " + processDefinition.getId() + ") is suspended");
}
ActivityImpl startActivity = processDefinition.findActivity(messageEventSubscription.getActivityId());
ExecutionEntity processInstance = processDefinition.createProcessInstance(businessKey, startActivity);
DeploymentManager deploymentCache = commandContext.getProcessEngineConfiguration().getDeploymentManager();
ProcessDefinitionEntity processDefinition = deploymentCache.findDeployedProcessDefinitionById(processDefinitionId);
if (processDefinition == null) {
throw new ActivitiObjectNotFoundException("No process definition found for id '" + processDefinitionId + "'", ProcessDefinition.class);
}
Process process = ProcessDefinitionCacheUtil.getCachedProcess(processDefinition.getId());
if (process == null) {
throw new ActivitiException("Cannot start process instance. Process model " + processDefinition.getName() + " (id = " + processDefinition.getId()
+ ") could not be found");
}
FlowElement initialFlowElement = process.getFlowElement(messageEventSubscription.getActivityId());
if (initialFlowElement == null) {
throw new ActivitiException("No message element found in process definition " + processDefinition.getId() + " for activity id "
+ messageEventSubscription.getActivityId());
}
ExecutionEntity processInstance = processDefinition.createProcessInstance(businessKey, initialFlowElement);
if (processVariables != null) {
processInstance.setVariables(processVariables);
}
processInstance.start();
if (processVariables != null) {
processInstance.setVariables(processVariables);
return processInstance;
}
processInstance.start();
return processInstance;
}
}
......@@ -18,6 +18,7 @@ import java.util.Map;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.Process;
import org.activiti.bpmn.model.StartEvent;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.ActivitiIllegalArgumentException;
import org.activiti.engine.ActivitiObjectNotFoundException;
......@@ -25,6 +26,7 @@ import org.activiti.engine.ProcessEngineConfiguration;
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;
......@@ -34,6 +36,7 @@ import org.activiti.engine.impl.runtime.ProcessInstanceBuilderImpl;
import org.activiti.engine.impl.util.cache.ProcessDefinitionCacheUtil;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.IdentityLinkType;
/**
* @author Tom Baeyens
......@@ -119,10 +122,14 @@ public class StartProcessInstanceCmd<T> implements Command<ProcessInstance>, Ser
// Get model from cache
Process process = ProcessDefinitionCacheUtil.getCachedProcess(processDefinition.getId());
if (process == null) {
throw new ActivitiException("Cannot start process instance. Process model "
+ processDefinition.getName() + " (id = " + processDefinition.getId() + ") could not be found");
}
FlowElement initialFlowElement = process.getInitialFlowElement();
if (initialFlowElement == null) {
throw new ActivitiException("No start element found");
throw new ActivitiException("No start element found for process definition " + processDefinition.getId());
}
// Create process instance
......@@ -130,7 +137,12 @@ public class StartProcessInstanceCmd<T> implements Command<ProcessInstance>, Ser
// //// ////// ////// //////
// Create the process instance
ExecutionEntity processInstance = createProcessInstance(commandContext, processDefinition, businessKey);
String initiatorVariableName = null;
if (initialFlowElement instanceof StartEvent) {
initiatorVariableName = ((StartEvent) initialFlowElement).getInitiator();
}
ExecutionEntity processInstance = createProcessInstance(commandContext, processDefinition,
businessKey, initiatorVariableName, initialFlowElement);
// Set the variables passed into the start command
if (variables != null) {
......@@ -150,8 +162,8 @@ public class StartProcessInstanceCmd<T> implements Command<ProcessInstance>, Ser
return processInstance;
}
protected ExecutionEntity createProcessInstance(CommandContext commandContext,
ProcessDefinitionEntity processDefinitionEntity, String businessKey) {
protected ExecutionEntity createProcessInstance(CommandContext commandContext, ProcessDefinitionEntity processDefinitionEntity,
String businessKey, String initiatorVariableName, FlowElement initialFlowElement) {
ExecutionEntity processInstance = new ExecutionEntity();
processInstance.setProcessDefinitionId(processDefinitionEntity.getId());
......@@ -163,21 +175,19 @@ public class StartProcessInstanceCmd<T> implements Command<ProcessInstance>, Ser
processInstance.setTenantId(processDefinitionEntity.getTenantId());
}
// String authenticatedUserId = Authentication.getAuthenticatedUserId();
// String initiatorVariableName = (String) getProperty(BpmnParse.PROPERTYNAME_INITIATOR_VARIABLE_NAME);
// if (initiatorVariableName != null) {
// processInstance.setVariable(initiatorVariableName,
// authenticatedUserId);
// }
// if (authenticatedUserId != null) {
// processInstance.addIdentityLink(authenticatedUserId, null,IdentityLinkType.STARTER);
// }
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);
commandContext.getHistoryManager().recordProcessInstanceStart(processInstance, initialFlowElement);
if (Context.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
Context.getProcessEngineConfiguration()
......
......@@ -15,6 +15,8 @@ package org.activiti.engine.impl.event;
import java.util.Map;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.Process;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.ActivitiObjectNotFoundException;
import org.activiti.engine.impl.context.Context;
......@@ -23,7 +25,7 @@ import org.activiti.engine.impl.persistence.deploy.DeploymentManager;
import org.activiti.engine.impl.persistence.entity.EventSubscriptionEntity;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.impl.util.cache.ProcessDefinitionCacheUtil;
import org.activiti.engine.repository.ProcessDefinition;
......@@ -55,12 +57,20 @@ public class SignalEventHandler extends AbstractEventHandler {
if (processDefinition == null) {
throw new ActivitiObjectNotFoundException("No process definition found for id '" + processDefinitionId + "'", ProcessDefinition.class);
}
ActivityImpl startActivity = processDefinition.findActivity(eventSubscription.getActivityId());
if (startActivity == null) {
throw new ActivitiException("Could no handle signal: no start activity found with id " + eventSubscription.getActivityId());
}
ExecutionEntity processInstance = processDefinition.createProcessInstance(null, startActivity);
Process process = ProcessDefinitionCacheUtil.getCachedProcess(processDefinition.getId());
if (process == null) {
throw new ActivitiException("Cannot start process instance. Process model "
+ processDefinition.getName() + " (id = " + processDefinition.getId() + ") could not be found");
}
FlowElement signalFlowElement = process.getFlowElement(eventSubscription.getActivityId());
if (signalFlowElement == null) {
throw new ActivitiException("No activity found in process definition " + processDefinition.getId() +
" for activity id " + eventSubscription.getActivityId());
}
ExecutionEntity processInstance = processDefinition.createProcessInstance(null, signalFlowElement);
if (processInstance == null) {
throw new ActivitiException("Could not handle signal: no process instance started");
}
......
......@@ -3,6 +3,7 @@ package org.activiti.engine.impl.history;
import java.util.Date;
import java.util.Map;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.engine.impl.db.DbSqlSession;
import org.activiti.engine.impl.interceptor.Session;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
......@@ -35,8 +36,7 @@ public interface HistoryManager extends Session {
/**
* Record a process-instance started and record start-event if activity history is enabled.
*/
public abstract void recordProcessInstanceStart(
ExecutionEntity processInstance);
public abstract void recordProcessInstanceStart(ExecutionEntity processInstance, FlowElement startElement);
/**
* Record a process-instance name change.
......
......@@ -19,6 +19,8 @@ import java.util.Map;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.impl.HistoricProcessInstanceQueryImpl;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.interceptor.CommandContext;
/**
......@@ -49,45 +51,45 @@ public class HistoricProcessInstanceEntityManager extends AbstractEntityManager<
@SuppressWarnings("unchecked")
public void deleteHistoricProcessInstanceById(String historicProcessInstanceId) {
// if (getHistoryManager().isHistoryEnabled()) {
// CommandContext commandContext = Context.getCommandContext();
// HistoricProcessInstanceEntity historicProcessInstance = findHistoricProcessInstance(historicProcessInstanceId);
//
// commandContext
// .getHistoricDetailEntityManager()
// .deleteHistoricDetailsByProcessInstanceId(historicProcessInstanceId);
//
// commandContext
// .getHistoricVariableInstanceEntityManager()
// .deleteHistoricVariableInstanceByProcessInstanceId(historicProcessInstanceId);
//
// commandContext
// .getHistoricActivityInstanceEntityManager()
// .deleteHistoricActivityInstancesByProcessInstanceId(historicProcessInstanceId);
//
// commandContext
// .getHistoricTaskInstanceEntityManager()
// .deleteHistoricTaskInstancesByProcessInstanceId(historicProcessInstanceId);
//
// commandContext
// .getHistoricIdentityLinkEntityManager()
// .deleteHistoricIdentityLinksByProcInstance(historicProcessInstanceId);
//
// commandContext
// .getCommentEntityManager()
// .deleteCommentsByProcessInstanceId(historicProcessInstanceId);
//
// getDbSqlSession().delete(historicProcessInstance);
//
// // Also delete any sub-processes that may be active (ACT-821)
// HistoricProcessInstanceQueryImpl subProcessesQueryImpl = new HistoricProcessInstanceQueryImpl();
// subProcessesQueryImpl.superProcessInstanceId(historicProcessInstanceId);
//
// List<HistoricProcessInstance> selectList = getDbSqlSession().selectList("selectHistoricProcessInstancesByQueryCriteria", subProcessesQueryImpl);
// for(HistoricProcessInstance child : selectList) {
// deleteHistoricProcessInstanceById(child.getId());
// }
// }
if (getHistoryManager().isHistoryEnabled()) {
CommandContext commandContext = Context.getCommandContext();
HistoricProcessInstanceEntity historicProcessInstance = findHistoricProcessInstance(historicProcessInstanceId);
commandContext
.getHistoricDetailEntityManager()
.deleteHistoricDetailsByProcessInstanceId(historicProcessInstanceId);
commandContext
.getHistoricVariableInstanceEntityManager()
.deleteHistoricVariableInstanceByProcessInstanceId(historicProcessInstanceId);
commandContext
.getHistoricActivityInstanceEntityManager()
.deleteHistoricActivityInstancesByProcessInstanceId(historicProcessInstanceId);
commandContext
.getHistoricTaskInstanceEntityManager()
.deleteHistoricTaskInstancesByProcessInstanceId(historicProcessInstanceId);
commandContext
.getHistoricIdentityLinkEntityManager()
.deleteHistoricIdentityLinksByProcInstance(historicProcessInstanceId);
commandContext
.getCommentEntityManager()
.deleteCommentsByProcessInstanceId(historicProcessInstanceId);
getDbSqlSession().delete(historicProcessInstance);
// Also delete any sub-processes that may be active (ACT-821)
HistoricProcessInstanceQueryImpl subProcessesQueryImpl = new HistoricProcessInstanceQueryImpl();
subProcessesQueryImpl.superProcessInstanceId(historicProcessInstanceId);
List<HistoricProcessInstance> selectList = getDbSqlSession().selectList("selectHistoricProcessInstancesByQueryCriteria", subProcessesQueryImpl);
for(HistoricProcessInstance child : selectList) {
deleteHistoricProcessInstanceById(child.getId());
}
}
}
public long findHistoricProcessInstanceCountByQueryCriteria(HistoricProcessInstanceQueryImpl historicProcessInstanceQuery) {
......
......@@ -60,7 +60,7 @@ public class ProcessDefinitionImpl extends ScopeImpl implements PvmProcessDefini
throw new ActivitiException("Cannot start process instance, initial activity where the process instance should start is null.");
}
InterpretableExecution processInstance = newProcessInstance(initial);
InterpretableExecution processInstance = newProcessInstance();
processInstance.setProcessDefinition(this);
processInstance.setProcessInstance(processInstance);
processInstance.initialize();
......@@ -102,8 +102,8 @@ public class ProcessDefinitionImpl extends ScopeImpl implements PvmProcessDefini
return initialActivityStack;
}
protected InterpretableExecution newProcessInstance(ActivityImpl startActivity) {
return new ExecutionImpl(startActivity);
protected InterpretableExecution newProcessInstance() {
return new ExecutionImpl();
}
public String getDiagramResourceName() {
......
......@@ -13,13 +13,11 @@
package org.activiti.engine.impl.pvm.runtime;
import java.util.List;
import java.util.Map;
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.pvm.process.ActivityImpl;
import org.activiti.engine.impl.pvm.process.ProcessDefinitionImpl;
import org.activiti.engine.impl.pvm.process.ScopeImpl;
......@@ -56,9 +54,6 @@ public class AtomicOperationProcessStart extends AbstractEventAtomicOperation {
}
ProcessDefinitionImpl processDefinition = execution.getProcessDefinition();
StartingExecution startingExecution = execution.getStartingExecution();
List<ActivityImpl> initialActivityStack = processDefinition.getInitialActivityStack(startingExecution.getInitial());
execution.setActivity(initialActivityStack.get(0));
execution.performOperation(PROCESS_START_INITIAL);
}
}
......@@ -13,10 +13,6 @@
package org.activiti.engine.impl.pvm.runtime;
import java.util.List;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.impl.pvm.process.ProcessDefinitionImpl;
import org.activiti.engine.impl.pvm.process.ScopeImpl;
......@@ -37,7 +33,7 @@ public class AtomicOperationProcessStartInitial extends AbstractEventAtomicOpera
@Override
protected void eventNotificationsCompleted(InterpretableExecution execution) {
ActivityImpl activity = (ActivityImpl) execution.getActivity();
/*ActivityImpl activity = (ActivityImpl) execution.getActivity();
ProcessDefinitionImpl processDefinition = execution.getProcessDefinition();
StartingExecution startingExecution = execution.getStartingExecution();
if (activity==startingExecution.getInitial()) {
......@@ -57,6 +53,6 @@ public class AtomicOperationProcessStartInitial extends AbstractEventAtomicOpera
}
executionToUse.setActivity(activity);
executionToUse.performOperation(PROCESS_START_INITIAL);
}
}*/
}
}
......@@ -77,8 +77,4 @@ public interface InterpretableExecution extends ActivityExecution, ExecutionList
boolean isEventScope();
void setEventScope(boolean isEventScope);
StartingExecution getStartingExecution();
void disposeStartingExecution();
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册