diff --git a/src/main/java/org/gridsuite/modification/server/dto/BuildContext.java b/src/main/java/org/gridsuite/modification/server/dto/BuildContext.java new file mode 100644 index 000000000..afc770b7a --- /dev/null +++ b/src/main/java/org/gridsuite/modification/server/dto/BuildContext.java @@ -0,0 +1,12 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.modification.server.dto; + +import java.util.Set; +import java.util.UUID; + +public record BuildContext(UUID groupUuid, Set excludedModifications, ReportInfos reportInfos) { } diff --git a/src/main/java/org/gridsuite/modification/server/dto/BuildInfos.java b/src/main/java/org/gridsuite/modification/server/dto/BuildInfos.java index ae288a0b3..9e7b9007b 100644 --- a/src/main/java/org/gridsuite/modification/server/dto/BuildInfos.java +++ b/src/main/java/org/gridsuite/modification/server/dto/BuildInfos.java @@ -9,7 +9,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; -import java.util.*; +import java.util.ArrayList; +import java.util.List; /** * @author Franck Lecuyer @@ -25,12 +26,5 @@ public class BuildInfos { private String destinationVariantId; - private List modificationGroupUuids = new ArrayList<>(); - - // map with modification groups as key, modification to excludes as value - @Builder.Default - private Map> modificationUuidsToExclude = new HashMap<>(); - - private List reportsInfos = new ArrayList<>(); - + private List buildContextsInfos = new ArrayList<>(); } diff --git a/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java b/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java index 0ce44cd36..5da5ae59f 100644 --- a/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java @@ -7,7 +7,6 @@ package org.gridsuite.modification.server.service; import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.Streams; import com.powsybl.commons.PowsyblException; import com.powsybl.iidm.network.Network; import com.powsybl.iidm.network.VariantManagerConstants; @@ -212,28 +211,25 @@ public NetworkModificationResult buildVariant(@NonNull UUID networkUuid, @NonNul // Apply all modifications belonging to the modification groups uuids in buildInfos List>> modificationInfos = new ArrayList<>(); - Streams.forEachPair(buildInfos.getModificationGroupUuids().stream(), buildInfos.getReportsInfos().stream(), - (groupUuid, reporterId) -> { - Set modificationsToExclude = buildInfos.getModificationUuidsToExclude().get(groupUuid); - List modificationsByGroup = List.of(); - try { - modificationsByGroup = networkModificationRepository.getModificationsInfos(List.of(groupUuid), false) - .stream() - .filter(m -> modificationsToExclude == null || !modificationsToExclude.contains(m.getUuid())) - .filter(m -> !m.getStashed()) - .collect(Collectors.toList()); - } catch (NetworkModificationException e) { - if (e.getType() != MODIFICATION_GROUP_NOT_FOUND) { // May not exist - throw e; - } + buildInfos.getBuildContextsInfos().stream().forEach(buildContext -> { + Set modificationsToExclude = buildContext.excludedModifications(); + List modificationsByGroup = List.of(); + try { + modificationsByGroup = networkModificationRepository.getModificationsInfos(List.of(buildContext.groupUuid()), false) + .stream() + .filter(m -> modificationsToExclude == null || !modificationsToExclude.contains(m.getUuid())) + .filter(m -> !m.getStashed()) + .collect(Collectors.toList()); + } catch (NetworkModificationException e) { + if (e.getType() != MODIFICATION_GROUP_NOT_FOUND) { // May not exist + throw e; } - modificationInfos.add( - Pair.of(reporterId, - modificationsByGroup) - ); - } - ); + modificationInfos.add( + Pair.of(buildContext.reportInfos(), + modificationsByGroup) + ); + }); PreloadingStrategy preloadingStrategy = modificationInfos.stream().map(Pair::getRight) .flatMap(Collection::stream) diff --git a/src/test/java/org/gridsuite/modification/server/service/BuildTest.java b/src/test/java/org/gridsuite/modification/server/service/BuildTest.java index 1f259085f..84cd8ac43 100644 --- a/src/test/java/org/gridsuite/modification/server/service/BuildTest.java +++ b/src/test/java/org/gridsuite/modification/server/service/BuildTest.java @@ -266,8 +266,10 @@ void runBuildForLineSplits(final MockWebServer server) throws Exception { BuildInfos buildInfos = BuildInfos.builder() .originVariantId(VariantManagerConstants.INITIAL_VARIANT_ID) .destinationVariantId(NetworkCreation.VARIANT_ID) - .modificationGroupUuids(List.of(TEST_GROUP_ID, TEST_GROUP_ID_2)) - .reportsInfos(List.of(new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1), new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_2))) + .buildContextsInfos(List.of( + new BuildContext(TEST_GROUP_ID, Set.of(), new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1)), + new BuildContext(TEST_GROUP_ID_2, Set.of(), new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_2)) + )) .build(); mockMvc.perform(post(uriString, TEST_NETWORK_ID) .contentType(MediaType.APPLICATION_JSON) @@ -284,8 +286,7 @@ void runBuildForLineSplits(final MockWebServer server) throws Exception { BuildInfos newBuildInfos = BuildInfos.builder() .originVariantId(NetworkCreation.VARIANT_ID) .destinationVariantId(VARIANT_ID_2) - .modificationGroupUuids(List.of()) - .reportsInfos(List.of()) + .buildContextsInfos(List.of()) .build(); mockMvc.perform(post(uriString, TEST_NETWORK_ID) .contentType(MediaType.APPLICATION_JSON) @@ -310,8 +311,9 @@ void runBuildWithEmptyGroupTest(final MockWebServer server) throws Exception { BuildInfos buildInfos = BuildInfos.builder() .originVariantId(VariantManagerConstants.INITIAL_VARIANT_ID) .destinationVariantId(NetworkCreation.VARIANT_ID) - .modificationGroupUuids(List.of(TEST_GROUP_ID)) - .reportsInfos(List.of(new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1))) + .buildContextsInfos(List.of( + new BuildContext(TEST_GROUP_ID, Set.of(), new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1)) + )) .build(); String expectedBody = mapper.writeValueAsString(ReportNode.newRootReportNode() .withMessageTemplate(TEST_SUB_REPORTER_ID_1.toString(), TEST_SUB_REPORTER_ID_1.toString()) @@ -414,8 +416,9 @@ void testIndexationAfterBuild(final MockWebServer server) { BuildInfos buildInfos = BuildInfos.builder() .originVariantId(VariantManagerConstants.INITIAL_VARIANT_ID) .destinationVariantId(NetworkCreation.VARIANT_ID) - .modificationGroupUuids(List.of(TEST_GROUP_ID)) - .reportsInfos(List.of(new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1))) + .buildContextsInfos(List.of( + new BuildContext(TEST_GROUP_ID, Set.of(), new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1)) + )) .build(); // Build variant @@ -706,8 +709,10 @@ void runBuildTest(final MockWebServer server) throws Exception { BuildInfos buildInfos = BuildInfos.builder() .originVariantId(VariantManagerConstants.INITIAL_VARIANT_ID) .destinationVariantId(NetworkCreation.VARIANT_ID) - .modificationGroupUuids(List.of(TEST_GROUP_ID, TEST_GROUP_ID_2)) - .reportsInfos(List.of(new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1), new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_2))) + .buildContextsInfos(List.of( + new BuildContext(TEST_GROUP_ID, Set.of(), new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1)), + new BuildContext(TEST_GROUP_ID_2, Set.of(), new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_2)) + )) .build(); String buildInfosJson = objectWriter.writeValueAsString(buildInfos); mockMvc.perform(post(uriString, TEST_NETWORK_ID).contentType(MediaType.APPLICATION_JSON).content(buildInfosJson)) @@ -806,8 +811,7 @@ void runBuildTest(final MockWebServer server) throws Exception { BuildInfos newBuildInfos = BuildInfos.builder() .originVariantId(NetworkCreation.VARIANT_ID) .destinationVariantId(VARIANT_ID_2) - .modificationGroupUuids(Collections.emptyList()) - .reportsInfos(Collections.emptyList()) + .buildContextsInfos(List.of()) .build(); buildInfosJson = objectWriter.writeValueAsString(newBuildInfos); mockMvc.perform(post(uriString, TEST_NETWORK_ID).contentType(MediaType.APPLICATION_JSON).content(buildInfosJson)).andExpect(status().isOk()); @@ -849,8 +853,9 @@ void runBuildWithStashedModificationsTest(final MockWebServer server) { BuildInfos buildInfos = BuildInfos.builder() .originVariantId(VariantManagerConstants.INITIAL_VARIANT_ID) .destinationVariantId(NetworkCreation.VARIANT_ID) - .modificationGroupUuids(List.of(TEST_GROUP_ID)) - .reportsInfos(List.of(new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1))) + .buildContextsInfos(List.of( + new BuildContext(TEST_GROUP_ID, Set.of(), new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1)) + )) .build(); networkModificationService.buildVariant(TEST_NETWORK_ID, buildInfos); @@ -876,9 +881,9 @@ void runBuildWithExcludedModificationsTest(final MockWebServer server) { BuildInfos buildInfos = BuildInfos.builder() .originVariantId(VariantManagerConstants.INITIAL_VARIANT_ID) .destinationVariantId(NetworkCreation.VARIANT_ID) - .modificationGroupUuids(List.of(TEST_GROUP_ID)) - .reportsInfos(List.of(new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1))) - .modificationUuidsToExclude(Map.of(TEST_GROUP_ID, Set.of(savedModificationEntities.get(1).getId()))) + .buildContextsInfos(List.of( + new BuildContext(TEST_GROUP_ID, Set.of(savedModificationEntities.get(1).getId()), new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1)) + )) .build(); networkModificationService.buildVariant(TEST_NETWORK_ID, buildInfos); @@ -904,8 +909,9 @@ void stopBuildTest() throws Exception { BuildInfos buildInfos = BuildInfos.builder() .originVariantId(VariantManagerConstants.INITIAL_VARIANT_ID) .destinationVariantId(NetworkCreation.VARIANT_ID) - .modificationGroupUuids(List.of(TEST_GROUP_ID)) - .reportsInfos(List.of(new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1))) + .buildContextsInfos(List.of( + new BuildContext(TEST_GROUP_ID, Set.of(), new ReportInfos(UUID.randomUUID(), TEST_SUB_REPORTER_ID_1)) + )) .build(); String buildInfosJson = mapper.writeValueAsString(buildInfos); CompletableFuture.runAsync(() -> { @@ -946,8 +952,9 @@ void runBuildWithReportErrorTest(final MockWebServer server) throws Exception { BuildInfos buildInfos = BuildInfos.builder() .originVariantId(VariantManagerConstants.INITIAL_VARIANT_ID) .destinationVariantId(NetworkCreation.VARIANT_ID) - .modificationGroupUuids(List.of(TEST_GROUP_ID)) - .reportsInfos(List.of(new ReportInfos(TEST_ERROR_REPORT_ID, TEST_SUB_REPORTER_ID_1))) + .buildContextsInfos(List.of( + new BuildContext(TEST_GROUP_ID, Set.of(), new ReportInfos(TEST_ERROR_REPORT_ID, TEST_SUB_REPORTER_ID_1)) + )) .build(); mockMvc.perform(post(uriString, TEST_NETWORK_ID) .contentType(MediaType.APPLICATION_JSON)