Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@
import org.flowable.cmmn.engine.impl.scripting.CmmnEngineScriptTraceEnhancer;
import org.flowable.cmmn.engine.impl.scripting.CmmnVariableScopeResolverFactory;
import org.flowable.cmmn.engine.impl.task.DefaultCmmnTaskVariableScopeResolver;
import org.flowable.cmmn.engine.impl.util.CmmnEventInstanceOutParameterHandler;
import org.flowable.cmmn.engine.impl.variable.CmmnAggregatedVariableType;
import org.flowable.cmmn.engine.interceptor.CmmnIdentityLinkInterceptor;
import org.flowable.cmmn.engine.interceptor.CreateCasePageTaskInterceptor;
Expand Down Expand Up @@ -680,6 +681,8 @@ public class CmmnEngineConfiguration extends AbstractBuildableEngineConfiguratio

protected boolean alwaysUseArraysForDmnMultiHitPolicies = true;

protected CmmnEventInstanceOutParameterHandler cmmnEventInstanceOutParameterHandler;

// Localization support
protected CaseDefinitionLocalizationManager caseDefinitionLocalizationManager;
protected CaseLocalizationManager caseLocalizationManager;
Expand Down Expand Up @@ -809,6 +812,13 @@ protected void init() {
afterInitEventRegistryEventBusConsumer();

initHistoryCleaningManager();
initEventInstanceOutParameterHandler();
}

public void initEventInstanceOutParameterHandler() {
if (cmmnEventInstanceOutParameterHandler == null) {
cmmnEventInstanceOutParameterHandler = new CmmnEventInstanceOutParameterHandler();
}
}

