Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/main' into flowable-release-7.2.0
Browse files Browse the repository at this point in the history
  • Loading branch information
jbarrez committed Sep 11, 2024
2 parents 49b47e4 + 1432f17 commit 00917c2
Show file tree
Hide file tree
Showing 17 changed files with 1,364 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
import static org.flowable.cmmn.converter.CmmnXmlConstants.ATTRIBUTE_ELEMENT_NAME;

import org.flowable.cmmn.model.CmmnModel;
import org.flowable.cmmn.model.ExtensionElement;
import org.flowable.cmmn.model.PlanItemDefinition;
import org.flowable.test.cmmn.converter.util.CmmnXmlConverterTest;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,4 +84,34 @@ public void validateModel(CmmnModel cmmnModel) {
});
}


@CmmnXmlConverterTest("org/flowable/test/cmmn/converter/script-task-expression-field.cmmn")
public void scriptTaskWithExpressionField(CmmnModel cmmnModel) {
assertThat(cmmnModel).isNotNull();

PlanItem planItemTaskA = cmmnModel.findPlanItem("planItemTaskA");
assertThat(planItemTaskA.getEntryCriteria()).isEmpty();

PlanItemDefinition planItemDefinition = planItemTaskA.getPlanItemDefinition();
assertThat(planItemDefinition)
.isInstanceOfSatisfying(ScriptServiceTask.class, scriptTask -> {
assertThat(scriptTask.getType()).isEqualTo(ScriptServiceTask.SCRIPT_TASK);
assertThat(scriptTask.getScriptFormat()).isEqualTo("javascript");
assertThat(scriptTask.getScript()).isEqualTo("var a = '${testA}';");
assertThat(scriptTask.getResultVariableName()).isEqualTo("scriptResult");
assertThat(scriptTask.isAutoStoreVariables()).isFalse();
assertThat(scriptTask.isBlocking()).isTrue();
assertThat(scriptTask.isAsync()).isFalse();
});

PlanItem planItemTaskB = cmmnModel.findPlanItem("planItemTaskB");
planItemDefinition = planItemTaskB.getPlanItemDefinition();
assertThat(planItemDefinition)
.isInstanceOfSatisfying(ScriptServiceTask.class, scriptServiceTask -> {
assertThat(scriptServiceTask.getScriptFormat()).isEqualTo("groovy");
assertThat(scriptServiceTask.getScript()).isEqualTo("var b = '${testB}';");
assertThat(scriptServiceTask.isAutoStoreVariables()).isTrue();
});
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/CMMN/20151109/MODEL"
xmlns:dc="http://www.omg.org/spec/CMMN/20151109/DC"
xmlns:di="http://www.omg.org/spec/CMMN/20151109/DI"
xmlns:cmmndi="http://www.omg.org/spec/CMMN/20151109/CMMNDI"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.omg.org/spec/CMMN/20151109/MODEL https://www.omg.org/spec/CMMN/20151109/CMMN11.xsd
http://www.omg.org/spec/CMMN/20151109/DC https://www.omg.org/spec/CMMN/20151109/DC.xsd
http://www.omg.org/spec/CMMN/20151109/DI https://www.omg.org/spec/CMMN/20151109/DI.xsd
http://www.omg.org/spec/CMMN/20151109/CMMNDI https://www.omg.org/spec/CMMN/20151109/CMMNDI11.xsd"
xmlns:flowable="http://flowable.org/cmmn"
targetNamespace="http://flowable.org/cmmn">

<case id="scriptCase" flowable:initiatorVariableName="test">
<casePlanModel id="myScriptPlanModel" name="My Script CasePlanModel">

<planItem id="planItemTaskA" definitionRef="taskA" />
<planItem id="planItemTaskB" definitionRef="taskB" />
<task id="taskA" name="A" flowable:type="script" flowable:scriptFormat="javascript" flowable:resultVariableName="scriptResult" flowable:autoStoreVariables="false">
<extensionElements>
<flowable:field name="script">
<expression><![CDATA[var a = '${testA}';]]></expression>
</flowable:field>
</extensionElements>
</task>

<task id="taskB" name="B" flowable:type="script" flowable:scriptFormat="groovy" flowable:autoStoreVariables="true">
<extensionElements>
<flowable:field name="script">
<expression><![CDATA[var b = '${testB}';]]></expression>
</flowable:field>
</extensionElements>
</task>

</casePlanModel>
</case>

</definitions>
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,8 @@ protected void doMovePlanItemState(CaseInstanceChangeState caseInstanceChangeSta

executeTerminatePlanItemInstances(caseInstanceChangeState, caseInstance, commandContext);

executeTerminateNonExistingPlanItemInstancesInTargetCmmnModel(caseInstanceChangeState, commandContext);

setCaseDefinitionIdForPlanItemInstances(currentPlanItemInstances, caseInstanceChangeState.getCaseDefinitionToMigrateTo());

executeChangePlanItemIds(caseInstanceChangeState, originalCaseDefinitionId, commandContext);
Expand Down Expand Up @@ -835,6 +837,35 @@ protected void executeTerminatePlanItemInstances(CaseInstanceChangeState caseIns
}
}

protected void executeTerminateNonExistingPlanItemInstancesInTargetCmmnModel(CaseInstanceChangeState caseInstanceChangeState, CommandContext commandContext) {
if (caseInstanceChangeState.getCaseDefinitionToMigrateTo() != null) {
CmmnModel targetCmmnModel = CaseDefinitionUtil.getCmmnModel(caseInstanceChangeState.getCaseDefinitionToMigrateTo().getId());
List<String> excludePlanItemDefinitionIds = new ArrayList<>();
for (TerminatePlanItemDefinitionMapping planItemDefinitionMapping : caseInstanceChangeState.getTerminatePlanItemDefinitions()) {
excludePlanItemDefinitionIds.add(planItemDefinitionMapping.getPlanItemDefinitionId());
}

for (ChangePlanItemDefinitionWithNewTargetIdsMapping newTargetIdsMapping : caseInstanceChangeState.getChangePlanItemDefinitionWithNewTargetIds()) {
excludePlanItemDefinitionIds.add(newTargetIdsMapping.getExistingPlanItemDefinitionId());
}

for (ChangePlanItemIdWithDefinitionIdMapping definitionIdMapping : caseInstanceChangeState.getChangePlanItemIdsWithDefinitionId()) {
excludePlanItemDefinitionIds.add(definitionIdMapping.getExistingPlanItemDefinitionId());
}

for (String currentPlanItemDefinitionId : caseInstanceChangeState.getCurrentPlanItemInstances().keySet()) {
if (!excludePlanItemDefinitionIds.contains(currentPlanItemDefinitionId) && targetCmmnModel.findPlanItemDefinition(currentPlanItemDefinitionId) == null) {
for (PlanItemInstanceEntity currentPlanItemInstance : caseInstanceChangeState.getCurrentPlanItemInstances().get(currentPlanItemDefinitionId)) {
if (!PlanItemInstanceState.TERMINAL_STATES.contains(currentPlanItemInstance.getState())) {
terminatePlanItemInstance(currentPlanItemInstance, commandContext);
caseInstanceChangeState.addTerminatedPlanItemInstance(currentPlanItemInstance.getPlanItemDefinitionId(), currentPlanItemInstance);
}
}
}
}
}
}

protected abstract boolean isDirectPlanItemDefinitionMigration(PlanItemDefinition currentPlanItemDefinition, PlanItemDefinition newPlanItemDefinition);

protected Map<String, List<PlanItemInstanceEntity>> retrievePlanItemInstances(String caseInstanceId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -439,6 +439,130 @@ void withSimpleOneTaskCaseChangingOnlyTaskProperties() {
}
}
}

