From 11bb3aa5a41de19462ad4c631fdf76064eb421b2 Mon Sep 17 00:00:00 2001 From: Tijs Rademakers Date: Wed, 19 Jun 2024 11:49:15 +0200 Subject: [PATCH] Use plan item instance name for stage overview when set --- .../impl/cmd/GetHistoricStageOverviewCmd.java | 15 +++- .../engine/impl/cmd/GetStageOverviewCmd.java | 14 +++- .../flowable/cmmn/test/runtime/StageTest.java | 82 +++++++++++++++++++ ...etStageAndMilestoneOverviewExpression.cmmn | 43 ++++++++++ 4 files changed, 150 insertions(+), 4 deletions(-) create mode 100644 modules/flowable-cmmn-engine/src/test/resources/org/flowable/cmmn/test/runtime/StageTest.testGetStageAndMilestoneOverviewExpression.cmmn diff --git a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/GetHistoricStageOverviewCmd.java b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/GetHistoricStageOverviewCmd.java index 34e1b3e4579..306f835777f 100644 --- a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/GetHistoricStageOverviewCmd.java +++ b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/GetHistoricStageOverviewCmd.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.Optional; +import org.apache.commons.lang3.StringUtils; import org.flowable.cmmn.api.StageResponse; import org.flowable.cmmn.api.history.HistoricPlanItemInstance; import org.flowable.cmmn.api.repository.CaseDefinition; @@ -78,10 +79,20 @@ public List execute(CommandContext commandContext) { List overviewElements = new ArrayList<>(); for (Stage stage : stages) { - overviewElements.add(new OverviewElement(stage.getId(), stage.getName(), stage.getDisplayOrder(), stage.getIncludeInStageOverview(), stage)); + OverviewElement overviewElement = new OverviewElement(stage.getId(), stage.getName(), stage.getDisplayOrder(), stage.getIncludeInStageOverview(), stage); + Optional planItemInstance = getPlanItemInstance(planItemInstances, stage); + if (planItemInstance.isPresent() && StringUtils.isNotEmpty(planItemInstance.get().getName())) { + overviewElement.setName(planItemInstance.get().getName()); + } + overviewElements.add(overviewElement); } for (Milestone milestone : milestones) { - overviewElements.add(new OverviewElement(milestone.getId(), milestone.getName(), milestone.getDisplayOrder(), milestone.getIncludeInStageOverview(), milestone)); + OverviewElement overviewElement = new OverviewElement(milestone.getId(), milestone.getName(), milestone.getDisplayOrder(), milestone.getIncludeInStageOverview(), milestone); + Optional planItemInstance = getPlanItemInstance(planItemInstances, milestone); + if (planItemInstance.isPresent() && StringUtils.isNotEmpty(planItemInstance.get().getName())) { + overviewElement.setName(planItemInstance.get().getName()); + } + overviewElements.add(overviewElement); } // If one stage has a display order, they are ordered by that. diff --git a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/GetStageOverviewCmd.java b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/GetStageOverviewCmd.java index 9125f066cf3..0cda373d14f 100644 --- a/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/GetStageOverviewCmd.java +++ b/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/cmd/GetStageOverviewCmd.java @@ -83,10 +83,20 @@ public List execute(CommandContext commandContext) { List overviewElements = new ArrayList<>(); for (Stage stage : stages) { - overviewElements.add(new OverviewElement(stage.getId(), stage.getName(), stage.getDisplayOrder(), stage.getIncludeInStageOverview(), stage)); + OverviewElement overviewElement = new OverviewElement(stage.getId(), stage.getName(), stage.getDisplayOrder(), stage.getIncludeInStageOverview(), stage); + Optional planItemInstance = getPlanItemInstance(planItemInstances, stage); + if (planItemInstance.isPresent() && StringUtils.isNotEmpty(planItemInstance.get().getName())) { + overviewElement.setName(planItemInstance.get().getName()); + } + overviewElements.add(overviewElement); } for (Milestone milestone : milestones) { - overviewElements.add(new OverviewElement(milestone.getId(), milestone.getName(), milestone.getDisplayOrder(), milestone.getIncludeInStageOverview(), milestone)); + OverviewElement overviewElement = new OverviewElement(milestone.getId(), milestone.getName(), milestone.getDisplayOrder(), milestone.getIncludeInStageOverview(), milestone); + Optional planItemInstance = getPlanItemInstance(planItemInstances, milestone); + if (planItemInstance.isPresent() && StringUtils.isNotEmpty(planItemInstance.get().getName())) { + overviewElement.setName(planItemInstance.get().getName()); + } + overviewElements.add(overviewElement); } // If one stage has a display order, they are ordered by that. diff --git a/modules/flowable-cmmn-engine/src/test/java/org/flowable/cmmn/test/runtime/StageTest.java b/modules/flowable-cmmn-engine/src/test/java/org/flowable/cmmn/test/runtime/StageTest.java index 343353ccc35..ad2b8261ab0 100644 --- a/modules/flowable-cmmn-engine/src/test/java/org/flowable/cmmn/test/runtime/StageTest.java +++ b/modules/flowable-cmmn-engine/src/test/java/org/flowable/cmmn/test/runtime/StageTest.java @@ -784,6 +784,88 @@ public void testGetStageAndMilestoneOverviewWhenExpressionIsFalse() { assertThat(stageMap.get("Stage 2").getEndTime()).isNotNull(); } } + + @Test + @CmmnDeployment + public void testGetStageAndMilestoneOverviewExpression() { + Date now = new Date(); + setClockTo(now); + CaseInstance caseInstance = cmmnRuntimeService.createCaseInstanceBuilder() + .caseDefinitionKey("testCase") + .variable("showInStage", true) + .variable("showMilestoneInOverview", true) + .variable("milestoneName", "This is a milestone name") + .variable("stageName", "This is a stage name") + .start(); + + List stages = cmmnRuntimeService.getStageOverview(caseInstance.getId()); + assertThat(stages).hasSize(5); + + Map stageMap = new HashMap<>(); + for (StageResponse stageResponse : stages) { + stageMap.put(stageResponse.getName(), stageResponse); + } + + assertThat(stageMap.get("This is a milestone name").getName()).isEqualTo("This is a milestone name"); + assertThat(stageMap.get("This is a milestone name").isCurrent()).isFalse(); + assertThat(stageMap.get("This is a milestone name").isEnded()).isTrue(); + assertThat(stageMap.get("This is a milestone name").getEndTime()).isNotNull(); + + assertThat(stageMap.get("This is a stage name").getName()).isEqualTo("This is a stage name"); + assertThat(stageMap.get("This is a stage name").isCurrent()).isTrue(); + assertThat(stageMap.get("This is a stage name").isEnded()).isFalse(); + assertThat(stageMap.get("This is a stage name").getEndTime()).isNull(); + + assertThat(stageMap.get("Stage 2").getName()).isEqualTo("Stage 2"); + assertThat(stageMap.get("Stage 2").isCurrent()).isFalse(); + assertThat(stageMap.get("Stage 2").isEnded()).isFalse(); + assertThat(stageMap.get("Stage 2").getEndTime()).isNull(); + + assertThat(stageMap.get("Milestone 2.1").getName()).isEqualTo("Milestone 2.1"); + assertThat(stageMap.get("Milestone 2.1").isCurrent()).isFalse(); + assertThat(stageMap.get("Milestone 2.1").isEnded()).isFalse(); + assertThat(stageMap.get("Milestone 2.1").getEndTime()).isNull(); + + assertThat(stageMap.get("Stage 2.1").getName()).isEqualTo("Stage 2.1"); + assertThat(stageMap.get("Stage 2.1").isCurrent()).isFalse(); + assertThat(stageMap.get("Stage 2.1").isEnded()).isFalse(); + assertThat(stageMap.get("Stage 2.1").getEndTime()).isNull(); + + if (CmmnHistoryTestHelper.isHistoryLevelAtLeast(HistoryLevel.ACTIVITY, cmmnEngineConfiguration)) { + stages = cmmnHistoryService.getStageOverview(caseInstance.getId()); + assertThat(stages).hasSize(5); + + stageMap = new HashMap<>(); + for (StageResponse stageResponse : stages) { + stageMap.put(stageResponse.getName(), stageResponse); + } + + assertThat(stageMap.get("This is a milestone name").getName()).isEqualTo("This is a milestone name"); + assertThat(stageMap.get("This is a milestone name").isCurrent()).isFalse(); + assertThat(stageMap.get("This is a milestone name").isEnded()).isTrue(); + assertThat(stageMap.get("This is a milestone name").getEndTime()).isNotNull(); + + assertThat(stageMap.get("This is a stage name").getName()).isEqualTo("This is a stage name"); + assertThat(stageMap.get("This is a stage name").isCurrent()).isTrue(); + assertThat(stageMap.get("This is a stage name").isEnded()).isFalse(); + assertThat(stageMap.get("This is a stage name").getEndTime()).isNull(); + + assertThat(stageMap.get("Stage 2").getName()).isEqualTo("Stage 2"); + assertThat(stageMap.get("Stage 2").isCurrent()).isFalse(); + assertThat(stageMap.get("Stage 2").isEnded()).isFalse(); + assertThat(stageMap.get("Stage 2").getEndTime()).isNull(); + + assertThat(stageMap.get("Milestone 2.1").getName()).isEqualTo("Milestone 2.1"); + assertThat(stageMap.get("Milestone 2.1").isCurrent()).isFalse(); + assertThat(stageMap.get("Milestone 2.1").isEnded()).isFalse(); + assertThat(stageMap.get("Milestone 2.1").getEndTime()).isNull(); + + assertThat(stageMap.get("Stage 2.1").getName()).isEqualTo("Stage 2.1"); + assertThat(stageMap.get("Stage 2.1").isCurrent()).isFalse(); + assertThat(stageMap.get("Stage 2.1").isEnded()).isFalse(); + assertThat(stageMap.get("Stage 2.1").getEndTime()).isNull(); + } + } @Test @CmmnDeployment diff --git a/modules/flowable-cmmn-engine/src/test/resources/org/flowable/cmmn/test/runtime/StageTest.testGetStageAndMilestoneOverviewExpression.cmmn b/modules/flowable-cmmn-engine/src/test/resources/org/flowable/cmmn/test/runtime/StageTest.testGetStageAndMilestoneOverviewExpression.cmmn new file mode 100644 index 00000000000..124ccd163c6 --- /dev/null +++ b/modules/flowable-cmmn-engine/src/test/resources/org/flowable/cmmn/test/runtime/StageTest.testGetStageAndMilestoneOverviewExpression.cmmn @@ -0,0 +1,43 @@ + + + + + + + + + + + + + complete + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file