public void initCaseDiagramGenerator() {
Expand Down Expand Up @@ -4473,4 +4483,12 @@ public CmmnEngineConfiguration setPlanItemLocalizationManager(PlanItemLocalizati
this.planItemLocalizationManager = planItemLocalizationManager;
return this;
}

public CmmnEventInstanceOutParameterHandler getCmmnEventInstanceOutParameterHandler() {
return cmmnEventInstanceOutParameterHandler;
}

public void setCmmnEventInstanceOutParameterHandler(CmmnEventInstanceOutParameterHandler cmmnEventInstanceOutParameterHandler) {
this.cmmnEventInstanceOutParameterHandler = cmmnEventInstanceOutParameterHandler;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
import org.flowable.cmmn.engine.impl.behavior.CoreCmmnTriggerableActivityBehavior;
import org.flowable.cmmn.engine.impl.behavior.PlanItemActivityBehavior;
import org.flowable.cmmn.engine.impl.persistence.entity.PlanItemInstanceEntity;
import org.flowable.cmmn.engine.impl.util.CmmnEventInstanceOutParameterHandler;
import org.flowable.cmmn.engine.impl.util.CommandContextUtil;
import org.flowable.cmmn.engine.impl.util.EventInstanceCmmnUtil;
import org.flowable.cmmn.engine.impl.util.ExpressionUtil;
import org.flowable.cmmn.engine.impl.util.PlanItemInstanceUtil;
import org.flowable.cmmn.model.ExtensionElement;
Expand Down Expand Up @@ -81,7 +81,7 @@ protected String resolveEventDefinitionKey(PlanItemInstanceEntity planItemInstan
public void trigger(CommandContext commandContext, PlanItemInstanceEntity planItemInstanceEntity) {
EventInstance eventInstance = (EventInstance) planItemInstanceEntity.getTransientVariable(EventConstants.EVENT_INSTANCE);
if (eventInstance != null) {
handleEventInstance(planItemInstanceEntity, eventInstance);
handleEventInstance(planItemInstanceEntity, eventInstance, commandContext);
}

RepetitionRule repetitionRule = ExpressionUtil.getRepetitionRule(planItemInstanceEntity);
Expand Down Expand Up @@ -110,10 +110,12 @@ public void trigger(CommandContext commandContext, PlanItemInstanceEntity planIt
}
}

protected void handleEventInstance(PlanItemInstanceEntity planItemInstanceEntity, EventInstance eventInstance) {
protected void handleEventInstance(PlanItemInstanceEntity planItemInstanceEntity, EventInstance eventInstance, CommandContext commandContext) {
PlanItemDefinition planItemDefinition = planItemInstanceEntity.getPlanItemDefinition();
if (planItemDefinition != null) {
EventInstanceCmmnUtil.handleEventInstanceOutParameters(planItemInstanceEntity, planItemDefinition, eventInstance);
CmmnEngineConfiguration cmmnEngineConfiguration = CommandContextUtil.getCmmnEngineConfiguration(commandContext);
CmmnEventInstanceOutParameterHandler outParameterHandler = cmmnEngineConfiguration.getCmmnEventInstanceOutParameterHandler();
outParameterHandler.handleOutParameters(planItemInstanceEntity, planItemDefinition, eventInstance);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,10 @@
import org.flowable.cmmn.engine.impl.persistence.entity.PlanItemInstanceEntityManager;
import org.flowable.cmmn.engine.impl.repository.CaseDefinitionUtil;
import org.flowable.cmmn.engine.impl.task.TaskHelper;
import org.flowable.cmmn.engine.impl.util.CmmnEventInstanceOutParameterHandler;
import org.flowable.cmmn.engine.impl.util.CmmnLoggingSessionUtil;
import org.flowable.cmmn.engine.impl.util.CommandContextUtil;
import org.flowable.cmmn.engine.impl.util.EntityLinkUtil;
import org.flowable.cmmn.engine.impl.util.EventInstanceCmmnUtil;
import org.flowable.cmmn.engine.impl.util.IdentityLinkUtil;
import org.flowable.cmmn.engine.impl.util.JobUtil;
import org.flowable.cmmn.engine.interceptor.StartCaseInstanceAfterContext;
Expand Down Expand Up @@ -368,7 +368,8 @@ protected void applyCaseInstanceBuilder(CmmnEngineConfiguration cmmnEngineConfig

Object eventInstance = caseInstanceEntity.getTransientVariable(EventConstants.EVENT_INSTANCE);
if (eventInstance instanceof EventInstance) {
EventInstanceCmmnUtil.handleEventInstanceOutParameters(caseInstanceEntity, caseModel, (EventInstance) eventInstance);
CmmnEventInstanceOutParameterHandler outParameterHandler = cmmnEngineConfiguration.getCmmnEventInstanceOutParameterHandler();
outParameterHandler.handleOutParameters(caseInstanceEntity, caseModel, (EventInstance) eventInstance);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package org.flowable.cmmn.engine.impl.util;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

import org.apache.commons.lang3.StringUtils;
import org.flowable.cmmn.converter.CmmnXmlConstants;
import org.flowable.cmmn.model.BaseElement;
import org.flowable.cmmn.model.ExtensionElement;
import org.flowable.eventregistry.api.runtime.EventInstance;
import org.flowable.eventregistry.api.runtime.EventPayloadInstance;
import org.flowable.variable.api.delegate.VariableScope;

public class CmmnEventInstanceOutParameterHandler {

/**
* Processes the 'out parameters' of an {@link EventInstance} and stores the corresponding variables on the {@link VariableScope}.
* Typically used when mapping incoming event payload into a runtime instance.
*/
public void handleOutParameters(VariableScope variableScope, BaseElement baseElement, EventInstance eventInstance) {
List<ExtensionElement> outParameters = baseElement.getExtensionElements()
.getOrDefault(CmmnXmlConstants.ELEMENT_EVENT_OUT_PARAMETER, Collections.emptyList());
if (!outParameters.isEmpty()) {
Map<String, EventPayloadInstance> payloadInstances = eventInstance.getPayloadInstances()
.stream()
.collect(Collectors.toMap(EventPayloadInstance::getDefinitionName, Function.identity()));

for (ExtensionElement outParameter : outParameters) {
String payloadSourceName = outParameter.getAttributeValue(null, CmmnXmlConstants.ATTRIBUTE_IOPARAMETER_SOURCE);
EventPayloadInstance payloadInstance = payloadInstances.get(payloadSourceName);
String variableName = outParameter.getAttributeValue(null, CmmnXmlConstants.ATTRIBUTE_IOPARAMETER_TARGET);
if (StringUtils.isNotEmpty(variableName)) {
boolean isTransient = Boolean.parseBoolean(outParameter.getAttributeValue(null, "transient"));
Object value = payloadInstance != null ? payloadInstance.getValue() : null;
if (isTransient) {
variableScope.setTransientVariable(variableName, value);
} else {
variableScope.setVariable(variableName, value);
}
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,7 @@
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

import org.apache.commons.lang3.StringUtils;
import org.flowable.cmmn.converter.CmmnXmlConstants;
import org.flowable.cmmn.model.BaseElement;
import org.flowable.cmmn.model.ExtensionElement;
Expand All @@ -38,36 +34,6 @@
*/
public class EventInstanceCmmnUtil {

/**
* Processes the 'out parameters' of an {@link EventInstance} and stores the corresponding variables on the {@link VariableScope}.
*
* Typically used when mapping incoming event payload into a runtime instance.
*/
public static void handleEventInstanceOutParameters(VariableScope variableScope, BaseElement baseElement, EventInstance eventInstance) {
List<ExtensionElement> outParameters = baseElement.getExtensionElements()
.getOrDefault(CmmnXmlConstants.ELEMENT_EVENT_OUT_PARAMETER, Collections.emptyList());
if (!outParameters.isEmpty()) {
Map<String, EventPayloadInstance> payloadInstances = eventInstance.getPayloadInstances()
.stream()
.collect(Collectors.toMap(EventPayloadInstance::getDefinitionName, Function.identity()));

for (ExtensionElement outParameter : outParameters) {
String payloadSourceName = outParameter.getAttributeValue(null, CmmnXmlConstants.ATTRIBUTE_IOPARAMETER_SOURCE);
EventPayloadInstance payloadInstance = payloadInstances.get(payloadSourceName);
String variableName = outParameter.getAttributeValue(null, CmmnXmlConstants.ATTRIBUTE_IOPARAMETER_TARGET);
if (StringUtils.isNotEmpty(variableName)) {
Boolean isTransient = Boolean.valueOf(outParameter.getAttributeValue(null, "transient"));
Object value = payloadInstance != null ? payloadInstance.getValue() : null;
if (Boolean.TRUE.equals(isTransient)) {
variableScope.setTransientVariable(variableName, value);
} else {
variableScope.setVariable(variableName, value);
}
}
}
}
}

/**
* Reads the 'in parameters' and converts them to {@link EventPayloadInstance} instances.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
import org.flowable.engine.impl.util.BpmnEventInstanceOutParameterHandler;
import org.flowable.engine.impl.util.CommandContextUtil;
import org.flowable.engine.impl.util.CorrelationUtil;
import org.flowable.engine.impl.util.CountingEntityUtil;
import org.flowable.engine.impl.util.EventInstanceBpmnUtil;
import org.flowable.eventregistry.api.runtime.EventInstance;
import org.flowable.eventregistry.impl.constant.EventConstants;
import org.flowable.eventsubscription.service.EventSubscriptionService;
Expand Down Expand Up @@ -76,14 +76,15 @@ public void execute(DelegateExecution execution) {
public void trigger(DelegateExecution execution, String triggerName, Object triggerData) {
ExecutionEntity executionEntity = (ExecutionEntity) execution;
BoundaryEvent boundaryEvent = (BoundaryEvent) execution.getCurrentFlowElement();

ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration();

Object eventInstance = execution.getTransientVariables().get(EventConstants.EVENT_INSTANCE);
if (eventInstance instanceof EventInstance) {
EventInstanceBpmnUtil.handleEventInstanceOutParameters(execution, boundaryEvent, (EventInstance) eventInstance);
BpmnEventInstanceOutParameterHandler outParameterHandler = processEngineConfiguration.getBpmnEventInstanceOutParameterHandler();
outParameterHandler.handleOutParameters(execution, boundaryEvent, (EventInstance) eventInstance);
}

if (boundaryEvent.isCancelActivity()) {
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration();
EventSubscriptionService eventSubscriptionService = processEngineConfiguration.getEventSubscriptionServiceConfiguration().getEventSubscriptionService();
List<EventSubscriptionEntity> eventSubscriptions = executionEntity.getEventSubscriptions();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
import org.flowable.engine.impl.persistence.entity.ExecutionEntityManager;
import org.flowable.engine.impl.util.BpmnEventInstanceOutParameterHandler;
import org.flowable.engine.impl.util.CommandContextUtil;
import org.flowable.engine.impl.util.CountingEntityUtil;
import org.flowable.engine.impl.util.EventInstanceBpmnUtil;
import org.flowable.eventregistry.api.runtime.EventInstance;
import org.flowable.eventregistry.impl.constant.EventConstants;
import org.flowable.eventsubscription.service.EventSubscriptionService;
Expand Down Expand Up @@ -80,7 +80,8 @@ public void trigger(DelegateExecution execution, String triggerName, Object trig

Object eventInstance = execution.getTransientVariable(EventConstants.EVENT_INSTANCE);
if (eventInstance instanceof EventInstance) {
EventInstanceBpmnUtil.handleEventInstanceOutParameters(execution, startEvent, (EventInstance) eventInstance);
BpmnEventInstanceOutParameterHandler outParameterHandler = processEngineConfiguration.getBpmnEventInstanceOutParameterHandler();
outParameterHandler.handleOutParameters(execution, startEvent, (EventInstance) eventInstance);
}

if (startEvent.isInterrupting()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@
import org.flowable.engine.history.DeleteReason;
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
import org.flowable.engine.impl.util.BpmnEventInstanceOutParameterHandler;
import org.flowable.engine.impl.util.CommandContextUtil;
import org.flowable.engine.impl.util.CorrelationUtil;
import org.flowable.engine.impl.util.CountingEntityUtil;
import org.flowable.engine.impl.util.EventInstanceBpmnUtil;
import org.flowable.eventregistry.api.runtime.EventInstance;
import org.flowable.eventregistry.impl.constant.EventConstants;
import org.flowable.eventsubscription.service.EventSubscriptionService;
Expand Down Expand Up @@ -103,14 +103,15 @@ public void eventCancelledByEventGateway(DelegateExecution execution) {

protected ExecutionEntity deleteEventSubscription(DelegateExecution execution) {
ExecutionEntity executionEntity = (ExecutionEntity) execution;
CommandContext commandContext = Context.getCommandContext();
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);

Object eventInstance = execution.getTransientVariables().get(EventConstants.EVENT_INSTANCE);
if (eventInstance instanceof EventInstance) {
EventInstanceBpmnUtil.handleEventInstanceOutParameters(execution, execution.getCurrentFlowElement(), (EventInstance) eventInstance);
BpmnEventInstanceOutParameterHandler outParameterHandler = processEngineConfiguration.getBpmnEventInstanceOutParameterHandler();
outParameterHandler.handleOutParameters(execution, execution.getCurrentFlowElement(), (EventInstance) eventInstance);
}

CommandContext commandContext = Context.getCommandContext();
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);
EventSubscriptionService eventSubscriptionService = processEngineConfiguration.getEventSubscriptionServiceConfiguration().getEventSubscriptionService();
List<EventSubscriptionEntity> eventSubscriptions = executionEntity.getEventSubscriptions();

Expand All @@ -123,6 +124,4 @@ protected ExecutionEntity deleteEventSubscription(DelegateExecution execution) {
}
return executionEntity;
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@
import org.flowable.engine.impl.bpmn.helper.SkipExpressionUtil;
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
import org.flowable.engine.impl.util.BpmnEventInstanceOutParameterHandler;
import org.flowable.engine.impl.util.CommandContextUtil;
import org.flowable.engine.impl.util.CorrelationUtil;
import org.flowable.engine.impl.util.CountingEntityUtil;
import org.flowable.engine.impl.util.EventInstanceBpmnUtil;
import org.flowable.eventregistry.api.runtime.EventInstance;
import org.flowable.eventregistry.impl.constant.EventConstants;
import org.flowable.eventsubscription.service.EventSubscriptionService;
Expand Down Expand Up @@ -84,13 +84,13 @@ public void execute(DelegateExecution execution) {
@Override
public void trigger(DelegateExecution execution, String signalName, Object signalData) {
ExecutionEntity executionEntity = (ExecutionEntity) execution;
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration();

Object eventInstance = execution.getTransientVariables().get(EventConstants.EVENT_INSTANCE);
if (eventInstance instanceof EventInstance) {
EventInstanceBpmnUtil.handleEventInstanceOutParameters(execution, execution.getCurrentFlowElement(), (EventInstance) eventInstance);
BpmnEventInstanceOutParameterHandler outParameterHandler = processEngineConfiguration.getBpmnEventInstanceOutParameterHandler();
outParameterHandler.handleOutParameters(execution, execution.getCurrentFlowElement(), (EventInstance) eventInstance);
}

ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration();
EventSubscriptionService eventSubscriptionService = processEngineConfiguration.getEventSubscriptionServiceConfiguration().getEventSubscriptionService();
List<EventSubscriptionEntity> eventSubscriptions = executionEntity.getEventSubscriptions();

Expand Down
Loading