From 87e0ddff25802a14f03f3430e37763d64a7db4b6 Mon Sep 17 00:00:00 2001 From: SebastianRoseneck <55637012+SebastianRoseneck@users.noreply.github.com> Date: Tue, 5 Dec 2023 11:11:16 +0100 Subject: [PATCH] Closes #2339 - sort classificationCategoriesByType according to type order (#2340) --- .../acceptance/TaskanaConfigurationTest.java | 20 ++++++++++++++++- .../pro/taskana/TaskanaConfiguration.java | 22 ++++++++++++++----- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/lib/taskana-core-test/src/test/java/acceptance/TaskanaConfigurationTest.java b/lib/taskana-core-test/src/test/java/acceptance/TaskanaConfigurationTest.java index 21efb159b..21e5d2e27 100644 --- a/lib/taskana-core-test/src/test/java/acceptance/TaskanaConfigurationTest.java +++ b/lib/taskana-core-test/src/test/java/acceptance/TaskanaConfigurationTest.java @@ -507,7 +507,7 @@ class TaskanaConfigurationTest { // user configuration .addAdditionalUserInfo(true) .minimalPermissionsToAssignDomains(Set.of(WorkbasketPermission.CUSTOM_2)) - //database configuration + // database configuration .useSpecificDb2Taskquery(false) .build(); @@ -1044,6 +1044,24 @@ class TaskanaConfigurationTest { Map.entry("TYPE_A", List.of("A", "B")), Map.entry("TYPE_B", List.of("C", "D")))); } + @Test + void should_OrderClassificationCategoriesByTypeOrder() { + TaskanaConfiguration configuration = + new Builder(TestContainerExtension.createDataSourceForH2(), false, "TASKANA") + .classificationTypes(List.of("type_a", "type_c", "type_b")) + .classificationCategoriesByType( + Map.ofEntries( + Map.entry("type_a", Collections.emptyList()), + Map.entry("type_b", Collections.emptyList()), + Map.entry("type_c", Collections.emptyList()))) + .build(); + + List expectedKeysOrder = Arrays.asList("TYPE_A", "TYPE_C", "TYPE_B"); + List actualKeysOrder = + new ArrayList<>(configuration.getClassificationCategoriesByType().keySet()); + assertThat(actualKeysOrder).containsExactlyElementsOf(expectedKeysOrder); + } + @Test void should_FillAllTaskanaRoles_When_RoleMapIsIncomplete() { TaskanaConfiguration configuration = diff --git a/lib/taskana-core/src/main/java/pro/taskana/TaskanaConfiguration.java b/lib/taskana-core/src/main/java/pro/taskana/TaskanaConfiguration.java index 3759ba81a..321d1129c 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/TaskanaConfiguration.java +++ b/lib/taskana-core/src/main/java/pro/taskana/TaskanaConfiguration.java @@ -16,9 +16,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.EnumMap; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -153,10 +155,14 @@ public class TaskanaConfiguration { // classification configuration this.classificationTypes = Collections.unmodifiableList(builder.classificationTypes); this.classificationCategoriesByType = - builder.classificationCategoriesByType.entrySet().stream() - .collect( - Collectors.toUnmodifiableMap( - Entry::getKey, e -> Collections.unmodifiableList(e.getValue()))); + Collections.unmodifiableMap( + builder.classificationCategoriesByType.entrySet().stream() + .collect( + Collectors.toMap( + Map.Entry::getKey, + e -> Collections.unmodifiableList(e.getValue()), + (oldValue, newValue) -> oldValue, + LinkedHashMap::new))); // working time configuration this.useWorkingTimeCalculation = builder.useWorkingTimeCalculation; this.workingTimeSchedule = @@ -1360,7 +1366,13 @@ public class TaskanaConfiguration { e.getValue().stream() .map(String::toUpperCase) .collect(Collectors.toList()))) - .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); + .sorted(Comparator.comparingInt(e -> classificationTypes.indexOf(e.getKey()))) + .collect( + Collectors.toMap( + Map.Entry::getKey, + Map.Entry::getValue, + (oldValue, newValue) -> oldValue, + LinkedHashMap::new)); roleMap = Arrays.stream(TaskanaRole.values()) .map(role -> Pair.of(role, roleMap.getOrDefault(role, Set.of())))