diff --git a/pom.xml b/pom.xml index 73f08f064..27d1e2179 100644 --- a/pom.xml +++ b/pom.xml @@ -52,7 +52,7 @@ gridsuite org.gridsuite:network-modification-server - 0.66.0 + 0.67.0 1.38.0 diff --git a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java index bc0503889..f4870290d 100644 --- a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java +++ b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java @@ -12,6 +12,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import org.gridsuite.modification.dto.ModificationInfos; +import org.gridsuite.modification.dto.ModificationsToCopyInfos; import org.gridsuite.modification.server.dto.*; import org.gridsuite.modification.server.dto.catalog.LineTypeInfos; import org.gridsuite.modification.server.service.LineTypesCatalogService; @@ -37,7 +38,10 @@ public class NetworkModificationController { private enum GroupModificationAction { - MOVE, COPY, INSERT + MOVE, + COPY, + SPLIT_COMPOSITE, // the network modifications contained into the composite modifications are extracted and inserted one by one + INSERT_COMPOSITE // the composite modifications are fully inserted as composite modifications } private final NetworkModificationService networkModificationService; @@ -89,24 +93,32 @@ public ResponseEntity> duplicateGroup(@RequestParam("groupUuid") @PutMapping(value = "/groups/{groupUuid}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @Operation(summary = "For a list of network modifications passed in body, Move them before another one or at the end of the list, or Duplicate them at the end of the list, or Insert them (composite) at the end of the list") @ApiResponse(responseCode = "200", description = "The modification list of the group has been updated.") - public CompletableFuture> handleNetworkModifications(@Parameter(description = "updated group UUID, where modifications are pasted") @PathVariable("groupUuid") UUID targetGroupUuid, - @Parameter(description = "kind of modification", required = true) @RequestParam(value = "action") GroupModificationAction action, - @Parameter(description = "the modification Uuid to move before (MOVE option, empty means moving at the end)") @RequestParam(value = "before", required = false) UUID beforeModificationUuid, - @Parameter(description = "origin group UUID, where modifications are copied or cut") @RequestParam(value = "originGroupUuid", required = false) UUID originGroupUuid, - @Parameter(description = "modifications can be applied (default is true)") @RequestParam(value = "build", required = false, defaultValue = "true") Boolean canApply, - @RequestBody Pair, List> modificationContextInfos) { + public CompletableFuture> handleNetworkModifications( + @Parameter(description = "updated group UUID, where modifications are pasted") @PathVariable("groupUuid") UUID targetGroupUuid, + @Parameter(description = "kind of modification", required = true) @RequestParam(value = "action") GroupModificationAction action, + @Parameter(description = "the modification Uuid to move before (MOVE option, empty means moving at the end)") @RequestParam(value = "before", required = false) UUID beforeModificationUuid, + @Parameter(description = "origin group UUID, where modifications are copied or cut") @RequestParam(value = "originGroupUuid", required = false) UUID originGroupUuid, + @Parameter(description = "modifications can be applied (default is true)") @RequestParam(value = "build", required = false, defaultValue = "true") Boolean canApply, + @RequestBody Pair, List> modificationContextInfos) { + List modificationsUuids = modificationContextInfos.getFirst().stream().map(ModificationsToCopyInfos::getUuid).toList(); return switch (action) { case COPY -> - networkModificationService.duplicateModifications(targetGroupUuid, originGroupUuid, modificationContextInfos.getFirst(), modificationContextInfos.getSecond()).thenApply(ResponseEntity.ok()::body); - case INSERT -> - networkModificationService.insertCompositeModifications(targetGroupUuid, modificationContextInfos.getFirst(), modificationContextInfos.getSecond()).thenApply(ResponseEntity.ok()::body); + networkModificationService.duplicateModifications(targetGroupUuid, originGroupUuid, modificationsUuids, modificationContextInfos.getSecond()).thenApply(ResponseEntity.ok()::body); + case SPLIT_COMPOSITE -> + networkModificationService.splitCompositeModifications(targetGroupUuid, modificationsUuids, modificationContextInfos.getSecond()).thenApply(ResponseEntity.ok()::body); + case INSERT_COMPOSITE -> + networkModificationService.insertCompositeModificationsIntoGroup( + targetGroupUuid, + modificationContextInfos.getFirst(), + modificationContextInfos.getSecond() + ).thenApply(ResponseEntity.ok()::body); case MOVE -> { UUID sourceGroupUuid = originGroupUuid == null ? targetGroupUuid : originGroupUuid; boolean applyModifications = canApply; if (sourceGroupUuid.equals(targetGroupUuid)) { applyModifications = false; } - yield networkModificationService.moveModifications(targetGroupUuid, sourceGroupUuid, beforeModificationUuid, modificationContextInfos.getFirst(), modificationContextInfos.getSecond(), applyModifications).thenApply(ResponseEntity.ok()::body); + yield networkModificationService.moveModifications(targetGroupUuid, sourceGroupUuid, beforeModificationUuid, modificationsUuids, modificationContextInfos.getSecond(), applyModifications).thenApply(ResponseEntity.ok()::body); } }; } diff --git a/src/main/java/org/gridsuite/modification/server/entities/CompositeModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/CompositeModificationEntity.java index ecab41a0d..fb5d79bf7 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/CompositeModificationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/CompositeModificationEntity.java @@ -13,6 +13,7 @@ import lombok.Setter; import org.gridsuite.modification.dto.CompositeModificationInfos; import org.gridsuite.modification.dto.ModificationInfos; +import org.hibernate.annotations.ColumnDefault; import java.util.ArrayList; import java.util.List; @@ -27,6 +28,10 @@ @Table(name = "composite_modification") public class CompositeModificationEntity extends ModificationEntity { + @Column(name = "name") + @ColumnDefault("'My Composite'") + private String name; + @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) @JoinTable( name = "compositeModificationSubModifications", @@ -44,6 +49,7 @@ public CompositeModificationEntity(@NonNull CompositeModificationInfos composite public CompositeModificationInfos toModificationInfos() { List modificationsInfos = modifications.stream().map(ModificationEntity::toModificationInfos).toList(); return CompositeModificationInfos.builder() + .name(getName()) .activated(getActivated()) .description(getDescription()) .date(getDate()) @@ -56,6 +62,7 @@ public CompositeModificationInfos toModificationInfos() { // when we go back to an empty list, dont use addAll() on the list because JPA could start // @OrderColumn to 1 instead of 0 private void assignAttributes(CompositeModificationInfos compositeModificationInfos) { + this.setName(compositeModificationInfos.getName()); modifications.clear(); modifications = compositeModificationInfos.getModifications().stream() .map(ModificationEntity::fromDTO) diff --git a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java index 57c201a97..ad47ad264 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -139,6 +139,15 @@ public UUID createNetworkCompositeModification(@NonNull List modificationU return modificationRepository.save(compositeEntity).getId(); } + public CompositeModificationInfos cloneCompositeModification(@NonNull ModificationsToCopyInfos compositeModification) { + CompositeModificationInfos newCompositeInfos = CompositeModificationInfos.builder().modifications(List.of()).build(); + List copiedModifications = getCompositeModificationsInfosNonTransactional(List.of(compositeModification.getUuid())).stream() + .toList(); + newCompositeInfos.setModifications(copiedModifications); + newCompositeInfos.setName(compositeModification.getCompositeName()); + return newCompositeInfos; + } + public void updateCompositeModification(@NonNull UUID compositeUuid, @NonNull List modificationUuids) { ModificationEntity modificationEntity = modificationRepository.findById(compositeUuid) .orElseThrow(() -> new NetworkModificationException(MODIFICATION_NOT_FOUND, String.format(MODIFICATION_NOT_FOUND_MESSAGE, compositeUuid))); @@ -765,4 +774,17 @@ public List saveCompositeModifications(@NonNull UUID targetGr // We can't return modificationInfos directly because it wouldn't have the IDs coming from the new saved entities return newEntities.stream().map(ModificationEntity::toModificationInfos).toList(); } + + @Transactional + public List insertCompositeModificationsIntoGroup( + @NonNull UUID targetGroupUuid, + @NonNull List compositeModifications) { + List newCompositeModifications = new ArrayList<>(); + for (ModificationsToCopyInfos compositeModification : compositeModifications) { + CompositeModificationInfos newCompositeModification = cloneCompositeModification(compositeModification); + newCompositeModifications.add(newCompositeModification); + } + List newEntities = saveModificationInfosNonTransactional(targetGroupUuid, newCompositeModifications); + return newEntities.stream().map(ModificationEntity::toModificationInfos).toList(); + } } 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 d0487ea21..820cbee91 100644 --- a/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java @@ -21,6 +21,7 @@ import org.gridsuite.modification.NetworkModificationException; import org.gridsuite.modification.dto.GenerationDispatchInfos; import org.gridsuite.modification.dto.ModificationInfos; +import org.gridsuite.modification.dto.ModificationsToCopyInfos; import org.gridsuite.modification.server.NetworkModificationServerException; import org.gridsuite.modification.server.dto.*; import org.gridsuite.modification.server.dto.elasticsearch.ModificationApplicationInfos; @@ -397,8 +398,22 @@ public CompletableFuture duplicateModifications(@Non new NetworkModificationsResult(ids, result)); } - public CompletableFuture insertCompositeModifications(@NonNull UUID targetGroupUuid, @NonNull List modificationsUuids, @NonNull List applicationContexts) { - List modifications = networkModificationRepository.saveCompositeModifications(targetGroupUuid, modificationsUuids); + /** + * all their network modifications are extracted from the composite modifications and inserted into the group + */ + public CompletableFuture splitCompositeModifications(@NonNull UUID targetGroupUuid, @NonNull List compositeModificationsUuids, @NonNull List applicationContexts) { + List modifications = networkModificationRepository.saveCompositeModifications(targetGroupUuid, compositeModificationsUuids); + List ids = modifications.stream().map(ModificationInfos::getUuid).toList(); + return applyModifications(targetGroupUuid, modifications, applicationContexts).thenApply(result -> + new NetworkModificationsResult(ids, result)); + } + + public CompletableFuture insertCompositeModificationsIntoGroup( + @NonNull UUID targetGroupUuid, + @NonNull List compositeModifications, + @NonNull List applicationContexts) { + List modifications = networkModificationRepository.insertCompositeModificationsIntoGroup( + targetGroupUuid, compositeModifications); List ids = modifications.stream().map(ModificationInfos::getUuid).toList(); return applyModifications(targetGroupUuid, modifications, applicationContexts).thenApply(result -> new NetworkModificationsResult(ids, result)); diff --git a/src/main/resources/db/changelog/changesets/changelog_20260206T132143Z.xml b/src/main/resources/db/changelog/changesets/changelog_20260206T132143Z.xml new file mode 100644 index 000000000..2d7cdf4af --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20260206T132143Z.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 22bc992fa..e6ba17e34 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -453,3 +453,6 @@ databaseChangeLog: - include: file: changesets/changelog_20251215T152152Z.xml relativeToChangelogFile: true + - include: + file: changesets/changelog_20260206T132143Z.xml + relativeToChangelogFile: true diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index 4ec138b38..5a4935dce 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -196,6 +196,10 @@ private String getJsonBody(ModificationInfos modificationInfos, UUID networkUuid return TestUtils.getJsonBody(modificationInfos, networkUuid, variantId); } + private String getJsonBodyModificationsToCopyInfos(List modifs, String variantId) throws JsonProcessingException { + return TestUtils.getJsonBodyModificationsToCopyInfos(modifs, TEST_NETWORK_ID, variantId); + } + private String getJsonBody(List uuids, String variantId) throws JsonProcessingException { return TestUtils.getJsonBody(uuids, TEST_NETWORK_ID, variantId); } @@ -554,7 +558,11 @@ void testCopyModification() throws Exception { List duplicateModificationUuidList = new ArrayList<>(modificationUuidList.subList(0, 2)); List badModificationUuidList = List.of(UUID.randomUUID(), UUID.randomUUID()); duplicateModificationUuidList.addAll(badModificationUuidList); - String bodyJson = getJsonBody(duplicateModificationUuidList, NetworkCreation.VARIANT_ID); + + List duplicateModificationList = duplicateModificationUuidList.stream().map( + uuid -> ModificationsToCopyInfos.builder().uuid(uuid).build()).toList(); + String bodyJson = getJsonBodyModificationsToCopyInfos(duplicateModificationList, NetworkCreation.VARIANT_ID); + MvcResult mvcResult = runRequestAsync(mockMvc, put("/v1/groups/" + TEST_GROUP_ID + "?action=COPY").content(bodyJson).contentType(MediaType.APPLICATION_JSON), status().isOk()); assertApplicationStatusOK(mvcResult); @@ -583,7 +591,9 @@ void testCopyModification() throws Exception { // Duplicate the same modifications, and append them at the end of this new group modification list. duplicateModificationUuidList = new ArrayList<>(modificationUuidList.subList(0, 2)); - bodyJson = getJsonBody(duplicateModificationUuidList, NetworkCreation.VARIANT_ID); + duplicateModificationList = duplicateModificationUuidList.stream().map( + uuid -> ModificationsToCopyInfos.builder().uuid(uuid).build()).toList(); + bodyJson = getJsonBodyModificationsToCopyInfos(duplicateModificationList, NetworkCreation.VARIANT_ID); mvcResult = runRequestAsync(mockMvc, put("/v1/groups/" + otherGroupId + "?action=COPY").content(bodyJson).contentType(MediaType.APPLICATION_JSON), status().isOk()); assertApplicationStatusOK(mvcResult); @@ -612,7 +622,9 @@ void testCopyModification() throws Exception { } // Duplicate modifications from a group and from a list : illegal operation - bodyJson = getJsonBody(duplicateModificationUuidList, NetworkCreation.VARIANT_ID); + duplicateModificationList = duplicateModificationUuidList.stream().map( + uuid -> ModificationsToCopyInfos.builder().uuid(uuid).build()).toList(); + bodyJson = getJsonBodyModificationsToCopyInfos(duplicateModificationList, NetworkCreation.VARIANT_ID); mvcResult = mockMvc.perform( put("/v1/groups/" + otherGroupId + "?action=COPY" + "&originGroupUuid=" + TEST_GROUP_ID) .content(bodyJson) @@ -635,7 +647,9 @@ void testCopyModificationOld() throws Exception { List duplicateModificationUuidList = new ArrayList<>(modificationUuidList.subList(0, 2)); List badModificationUuidList = List.of(UUID.randomUUID(), UUID.randomUUID()); duplicateModificationUuidList.addAll(badModificationUuidList); - String bodyJson = getJsonBody(duplicateModificationUuidList, NetworkCreation.VARIANT_ID); + List duplicateModificationList = duplicateModificationUuidList.stream().map( + uuid -> ModificationsToCopyInfos.builder().uuid(uuid).build()).toList(); + String bodyJson = getJsonBodyModificationsToCopyInfos(duplicateModificationList, NetworkCreation.VARIANT_ID); String url = "/v1/groups/" + TEST_GROUP_ID + "?action=COPY"; MvcResult mvcResult = runRequestAsync(mockMvc, put(url).content(bodyJson).contentType(MediaType.APPLICATION_JSON), status().isOk()); assertApplicationStatusOK(mvcResult); @@ -667,7 +681,10 @@ void testCopyModificationOld() throws Exception { // Duplicate the same modifications, and append them at the end of this new group modification list. duplicateModificationUuidList = new ArrayList<>(modificationUuidList.subList(0, 2)); String copyUrl = "/v1/groups/" + otherGroupId + "?action=COPY"; - bodyJson = getJsonBody(duplicateModificationUuidList, NetworkCreation.VARIANT_ID); + duplicateModificationList = duplicateModificationUuidList.stream().map( + uuid -> ModificationsToCopyInfos.builder().uuid(uuid).build()).toList(); + bodyJson = getJsonBodyModificationsToCopyInfos(duplicateModificationList, NetworkCreation.VARIANT_ID); + mvcResult = runRequestAsync(mockMvc, put(copyUrl).content(bodyJson).contentType(MediaType.APPLICATION_JSON), status().isOk()); assertApplicationStatusOK(mvcResult); @@ -704,7 +721,9 @@ void testCopyModificationWithUnexistingId() throws Exception { // Try to copy an unexisting Modification List duplicateModificationUuidList = List.of(UUID.randomUUID()); - String bodyJson = getJsonBody(duplicateModificationUuidList, NetworkCreation.VARIANT_ID); + List duplicateModificationList = duplicateModificationUuidList.stream().map( + uuid -> ModificationsToCopyInfos.builder().uuid(uuid).build()).toList(); + String bodyJson = getJsonBodyModificationsToCopyInfos(duplicateModificationList, NetworkCreation.VARIANT_ID); String url = "/v1/groups/" + TEST_GROUP_ID + "?action=COPY" + "&before=" + modificationUuidList.get(0); mockMvc.perform(put(url).content(bodyJson) .contentType(MediaType.APPLICATION_JSON)) @@ -773,7 +792,9 @@ void testMoveModificationInSameGroup() throws Exception { // swap modifications: move [1] before [0] List movingModificationUuidList = List.of(modificationUuidList.get(1)); - String bodyJson = getJsonBody(movingModificationUuidList, NetworkCreation.VARIANT_ID); + List movingModificationList = movingModificationUuidList.stream().map( + uuid -> ModificationsToCopyInfos.builder().uuid(uuid).build()).toList(); + String bodyJson = getJsonBodyModificationsToCopyInfos(movingModificationList, NetworkCreation.VARIANT_ID); String url = "/v1/groups/" + TEST_GROUP_ID + "?action=MOVE" + "&before=" + modificationUuidList.get(0); mockMvc.perform(put(url).content(bodyJson) .contentType(MediaType.APPLICATION_JSON)) @@ -845,14 +866,13 @@ void testNetworkCompositeModification() throws Exception { mvcResult = mockMvc.perform(get(URI_GET_COMPOSITE_NETWORK_MODIF_CONTENT + "/network-modifications?uuids={id}&onlyMetadata=false", compositeModificationUuid)) .andExpect(status().isOk()).andReturn(); compositeModificationContent = mapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); - assertEquals("open", ((EquipmentAttributeModificationInfos) compositeModificationContent.get(0)).getEquipmentAttributeName()); - assertEquals(Boolean.TRUE, ((EquipmentAttributeModificationInfos) compositeModificationContent.get(0)).getEquipmentAttributeValue()); - assertEquals(IdentifiableType.SWITCH, ((EquipmentAttributeModificationInfos) compositeModificationContent.get(0)).getEquipmentType()); - assertEquals("v1b1", ((EquipmentAttributeModificationInfos) compositeModificationContent.get(0)).getEquipmentId()); + checkCompositeModificationContent(compositeModificationContent); // Insert the composite modification in the group - String bodyJson = getJsonBody(List.of(compositeModificationUuid), NetworkCreation.VARIANT_ID); - mvcResult = runRequestAsync(mockMvc, put("/v1/groups/" + TEST_GROUP_ID + "?action=INSERT").content(bodyJson).contentType(MediaType.APPLICATION_JSON), status().isOk()); + final String bodyJson = getJsonBodyModificationsToCopyInfos( + List.of(ModificationsToCopyInfos.builder().uuid(compositeModificationUuid).compositeName("random name").build()), + NetworkCreation.VARIANT_ID); + mvcResult = runRequestAsync(mockMvc, put("/v1/groups/" + TEST_GROUP_ID + "?action=SPLIT_COMPOSITE").content(bodyJson).contentType(MediaType.APPLICATION_JSON), status().isOk()); assertApplicationStatusOK(mvcResult); @@ -861,6 +881,27 @@ void testNetworkCompositeModification() throws Exception { List newModificationUuidList = newModificationList.stream().map(ModificationInfos::getUuid).toList(); assertEquals(modificationUuids.get(0), newModificationUuidList.get(0)); assertThat(modificationList.get(0)).recursivelyEquals(newModificationList.get(modificationsNumber)); + + // insert the same composite modification inside the same group but this time as a complete composite, not split into regular network modifications + mvcResult = runRequestAsync( + mockMvc, + put("/v1/groups/" + TEST_GROUP_ID + "?action=INSERT_COMPOSITE") + .content(bodyJson).contentType(MediaType.APPLICATION_JSON), status().isOk() + ); + assertApplicationStatusOK(mvcResult); + newModificationList = modificationRepository.getModifications(TEST_GROUP_ID, false, true); + assertEquals(modificationsNumber * 2 + 1, newModificationList.size()); + CompositeModificationInfos insertedComposite = (CompositeModificationInfos) newModificationList.stream().filter(modificationInfos -> + modificationInfos.getType().equals(COMPOSITE_MODIFICATION)).findFirst().orElseThrow(); + assertNotNull(insertedComposite); + checkCompositeModificationContent(insertedComposite.getModifications()); + } + + private static void checkCompositeModificationContent(List compositeModificationContent) { + assertEquals("open", ((EquipmentAttributeModificationInfos) compositeModificationContent.getFirst()).getEquipmentAttributeName()); + assertEquals(Boolean.TRUE, ((EquipmentAttributeModificationInfos) compositeModificationContent.getFirst()).getEquipmentAttributeValue()); + assertEquals(IdentifiableType.SWITCH, ((EquipmentAttributeModificationInfos) compositeModificationContent.getFirst()).getEquipmentType()); + assertEquals("v1b1", ((EquipmentAttributeModificationInfos) compositeModificationContent.getFirst()).getEquipmentId()); } /** @@ -903,13 +944,12 @@ void testNetworkCompositeModificationOld() throws Exception { mvcResult = mockMvc.perform(get(URI_GET_COMPOSITE_NETWORK_MODIF_CONTENT + "/network-modifications?uuids={id}&onlyMetadata=false", compositeModificationUuid)) .andExpect(status().isOk()).andReturn(); compositeModificationContent = mapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); - assertEquals("open", ((EquipmentAttributeModificationInfos) compositeModificationContent.get(0)).getEquipmentAttributeName()); - assertEquals(Boolean.TRUE, ((EquipmentAttributeModificationInfos) compositeModificationContent.get(0)).getEquipmentAttributeValue()); - assertEquals(IdentifiableType.SWITCH, ((EquipmentAttributeModificationInfos) compositeModificationContent.get(0)).getEquipmentType()); - assertEquals("v1b1", ((EquipmentAttributeModificationInfos) compositeModificationContent.get(0)).getEquipmentId()); - String bodyJson = getJsonBody(List.of(compositeModificationUuid), NetworkCreation.VARIANT_ID); + checkCompositeModificationContent(compositeModificationContent); + final String bodyJson = getJsonBodyModificationsToCopyInfos( + List.of(ModificationsToCopyInfos.builder().uuid(compositeModificationUuid).build()), + NetworkCreation.VARIANT_ID); // Insert the composite modification in the group - mvcResult = runRequestAsync(mockMvc, put("/v1/groups/" + TEST_GROUP_ID + "?action=INSERT").content(bodyJson).contentType(MediaType.APPLICATION_JSON), status().isOk()); + mvcResult = runRequestAsync(mockMvc, put("/v1/groups/" + TEST_GROUP_ID + "?action=SPLIT_COMPOSITE").content(bodyJson).contentType(MediaType.APPLICATION_JSON), status().isOk()); assertApplicationStatusOK(mvcResult); @@ -937,7 +977,9 @@ void testMoveModificationBetweenTwoGroups() throws Exception { // cut origin[0] and append to destination List movingModificationUuidList = List.of(originSingleModification); - String bodyJson = getJsonBody(movingModificationUuidList, NetworkCreation.VARIANT_ID); + List movingModificationList = movingModificationUuidList.stream().map( + uuid -> ModificationsToCopyInfos.builder().uuid(uuid).build()).toList(); + String bodyJson = getJsonBodyModificationsToCopyInfos(movingModificationList, NetworkCreation.VARIANT_ID); String url = "/v1/groups/" + TEST_GROUP_ID + "?action=MOVE" + "&originGroupUuid=" + TEST_GROUP2_ID + "&build=true"; MvcResult mvcResult = runRequestAsync(mockMvc, put(url).content(bodyJson).contentType(MediaType.APPLICATION_JSON), status().isOk()); @@ -975,8 +1017,8 @@ void testMoveModificationWithUnexistingId() throws Exception { stream().map(ModificationInfos::getUuid).collect(Collectors.toList()); // try to move an unexisting modification before [0]: no error, no change - List movingModificationUuidList = List.of(UUID.randomUUID()); - String bodyJson = getJsonBody(movingModificationUuidList, NetworkCreation.VARIANT_ID); + List movingModificationList = List.of(ModificationsToCopyInfos.builder().uuid(UUID.randomUUID()).build()); + String bodyJson = getJsonBodyModificationsToCopyInfos(movingModificationList, NetworkCreation.VARIANT_ID); String url = "/v1/groups/" + TEST_GROUP_ID + "?action=MOVE" + "&originGroupUuid=" + TEST_GROUP_ID + "&before=" + modificationUuidList.get(0); mockMvc.perform(put(url).content(bodyJson) diff --git a/src/test/java/org/gridsuite/modification/server/modifications/AbstractNetworkModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/AbstractNetworkModificationTest.java index 2a251dfa0..ee5bf3a8d 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/AbstractNetworkModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/AbstractNetworkModificationTest.java @@ -17,6 +17,7 @@ import com.powsybl.network.store.client.PreloadingStrategy; import com.powsybl.network.store.iidm.impl.NetworkImpl; import org.gridsuite.modification.dto.ModificationInfos; +import org.gridsuite.modification.dto.ModificationsToCopyInfos; import org.gridsuite.modification.server.dto.NetworkModificationResult; import org.gridsuite.modification.server.dto.NetworkModificationsResult; import org.gridsuite.modification.server.entities.ModificationEntity; @@ -46,6 +47,7 @@ import java.util.stream.Collectors; import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; +import static org.gridsuite.modification.server.utils.TestUtils.getJsonBodyModificationsToCopyInfos; import static org.gridsuite.modification.server.utils.assertions.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; @@ -246,7 +248,11 @@ public void testCopy() throws Exception { ModificationInfos modificationToCopy = buildModification(); UUID modificationUuid = saveModification(modificationToCopy); - String body = TestUtils.getJsonBody(List.of(modificationUuid), AbstractNetworkModificationTest.TEST_NETWORK_ID, null); + + final String body = getJsonBodyModificationsToCopyInfos( + List.of(ModificationsToCopyInfos.builder().uuid(modificationUuid).build()), + AbstractNetworkModificationTest.TEST_NETWORK_ID, + null); ResultActions mockMvcResultActions = mockMvc.perform(put(URI_NETWORK_MODIF_COPY) .content(body) .contentType(MediaType.APPLICATION_JSON)) diff --git a/src/test/java/org/gridsuite/modification/server/service/ModificationIndexationTest.java b/src/test/java/org/gridsuite/modification/server/service/ModificationIndexationTest.java index 9b8e88385..b69352209 100644 --- a/src/test/java/org/gridsuite/modification/server/service/ModificationIndexationTest.java +++ b/src/test/java/org/gridsuite/modification/server/service/ModificationIndexationTest.java @@ -304,10 +304,10 @@ void testInsertCompositeModifications() { ((NetworkImpl) networkInfos.getNetwork()).getListeners().clear(); /* - Insert as composite this modification to group 2, variant 2 + Split this composite and insert the contained modifications to group 2, variant 2 */ UUID groupUuid2 = UUID.randomUUID(); - NetworkModificationsResult modificationsResult = networkModificationService.insertCompositeModifications( + NetworkModificationsResult modificationsResult = networkModificationService.splitCompositeModifications( groupUuid2, List.of(compositeUuid), List.of(new ModificationApplicationContext(networkInfos.getNetworkUuuid(), variant2, UUID.randomUUID(), UUID.randomUUID())) diff --git a/src/test/java/org/gridsuite/modification/server/utils/ApiUtils.java b/src/test/java/org/gridsuite/modification/server/utils/ApiUtils.java index 303145416..3e34eedb1 100644 --- a/src/test/java/org/gridsuite/modification/server/utils/ApiUtils.java +++ b/src/test/java/org/gridsuite/modification/server/utils/ApiUtils.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.gridsuite.modification.dto.ModificationInfos; +import org.gridsuite.modification.dto.ModificationsToCopyInfos; import org.gridsuite.modification.server.dto.ModificationApplicationContext; import org.gridsuite.modification.server.dto.NetworkModificationResult; import org.gridsuite.modification.server.dto.NetworkModificationsResult; @@ -76,7 +77,10 @@ public static Optional putGroupsDuplications(MockMvc public static NetworkModificationsResult putGroupsWithCopy(MockMvc mockMvc, UUID targetGroupUuid, List modificationUuids, UUID networkUuid) throws Exception { ModificationApplicationContext applicationContext = new ModificationApplicationContext(networkUuid, UUID.randomUUID().toString(), UUID.randomUUID(), UUID.randomUUID(), Set.of()); - String body = getObjectMapper().writeValueAsString(org.springframework.data.util.Pair.of(modificationUuids, List.of(applicationContext))); + + List modifications = modificationUuids.stream().map( + uuid -> ModificationsToCopyInfos.builder().uuid(uuid).build()).toList(); + String body = getObjectMapper().writeValueAsString(org.springframework.data.util.Pair.of(modifications, List.of(applicationContext))); ResultActions mockMvcResultActions = mockMvc.perform( put("/v1/groups/{groupUuid}", targetGroupUuid) diff --git a/src/test/java/org/gridsuite/modification/server/utils/TestUtils.java b/src/test/java/org/gridsuite/modification/server/utils/TestUtils.java index 4f98bd04b..4dc31289b 100644 --- a/src/test/java/org/gridsuite/modification/server/utils/TestUtils.java +++ b/src/test/java/org/gridsuite/modification/server/utils/TestUtils.java @@ -21,6 +21,7 @@ import mockwebserver3.MockWebServer; import org.apache.commons.text.StringSubstitutor; import org.gridsuite.modification.dto.ModificationInfos; +import org.gridsuite.modification.dto.ModificationsToCopyInfos; import org.gridsuite.modification.server.dto.*; import org.gridsuite.modification.server.modifications.NetworkModificationApplicator; import org.gridsuite.modification.server.service.ReportService; @@ -226,6 +227,10 @@ public static String getJsonBody(List uuids, UUID networkUuid, String vari return createJsonPayload(uuids, networkUuid, variantId); } + public static String getJsonBodyModificationsToCopyInfos(List modifs, UUID networkUuid, String variantId) throws JsonProcessingException { + return createJsonPayload(modifs, networkUuid, variantId); + } + private static ObjectMapper getObjectMapper() { return new ObjectMapper().registerModule(new JavaTimeModule()); }