@Test
void withAutomatedMigrationFromTwoTasksToOneTask() {
// Arrange
deployCaseDefinition("test1", "org/flowable/cmmn/test/migration/two-task.cmmn.xml");
CaseInstance caseInstance = cmmnRuntimeService.createCaseInstanceBuilder().caseDefinitionKey("testCase").start();
CaseDefinition destinationDefinition = deployCaseDefinition("test1", "org/flowable/cmmn/test/migration/one-task.cmmn.xml");

// Act
cmmnMigrationService.createCaseInstanceMigrationBuilder()
.migrateToCaseDefinition(destinationDefinition.getId())
.migrate(caseInstance.getId());

// Assert
CaseInstance caseInstanceAfterMigration = cmmnRuntimeService.createCaseInstanceQuery()
.caseInstanceId(caseInstance.getId())
.singleResult();
assertThat(caseInstanceAfterMigration.getCaseDefinitionId()).isEqualTo(destinationDefinition.getId());
assertThat(caseInstanceAfterMigration.getCaseDefinitionVersion()).isEqualTo(2);
assertThat(caseInstanceAfterMigration.getCaseDefinitionDeploymentId()).isEqualTo(destinationDefinition.getDeploymentId());
List<PlanItemInstance> planItemInstances = cmmnRuntimeService.createPlanItemInstanceQuery()
.caseInstanceId(caseInstance.getId())
.list();
assertThat(planItemInstances).hasSize(1);
assertThat(planItemInstances)
.extracting(PlanItemInstance::getCaseDefinitionId)
.containsOnly(destinationDefinition.getId());
assertThat(planItemInstances)
.extracting(PlanItemInstance::getName)
.containsExactlyInAnyOrder("Task 1");
assertThat(planItemInstances)
.extracting(PlanItemInstance::getState)
.containsOnly(PlanItemInstanceState.ACTIVE);

List<Task> tasks = cmmnTaskService.createTaskQuery().caseInstanceId(caseInstance.getId()).list();
assertThat(tasks).hasSize(1);
assertThat(tasks.get(0).getScopeDefinitionId()).isEqualTo(destinationDefinition.getId());
cmmnTaskService.complete(tasks.get(0).getId());

assertThat(cmmnRuntimeService.createCaseInstanceQuery().caseInstanceId(caseInstance.getId()).count()).isZero();

if (CmmnHistoryTestHelper.isHistoryLevelAtLeast(HistoryLevel.ACTIVITY, cmmnEngineConfiguration)) {
assertThat(cmmnHistoryService.createHistoricCaseInstanceQuery().caseInstanceId(caseInstance.getId()).count()).isEqualTo(1);
assertThat(cmmnHistoryService.createHistoricCaseInstanceQuery().caseInstanceId(caseInstance.getId()).singleResult().getCaseDefinitionId())
.isEqualTo(destinationDefinition.getId());

List<HistoricPlanItemInstance> historicPlanItemInstances = cmmnHistoryService.createHistoricPlanItemInstanceQuery()
.planItemInstanceCaseInstanceId(caseInstance.getId()).list();
assertThat(historicPlanItemInstances).hasSize(2);
for (HistoricPlanItemInstance historicPlanItemInstance : historicPlanItemInstances) {
assertThat(historicPlanItemInstance.getCaseDefinitionId()).isEqualTo(destinationDefinition.getId());
}

List<HistoricTaskInstance> historicTasks = cmmnHistoryService.createHistoricTaskInstanceQuery().caseInstanceId(caseInstance.getId()).list();
assertThat(historicTasks).hasSize(2);
for (HistoricTaskInstance historicTask : historicTasks) {
assertThat(historicTask.getScopeDefinitionId()).isEqualTo(destinationDefinition.getId());
}
}
}

