未验证 提交 6ddaae94 编写于 作者: V Vito 提交者: GitHub

DW-1667 - created instance will return with status CREATED (#3218)

* DW-1667 - created instance will return with status CREATED and no start date

* DW-1667 - fixed tests for new status CREATED/STARTED

* DW-1667 - fixed IT
上级 7b944550
......@@ -48,6 +48,8 @@ public class APIProcessInstanceConverter extends ListConverter<org.activiti.engi
return ProcessInstance.ProcessInstanceStatus.SUSPENDED;
} else if (internalProcessInstance.isEnded()) {
return ProcessInstance.ProcessInstanceStatus.COMPLETED;
}else if(internalProcessInstance.getStartTime() == null){
return ProcessInstance.ProcessInstanceStatus.CREATED;
}
return ProcessInstance.ProcessInstanceStatus.RUNNING;
}
......
......@@ -54,6 +54,16 @@ public class APIProcessInstanceConverterTest {
assertThat(result.getStatus()).isEqualTo(ProcessInstanceStatus.RUNNING);
}
@Test
public void should_returnStatusCreated_when_StartDateIsNull() {
ExecutionEntity internalProcessInstance = anInternalProcessInstance(APP_VERSION);
internalProcessInstance.setStartTime(null);
ProcessInstance result = subject.from(internalProcessInstance);
assertThat(result.getStatus()).isEqualTo(ProcessInstanceStatus.CREATED);
}
@Test
public void should_convertFromInternalProcessInstance_when_withSuspendedStatus() {
ExecutionEntity internalProcessInstance = anInternalProcessInstance(APP_VERSION);
......
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.engine.impl.event;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.ActivitiObjectNotFoundException;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.event.ActivitiSignalEvent;
import org.activiti.engine.delegate.event.impl.ActivitiEventBuilder;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.EventSubscriptionEntity;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.util.ProcessDefinitionUtil;
import org.activiti.engine.impl.util.ProcessInstanceHelper;
import org.activiti.engine.repository.ProcessDefinition;
import java.util.Map;
/**
*/
public class SignalEventHandler extends AbstractEventHandler {
public static final String EVENT_HANDLER_TYPE = "signal";
public String getEventHandlerType() {
return EVENT_HANDLER_TYPE;
}
@SuppressWarnings("unchecked")
@Override
public void handleEvent(EventSubscriptionEntity eventSubscription, Object payload, CommandContext commandContext) {
if (eventSubscription.getExecutionId() != null) {
dispatchActivitySignalledEvent(eventSubscription.getExecution(),
eventSubscription.getEventName(),
payload,
commandContext);
super.handleEvent(eventSubscription, payload, commandContext);
} else if (eventSubscription.getProcessDefinitionId() != null) {
// Find initial flow element matching the signal start event
String processDefinitionId = eventSubscription.getProcessDefinitionId();
ProcessDefinition processDefinition = ProcessDefinitionUtil.getProcessDefinition(processDefinitionId);
if (processDefinition == null) {
throw new ActivitiObjectNotFoundException("No process definition found for id '" + processDefinitionId + "'", ProcessDefinition.class);
}
if (processDefinition.isSuspended()) {
throw new ActivitiException("Could not handle signal: process definition with id: " + processDefinitionId + " is suspended");
}
org.activiti.bpmn.model.Process process = ProcessDefinitionUtil.getProcess(processDefinitionId);
FlowElement flowElement = process.getFlowElement(eventSubscription.getActivityId(), true);
if (flowElement == null) {
throw new ActivitiException("Could not find matching FlowElement for activityId " + eventSubscription.getActivityId());
}
// Start process instance via that flow element
Map<String, Object> variables = null;
if (payload instanceof Map) {
variables = (Map<String, Object>) payload;
}
ProcessInstanceHelper processInstanceHelper = commandContext.getProcessEngineConfiguration()
.getProcessInstanceHelper();
ExecutionEntity executionEntity = processInstanceHelper.createProcessInstanceWithInitialFlowElement(processDefinition,
null,
null,
flowElement,
process,
variables,
null);
DelegateExecution execution = executionEntity.getExecutions()
.get(0);
dispatchActivitySignalledEvent(execution,
eventSubscription.getEventName(),
payload,
commandContext);
processInstanceHelper.startProcessInstance(executionEntity,
commandContext,
variables);
} else {
throw new ActivitiException("Invalid signal handling: no execution nor process definition set");
}
}
protected void dispatchActivitySignalledEvent(DelegateExecution execution,
String signalName,
Object payload,
CommandContext commandContext) {
if (commandContext.getProcessEngineConfiguration()
.getEventDispatcher()
.isEnabled()) {
ActivitiSignalEvent signalEvent = ActivitiEventBuilder.createActivitiySignalledEvent(execution,
signalName,
payload);
Context.getProcessEngineConfiguration().getEventDispatcher()
.dispatchEvent(signalEvent);
}
}
}
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.engine.impl.event;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.ActivitiObjectNotFoundException;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.event.ActivitiSignalEvent;
import org.activiti.engine.delegate.event.impl.ActivitiEventBuilder;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.EventSubscriptionEntity;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.util.ProcessDefinitionUtil;
import org.activiti.engine.impl.util.ProcessInstanceHelper;
import org.activiti.engine.repository.ProcessDefinition;
import java.util.Map;
/**
*/
public class SignalEventHandler extends AbstractEventHandler {
public static final String EVENT_HANDLER_TYPE = "signal";
public String getEventHandlerType() {
return EVENT_HANDLER_TYPE;
}
@SuppressWarnings("unchecked")
@Override
public void handleEvent(EventSubscriptionEntity eventSubscription, Object payload, CommandContext commandContext) {
if (eventSubscription.getExecutionId() != null) {
dispatchActivitySignalledEvent(eventSubscription.getExecution(),
eventSubscription.getEventName(),
payload,
commandContext);
super.handleEvent(eventSubscription, payload, commandContext);
} else if (eventSubscription.getProcessDefinitionId() != null) {
// Find initial flow element matching the signal start event
String processDefinitionId = eventSubscription.getProcessDefinitionId();
ProcessDefinition processDefinition = ProcessDefinitionUtil.getProcessDefinition(processDefinitionId);
if (processDefinition == null) {
throw new ActivitiObjectNotFoundException("No process definition found for id '" + processDefinitionId + "'", ProcessDefinition.class);
}
if (processDefinition.isSuspended()) {
throw new ActivitiException("Could not handle signal: process definition with id: " + processDefinitionId + " is suspended");
}
org.activiti.bpmn.model.Process process = ProcessDefinitionUtil.getProcess(processDefinitionId);
FlowElement flowElement = process.getFlowElement(eventSubscription.getActivityId(), true);
if (flowElement == null) {
throw new ActivitiException("Could not find matching FlowElement for activityId " + eventSubscription.getActivityId());
}
// Start process instance via that flow element
Map<String, Object> variables = null;
if (payload instanceof Map) {
variables = (Map<String, Object>) payload;
}
ProcessInstanceHelper processInstanceHelper = commandContext.getProcessEngineConfiguration()
.getProcessInstanceHelper();
ExecutionEntity executionEntity = processInstanceHelper.createProcessInstanceWithInitialFlowElement(processDefinition,
null,
null,
flowElement,
process,
variables,
null);
DelegateExecution execution = executionEntity.getExecutions()
.get(0);
dispatchActivitySignalledEvent(execution,
eventSubscription.getEventName(),
payload,
commandContext);
processInstanceHelper.startProcessInstance(executionEntity,
commandContext,
variables,
flowElement);
} else {
throw new ActivitiException("Invalid signal handling: no execution nor process definition set");
}
}
protected void dispatchActivitySignalledEvent(DelegateExecution execution,
String signalName,
Object payload,
CommandContext commandContext) {
if (commandContext.getProcessEngineConfiguration()
.getEventDispatcher()
.isEnabled()) {
ActivitiSignalEvent signalEvent = ActivitiEventBuilder.createActivitiySignalledEvent(execution,
signalName,
payload);
Context.getProcessEngineConfiguration().getEventDispatcher()
.dispatchEvent(signalEvent);
}
}
}
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
......@@ -29,16 +29,16 @@ import org.activiti.engine.runtime.ProcessInstance;
*/
@Internal
public interface ExecutionEntityManager extends EntityManager<ExecutionEntity> {
ExecutionEntity createProcessInstanceExecution(ProcessDefinition processDefinition, String businessKey, String tenantId, String initiatorVariableName);
ExecutionEntity createChildExecution(ExecutionEntity parentExecutionEntity);
ExecutionEntity createSubprocessInstance(ProcessDefinition processDefinition, ExecutionEntity superExecutionEntity, String businessKey);
/**
* Finds the {@link ExecutionEntity} for the given root process instance id.
* All children will have been fetched and initialized.
* All children will have been fetched and initialized.
*/
ExecutionEntity findByRootProcessInstanceId(String rootProcessInstanceId);
......@@ -57,43 +57,44 @@ public interface ExecutionEntityManager extends EntityManager<ExecutionEntity> {
long findProcessInstanceCountByQueryCriteria(ProcessInstanceQueryImpl executionQuery);
List<ProcessInstance> findProcessInstanceByQueryCriteria(ProcessInstanceQueryImpl executionQuery);
List<ProcessInstance> findProcessInstanceAndVariablesByQueryCriteria(ProcessInstanceQueryImpl executionQuery);
Collection<ExecutionEntity> findInactiveExecutionsByProcessInstanceId(String processInstanceId);
Collection<ExecutionEntity> findInactiveExecutionsByActivityIdAndProcessInstanceId(String activityId, String processInstanceId);
List<Execution> findExecutionsByNativeQuery(Map<String, Object> parameterMap, int firstResult, int maxResults);
List<ProcessInstance> findProcessInstanceByNativeQuery(Map<String, Object> parameterMap, int firstResult, int maxResults);
long findExecutionCountByNativeQuery(Map<String, Object> parameterMap);
/**
* Returns all child executions of a given {@link ExecutionEntity}.
* In the list, child executions will be behind parent executions.
* In the list, child executions will be behind parent executions.
*/
List<ExecutionEntity> collectChildren(ExecutionEntity executionEntity);
ExecutionEntity findFirstScope(ExecutionEntity executionEntity);
ExecutionEntity findFirstMultiInstanceRoot(ExecutionEntity executionEntity);
void updateExecutionTenantIdForDeployment(String deploymentId, String newTenantId);
String updateProcessInstanceBusinessKey(ExecutionEntity executionEntity, String businessKey);
ExecutionEntity updateProcessInstanceStartDate(ExecutionEntity processInstanceExecution);
void deleteProcessInstancesByProcessDefinition(String processDefinitionId, String deleteReason, boolean cascade);
void deleteProcessInstance(String processInstanceId, String deleteReason, boolean cascade);
void deleteProcessInstanceExecutionEntity(String processInstanceId, String currentFlowElementId,
void deleteProcessInstanceExecutionEntity(String processInstanceId, String currentFlowElementId,
String deleteReason, boolean cascade, boolean cancel);
void deleteChildExecutions(ExecutionEntity executionEntity, String deleteReason);
void cancelChildExecutions(ExecutionEntity executionEntity, String deleteReason);
......
......@@ -230,7 +230,6 @@ public class ExecutionEntityManagerImpl extends AbstractEntityManager<ExecutionE
String authenticatedUserId = Authentication.getAuthenticatedUserId();
processInstanceExecution.setStartTime(Context.getProcessEngineConfiguration().getClock().getCurrentTime());
processInstanceExecution.setStartUserId(authenticatedUserId);
// Store in database
......@@ -255,6 +254,10 @@ public class ExecutionEntityManagerImpl extends AbstractEntityManager<ExecutionE
return processInstanceExecution;
}
public ExecutionEntity updateProcessInstanceStartDate(ExecutionEntity processInstanceExecution) {
processInstanceExecution.setStartTime(Context.getProcessEngineConfiguration().getClock().getCurrentTime());
return update(processInstanceExecution);
}
/**
* Creates a new execution. properties processDefinition, processInstance and activity will be initialized.
*/
......
......@@ -48,12 +48,13 @@ public class HistoricProcessInstanceEntityImpl extends HistoricScopeInstanceEnti
protected List<HistoricVariableInstanceEntity> queryVariables;
public HistoricProcessInstanceEntityImpl() {
}
public HistoricProcessInstanceEntityImpl(ExecutionEntity processInstance) {
id = processInstance.getId();
processInstanceId = processInstance.getId();
name = processInstance.getName();
businessKey = processInstance.getBusinessKey();
processDefinitionId = processInstance.getProcessDefinitionId();
processDefinitionKey = processInstance.getProcessDefinitionKey();
......@@ -153,11 +154,11 @@ public class HistoricProcessInstanceEntityImpl extends HistoricScopeInstanceEnti
public String getLocalizedName() {
return localizedName;
}
public void setLocalizedName(String localizedName) {
this.localizedName = localizedName;
}
public String getDescription() {
if (localizedDescription != null && localizedDescription.length() > 0) {
return localizedDescription;
......@@ -165,19 +166,19 @@ public class HistoricProcessInstanceEntityImpl extends HistoricScopeInstanceEnti
return description;
}
}
public void setDescription(String description) {
this.description = description;
}
public String getLocalizedDescription() {
return localizedDescription;
}
public void setLocalizedDescription(String localizedDescription) {
this.localizedDescription = localizedDescription;
}
public String getProcessDefinitionKey() {
return processDefinitionKey;
}
......
......@@ -51,9 +51,8 @@ public class ProcessInstanceHelper {
public ProcessInstance createAndStartProcessInstance(ProcessDefinition processDefinition,
String businessKey, String processInstanceName,
Map<String, Object> variables, Map<String, Object> transientVariables) {
return createAndStartProcessInstance(processDefinition, businessKey, processInstanceName, variables, transientVariables, true);
}
return createAndStartProcessInstance(processDefinition, businessKey, processInstanceName, variables, transientVariables, true);
}
public Process getActiveProcess(ProcessDefinition processDefinition) {
if (ProcessDefinitionUtil.isProcessDefinitionSuspended(processDefinition.getId())) {
......@@ -75,17 +74,17 @@ public class ProcessInstanceHelper {
return initialFlowElement;
}
protected ProcessInstance createAndStartProcessInstance(ProcessDefinition processDefinition,
String businessKey, String processInstanceName,
Map<String, Object> variables, Map<String, Object> transientVariables, boolean startProcessInstance) {
protected ProcessInstance createAndStartProcessInstance(ProcessDefinition processDefinition,
String businessKey, String processInstanceName,
Map<String, Object> variables, Map<String, Object> transientVariables, boolean startProcessInstance) {
Process process = this.getActiveProcess(processDefinition);
Process process = this.getActiveProcess(processDefinition);
FlowElement initialFlowElement = this.getInitialFlowElement(process, processDefinition.getId());
FlowElement initialFlowElement = this.getInitialFlowElement(process, processDefinition.getId());
return createAndStartProcessInstanceWithInitialFlowElement(processDefinition, businessKey,
processInstanceName, initialFlowElement, process, variables, transientVariables, startProcessInstance);
}
return createAndStartProcessInstanceWithInitialFlowElement(processDefinition, businessKey,
processInstanceName, initialFlowElement, process, variables, transientVariables, startProcessInstance);
}
public ProcessInstance createProcessInstance(ProcessDefinition processDefinition, String businessKey,
String processInstanceName, Map<String, Object> variables,
......@@ -95,91 +94,99 @@ public class ProcessInstanceHelper {
FlowElement initialFlowElement = this.getInitialFlowElement(process, processDefinition.getId());
ExecutionEntity processInstance = createProcessInstanceWithInitialFlowElement(processDefinition,
businessKey,
processInstanceName,
initialFlowElement,
process,
variables,
transientVariables);
businessKey,
processInstanceName,
initialFlowElement,
process,
variables,
transientVariables);
return processInstance;
}
public ProcessInstance createAndStartProcessInstanceByMessage(ProcessDefinition processDefinition, String businessKey, String messageName,
Map<String, Object> messageVariables, Map<String, Object> transientVariables) {
Process process = this.getActiveProcess(processDefinition);
FlowElement initialFlowElement = null;
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinition.getId());
for (FlowElement flowElement : process.getFlowElements()) {
if (flowElement instanceof StartEvent) {
StartEvent startEvent = (StartEvent) flowElement;
if (CollectionUtil.isNotEmpty(startEvent.getEventDefinitions()) && startEvent.getEventDefinitions().get(0) instanceof MessageEventDefinition) {
MessageEventDefinition messageEventDefinition = (MessageEventDefinition) startEvent.getEventDefinitions().get(0);
String messageRef = messageEventDefinition.getMessageRef();
if (messageRef.equals(messageName)) {
initialFlowElement = flowElement;
break;
} // FIXME: We should not need to reset eventDefinition messageRef to message name
else if (bpmnModel.containsMessageId(messageRef)) {
Message message = bpmnModel.getMessage(messageRef);
messageEventDefinition.setMessageRef(message.getName());
initialFlowElement = flowElement;
break;
}
}
}
}
if (initialFlowElement == null) {
throw new ActivitiException("No message start event found for process definition " + processDefinition.getId() + " and message name " + messageName);
}
Map<String, Object> processVariables = messageVariables;
// Create process instance with executions but defer to start process after dispatching ACTIVITY_MESSAGE_RECEIVED
ExecutionEntity processInstance = createProcessInstanceWithInitialFlowElement(processDefinition,
businessKey,
null,
initialFlowElement,
process,
processVariables,
transientVariables);
// Dispatch message received event
dispatchStartMessageReceivedEvent(processInstance, messageName, messageVariables);
// Finally start the process
CommandContext commandContext = Context.getCommandContext();
startProcessInstance(processInstance, commandContext, processVariables);
return processInstance;
}
public ProcessInstance createAndStartProcessInstanceWithInitialFlowElement(ProcessDefinition processDefinition,
String businessKey, String processInstanceName, FlowElement initialFlowElement,
Process process, Map<String, Object> variables, Map<String, Object> transientVariables, boolean startProcessInstance) {
public ProcessInstance createAndStartProcessInstanceByMessage(ProcessDefinition processDefinition, String businessKey, String messageName,
Map<String, Object> messageVariables, Map<String, Object> transientVariables) {
Process process = this.getActiveProcess(processDefinition);
FlowElement initialFlowElement = null;
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinition.getId());
for (FlowElement flowElement : process.getFlowElements()) {
if (flowElement instanceof StartEvent) {
StartEvent startEvent = (StartEvent) flowElement;
if (CollectionUtil.isNotEmpty(startEvent.getEventDefinitions()) && startEvent.getEventDefinitions().get(0) instanceof MessageEventDefinition) {
MessageEventDefinition messageEventDefinition = (MessageEventDefinition) startEvent.getEventDefinitions().get(0);
String messageRef = messageEventDefinition.getMessageRef();
if (messageRef.equals(messageName)) {
initialFlowElement = flowElement;
break;
} // FIXME: We should not need to reset eventDefinition messageRef to message name
else if (bpmnModel.containsMessageId(messageRef)) {
Message message = bpmnModel.getMessage(messageRef);
messageEventDefinition.setMessageRef(message.getName());
initialFlowElement = flowElement;
break;
}
}
}
}
if (initialFlowElement == null) {
throw new ActivitiException("No message start event found for process definition " + processDefinition.getId() + " and message name " + messageName);
}
Map<String, Object> processVariables = messageVariables;
// Create process instance with executions but defer to start process after dispatching ACTIVITY_MESSAGE_RECEIVED
ExecutionEntity processInstance = createProcessInstanceWithInitialFlowElement(processDefinition,
businessKey,
processInstanceName,
initialFlowElement,
process,
variables,
transientVariables);
if (startProcessInstance) {
businessKey,
null,
initialFlowElement,
process,
processVariables,
transientVariables);
// Dispatch message received event
dispatchStartMessageReceivedEvent(processInstance, messageName, messageVariables);
// Finally start the process
CommandContext commandContext = Context.getCommandContext();
startProcessInstance(processInstance, commandContext, processVariables, initialFlowElement);
startProcessInstance(processInstance, commandContext, variables);
}
return processInstance;
}
return processInstance;
private void updateProcessInstanceStartDate(ExecutionEntity processInstance) {
CommandContext commandContext = Context.getCommandContext();
commandContext.getExecutionEntityManager().updateProcessInstanceStartDate(processInstance);
}
public void startProcessInstance(ExecutionEntity processInstance, CommandContext commandContext, Map<String, Object> variables) {
public ProcessInstance createAndStartProcessInstanceWithInitialFlowElement(ProcessDefinition processDefinition,
String businessKey, String processInstanceName, FlowElement initialFlowElement,
Process process, Map<String, Object> variables, Map<String, Object> transientVariables, boolean startProcessInstance) {
Process process = ProcessDefinitionUtil.getProcess(processInstance.getProcessDefinitionId());
ExecutionEntity processInstance = createProcessInstanceWithInitialFlowElement(processDefinition,
businessKey,
processInstanceName,
initialFlowElement,
process,
variables,
transientVariables);
if (startProcessInstance) {
CommandContext commandContext = Context.getCommandContext();
startProcessInstance(processInstance, commandContext, variables, initialFlowElement);
}
return processInstance;
}
private void recordStartProcessInstance(CommandContext commandContext, FlowElement initialFlowElement, ExecutionEntity processInstance){
updateProcessInstanceStartDate(processInstance);
commandContext.getHistoryManager().recordProcessInstanceStart(processInstance, initialFlowElement);
}
public void startProcessInstance(ExecutionEntity processInstance, CommandContext commandContext, Map<String, Object> variables, FlowElement initialFlowElement) {
recordStartProcessInstance(commandContext, initialFlowElement, processInstance);
Process process = ProcessDefinitionUtil.getProcess(processInstance.getProcessDefinitionId());
// Event sub process handling
List<MessageEventSubscriptionEntity> messageEventSubscriptions = new LinkedList<>();
......@@ -252,34 +259,34 @@ public class ProcessInstanceHelper {
}
protected Optional<String> getCorrelationKey(CommandContext commandContext,
MessageEventDefinition messageEventDefinition,
DelegateExecution execution) {
ExpressionManager expressionManager = commandContext.getProcessEngineConfiguration()
.getExpressionManager();
return Optional.ofNullable(messageEventDefinition.getCorrelationKey())
.map(correlationKey -> {
Expression expression = expressionManager.createExpression(messageEventDefinition.getCorrelationKey());
return expression.getValue(execution)
.toString();
});
MessageEventDefinition messageEventDefinition,
DelegateExecution execution) {
ExpressionManager expressionManager = commandContext.getProcessEngineConfiguration()
.getExpressionManager();
return Optional.ofNullable(messageEventDefinition.getCorrelationKey())
.map(correlationKey -> {
Expression expression = expressionManager.createExpression(messageEventDefinition.getCorrelationKey());
return expression.getValue(execution)
.toString();
});
}
protected String getMessageName(CommandContext commandContext,
MessageEventDefinition messageEventDefinition,
DelegateExecution execution) {
ExpressionManager expressionManager = commandContext.getProcessEngineConfiguration()
.getExpressionManager();
MessageEventDefinition messageEventDefinition,
DelegateExecution execution) {
ExpressionManager expressionManager = commandContext.getProcessEngineConfiguration()
.getExpressionManager();
String messageName = Optional.ofNullable(messageEventDefinition.getMessageRef())
.orElse(messageEventDefinition.getMessageExpression());
String messageName = Optional.ofNullable(messageEventDefinition.getMessageRef())
.orElse(messageEventDefinition.getMessageExpression());
Expression expression = expressionManager.createExpression(messageName);
Expression expression = expressionManager.createExpression(messageName);
return expression.getValue(execution)
.toString();
return expression.getValue(execution)
.toString();
}
......@@ -304,8 +311,6 @@ public class ProcessInstanceHelper {
processDefinition.getTenantId(),
initiatorVariableName);
commandContext.getHistoryManager().recordProcessInstanceStart(processInstance, initialFlowElement);
processInstance.setVariables(processDataObjects(process.getDataObjects()));
// Set the variables passed into the start command
......@@ -346,18 +351,18 @@ public class ProcessInstanceHelper {
}
protected void dispatchStartMessageReceivedEvent(ExecutionEntity processInstance,
String messageName,
Map<String, Object> variables) {
String messageName,
Map<String, Object> variables) {
// Dispatch message received event
if (Context.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
// There will always be one child execution created
DelegateExecution execution = processInstance.getExecutions().get(0);
ActivitiEventDispatcher eventDispatcher = Context.getProcessEngineConfiguration()
.getEventDispatcher();
.getEventDispatcher();
eventDispatcher.dispatchEvent(ActivitiEventBuilder.createMessageReceivedEvent(execution,
messageName,
null,
variables));
messageName,
null,
variables));
}
}
......
......@@ -17,9 +17,9 @@
package org.activiti.engine.impl.persistence.entity;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.*;
import static org.mockito.MockitoAnnotations.initMocks;
import java.util.ArrayList;
......@@ -34,6 +34,7 @@ import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import static org.mockito.AdditionalAnswers.returnsFirstArg;
public class ExecutionEntityManagerImplTest {
......@@ -77,8 +78,6 @@ public class ExecutionEntityManagerImplTest {
ExecutionEntity execution = new ExecutionEntityImpl();
execution.setId("processInstanceId");
given(executionDataManager.create()).willReturn(execution);
Date startTime = new Date();
given(clock.getCurrentTime()).willReturn(startTime);
ExecutionEntity processInstanceResult = executionEntityManager.createProcessInstanceExecution(processDefinition, businessKey, tenantId, null);
......@@ -89,7 +88,6 @@ public class ExecutionEntityManagerImplTest {
assertThat(processInstanceResult.getAppVersion()).isEqualTo(3);
assertThat(processInstanceResult.getBusinessKey()).isEqualTo(businessKey);
assertThat(processInstanceResult.isScope()).isTrue();
assertThat(processInstanceResult.getStartTime()).isEqualTo(startTime);
assertThat(processInstanceResult.getTenantId()).isEqualTo(tenantId);
assertThat(processInstanceResult.getProcessInstanceId()).isEqualTo("processInstanceId");
assertThat(processInstanceResult.getRootProcessInstanceId()).isEqualTo("processInstanceId");
......@@ -171,4 +169,30 @@ public class ExecutionEntityManagerImplTest {
verify(eventDispatcher).isEnabled();
assertThat(superExecution.getSubProcessInstance()).isEqualTo(subProcessInstance);
}
@Test
public void should_updateStartDateOfProcessInstance() {
ProcessDefinitionEntity processDefinition = new ProcessDefinitionEntityImpl();
processDefinition.setId("processDefinitionId");
processDefinition.setKey("processDefinitionKey");
processDefinition.setName("processDefinitionName");
processDefinition.setVersion(1);
String businessKey = "businessKey";
String tenantId = "tenantId";
Date startTime = new Date();
given(clock.getCurrentTime()).willReturn(startTime);
PerformanceSettings performanceSettings = mock(PerformanceSettings.class);
given(processEngineConfiguration.getPerformanceSettings()).willReturn(performanceSettings);
ExecutionEntity execution = new ExecutionEntityImpl();
execution.setId("processInstanceId");
given(executionDataManager.create()).willReturn(execution);
when(executionDataManager.update(any(ExecutionEntity.class))).then(returnsFirstArg());
ExecutionEntity processInstanceResult = executionEntityManager.createProcessInstanceExecution(processDefinition, businessKey, tenantId, null);
assertThat(processInstanceResult.getStartTime()).isNull();
ExecutionEntity processInstanceUpdated = executionEntityManager.updateProcessInstanceStartDate(processInstanceResult);
assertThat(processInstanceUpdated.getStartTime()).isEqualTo(startTime);
}
}
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
......@@ -22,7 +22,7 @@ import org.activiti.engine.test.Deployment;
/**
* Test case for all {@link ActivitiEvent}s related to executions.
*
*
*/
public class ExecutionEventsTest extends PluggableActivitiTestCase {
......@@ -39,7 +39,7 @@ public class ExecutionEventsTest extends PluggableActivitiTestCase {
assertNotNull(processInstance);
// Check create-event
assertEquals(5, listener.getEventsReceived().size());
assertEquals(6, listener.getEventsReceived().size());
assertTrue(listener.getEventsReceived().get(0) instanceof ActivitiEntityEvent);
ActivitiEntityEvent event = (ActivitiEntityEvent) listener.getEventsReceived().get(0);
......@@ -49,7 +49,7 @@ public class ExecutionEventsTest extends PluggableActivitiTestCase {
event = (ActivitiEntityEvent) listener.getEventsReceived().get(1);
assertEquals(ActivitiEventType.ENTITY_INITIALIZED, event.getType());
assertEquals(processInstance.getId(), ((Execution) event.getEntity()).getProcessInstanceId());
event = (ActivitiEntityEvent) listener.getEventsReceived().get(2);
assertEquals(ActivitiEventType.ENTITY_CREATED, event.getType());
assertEquals(processInstance.getId(), ((Execution) event.getEntity()).getProcessInstanceId());
......@@ -67,19 +67,19 @@ public class ExecutionEventsTest extends PluggableActivitiTestCase {
event = (ActivitiEntityEvent) listener.getEventsReceived().get(0);
assertEquals(processInstance.getId(), ((Execution) event.getEntity()).getProcessInstanceId());
assertEquals(ActivitiEventType.ENTITY_SUSPENDED, event.getType());
event = (ActivitiEntityEvent) listener.getEventsReceived().get(1);
assertEquals(processInstance.getId(), ((Execution) event.getEntity()).getProcessInstanceId());
assertEquals(ActivitiEventType.ENTITY_SUSPENDED, event.getType());
event = (ActivitiEntityEvent) listener.getEventsReceived().get(2);
assertEquals(ActivitiEventType.ENTITY_ACTIVATED, event.getType());
assertEquals(processInstance.getId(), ((Execution) event.getEntity()).getProcessInstanceId());
event = (ActivitiEntityEvent) listener.getEventsReceived().get(3);
assertEquals(ActivitiEventType.ENTITY_ACTIVATED, event.getType());
assertEquals(processInstance.getId(), ((Execution) event.getEntity()).getProcessInstanceId());
listener.clearEventsReceived();
// Check update event when process-definition is supended (should
......@@ -88,23 +88,23 @@ public class ExecutionEventsTest extends PluggableActivitiTestCase {
repositoryService.activateProcessDefinitionById(processInstance.getProcessDefinitionId(), true, null);
assertEquals(4, listener.getEventsReceived().size());
event = (ActivitiEntityEvent) listener.getEventsReceived().get(0);
assertEquals(processInstance.getId(), ((Execution) event.getEntity()).getProcessInstanceId());
assertEquals(ActivitiEventType.ENTITY_SUSPENDED, event.getType());
event = (ActivitiEntityEvent) listener.getEventsReceived().get(1);
assertEquals(processInstance.getId(), ((Execution) event.getEntity()).getProcessInstanceId());
assertEquals(ActivitiEventType.ENTITY_SUSPENDED, event.getType());
event = (ActivitiEntityEvent) listener.getEventsReceived().get(2);
assertEquals(ActivitiEventType.ENTITY_ACTIVATED, event.getType());
assertEquals(processInstance.getId(), ((Execution) event.getEntity()).getProcessInstanceId());
event = (ActivitiEntityEvent) listener.getEventsReceived().get(3);
assertEquals(ActivitiEventType.ENTITY_ACTIVATED, event.getType());
assertEquals(processInstance.getId(), ((Execution) event.getEntity()).getProcessInstanceId());
listener.clearEventsReceived();
// Check update-event when business-key is updated
......
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
......@@ -29,6 +29,7 @@ import org.activiti.engine.delegate.event.ActivitiEventListener;
import org.activiti.engine.delegate.event.ActivitiEventType;
import org.activiti.engine.delegate.event.ActivitiProcessStartedEvent;
import org.activiti.engine.delegate.event.impl.ActivitiActivityCancelledEventImpl;
import org.activiti.engine.delegate.event.impl.ActivitiEntityEventImpl;
import org.activiti.engine.delegate.event.impl.ActivitiProcessCancelledEventImpl;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.test.PluggableActivitiTestCase;
......@@ -39,7 +40,7 @@ import org.activiti.engine.test.Deployment;
/**
* Test case for all {@link ActivitiEvent}s related to process instances.
*
*
*/
public class ProcessInstanceEventsTest extends PluggableActivitiTestCase {
......@@ -56,7 +57,7 @@ public class ProcessInstanceEventsTest extends PluggableActivitiTestCase {
assertNotNull(processInstance);
// Check create-event
assertEquals(5, listener.getEventsReceived().size());
assertEquals(6, listener.getEventsReceived().size());
assertTrue(listener.getEventsReceived().get(0) instanceof ActivitiEntityEvent);
// process instance create event
......@@ -66,7 +67,7 @@ public class ProcessInstanceEventsTest extends PluggableActivitiTestCase {
assertEquals(processInstance.getId(), event.getProcessInstanceId());
assertEquals(processInstance.getId(), event.getExecutionId());
assertEquals(processInstance.getProcessDefinitionId(), event.getProcessDefinitionId());
event = (ActivitiEntityEvent) listener.getEventsReceived().get(1);
assertEquals(ActivitiEventType.ENTITY_INITIALIZED, event.getType());
assertEquals(processInstance.getId(), event.getProcessInstanceId());
......@@ -86,15 +87,21 @@ public class ProcessInstanceEventsTest extends PluggableActivitiTestCase {
assertEquals(processInstance.getId(), event.getProcessInstanceId());
assertNotEquals(processInstance.getId(), event.getExecutionId());
assertEquals(processInstance.getProcessDefinitionId(), event.getProcessDefinitionId());
event = (ActivitiEntityEvent) listener.getEventsReceived().get(4);
assertEquals(ActivitiEventType.PROCESS_STARTED, event.getType());
assertEquals(processInstance.getId(), event.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), event.getProcessDefinitionId());
assertTrue(event instanceof ActivitiProcessStartedEvent);
assertNull(((ActivitiProcessStartedEvent)event).getNestedProcessDefinitionId());
assertNull(((ActivitiProcessStartedEvent)event).getNestedProcessInstanceId());
assertEquals(ActivitiEventType.ENTITY_UPDATED, event.getType());
assertEquals(processInstance.getId(), event.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), event.getProcessDefinitionId());
assertTrue(event instanceof ActivitiEntityEventImpl);
event = (ActivitiEntityEvent) listener.getEventsReceived().get(5);
assertEquals(ActivitiEventType.PROCESS_STARTED, event.getType());
assertEquals(processInstance.getId(), event.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), event.getProcessDefinitionId());
assertTrue(event instanceof ActivitiProcessStartedEvent);
assertNull(((ActivitiProcessStartedEvent)event).getNestedProcessDefinitionId());
assertNull(((ActivitiProcessStartedEvent)event).getNestedProcessInstanceId());
listener.clearEventsReceived();
// Check update event when suspended/activated
......@@ -188,7 +195,7 @@ public class ProcessInstanceEventsTest extends PluggableActivitiTestCase {
String processDefinitionId = processInstance.getProcessDefinitionId();
// Check create-event one main process the second one Scope execution, and the third one subprocess
assertEquals(9, listener.getEventsReceived().size());
assertEquals(10, listener.getEventsReceived().size());
assertTrue(listener.getEventsReceived().get(0) instanceof ActivitiEntityEvent);
// process instance created event
......@@ -198,7 +205,7 @@ public class ProcessInstanceEventsTest extends PluggableActivitiTestCase {
assertEquals(processInstance.getId(), event.getProcessInstanceId());
assertEquals(processInstance.getId(), event.getExecutionId());
assertEquals(processDefinitionId, event.getProcessDefinitionId());
event = (ActivitiEntityEvent) listener.getEventsReceived().get(1);
String processExecutionId = event.getExecutionId();
assertEquals(ActivitiEventType.ENTITY_INITIALIZED, event.getType());
......@@ -219,9 +226,15 @@ public class ProcessInstanceEventsTest extends PluggableActivitiTestCase {
assertEquals(ActivitiEventType.ENTITY_INITIALIZED, event.getType());
assertEquals(processInstance.getId(), event.getProcessInstanceId());
assertNotEquals(processInstance.getId(), ((ExecutionEntity) event.getEntity()).getId());
// Process start
// Process Start Date
event = (ActivitiEntityEvent) listener.getEventsReceived().get(4);
assertEquals(ActivitiEventType.ENTITY_UPDATED, event.getType());
assertEquals(processInstance.getId(), event.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), event.getProcessDefinitionId());
// Process start
event = (ActivitiEntityEvent) listener.getEventsReceived().get(5);
assertEquals(ActivitiEventType.PROCESS_STARTED, event.getType());
assertEquals(processInstance.getId(), event.getProcessInstanceId());
assertEquals(processInstance.getProcessDefinitionId(), event.getProcessDefinitionId());
......@@ -230,14 +243,14 @@ public class ProcessInstanceEventsTest extends PluggableActivitiTestCase {
assertNull(((ActivitiProcessStartedEvent)event).getNestedProcessInstanceId());
// sub process instance created event
event = (ActivitiEntityEvent) listener.getEventsReceived().get(5);
event = (ActivitiEntityEvent) listener.getEventsReceived().get(6);
assertEquals(ActivitiEventType.ENTITY_CREATED, event.getType());
ExecutionEntity subProcessEntity = (ExecutionEntity) event.getEntity();
assertEquals(processExecutionId, subProcessEntity.getSuperExecutionId());
String subProcessInstanceId = subProcessEntity.getProcessInstanceId();
// sub process instance start created event
event = (ActivitiEntityEvent) listener.getEventsReceived().get(6);
event = (ActivitiEntityEvent) listener.getEventsReceived().get(7);
assertEquals(ActivitiEventType.ENTITY_CREATED, event.getType());
assertEquals(subProcessInstanceId, event.getProcessInstanceId());
assertNotEquals(subProcessInstanceId, event.getExecutionId());
......@@ -247,14 +260,14 @@ public class ProcessInstanceEventsTest extends PluggableActivitiTestCase {
assertEquals("simpleSubProcess", subProcessDefinition.getKey());
// sub process instance start initialized event
event = (ActivitiEntityEvent) listener.getEventsReceived().get(7);
event = (ActivitiEntityEvent) listener.getEventsReceived().get(8);
assertEquals(ActivitiEventType.ENTITY_INITIALIZED, event.getType());
assertEquals(subProcessInstanceId, event.getProcessInstanceId());
assertNotEquals(subProcessInstanceId, event.getExecutionId());
subProcessDefinitionId = ((ExecutionEntity) event.getEntity()).getProcessDefinitionId();
assertNotNull(subProcessDefinitionId);
event = (ActivitiEntityEvent) listener.getEventsReceived().get(8);
event = (ActivitiEntityEvent) listener.getEventsReceived().get(9);
assertEquals(ActivitiEventType.PROCESS_STARTED, event.getType());
assertEquals(subProcessInstanceId, event.getProcessInstanceId());
assertEquals(subProcessDefinitionId, event.getProcessDefinitionId());
......@@ -301,7 +314,7 @@ public class ProcessInstanceEventsTest extends PluggableActivitiTestCase {
/**
* Test +-->Task1 Start-<> +-->Task1
*
*
* process on PROCESS_COMPLETED event
*/
@Deployment(resources = { "org/activiti/engine/test/api/event/ProcessInstanceEventsTest.parallelGatewayNoEndProcess.bpmn20.xml" })
......@@ -366,7 +379,7 @@ public class ProcessInstanceEventsTest extends PluggableActivitiTestCase {
assertEquals("The process instance has to be the same as in deleteProcessInstance method call", subProcess.getId(), processCancelledEvent.getProcessInstanceId());
assertEquals("The execution instance has to be the same as in deleteProcessInstance method call", subProcess.getId(), processCancelledEvent.getExecutionId());
assertEquals("The cause has to be the same as in deleteProcessInstance method call", "delete_test", processCancelledEvent.getCause());
processCancelledEvent = (ActivitiCancelledEvent) processCancelledEvents.get(1);
assertTrue("The cause has to be the same as deleteProcessInstance method call", ActivitiCancelledEvent.class.isAssignableFrom(processCancelledEvent.getClass()));
assertEquals("The process instance has to be the same as in deleteProcessInstance method call", processInstance.getId(), processCancelledEvent.getProcessInstanceId());
......@@ -431,7 +444,7 @@ public class ProcessInstanceEventsTest extends PluggableActivitiTestCase {
assertThat("There should be exactly two ActivitiEventType.ACTIVITY_CANCELLED event after the task complete.", activityTerminatedEvents.size(), is(2));
for (ActivitiEvent event : activityTerminatedEvents) {
ActivitiActivityCancelledEventImpl activityEvent = (ActivitiActivityCancelledEventImpl) event;
if (activityEvent.getActivityId().equals("preNormalTerminateTask")) {
assertThat("The user task must be terminated", activityEvent.getActivityId(), is("preNormalTerminateTask"));
......@@ -440,9 +453,9 @@ public class ProcessInstanceEventsTest extends PluggableActivitiTestCase {
assertThat("The end event must be terminated", activityEvent.getActivityId(), is("EndEvent_2"));
assertThat("The cause must be terminate end event", activityEvent.getCause(), is("Terminated by end event: EndEvent_2"));
}
}
}
@Deployment(resources = { "org/activiti/engine/test/bpmn/event/end/TerminateEndEventTest.testTerminateInCallActivity.bpmn",
......@@ -479,30 +492,30 @@ public class ProcessInstanceEventsTest extends PluggableActivitiTestCase {
List<ActivitiEvent> activityTerminatedEvents = listener.filterEvents(ActivitiEventType.ACTIVITY_CANCELLED);
assertThat("3 activities must be cancelled.", activityTerminatedEvents.size(), is(3));
for (ActivitiEvent event : activityTerminatedEvents) {
ActivitiActivityCancelledEventImpl activityEvent = (ActivitiActivityCancelledEventImpl) event;
if (activityEvent.getActivityId().equals("theTask")) {
assertThat("The user task must be terminated in the called sub process.", activityEvent.getActivityId(), is("theTask"));
assertThat("The cause must be terminate end event", activityEvent.getCause(), is("Terminated by end event: EndEvent_3"));
} else if (activityEvent.getActivityId().equals("CallActivity_1")) {
assertThat("The call activity must be terminated", activityEvent.getActivityId(), is("CallActivity_1"));
assertThat("The cause must be terminate end event", activityEvent.getCause(), is("Terminated by end event: EndEvent_3"));
} else if (activityEvent.getActivityId().equals("EndEvent_3")) {
assertThat("The end event must be terminated", activityEvent.getActivityId(), is("EndEvent_3"));
assertThat("The cause must be terminate end event", activityEvent.getCause(), is("Terminated by end event: EndEvent_3"));
}
}
}
@Deployment(resources = {
......@@ -533,7 +546,7 @@ public class ProcessInstanceEventsTest extends PluggableActivitiTestCase {
taskService.complete(task.getId());
assertProcessEnded(pi.getId());
}
@Deployment(resources = {
"org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.testParallelCallActivity.bpmn20.xml",
"org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.externalSubProcess.bpmn20.xml"})
......@@ -543,9 +556,9 @@ public class ProcessInstanceEventsTest extends PluggableActivitiTestCase {
assertEquals(7, runtimeService.createProcessInstanceQuery().count());
assertEquals(12, taskService.createTaskQuery().count());
this.listener.clearEventsReceived();
runtimeService.deleteProcessInstance(processInstance.getId(), "testing instance deletion");
assertThat("Task cancelled event has to be fired.", this.listener.getEventsReceived().get(0).getType(), is(ActivitiEventType.ACTIVITY_CANCELLED));
assertThat("SubProcess cancelled event has to be fired.", this.listener.getEventsReceived().get(2).getType(), is(ActivitiEventType.PROCESS_CANCELLED));
assertEquals(0, runtimeService.createProcessInstanceQuery().count());
......
......@@ -198,7 +198,7 @@ public class ProcessRuntimeIT {
assertThat(RuntimeTestConfiguration.completedProcesses).doesNotContain(categorizeProcess.getId());
assertThat(categorizeProcess).isNotNull();
assertThat(categorizeProcess.getStatus()).isEqualTo(ProcessInstance.ProcessInstanceStatus.RUNNING);
assertThat(categorizeProcess.getStatus()).isEqualTo(ProcessInstance.ProcessInstanceStatus.CREATED);
}
@Test
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册