Skip to content
Open
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 @@ -44,6 +44,11 @@ protected CmmnElement convert(XMLStreamReader xtr, ConversionHelper conversionHe
caseTask.setInheritBusinessKey(Boolean.parseBoolean(inheritBusinessKey));
}

String inheritVariables = xtr.getAttributeValue(CmmnXmlConstants.FLOWABLE_EXTENSIONS_NAMESPACE, CmmnXmlConstants.ATTRIBUTE_INHERIT_VARIABLES);
if (inheritVariables != null) {
caseTask.setInheritVariables(Boolean.parseBoolean(inheritVariables));
}

String fallbackToDefaultTenantValue = xtr.getAttributeValue(CmmnXmlConstants.FLOWABLE_EXTENSIONS_NAMESPACE, CmmnXmlConstants.ATTRIBUTE_FALLBACK_TO_DEFAULT_TENANT);
if (fallbackToDefaultTenantValue != null) {
caseTask.setFallbackToDefaultTenant(Boolean.valueOf(fallbackToDefaultTenantValue));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ public interface CmmnXmlConstants {
String ATTRIBUTE_FALLBACK_TO_DEFAULT_TENANT = "fallbackToDefaultTenant";
String ATTRIBUTE_BUSINESS_KEY = "businessKey";
String ATTRIBUTE_INHERIT_BUSINESS_KEY = "inheritBusinessKey";
String ATTRIBUTE_INHERIT_VARIABLES = "inheritVariables";
String ATTRIBUTE_ID_VARIABLE_NAME = "idVariableName";

String ELEMENT_CASE_REF_EXPRESSION = "caseRefExpression";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ protected CmmnElement convert(XMLStreamReader xtr, ConversionHelper conversionHe
processTask.setInheritBusinessKey(Boolean.parseBoolean(inheritBusinessKey));
}

String inheritVariables = xtr.getAttributeValue(CmmnXmlConstants.FLOWABLE_EXTENSIONS_NAMESPACE, CmmnXmlConstants.ATTRIBUTE_INHERIT_VARIABLES);
if (inheritVariables != null) {
processTask.setInheritVariables(Boolean.parseBoolean(inheritVariables));
}

String fallbackToDefaultTenantValue = xtr.getAttributeValue(CmmnXmlConstants.FLOWABLE_EXTENSIONS_NAMESPACE, CmmnXmlConstants.ATTRIBUTE_FALLBACK_TO_DEFAULT_TENANT);
if (fallbackToDefaultTenantValue != null) {
processTask.setFallbackToDefaultTenant(Boolean.parseBoolean(fallbackToDefaultTenantValue));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ protected void writePlanItemDefinitionSpecificAttributes(T planItemDefinition, X
if (planItemDefinition.isInheritBusinessKey()) {
xtw.writeAttribute(FLOWABLE_EXTENSIONS_PREFIX, FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_INHERIT_BUSINESS_KEY, String.valueOf(planItemDefinition.isInheritBusinessKey()));
}
if (planItemDefinition.isInheritVariables()) {
xtw.writeAttribute(FLOWABLE_EXTENSIONS_PREFIX, FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_INHERIT_VARIABLES, String.valueOf(planItemDefinition.isInheritVariables()));
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ public void validateModel(CmmnModel cmmnModel) {
assertThat(task1.getCaseRefExpression()).isEqualTo("caseDefinitionKey");
assertThat(task1.getFallbackToDefaultTenant()).isTrue();
assertThat(task1.isSameDeployment()).isTrue();
assertThat(task1.isInheritVariables()).isTrue();

assertThat(task1.getInParameters())
.extracting(IOParameter::getSource, IOParameter::getTarget)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ public void validateModel(CmmnModel cmmnModel) {
.isInstanceOfSatisfying(ProcessTask.class, task1 -> {
assertThat(task1.getProcessRefExpression()).isEqualTo("myTestProcess");
assertThat((task1.isSameDeployment())).isTrue();
assertThat(task1.isInheritVariables()).isTrue();

assertThat(task1.getInParameters()).isEmpty();
assertThat(task1.getOutParameters()).isEmpty();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
</sentry>

<task id="theTask" name="The Task" isBlocking="true" />
<caseTask id="theCase" isBlocking="true" flowable:fallbackToDefaultTenant="true" flowable:sameDeployment="true">
<caseTask id="theCase" isBlocking="true" flowable:fallbackToDefaultTenant="true" flowable:sameDeployment="true" flowable:inheritVariables="true">
<extensionElements>
<flowable:in source="testSource" target="testTarget"></flowable:in>
</extensionElements>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
</humanTask>
<processTask id="oneprocesstask1" name="Process task" flowable:sameDeployment="true">
<processTask id="oneprocesstask1" name="Process task" flowable:sameDeployment="true" flowable:inheritVariables="true">
<processRefExpression><![CDATA[myTestProcess]]></processRefExpression>
</processTask>
</casePlanModel>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1015,6 +1015,33 @@ public void testIOParameterCombinations() {
.hasSize(4 + 4); // 4 from in mapping, 4 from task complete
}

@Test
@CmmnDeployment
@org.flowable.engine.test.Deployment(resources = "org/flowable/cmmn/test/oneTaskProcess.bpmn20.xml")
public void testProcessTaskInheritVariables() {
CaseInstance caseInstance = cmmnRuntimeService.createCaseInstanceBuilder()
.caseDefinitionKey("myCase")
.variable("caseVariableA", "hello")
.variable("caseVariableB", "world")
.variable("caseVariableC", 42)
.start();

PlanItemInstance processTaskPlanItemInstance = cmmnRuntimeService.createPlanItemInstanceQuery()
.caseInstanceId(caseInstance.getId())
.planItemDefinitionType(PlanItemDefinitionType.PROCESS_TASK)
.singleResult();
String processInstanceId = processTaskPlanItemInstance.getReferenceId();
ProcessInstance processInstance = processEngineRuntimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
assertThat(processInstance).isNotNull();

// All case variables are inherited into the child process instance (like a BPMN call activity)
assertThat(processEngineRuntimeService.getVariable(processInstanceId, "caseVariableA")).isEqualTo("hello");
assertThat(processEngineRuntimeService.getVariable(processInstanceId, "caseVariableC")).isEqualTo(42);

// An explicit in parameter takes precedence over the inherited variable
assertThat(processEngineRuntimeService.getVariable(processInstanceId, "caseVariableB")).isEqualTo("overridden");
}

@Test
@CmmnDeployment
public void testProcessTaskWithSkipExpressions() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/CMMN/20151109/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:flowable="http://flowable.org/cmmn"
targetNamespace="http://flowable.org/cmmn">

<case id="myCase">
<casePlanModel id="myPlanModel" name="My CasePlanModel">
<planItem id="planItem1" name="The Process" definitionRef="theProcess" />
<processTask id="theProcess" isBlocking="true" flowable:inheritVariables="true">
<extensionElements>
<flowable:in sourceExpression="${'overridden'}" target="caseVariableB" />
</extensionElements>
<processRefExpression><![CDATA[oneTask]]></processRefExpression>
</processTask>
</casePlanModel>
</case>

</definitions>
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ public class CaseTaskActivityBehavior extends ChildTaskActivityBehavior implemen
protected CaseTask caseTask;

public CaseTaskActivityBehavior(Expression caseRefExpression, CaseTask caseTask) {
super(caseTask.isBlocking(), caseTask.getBlockingExpression(), caseTask.getInParameters(), caseTask.getOutParameters());
super(caseTask.isBlocking(), caseTask.getBlockingExpression(), caseTask.getInParameters(), caseTask.getOutParameters(),
caseTask.isInheritVariables());
this.caseRefExpression = caseRefExpression;
this.caseRef = caseTask.getCaseRef();
this.fallbackToDefaultTenant = caseTask.getFallbackToDefaultTenant();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,23 @@ public abstract class ChildTaskActivityBehavior extends CoreCmmnTriggerableActiv
protected String isBlockingExpression;
protected List<IOParameter> inParameters;
protected List<IOParameter> outParameters;
protected boolean inheritVariables;

public ChildTaskActivityBehavior(boolean isBlocking, String isBlockingExpression) {
this.isBlocking = isBlocking;
this.isBlockingExpression = isBlockingExpression;
}

public ChildTaskActivityBehavior(boolean isBlocking, String isBlockingExpression, List<IOParameter> inParameters, List<IOParameter> outParameters) {
this(isBlocking, isBlockingExpression, inParameters, outParameters, false);
}

public ChildTaskActivityBehavior(boolean isBlocking, String isBlockingExpression, List<IOParameter> inParameters, List<IOParameter> outParameters,
boolean inheritVariables) {
this(isBlocking, isBlockingExpression);
this.inParameters = inParameters;
this.outParameters = outParameters;
this.inheritVariables = inheritVariables;
}

@Override
Expand Down Expand Up @@ -83,6 +90,12 @@ protected void handleInParameters(PlanItemInstanceEntity planItemInstanceEntity,
CmmnEngineConfiguration cmmnEngineConfiguration, Map<String, Object> inParametersMap,
ExpressionManager expressionManager) {

if (inheritVariables) {
// Inherit all variables from the parent. Explicit in parameters are
// applied afterwards, so they take precedence over the inherited variables.
inParametersMap.putAll(planItemInstanceEntity.getVariables());
}

IOParameterUtil.processInParameters(inParameters, planItemInstanceEntity, inParametersMap, expressionManager);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ public class ProcessTaskActivityBehavior extends ChildTaskActivityBehavior imple
protected ProcessTask processTask;

public ProcessTaskActivityBehavior(Process process, Expression processRefExpression, ProcessTask processTask) {
super(processTask.isBlocking(), processTask.getBlockingExpression(), processTask.getInParameters(), processTask.getOutParameters());
super(processTask.isBlocking(), processTask.getBlockingExpression(), processTask.getInParameters(), processTask.getOutParameters(),
processTask.isInheritVariables());
this.process = process;
this.processRefExpression = processRefExpression;
this.processRef = processTask.getProcessRef();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1236,6 +1236,32 @@ public void testWithInheritBusinessKeyButWithoutBusinessKey() {
cmmnRuntimeService.triggerPlanItemInstance(planItemInstance.getId());
}

@Test
@CmmnDeployment(resources = {
"org/flowable/cmmn/test/runtime/CaseTaskTest.testCaseTaskInheritVariables.cmmn",
"org/flowable/cmmn/test/runtime/oneTaskCase.cmmn"
})
public void testCaseTaskInheritVariables() {
CaseInstance caseInstance = cmmnRuntimeService.createCaseInstanceBuilder()
.caseDefinitionKey("myCase")
.variable("caseVariableA", "hello")
.variable("caseVariableB", "world")
.variable("caseVariableC", 42)
.start();

CaseInstance subCase = cmmnRuntimeService.createCaseInstanceQuery()
.caseDefinitionKey("oneTaskCase")
.singleResult();
assertThat(subCase).isNotNull();

// All parent case variables are inherited into the child case instance (like a BPMN call activity)
assertThat(cmmnRuntimeService.getVariable(subCase.getId(), "caseVariableA")).isEqualTo("hello");
assertThat(cmmnRuntimeService.getVariable(subCase.getId(), "caseVariableC")).isEqualTo(42);

// An explicit in parameter takes precedence over the inherited variable
assertThat(cmmnRuntimeService.getVariable(subCase.getId(), "caseVariableB")).isEqualTo("overridden");
}

@Test
@CmmnDeployment
public void testIdVariableName() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/CMMN/20151109/MODEL"
xmlns:flowable="http://flowable.org/cmmn"
targetNamespace="http://flowable.org/cmmn">

<case id="myCase">
<casePlanModel id="myPlanModel" name="My CasePlanModel">
<planItem id="planItem1" name="The Case" definitionRef="theCase"/>
<caseTask id="theCase" caseRef="oneTaskCase" isBlocking="true" flowable:inheritVariables="true">
<extensionElements>
<flowable:in sourceExpression="${'overridden'}" target="caseVariableB"/>
</extensionElements>
</caseTask>
</casePlanModel>
</case>
</definitions>
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public class ChildTask extends Task implements HasInParameters, HasOutParameters

protected String businessKey;
protected boolean inheritBusinessKey;
protected boolean inheritVariables;
protected List<IOParameter> inParameters = new ArrayList<>();
protected List<IOParameter> outParameters = new ArrayList<>();

Expand All @@ -41,6 +42,14 @@ public void setInheritBusinessKey(boolean inheritBusinessKey) {
this.inheritBusinessKey = inheritBusinessKey;
}

public boolean isInheritVariables() {
return inheritVariables;
}

public void setInheritVariables(boolean inheritVariables) {
this.inheritVariables = inheritVariables;
}

@Override
public List<IOParameter> getInParameters() {
return inParameters;
Expand Down