@Test
void withActivateTaskFromTwoTasksToOneTask() {
// Arrange
deployCaseDefinition("test1", "org/flowable/cmmn/test/migration/two-task.cmmn.xml");
CaseInstance caseInstance = cmmnRuntimeService.createCaseInstanceBuilder().caseDefinitionKey("testCase").start();
CaseDefinition destinationDefinition = deployCaseDefinition("test1", "org/flowable/cmmn/test/migration/one-task.cmmn.xml");

Task task = cmmnTaskService.createTaskQuery().caseInstanceId(caseInstance.getId()).taskDefinitionKey("humanTask1").singleResult();
cmmnTaskService.complete(task.getId());

// Act
cmmnMigrationService.createCaseInstanceMigrationBuilder()
.migrateToCaseDefinition(destinationDefinition.getId())
.addActivatePlanItemDefinitionMapping(PlanItemDefinitionMappingBuilder.createActivatePlanItemDefinitionMappingFor("humanTask1"))
.migrate(caseInstance.getId());

// Assert
CaseInstance caseInstanceAfterMigration = cmmnRuntimeService.createCaseInstanceQuery()
.caseInstanceId(caseInstance.getId())
.singleResult();
assertThat(caseInstanceAfterMigration.getCaseDefinitionId()).isEqualTo(destinationDefinition.getId());
assertThat(caseInstanceAfterMigration.getCaseDefinitionVersion()).isEqualTo(2);
assertThat(caseInstanceAfterMigration.getCaseDefinitionDeploymentId()).isEqualTo(destinationDefinition.getDeploymentId());
List<PlanItemInstance> planItemInstances = cmmnRuntimeService.createPlanItemInstanceQuery()
.caseInstanceId(caseInstance.getId())
.list();
assertThat(planItemInstances).hasSize(1);
assertThat(planItemInstances)
.extracting(PlanItemInstance::getCaseDefinitionId)
.containsOnly(destinationDefinition.getId());
assertThat(planItemInstances)
.extracting(PlanItemInstance::getName)
.containsExactlyInAnyOrder("Task 1");
assertThat(planItemInstances)
.extracting(PlanItemInstance::getState)
.containsOnly(PlanItemInstanceState.ACTIVE);

List<Task> tasks = cmmnTaskService.createTaskQuery().caseInstanceId(caseInstance.getId()).list();
assertThat(tasks).hasSize(1);
assertThat(tasks.get(0).getScopeDefinitionId()).isEqualTo(destinationDefinition.getId());
cmmnTaskService.complete(tasks.get(0).getId());

assertThat(cmmnRuntimeService.createCaseInstanceQuery().caseInstanceId(caseInstance.getId()).count()).isZero();

if (CmmnHistoryTestHelper.isHistoryLevelAtLeast(HistoryLevel.ACTIVITY, cmmnEngineConfiguration)) {
assertThat(cmmnHistoryService.createHistoricCaseInstanceQuery().caseInstanceId(caseInstance.getId()).count()).isEqualTo(1);
assertThat(cmmnHistoryService.createHistoricCaseInstanceQuery().caseInstanceId(caseInstance.getId()).singleResult().getCaseDefinitionId())
.isEqualTo(destinationDefinition.getId());

List<HistoricPlanItemInstance> historicPlanItemInstances = cmmnHistoryService.createHistoricPlanItemInstanceQuery()
.planItemInstanceCaseInstanceId(caseInstance.getId()).list();
assertThat(historicPlanItemInstances).hasSize(3);
for (HistoricPlanItemInstance historicPlanItemInstance : historicPlanItemInstances) {
assertThat(historicPlanItemInstance.getCaseDefinitionId()).isEqualTo(destinationDefinition.getId());
}

List<HistoricTaskInstance> historicTasks = cmmnHistoryService.createHistoricTaskInstanceQuery().caseInstanceId(caseInstance.getId()).list();
assertThat(historicTasks).hasSize(3);
for (HistoricTaskInstance historicTask : historicTasks) {
assertThat(historicTask.getScopeDefinitionId()).isEqualTo(destinationDefinition.getId());
}
}
}

@Test
void withTwoTasksIntroducingANewStageAroundSecondTask() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,8 @@
package org.flowable.cmmn.test.runtime;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.api.Assertions.tuple;
import static org.flowable.cmmn.api.runtime.PlanItemInstanceState.ACTIVE;
import static org.flowable.cmmn.api.runtime.PlanItemInstanceState.AVAILABLE;

import java.util.ArrayList;
import java.util.Arrays;
Expand All @@ -32,7 +30,6 @@
import org.flowable.cmmn.engine.PlanItemLocalizationManager;
import org.flowable.cmmn.engine.test.CmmnDeployment;
import org.flowable.cmmn.engine.test.FlowableCmmnTestCase;
import org.flowable.common.engine.api.FlowableIllegalArgumentException;
import org.flowable.task.api.Task;
import org.junit.Before;
import org.junit.Test;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,7 @@
*/
package org.flowable.cmmn.model;

import java.util.Optional;

import org.flowable.common.engine.api.FlowableException;
import org.apache.commons.lang3.StringUtils;

/**
* @author Dennis
Expand All @@ -38,11 +36,16 @@ public void setScriptFormat(String scriptFormat) {
}

public String getScript() {
Optional<String> script = fieldExtensions.stream()
.filter(e -> "script".equalsIgnoreCase(e.getFieldName()))
.findFirst()
.map(FieldExtension::getStringValue);
return script.orElseThrow(() -> new FlowableException("Missing script"));
for (FieldExtension fieldExtension : fieldExtensions) {
if ("script".equalsIgnoreCase(fieldExtension.getFieldName())) {
String script = fieldExtension.getStringValue();
if (StringUtils.isNotEmpty(script)) {
return script;
}
return fieldExtension.getExpression();
}
}
return null;
}

public boolean isAutoStoreVariables() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,6 @@
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Collection;
Expand All @@ -35,7 +30,6 @@
import javax.naming.InitialContext;
import javax.sql.DataSource;

import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.builder.xml.XMLConfigBuilder;
import org.apache.ibatis.builder.xml.XMLMapperBuilder;
import org.apache.ibatis.datasource.pooled.PooledDataSource;
Expand Down
Loading

0 comments on commit 00917c2

Please sign in to comment.