From 4bb3526a4171cae10de2e5497d41aa95b61a4196 Mon Sep 17 00:00:00 2001 From: Slimane AMAR Date: Tue, 28 Apr 2026 17:09:58 +0200 Subject: [PATCH 01/26] Add a modification reference as a new modification type --- .../server/entities/EntityRegistry.java | 2 + .../entities/ModificationReferenceEntity.java | 70 ++++++++++++++++++ ...odificationTypeWithPreloadingStrategy.java | 3 +- .../NetworkModificationRepository.java | 34 +++++++-- .../changesets/changelog_20260424T113143Z.xml | 15 ++++ .../db/changelog/db.changelog-master.yaml | 3 + .../server/ModificationControllerTest.java | 29 ++++++++ .../ModificationReferenceTest.java | 72 +++++++++++++++++++ 8 files changed, 221 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/gridsuite/modification/server/entities/ModificationReferenceEntity.java create mode 100644 src/main/resources/db/changelog/changesets/changelog_20260424T113143Z.xml create mode 100644 src/test/java/org/gridsuite/modification/server/modifications/ModificationReferenceTest.java diff --git a/src/main/java/org/gridsuite/modification/server/entities/EntityRegistry.java b/src/main/java/org/gridsuite/modification/server/entities/EntityRegistry.java index ae45b7142..51b1e0204 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/EntityRegistry.java +++ b/src/main/java/org/gridsuite/modification/server/entities/EntityRegistry.java @@ -110,6 +110,8 @@ private EntityRegistry() { registerAttribute(Integer.class, IntegerEquipmentAttributeModificationEntity.class); registerAttribute(Float.class, FloatEquipmentAttributeModificationEntity.class); registerAttribute(Double.class, DoubleEquipmentAttributeModificationEntity.class); + + register(ModificationReferenceInfos.class, ModificationReferenceEntity.class); } public static void register(Class dtoClass, Class entityClass) { diff --git a/src/main/java/org/gridsuite/modification/server/entities/ModificationReferenceEntity.java b/src/main/java/org/gridsuite/modification/server/entities/ModificationReferenceEntity.java new file mode 100644 index 000000000..72ad4ed93 --- /dev/null +++ b/src/main/java/org/gridsuite/modification/server/entities/ModificationReferenceEntity.java @@ -0,0 +1,70 @@ +/* + Copyright (c) 2026, 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.entities; + +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.persistence.*; +import lombok.*; +import org.gridsuite.modification.dto.ModificationInfos; +import org.gridsuite.modification.dto.ModificationReferenceInfos; + +import java.util.UUID; + +/** + * @author Slimane Amar + */ +@NoArgsConstructor +@Getter +@Setter +@Entity +@Table(name = "modification_reference") +@PrimaryKeyJoinColumn(foreignKey = @ForeignKey(name = "modification_reference_id_fk_constraint")) +public class ModificationReferenceEntity extends ModificationEntity { + + @Column(name = "referenceId") + UUID referenceId; + + @Column(name = "referenceType") + String referenceType; + + // Transient just for optimization purpose + @Transient + private ModificationInfos referenceInfos; + + public ModificationReferenceEntity(@NonNull ModificationReferenceInfos modificationReferenceInfos) { + super(modificationReferenceInfos); + assignAttributes(modificationReferenceInfos); + } + + @Override + public ModificationReferenceInfos toModificationInfos() { + return ModificationReferenceInfos.builder() + .uuid(getId()) + .activated(getActivated()) + .description(getDescription()) + .date(getDate()) + .stashed(getStashed()) + .referenceId(getReferenceId()) + .referenceType(ModificationReferenceInfos.Type.valueOf(getReferenceType())) + .referenceInfos(getReferenceInfos()) + .build(); + } + + @SneakyThrows + private void assignAttributes(ModificationReferenceInfos modificationReferenceInfos) { + this.referenceType = modificationReferenceInfos.getReferenceType().name(); + this.referenceId = modificationReferenceInfos.getReferenceId(); + + // appears as the referenced modification + this.setMessageType(modificationReferenceInfos.getReferenceInfos().getMessageType()); + this.setMessageValues(new ObjectMapper().writeValueAsString(modificationReferenceInfos.getReferenceInfos().getMapMessageValues())); + + // Transient just for optimization purpose + // No need to load the referenced modification + this.referenceInfos = modificationReferenceInfos.getReferenceInfos(); + } +} diff --git a/src/main/java/org/gridsuite/modification/server/modifications/ModificationTypeWithPreloadingStrategy.java b/src/main/java/org/gridsuite/modification/server/modifications/ModificationTypeWithPreloadingStrategy.java index 57d547010..512a1eef1 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/ModificationTypeWithPreloadingStrategy.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/ModificationTypeWithPreloadingStrategy.java @@ -68,7 +68,8 @@ public enum ModificationTypeWithPreloadingStrategy { CREATE_VOLTAGE_LEVEL_TOPOLOGY(ModificationType.CREATE_VOLTAGE_LEVEL_TOPOLOGY, PreloadingStrategy.NONE), LIMIT_SETS_TABULAR_MODIFICATION(ModificationType.LIMIT_SETS_TABULAR_MODIFICATION, PreloadingStrategy.COLLECTION), CREATE_VOLTAGE_LEVEL_SECTION(ModificationType.CREATE_VOLTAGE_LEVEL_SECTION, PreloadingStrategy.NONE), - MOVE_VOLTAGE_LEVEL_FEEDER_BAYS(ModificationType.MOVE_VOLTAGE_LEVEL_FEEDER_BAYS, PreloadingStrategy.NONE); + MOVE_VOLTAGE_LEVEL_FEEDER_BAYS(ModificationType.MOVE_VOLTAGE_LEVEL_FEEDER_BAYS, PreloadingStrategy.NONE), + MODIFICATION_REFERENCE(ModificationType.MODIFICATION_REFERENCE, PreloadingStrategy.COLLECTION); private final ModificationType type; private final PreloadingStrategy strategy; 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 2688c875d..558bb641c 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -11,11 +11,19 @@ import org.apache.commons.collections4.CollectionUtils; import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.NetworkModificationException; -import org.gridsuite.modification.dto.*; -import org.gridsuite.modification.dto.tabular.*; +import org.gridsuite.modification.dto.CompositeModificationInfos; +import org.gridsuite.modification.dto.ModificationInfos; +import org.gridsuite.modification.dto.ModificationReferenceInfos; +import org.gridsuite.modification.dto.tabular.LimitSetsTabularModificationInfos; +import org.gridsuite.modification.dto.tabular.TabularBaseInfos; +import org.gridsuite.modification.dto.tabular.TabularCreationInfos; +import org.gridsuite.modification.dto.tabular.TabularModificationInfos; import org.gridsuite.modification.server.dto.ModificationMetadata; import org.gridsuite.modification.server.elasticsearch.ModificationApplicationInfosService; -import org.gridsuite.modification.server.entities.*; +import org.gridsuite.modification.server.entities.CompositeModificationEntity; +import org.gridsuite.modification.server.entities.ModificationEntity; +import org.gridsuite.modification.server.entities.ModificationGroupEntity; +import org.gridsuite.modification.server.entities.ModificationReferenceEntity; import org.gridsuite.modification.server.entities.equipment.modification.EquipmentModificationEntity; import org.gridsuite.modification.server.entities.tabular.TabularModificationsEntity; import org.gridsuite.modification.server.entities.tabular.TabularPropertyEntity; @@ -131,10 +139,8 @@ public List saveModificationInfos(UUID groupUuid, List saveModificationInfosNonTransactional(UUID groupUuid, - List modifications) { + private List saveModificationInfosNonTransactional(UUID groupUuid, List modifications) { List entities = modifications.stream().map(ModificationEntity::fromDTO).toList(); - return saveModificationsNonTransactional(groupUuid, entities); } @@ -473,6 +479,19 @@ private CompositeModificationInfos loadCompositeModificationMetadata(Modificatio .build(); } + private ModificationReferenceInfos loadModificationReference(ModificationReferenceEntity modificationEntity) { + return ModificationReferenceInfos.builder() + .uuid(modificationEntity.getId()) + .activated(modificationEntity.getActivated()) + .description(modificationEntity.getDescription()) + .date(modificationEntity.getDate()) + .stashed(modificationEntity.getStashed()) + .referenceId(modificationEntity.getReferenceId()) + .referenceType(ModificationReferenceInfos.Type.valueOf(modificationEntity.getReferenceType())) + .referenceInfos(toModificationsInfosOptimized(modificationRepository.getReferenceById(modificationEntity.getReferenceId()))) + .build(); + } + private ModificationInfos toModificationsInfosOptimized(ModificationEntity modificationEntity) { return toModificationsInfosOptimized(modificationEntity, Set.of(), Map.of()); } @@ -495,6 +514,9 @@ private ModificationInfos toModificationsInfosOptimized(ModificationEntity modif if (modificationEntity instanceof TabularModificationsEntity tabularEntity) { return loadTabularModification(tabularEntity); } + if (modificationEntity instanceof ModificationReferenceEntity referenceEntity) { + return loadModificationReference(referenceEntity); + } return modificationEntity.toModificationInfos(); } diff --git a/src/main/resources/db/changelog/changesets/changelog_20260424T113143Z.xml b/src/main/resources/db/changelog/changesets/changelog_20260424T113143Z.xml new file mode 100644 index 000000000..ad2ac2887 --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20260424T113143Z.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 900da3e04..5d69d5c48 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -471,3 +471,6 @@ databaseChangeLog: - include: file: changesets/changelog_20260415T134200Z.xml relativeToChangelogFile: true + - include: + file: changesets/changelog_20260424T113143Z.xml + relativeToChangelogFile: true \ No newline at end of file diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index df217fd73..94e1d7e8c 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -31,6 +31,7 @@ import org.gridsuite.modification.server.elasticsearch.EquipmentInfosRepository; import org.gridsuite.modification.server.elasticsearch.EquipmentInfosService; import org.gridsuite.modification.server.elasticsearch.TombstonedEquipmentInfosRepository; +import org.gridsuite.modification.server.entities.ModificationEntity; import org.gridsuite.modification.server.impacts.AbstractBaseImpact; import org.gridsuite.modification.server.impacts.SimpleElementImpact; import org.gridsuite.modification.server.impacts.TestImpactUtils; @@ -783,6 +784,34 @@ void testCopyModificationWithUnexistingId() throws Exception { assertEquals(newModificationUuidList, modificationUuidList); } + @Test + void testCopyModificationReference() throws Exception { + // Create 1 modification reference + ModificationInfos loadModificationInfo = ModificationCreation.getCreationLoad("v1", "idLoad", "nameLoad", "1.1", LoadType.UNDEFINED); + loadModificationInfo = modificationRepository.saveModifications(UUID.randomUUID(), List.of(ModificationEntity.fromDTO(loadModificationInfo))).getFirst(); + ModificationInfos modificationReferenceInfo = ModificationReferenceInfos.builder() + .referenceType(ModificationReferenceInfos.Type.SAMPLE) + .referenceId(loadModificationInfo.getUuid()) + .referenceInfos(loadModificationInfo) + .stashed(false) + .build(); + modificationReferenceInfo = modificationRepository.saveModifications(TEST_GROUP_ID, List.of(ModificationEntity.fromDTO(modificationReferenceInfo))).getFirst(); + + // Duplicate + UUID otherGroupId = UUID.randomUUID(); + String bodyJson = getJsonBody(List.of(modificationReferenceInfo.getUuid()), NetworkCreation.VARIANT_ID); + MvcResult mvcResult = runRequestAsync(mockMvc, put("/v1/groups/" + otherGroupId + "?action=COPY").content(bodyJson).contentType(MediaType.APPLICATION_JSON), status().isOk()); + assertApplicationStatusOK(mvcResult); + + // Check duplication + List originalReference = modificationRepository.getModifications(TEST_GROUP_ID, true, true); + List duplicateReference = modificationRepository.getModifications(otherGroupId, true, true); + assertEquals(1, originalReference.size()); + assertEquals(1, duplicateReference.size()); + + assertThat(originalReference.get(0)).recursivelyEquals(duplicateReference.get(0)); + } + @Test void createGeneratorWithStartup() throws Exception { // create and build generator without startup diff --git a/src/test/java/org/gridsuite/modification/server/modifications/ModificationReferenceTest.java b/src/test/java/org/gridsuite/modification/server/modifications/ModificationReferenceTest.java new file mode 100644 index 000000000..2c5a121e5 --- /dev/null +++ b/src/test/java/org/gridsuite/modification/server/modifications/ModificationReferenceTest.java @@ -0,0 +1,72 @@ +/** + * Copyright (c) 2026, 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.modifications; + +import com.powsybl.iidm.network.LoadType; +import com.powsybl.iidm.network.Network; +import org.gridsuite.modification.ModificationType; +import org.gridsuite.modification.dto.ModificationInfos; +import org.gridsuite.modification.dto.ModificationReferenceInfos; +import org.gridsuite.modification.server.entities.ModificationEntity; +import org.gridsuite.modification.server.utils.ModificationCreation; +import org.gridsuite.modification.server.utils.NetworkCreation; +import org.junit.jupiter.api.Tag; + +import java.util.List; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +/** + * @author Slimane Amar + */ +@Tag("IntegrationTest") +class ModificationReferenceTest extends AbstractNetworkModificationTest { + + @Override + protected Network createNetwork(UUID networkUuid) { + return NetworkCreation.create(networkUuid, false); + } + + @Override + protected ModificationInfos buildModification() { + ModificationInfos modificationInfo = ModificationCreation.getCreationLoad("v1", "idLoad", "nameLoad", "1.1", LoadType.UNDEFINED); + modificationInfo = networkModificationRepository.saveModifications(UUID.randomUUID(), List.of(ModificationEntity.fromDTO(modificationInfo))).getFirst(); + return ModificationReferenceInfos.builder() + .referenceType(ModificationReferenceInfos.Type.SAMPLE) + .referenceId(modificationInfo.getUuid()) + .referenceInfos(modificationInfo) + .stashed(false) + .build(); + } + + @Override + protected ModificationInfos buildModificationUpdate() { + return buildModification(); + } + + @Override + protected void assertAfterNetworkModificationCreation() { + assertNotNull(getNetwork().getLoad("idLoad")); + } + + @Override + protected void assertAfterNetworkModificationDeletion() { + assertNull(getNetwork().getLoad("idLoad")); + } + + @Override + protected void testCreationModificationMessage(ModificationInfos modificationInfos) throws Exception { + assertNotNull(ModificationType.COMPOSITE_MODIFICATION.name(), modificationInfos.getMessageType()); + } + + @Override + protected void testUpdateModificationMessage(ModificationInfos modificationInfos) throws Exception { + assertNotNull(ModificationType.COMPOSITE_MODIFICATION.name(), modificationInfos.getMessageType()); + } +} From b492fc1a65ae0259cc03eef0f86acd28a0308bd9 Mon Sep 17 00:00:00 2001 From: Slimane AMAR Date: Wed, 29 Apr 2026 14:51:15 +0200 Subject: [PATCH 02/26] Sonar issues --- .../entities/ModificationReferenceEntity.java | 18 ++++++++++---- .../NetworkModificationRepository.java | 9 ++++++- .../changesets/changelog_20260424T113143Z.xml | 8 +++++-- .../ModificationReferenceTest.java | 24 ++++++++++++------- 4 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/entities/ModificationReferenceEntity.java b/src/main/java/org/gridsuite/modification/server/entities/ModificationReferenceEntity.java index 72ad4ed93..354ea0c09 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/ModificationReferenceEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/ModificationReferenceEntity.java @@ -6,7 +6,6 @@ */ package org.gridsuite.modification.server.entities; -import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.persistence.*; import lombok.*; import org.gridsuite.modification.dto.ModificationInfos; @@ -44,6 +43,8 @@ public ModificationReferenceEntity(@NonNull ModificationReferenceInfos modificat public ModificationReferenceInfos toModificationInfos() { return ModificationReferenceInfos.builder() .uuid(getId()) + .messageType(getMessageType()) + .messageValues(getMessageValues()) .activated(getActivated()) .description(getDescription()) .date(getDate()) @@ -54,14 +55,23 @@ public ModificationReferenceInfos toModificationInfos() { .build(); } + @Override + // Perhaps we should not allow updating reference info (recreating is better) + public void update(@NonNull ModificationInfos modificationInfos) { + super.update(modificationInfos); + assignAttributes((ModificationReferenceInfos) modificationInfos); + } + @SneakyThrows private void assignAttributes(ModificationReferenceInfos modificationReferenceInfos) { + modificationReferenceInfos.check(); + this.referenceType = modificationReferenceInfos.getReferenceType().name(); this.referenceId = modificationReferenceInfos.getReferenceId(); - // appears as the referenced modification - this.setMessageType(modificationReferenceInfos.getReferenceInfos().getMessageType()); - this.setMessageValues(new ObjectMapper().writeValueAsString(modificationReferenceInfos.getReferenceInfos().getMapMessageValues())); + // Appears as the referenced modification + this.setMessageType(modificationReferenceInfos.getMessageType()); + this.setMessageValues(modificationReferenceInfos.getMessageValues()); // Transient just for optimization purpose // No need to load the referenced modification 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 f1122d29c..1b41af045 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -27,6 +27,7 @@ import org.gridsuite.modification.server.entities.equipment.modification.EquipmentModificationEntity; import org.gridsuite.modification.server.entities.tabular.TabularModificationsEntity; import org.gridsuite.modification.server.entities.tabular.TabularPropertyEntity; +import org.gridsuite.modification.server.service.DirectoryService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.util.Pair; @@ -487,15 +488,21 @@ private CompositeModificationInfos loadCompositeModificationMetadata(Modificatio } private ModificationReferenceInfos loadModificationReference(ModificationReferenceEntity modificationEntity) { + ModificationEntity referencedEntity = modificationRepository.getReferenceById(modificationEntity.getReferenceId()); + if (referencedEntity == null) { + throw new NetworkModificationException(MODIFICATION_NOT_FOUND, String.format(MODIFICATION_NOT_FOUND_MESSAGE, modificationEntity.getReferenceId())); + } return ModificationReferenceInfos.builder() .uuid(modificationEntity.getId()) + .messageType(modificationEntity.getMessageType()) + .messageValues(modificationEntity.getMessageValues()) .activated(modificationEntity.getActivated()) .description(modificationEntity.getDescription()) .date(modificationEntity.getDate()) .stashed(modificationEntity.getStashed()) .referenceId(modificationEntity.getReferenceId()) .referenceType(ModificationReferenceInfos.Type.valueOf(modificationEntity.getReferenceType())) - .referenceInfos(toModificationsInfosOptimized(modificationRepository.getReferenceById(modificationEntity.getReferenceId()))) + .referenceInfos(toModificationsInfosOptimized(referencedEntity)) .build(); } diff --git a/src/main/resources/db/changelog/changesets/changelog_20260424T113143Z.xml b/src/main/resources/db/changelog/changesets/changelog_20260424T113143Z.xml index ad2ac2887..5c8cbb5cd 100644 --- a/src/main/resources/db/changelog/changesets/changelog_20260424T113143Z.xml +++ b/src/main/resources/db/changelog/changesets/changelog_20260424T113143Z.xml @@ -2,8 +2,12 @@ - - + + + + + + diff --git a/src/test/java/org/gridsuite/modification/server/modifications/ModificationReferenceTest.java b/src/test/java/org/gridsuite/modification/server/modifications/ModificationReferenceTest.java index 2c5a121e5..0be28594b 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/ModificationReferenceTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/ModificationReferenceTest.java @@ -12,15 +12,16 @@ import org.gridsuite.modification.dto.ModificationInfos; import org.gridsuite.modification.dto.ModificationReferenceInfos; import org.gridsuite.modification.server.entities.ModificationEntity; +import org.gridsuite.modification.server.repositories.ModificationRepository; import org.gridsuite.modification.server.utils.ModificationCreation; import org.gridsuite.modification.server.utils.NetworkCreation; import org.junit.jupiter.api.Tag; +import org.springframework.beans.factory.annotation.Autowired; import java.util.List; import java.util.UUID; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.*; /** * @author Slimane Amar @@ -28,6 +29,9 @@ @Tag("IntegrationTest") class ModificationReferenceTest extends AbstractNetworkModificationTest { + @Autowired + protected ModificationRepository modificationRepository; + @Override protected Network createNetwork(UUID networkUuid) { return NetworkCreation.create(networkUuid, false); @@ -35,12 +39,16 @@ protected Network createNetwork(UUID networkUuid) { @Override protected ModificationInfos buildModification() { - ModificationInfos modificationInfo = ModificationCreation.getCreationLoad("v1", "idLoad", "nameLoad", "1.1", LoadType.UNDEFINED); - modificationInfo = networkModificationRepository.saveModifications(UUID.randomUUID(), List.of(ModificationEntity.fromDTO(modificationInfo))).getFirst(); + ModificationInfos loadInfo = ModificationCreation.getCreationLoad("v1", "idLoad", "nameLoad", "1.1", LoadType.UNDEFINED); + ModificationEntity loadEntity = modificationRepository.save(ModificationEntity.fromDTO(loadInfo)); + ModificationInfos loadMetadataInfo = modificationRepository.findBaseDataByIdIn(List.of(loadEntity.getId())).getFirst().toModificationInfos(); + return ModificationReferenceInfos.builder() + .messageType(loadMetadataInfo.getMessageType()) + .messageValues(loadMetadataInfo.getMessageValues()) .referenceType(ModificationReferenceInfos.Type.SAMPLE) - .referenceId(modificationInfo.getUuid()) - .referenceInfos(modificationInfo) + .referenceId(loadMetadataInfo.getUuid()) + .referenceInfos(loadInfo) .stashed(false) .build(); } @@ -62,11 +70,11 @@ protected void assertAfterNetworkModificationDeletion() { @Override protected void testCreationModificationMessage(ModificationInfos modificationInfos) throws Exception { - assertNotNull(ModificationType.COMPOSITE_MODIFICATION.name(), modificationInfos.getMessageType()); + assertEquals(ModificationType.LOAD_CREATION.name(), modificationInfos.getMessageType()); } @Override protected void testUpdateModificationMessage(ModificationInfos modificationInfos) throws Exception { - assertNotNull(ModificationType.COMPOSITE_MODIFICATION.name(), modificationInfos.getMessageType()); + assertEquals(ModificationType.LOAD_CREATION.name(), modificationInfos.getMessageType()); } } From a1c1e0ba5023d3715cc5dd9a17c3dba1366e0ea7 Mon Sep 17 00:00:00 2001 From: Slimane AMAR Date: Wed, 29 Apr 2026 15:05:43 +0200 Subject: [PATCH 03/26] Sonar issues --- .../server/repositories/NetworkModificationRepository.java | 1 - 1 file changed, 1 deletion(-) 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 1b41af045..e6fd6a2ce 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -27,7 +27,6 @@ import org.gridsuite.modification.server.entities.equipment.modification.EquipmentModificationEntity; import org.gridsuite.modification.server.entities.tabular.TabularModificationsEntity; import org.gridsuite.modification.server.entities.tabular.TabularPropertyEntity; -import org.gridsuite.modification.server.service.DirectoryService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.util.Pair; From 9bdc3f5c721bcf38cfbeb380a617f3082daecf1d Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Fri, 5 Jun 2026 12:18:12 +0200 Subject: [PATCH 04/26] import shared composites Signed-off-by: Mathieu DEHARBE --- pom.xml | 2 +- .../modification/server/CompositeController.java | 3 ++- .../server/dto/CompositesToBeInserted.java | 14 ++++++++++++++ .../NetworkModificationRepository.java | 15 ++++++++------- .../service/NetworkModificationService.java | 7 ++++--- .../service/ModificationIndexationTest.java | 4 ++-- 6 files changed, 31 insertions(+), 14 deletions(-) create mode 100644 src/main/java/org/gridsuite/modification/server/dto/CompositesToBeInserted.java diff --git a/pom.xml b/pom.xml index 9bc27e702..ca8aba898 100644 --- a/pom.xml +++ b/pom.xml @@ -53,7 +53,7 @@ gridsuite org.gridsuite:network-modification-server - 0.86.0 + 0.87.0-SNAPSHOT diff --git a/src/main/java/org/gridsuite/modification/server/CompositeController.java b/src/main/java/org/gridsuite/modification/server/CompositeController.java index 89fd56789..e62f8b7ec 100644 --- a/src/main/java/org/gridsuite/modification/server/CompositeController.java +++ b/src/main/java/org/gridsuite/modification/server/CompositeController.java @@ -11,6 +11,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; +import org.gridsuite.modification.server.dto.CompositesToBeInserted; import org.gridsuite.modification.dto.ModificationInfos; import org.gridsuite.modification.server.dto.ModificationApplicationContext; import org.gridsuite.modification.server.dto.NetworkModificationsResult; @@ -50,7 +51,7 @@ public CompositeController(NetworkModificationService networkModificationService public CompletableFuture> insertCompositeModifications( @Parameter(description = "updated group UUID, where modifications are inserted") @PathVariable("groupUuid") UUID targetGroupUuid, @Parameter(description = "Insertion method", required = true) @RequestParam(value = "action") CompositeModificationAction action, - @RequestBody Pair>, List> modificationContextInfos) { + @RequestBody Pair, List> modificationContextInfos) { return switch (action) { case SPLIT -> networkModificationService.splitCompositeModifications( targetGroupUuid, diff --git a/src/main/java/org/gridsuite/modification/server/dto/CompositesToBeInserted.java b/src/main/java/org/gridsuite/modification/server/dto/CompositesToBeInserted.java new file mode 100644 index 000000000..8396644b6 --- /dev/null +++ b/src/main/java/org/gridsuite/modification/server/dto/CompositesToBeInserted.java @@ -0,0 +1,14 @@ +/* + Copyright (c) 2026, 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.UUID; + +/** + * @author Mathieu Deharbe + */ +public record CompositesToBeInserted(UUID id, String name, boolean isShared) { } 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 79953ecd0..7f362f5aa 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -12,6 +12,7 @@ import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.NetworkModificationException; import org.gridsuite.modification.dto.CompositeModificationInfos; +import org.gridsuite.modification.server.dto.CompositesToBeInserted; import org.gridsuite.modification.dto.ModificationInfos; import org.gridsuite.modification.dto.ModificationReferenceInfos; import org.gridsuite.modification.dto.tabular.LimitSetsTabularModificationInfos; @@ -29,7 +30,6 @@ import org.gridsuite.modification.server.entities.tabular.TabularPropertyEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.data.util.Pair; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @@ -917,20 +917,21 @@ public List extractModificationsFromCompositesAndSave(@NonNul @Transactional public List insertCompositeModifications( @NonNull UUID targetGroupUuid, - @NonNull List> compositesUuidName) { - List compositeUuids = compositesUuidName.stream().map(Pair::getFirst).toList(); + @NonNull List compositesToBeInserted) { + List compositeUuids = compositesToBeInserted.stream().map(CompositesToBeInserted::id).toList(); List newCompositeModifications = new ArrayList<>(); List modificationInfos = getModificationsInfosNonTransactional(compositeUuids); // apply the new composite name to the corresponding composite modifications - for (Pair compositeUuidName : compositesUuidName) { + for (CompositesToBeInserted compositeToBeInserted : compositesToBeInserted) { + // TODO : ici prendre en compte isShared et créer une composite modification partagée CompositeModificationInfos newCompositeModification = (CompositeModificationInfos) modificationInfos.stream() - .filter(modif -> modif.getUuid().equals(compositeUuidName.getFirst())) + .filter(modif -> modif.getUuid().equals(compositeToBeInserted.id())) .findFirst().orElse(null); if (newCompositeModification != null) { - newCompositeModification.setName(compositeUuidName.getSecond()); + newCompositeModification.setName(compositeToBeInserted.name()); newCompositeModifications.add(newCompositeModification); } else { - LOGGER.error("Could not find composite modification with uuid {} to apply its name {}", compositeUuidName.getFirst(), compositeUuidName.getSecond()); + LOGGER.error("Could not find composite modification with uuid {} to apply its name {}", compositeToBeInserted.id(), compositeToBeInserted.name()); } } List newEntities = saveModificationInfosNonTransactional(targetGroupUuid, newCompositeModifications); 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 bfcfb47b4..cda2b9f0c 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.filter.AbstractFilter; import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.NetworkModificationException; +import org.gridsuite.modification.server.dto.CompositesToBeInserted; import org.gridsuite.modification.dto.EquipmentModificationInfos; import org.gridsuite.modification.dto.GenerationDispatchInfos; import org.gridsuite.modification.dto.ModificationInfos; @@ -456,8 +457,8 @@ public CompletableFuture duplicateModifications(@Non */ public CompletableFuture splitCompositeModifications( @NonNull UUID targetGroupUuid, - @NonNull Pair>, List> modificationContextInfos) { - List compositesUuids = modificationContextInfos.getFirst().stream().map(Pair::getFirst).toList(); + @NonNull Pair, List> modificationContextInfos) { + List compositesUuids = modificationContextInfos.getFirst().stream().map(CompositesToBeInserted::id).toList(); List modifications = networkModificationRepository.extractModificationsFromCompositesAndSave(targetGroupUuid, compositesUuids); List ids = modifications.stream().map(ModificationInfos::getUuid).toList(); return applyModifications(targetGroupUuid, modifications, modificationContextInfos.getSecond()).thenApply(result -> @@ -466,7 +467,7 @@ public CompletableFuture splitCompositeModifications public CompletableFuture insertCompositeModifications( @NonNull UUID targetGroupUuid, - @NonNull Pair>, List> modificationContextInfos) { + @NonNull Pair, List> modificationContextInfos) { List modifications = networkModificationRepository.insertCompositeModifications( targetGroupUuid, modificationContextInfos.getFirst()); List ids = modifications.stream().map(ModificationInfos::getUuid).toList(); 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 893e13b5b..dc93bd482 100644 --- a/src/test/java/org/gridsuite/modification/server/service/ModificationIndexationTest.java +++ b/src/test/java/org/gridsuite/modification/server/service/ModificationIndexationTest.java @@ -308,8 +308,8 @@ void testInsertCompositeModifications() { Split this composite and insert the contained modifications to group 2, variant 2 */ UUID groupUuid2 = UUID.randomUUID(); - Pair>, List> modificationContextInfos = Pair.of( - List.of(Pair.of(compositeUuid, "")), + Pair, List> modificationContextInfos = Pair.of( + List.of(new CompositesToBeInserted(compositeUuid, "", false)), List.of(new ModificationApplicationContext(networkInfos.getNetworkUuuid(), variant2, UUID.randomUUID(), UUID.randomUUID())) ); NetworkModificationsResult modificationsResult = networkModificationService.splitCompositeModifications( From 6c450c801b80704ff78a05fa70360c75fee4d265 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Fri, 5 Jun 2026 15:57:20 +0200 Subject: [PATCH 05/26] import shared composites Signed-off-by: Mathieu DEHARBE --- .../entities/ModificationReferenceEntity.java | 5 +-- .../NetworkModificationRepository.java | 34 ++++++++++++++----- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/entities/ModificationReferenceEntity.java b/src/main/java/org/gridsuite/modification/server/entities/ModificationReferenceEntity.java index 354ea0c09..780d6107e 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/ModificationReferenceEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/ModificationReferenceEntity.java @@ -6,6 +6,7 @@ */ package org.gridsuite.modification.server.entities; +import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.persistence.*; import lombok.*; import org.gridsuite.modification.dto.ModificationInfos; @@ -70,8 +71,8 @@ private void assignAttributes(ModificationReferenceInfos modificationReferenceIn this.referenceId = modificationReferenceInfos.getReferenceId(); // Appears as the referenced modification - this.setMessageType(modificationReferenceInfos.getMessageType()); - this.setMessageValues(modificationReferenceInfos.getMessageValues()); + this.setMessageType(modificationReferenceInfos.getReferenceInfos().getType().name()); + this.setMessageValues(new ObjectMapper().writeValueAsString(modificationReferenceInfos.getReferenceInfos().getMapMessageValues())); // Transient just for optimization purpose // No need to load the referenced modification 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 7f362f5aa..3e19612ef 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -921,17 +921,33 @@ public List insertCompositeModifications( List compositeUuids = compositesToBeInserted.stream().map(CompositesToBeInserted::id).toList(); List newCompositeModifications = new ArrayList<>(); List modificationInfos = getModificationsInfosNonTransactional(compositeUuids); - // apply the new composite name to the corresponding composite modifications for (CompositesToBeInserted compositeToBeInserted : compositesToBeInserted) { - // TODO : ici prendre en compte isShared et créer une composite modification partagée - CompositeModificationInfos newCompositeModification = (CompositeModificationInfos) modificationInfos.stream() - .filter(modif -> modif.getUuid().equals(compositeToBeInserted.id())) - .findFirst().orElse(null); - if (newCompositeModification != null) { - newCompositeModification.setName(compositeToBeInserted.name()); - newCompositeModifications.add(newCompositeModification); + if ( compositeToBeInserted.isShared()) { + CompositeModificationInfos referencedCompositeModification = (CompositeModificationInfos) modificationInfos.stream() + .filter(modif -> modif.getUuid().equals(compositeToBeInserted.id())) + .findFirst().orElse(null); + if (referencedCompositeModification != null) { + referencedCompositeModification.setName(compositeToBeInserted.name()); + ModificationReferenceInfos newModificationReference = ModificationReferenceInfos.builder() + .referenceId(compositeToBeInserted.id()) + .referenceType(ModificationReferenceInfos.Type.SAMPLE) + .referenceInfos(referencedCompositeModification) + .build(); + newCompositeModifications.add(newModificationReference); + // TODO : ces partagées doivent être référencées dans directory-server + // puis-je appeler directement les endpoints d Slimane d'ici ?? + } } else { - LOGGER.error("Could not find composite modification with uuid {} to apply its name {}", compositeToBeInserted.id(), compositeToBeInserted.name()); + // apply the new composite name to the corresponding composite modifications + CompositeModificationInfos newCompositeModification = (CompositeModificationInfos) modificationInfos.stream() + .filter(modif -> modif.getUuid().equals(compositeToBeInserted.id())) + .findFirst().orElse(null); + if (newCompositeModification != null) { + newCompositeModification.setName(compositeToBeInserted.name()); + newCompositeModifications.add(newCompositeModification); + } else { + LOGGER.error("Could not find composite modification with uuid {} to apply its name {}", compositeToBeInserted.id(), compositeToBeInserted.name()); + } } } List newEntities = saveModificationInfosNonTransactional(targetGroupUuid, newCompositeModifications); From 25e2bc37f2a9a46841f3b5307f746242b64600aa Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Tue, 9 Jun 2026 15:26:05 +0200 Subject: [PATCH 06/26] eslint Signed-off-by: Mathieu DEHARBE --- .../server/repositories/NetworkModificationRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3e19612ef..81001cc78 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -922,7 +922,7 @@ public List insertCompositeModifications( List newCompositeModifications = new ArrayList<>(); List modificationInfos = getModificationsInfosNonTransactional(compositeUuids); for (CompositesToBeInserted compositeToBeInserted : compositesToBeInserted) { - if ( compositeToBeInserted.isShared()) { + if (compositeToBeInserted.isShared()) { CompositeModificationInfos referencedCompositeModification = (CompositeModificationInfos) modificationInfos.stream() .filter(modif -> modif.getUuid().equals(compositeToBeInserted.id())) .findFirst().orElse(null); From 2b99effde2990680d6223e8ff48381cd103f2d81 Mon Sep 17 00:00:00 2001 From: Slimane AMAR Date: Fri, 12 Jun 2026 11:14:00 +0200 Subject: [PATCH 07/26] Update reference type --- .../modification/server/ModificationControllerTest.java | 2 +- .../server/modifications/ModificationReferenceTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index f7fac794a..65ec828f5 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -800,7 +800,7 @@ void testCopyModificationReference() throws Exception { ModificationInfos loadModificationInfo = ModificationCreation.getCreationLoad("v1", "idLoad", "nameLoad", "1.1", LoadType.UNDEFINED); loadModificationInfo = modificationRepository.saveModifications(UUID.randomUUID(), List.of(ModificationEntity.fromDTO(loadModificationInfo))).getFirst(); ModificationInfos modificationReferenceInfo = ModificationReferenceInfos.builder() - .referenceType(ModificationReferenceInfos.Type.SAMPLE) + .referenceType(ModificationReferenceInfos.Type.BASIC) .referenceId(loadModificationInfo.getUuid()) .referenceInfos(loadModificationInfo) .stashed(false) diff --git a/src/test/java/org/gridsuite/modification/server/modifications/ModificationReferenceTest.java b/src/test/java/org/gridsuite/modification/server/modifications/ModificationReferenceTest.java index 0be28594b..c5cc7b897 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/ModificationReferenceTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/ModificationReferenceTest.java @@ -46,7 +46,7 @@ protected ModificationInfos buildModification() { return ModificationReferenceInfos.builder() .messageType(loadMetadataInfo.getMessageType()) .messageValues(loadMetadataInfo.getMessageValues()) - .referenceType(ModificationReferenceInfos.Type.SAMPLE) + .referenceType(ModificationReferenceInfos.Type.BASIC) .referenceId(loadMetadataInfo.getUuid()) .referenceInfos(loadInfo) .stashed(false) From 7e4e649cb003b1e322f5458ae767637825958220 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Fri, 12 Jun 2026 11:38:36 +0200 Subject: [PATCH 08/26] clean Signed-off-by: Mathieu DEHARBE --- .../server/repositories/NetworkModificationRepository.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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 72009e8a7..5401fc5a4 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -930,12 +930,10 @@ public List insertCompositeModifications( referencedCompositeModification.setName(compositeToBeInserted.name()); ModificationReferenceInfos newModificationReference = ModificationReferenceInfos.builder() .referenceId(compositeToBeInserted.id()) - .referenceType(ModificationReferenceInfos.Type.SAMPLE) + .referenceType(ModificationReferenceInfos.Type.BASIC) .referenceInfos(referencedCompositeModification) .build(); newCompositeModifications.add(newModificationReference); - // TODO : ces partagées doivent être référencées dans directory-server - // puis-je appeler directement les endpoints d Slimane d'ici ?? } } else { // apply the new composite name to the corresponding composite modifications From 94f1332007c4def8e12e526ce2a4618bab1d2cf4 Mon Sep 17 00:00:00 2001 From: Slimane AMAR Date: Fri, 12 Jun 2026 14:33:45 +0200 Subject: [PATCH 09/26] Fix get modification reference for applying --- .../NetworkModificationRepository.java | 6 ++-- .../ModificationReferenceTest.java | 30 +++++++++++++------ .../server/utils/ModificationCreation.java | 1 + 3 files changed, 24 insertions(+), 13 deletions(-) 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 af9ce3ff0..3398e6fa7 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -476,10 +476,8 @@ private CompositeModificationInfos loadCompositeModificationMetadata(Modificatio } private ModificationReferenceInfos loadModificationReference(ModificationReferenceEntity modificationEntity) { - ModificationEntity referencedEntity = modificationRepository.getReferenceById(modificationEntity.getReferenceId()); - if (referencedEntity == null) { - throw new NetworkModificationException(MODIFICATION_NOT_FOUND, String.format(MODIFICATION_NOT_FOUND_MESSAGE, modificationEntity.getReferenceId())); - } + ModificationEntity referencedEntity = modificationRepository.findAllByIdIn(List.of(modificationEntity.getReferenceId())).stream().findFirst() + .orElseThrow(() -> new NetworkModificationException(MODIFICATION_NOT_FOUND, String.format(MODIFICATION_NOT_FOUND_MESSAGE, modificationEntity.getReferenceId()))); return ModificationReferenceInfos.builder() .uuid(modificationEntity.getId()) .messageType(modificationEntity.getMessageType()) diff --git a/src/test/java/org/gridsuite/modification/server/modifications/ModificationReferenceTest.java b/src/test/java/org/gridsuite/modification/server/modifications/ModificationReferenceTest.java index c5cc7b897..5c3ce321c 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/ModificationReferenceTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/ModificationReferenceTest.java @@ -9,6 +9,7 @@ import com.powsybl.iidm.network.LoadType; import com.powsybl.iidm.network.Network; import org.gridsuite.modification.ModificationType; +import org.gridsuite.modification.dto.CompositeModificationInfos; import org.gridsuite.modification.dto.ModificationInfos; import org.gridsuite.modification.dto.ModificationReferenceInfos; import org.gridsuite.modification.server.entities.ModificationEntity; @@ -39,16 +40,16 @@ protected Network createNetwork(UUID networkUuid) { @Override protected ModificationInfos buildModification() { - ModificationInfos loadInfo = ModificationCreation.getCreationLoad("v1", "idLoad", "nameLoad", "1.1", LoadType.UNDEFINED); - ModificationEntity loadEntity = modificationRepository.save(ModificationEntity.fromDTO(loadInfo)); - ModificationInfos loadMetadataInfo = modificationRepository.findBaseDataByIdIn(List.of(loadEntity.getId())).getFirst().toModificationInfos(); + ModificationInfos compositeInfo = buildCompositeModification(); + ModificationEntity compositeEntity = modificationRepository.save(ModificationEntity.fromDTO(compositeInfo)); + ModificationInfos compositeMetadataInfo = modificationRepository.findBaseDataByIdIn(List.of(compositeEntity.getId())).getFirst().toModificationInfos(); return ModificationReferenceInfos.builder() - .messageType(loadMetadataInfo.getMessageType()) - .messageValues(loadMetadataInfo.getMessageValues()) + .messageType(compositeMetadataInfo.getMessageType()) + .messageValues(compositeMetadataInfo.getMessageValues()) .referenceType(ModificationReferenceInfos.Type.BASIC) - .referenceId(loadMetadataInfo.getUuid()) - .referenceInfos(loadInfo) + .referenceId(compositeMetadataInfo.getUuid()) + .referenceInfos(compositeInfo) .stashed(false) .build(); } @@ -70,11 +71,22 @@ protected void assertAfterNetworkModificationDeletion() { @Override protected void testCreationModificationMessage(ModificationInfos modificationInfos) throws Exception { - assertEquals(ModificationType.LOAD_CREATION.name(), modificationInfos.getMessageType()); + assertEquals(ModificationType.COMPOSITE_MODIFICATION.name(), modificationInfos.getMessageType()); } @Override protected void testUpdateModificationMessage(ModificationInfos modificationInfos) throws Exception { - assertEquals(ModificationType.LOAD_CREATION.name(), modificationInfos.getMessageType()); + assertEquals(ModificationType.COMPOSITE_MODIFICATION.name(), modificationInfos.getMessageType()); + } + + protected ModificationInfos buildCompositeModification() { + List modifications = List.of( + ModificationCreation.getCreationLoad("v1", "idLoad", "nameLoad", "1.1", LoadType.UNDEFINED) + ); + return CompositeModificationInfos.builder() + .name("composite") + .modificationsInfos(modifications) + .stashed(false) + .build(); } } diff --git a/src/test/java/org/gridsuite/modification/server/utils/ModificationCreation.java b/src/test/java/org/gridsuite/modification/server/utils/ModificationCreation.java index 42c079624..6617445c5 100644 --- a/src/test/java/org/gridsuite/modification/server/utils/ModificationCreation.java +++ b/src/test/java/org/gridsuite/modification/server/utils/ModificationCreation.java @@ -114,6 +114,7 @@ public static GeneratorModificationInfos getModificationGenerator(String generat public static LoadCreationInfos getCreationLoad(String vlId, String loadId, String loadName, String busOrBusBarSectionId, LoadType loadType) { return LoadCreationInfos.builder() .stashed(false) + .activated(true) .equipmentId(loadId) .equipmentName(loadName) .voltageLevelId(vlId) From edb9dcb8ef0b58eec8c09567be0738e1f56f18bc Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Fri, 12 Jun 2026 17:18:34 +0200 Subject: [PATCH 10/26] returns references to be updated after stash and unstash Signed-off-by: Mathieu DEHARBE --- .../server/NetworkModificationController.java | 13 ++++++---- .../NetworkModificationRepository.java | 24 +++++++++++++++++-- .../service/NetworkModificationService.java | 8 +++---- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java index d83f52ae9..df032175a 100644 --- a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java +++ b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java @@ -221,21 +221,26 @@ public ResponseEntity getOneLineTypeWithLimits(@PathVariable UUID return ResponseEntity.ok().body(test); } + /** + * @return referencesToBeUpdated : in the case of stashing those references will be deleted, in case of unstashing, those references will be recreated + */ @PutMapping(value = "/network-modifications", produces = MediaType.APPLICATION_JSON_VALUE, params = "stashed") @Operation(summary = "stash or unstash network modifications") @ApiResponse(responseCode = "200", description = "The network modifications were stashed") - public ResponseEntity stashNetworkModifications( + public ResponseEntity> stashNetworkModifications( @Parameter(description = "Network modification UUIDs") @RequestParam("uuids") List networkModificationUuids, @Parameter(description = "Group UUID") @RequestParam("groupUuid") UUID groupUuid, @Parameter(description = "stash or unstash network modifications") @RequestParam(name = "stashed", defaultValue = "true") Boolean stashed) { + Map referencesToBeUpdated; if (Boolean.TRUE.equals(stashed)) { - networkModificationService.stashNetworkModifications(groupUuid, networkModificationUuids); + referencesToBeUpdated = networkModificationService.stashNetworkModifications(groupUuid, networkModificationUuids); networkModificationService.reorderNetworkModifications(groupUuid, Boolean.FALSE); } else { - networkModificationService.restoreNetworkModifications(groupUuid, networkModificationUuids); + referencesToBeUpdated = networkModificationService.restoreNetworkModifications(groupUuid, networkModificationUuids); networkModificationService.reorderNetworkModifications(groupUuid, Boolean.TRUE); } - return ResponseEntity.ok().build(); + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON) + .body(referencesToBeUpdated); } @PutMapping(value = "/network-modifications", produces = MediaType.APPLICATION_JSON_VALUE) 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 669c2785a..7dcb4f56c 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -690,9 +690,14 @@ private List getUnstashedModificationsInfosNonTransactional(U return getModificationEntityStream(groupUuid).filter(m -> !m.getStashed()).map(this::toModificationsInfosOptimized).toList(); } + /** + * @return references to a shared modification that should be deleted from directory-server + */ @Transactional - public void stashNetworkModifications(@NonNull List modificationUuids, int stashedModificationCount) { + public Map stashNetworkModifications(@NonNull List modificationUuids, int stashedModificationCount) { int stashModificationOrder = -stashedModificationCount - 1; + // elementUuid of the shared modification -> Uuid of the composite containing the reference, null if the composite is at the root level + Map referencesToBeDeleted = new HashMap<>(); List modificationEntities = new ArrayList<>(); for (UUID modificationUuid : modificationUuids) { ModificationEntity modificationEntity = this.modificationRepository @@ -702,8 +707,15 @@ public void stashNetworkModifications(@NonNull List modificationUuids, int modificationEntity.setModificationsOrder(stashModificationOrder); modificationEntities.add(modificationEntity); stashModificationOrder--; + + if (modificationEntity instanceof ModificationReferenceEntity modificationReference) { + // TODO : fetch the composite uuid containing the modificationReference ? null (groupUuid) si je n'en trouve pas ? + // bof : montrer à Slimane et en discuter + referencesToBeDeleted.putIfAbsent(modificationReference.getReferenceId(), null); + } } this.modificationRepository.saveAll(modificationEntities); + return referencesToBeDeleted; } @Transactional @@ -722,8 +734,9 @@ public void reorderNetworkModifications(UUID groupId, Boolean stashed) { } @Transactional - public void restoreNetworkModifications(@NonNull List modificationUuids, int unstashedSize) { + public Map restoreNetworkModifications(@NonNull List modificationUuids, int unstashedSize) { int modificationOrder = unstashedSize; + Map referencesToBeRecreated = new HashMap<>(); List modifications = modificationRepository.findAllByIdInReverse(modificationUuids); if (modifications.size() != modificationUuids.size()) { throw new NetworkModificationException(MODIFICATION_NOT_FOUND); @@ -731,8 +744,15 @@ public void restoreNetworkModifications(@NonNull List modificationUuids, i for (ModificationEntity modification : modifications) { modification.setStashed(false); modification.setModificationsOrder(modificationOrder++); + + if (modification instanceof ModificationReferenceEntity modificationReference) { + // TODO : fetch the composite uuid containing the modificationReference ? null (groupUuid) si je n'en trouve pas ? + // bof : montrer à Slimane et en discuter + referencesToBeRecreated.putIfAbsent(modificationReference.getReferenceId(), null); + } } this.modificationRepository.saveAll(modifications); + return referencesToBeRecreated; } @Transactional 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 b34577252..bb4bd6ebb 100644 --- a/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java @@ -271,8 +271,8 @@ public void updateNetworkModificationMetadata(@NonNull List modificationUu } @Transactional - public void stashNetworkModifications(UUID groupUuid, @NonNull List modificationUuids) { - networkModificationRepository.stashNetworkModifications(modificationUuids, networkModificationRepository.getModificationsCount(groupUuid, true)); + public Map stashNetworkModifications(UUID groupUuid, @NonNull List modificationUuids) { + return networkModificationRepository.stashNetworkModifications(modificationUuids, networkModificationRepository.getModificationsCount(groupUuid, true)); } @Transactional @@ -281,8 +281,8 @@ public void reorderNetworkModifications(UUID groupId, Boolean stashed) { } @Transactional - public void restoreNetworkModifications(UUID groupUuid, @NonNull List modificationUuids) { - networkModificationRepository.restoreNetworkModifications(modificationUuids, + public Map restoreNetworkModifications(UUID groupUuid, @NonNull List modificationUuids) { + return networkModificationRepository.restoreNetworkModifications(modificationUuids, networkModificationRepository.getModificationsCount(groupUuid, false)); } From 0365c18ae3c34fc304ffdaba66e8105afbe27dab Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Tue, 16 Jun 2026 18:15:25 +0200 Subject: [PATCH 11/26] specific endpoint to return references Signed-off-by: Mathieu DEHARBE --- .../server/NetworkModificationController.java | 25 ++++++++++----- .../NetworkModificationRepository.java | 31 ++++++++++++------- .../service/NetworkModificationService.java | 9 ++++-- 3 files changed, 44 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java index df032175a..c4188be5b 100644 --- a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java +++ b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java @@ -221,26 +221,35 @@ public ResponseEntity getOneLineTypeWithLimits(@PathVariable UUID return ResponseEntity.ok().body(test); } - /** - * @return referencesToBeUpdated : in the case of stashing those references will be deleted, in case of unstashing, those references will be recreated - */ @PutMapping(value = "/network-modifications", produces = MediaType.APPLICATION_JSON_VALUE, params = "stashed") @Operation(summary = "stash or unstash network modifications") @ApiResponse(responseCode = "200", description = "The network modifications were stashed") - public ResponseEntity> stashNetworkModifications( + public ResponseEntity stashNetworkModifications( @Parameter(description = "Network modification UUIDs") @RequestParam("uuids") List networkModificationUuids, @Parameter(description = "Group UUID") @RequestParam("groupUuid") UUID groupUuid, @Parameter(description = "stash or unstash network modifications") @RequestParam(name = "stashed", defaultValue = "true") Boolean stashed) { - Map referencesToBeUpdated; if (Boolean.TRUE.equals(stashed)) { - referencesToBeUpdated = networkModificationService.stashNetworkModifications(groupUuid, networkModificationUuids); + networkModificationService.stashNetworkModifications(groupUuid, networkModificationUuids); networkModificationService.reorderNetworkModifications(groupUuid, Boolean.FALSE); } else { - referencesToBeUpdated = networkModificationService.restoreNetworkModifications(groupUuid, networkModificationUuids); + networkModificationService.restoreNetworkModifications(groupUuid, networkModificationUuids); networkModificationService.reorderNetworkModifications(groupUuid, Boolean.TRUE); } + return ResponseEntity.ok().build(); + } + + /** + * filters out the netmods which are not references and returns the references data as : + * referenced element uuid -> container of the reference (uuid of the composite if there is one, null if it is at the root level) + */ + @GetMapping(value = "/references", produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "fetch references data of the network modifications") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The references data were returned")}) + public ResponseEntity> getReferencesData( + @Parameter(description = "Network modification UUIDs") @RequestParam("uuids") List networkModificationUuids) { + Map referencesData = networkModificationService.getReferencesData(networkModificationUuids); return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON) - .body(referencesToBeUpdated); + .body(referencesData); } @PutMapping(value = "/network-modifications", produces = MediaType.APPLICATION_JSON_VALUE) 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 a1fa1a6fe..96a3f38e0 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -698,33 +698,42 @@ private List getUnstashedModificationsInfosNonTransactional(U } /** - * @return references to a shared modification that should be deleted from directory-server + * @return elementUuid of the shared modification -> Uuid of the composite containing the reference, null if the composite is at the root level */ @Transactional - public Map stashNetworkModifications(@NonNull List modificationUuids, int stashedModificationCount) { - int stashModificationOrder = -stashedModificationCount - 1; - // elementUuid of the shared modification -> Uuid of the composite containing the reference, null if the composite is at the root level + public Map getReferencesData(@NonNull List modificationUuids) { Map referencesToBeDeleted = new HashMap<>(); - List modificationEntities = new ArrayList<>(); for (UUID modificationUuid : modificationUuids) { ModificationEntity modificationEntity = this.modificationRepository .findById(modificationUuid) .orElseThrow(() -> new NetworkModificationException(MODIFICATION_NOT_FOUND, String.format(MODIFICATION_NOT_FOUND_MESSAGE, modificationUuid))); - modificationEntity.setStashed(true); - modificationEntity.setModificationsOrder(stashModificationOrder); - modificationEntities.add(modificationEntity); - stashModificationOrder--; if (modificationEntity instanceof ModificationReferenceEntity modificationReference) { // TODO : fetch the composite uuid containing the modificationReference ? null (groupUuid) si je n'en trouve pas ? - // bof : montrer à Slimane et en discuter + // TODO : et faire ça dans une requête spécifique ?? referencesToBeDeleted.putIfAbsent(modificationReference.getReferenceId(), null); } } - this.modificationRepository.saveAll(modificationEntities); + return referencesToBeDeleted; } + @Transactional + public void stashNetworkModifications(@NonNull List modificationUuids, int stashedModificationCount) { + int stashModificationOrder = -stashedModificationCount - 1; + List modificationEntities = new ArrayList<>(); + for (UUID modificationUuid : modificationUuids) { + ModificationEntity modificationEntity = this.modificationRepository + .findById(modificationUuid) + .orElseThrow(() -> new NetworkModificationException(MODIFICATION_NOT_FOUND, String.format(MODIFICATION_NOT_FOUND_MESSAGE, modificationUuid))); + modificationEntity.setStashed(true); + modificationEntity.setModificationsOrder(stashModificationOrder); + modificationEntities.add(modificationEntity); + stashModificationOrder--; + } + this.modificationRepository.saveAll(modificationEntities); + } + @Transactional public void reorderNetworkModifications(UUID groupId, Boolean stashed) { List entities = this.modificationRepository.findAllByGroupId(groupId, stashed); 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 bb4bd6ebb..6b79fff7f 100644 --- a/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java @@ -271,8 +271,13 @@ public void updateNetworkModificationMetadata(@NonNull List modificationUu } @Transactional - public Map stashNetworkModifications(UUID groupUuid, @NonNull List modificationUuids) { - return networkModificationRepository.stashNetworkModifications(modificationUuids, networkModificationRepository.getModificationsCount(groupUuid, true)); + public Map getReferencesData(@NonNull List modificationUuids) { + return networkModificationRepository.getReferencesData(modificationUuids); + } + + @Transactional + public void stashNetworkModifications(UUID groupUuid, @NonNull List modificationUuids) { + networkModificationRepository.stashNetworkModifications(modificationUuids, networkModificationRepository.getModificationsCount(groupUuid, true)); } @Transactional From 88c5a3d9bb507d8e8a898990743ccf9db52f6f53 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Wed, 17 Jun 2026 13:59:45 +0200 Subject: [PATCH 12/26] getAllReferencesDataFromGroup Signed-off-by: Mathieu DEHARBE --- .../server/NetworkModificationController.java | 19 +++++++++++++++++++ .../NetworkModificationRepository.java | 7 +++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java index c4188be5b..0b8b89aff 100644 --- a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java +++ b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java @@ -252,6 +252,25 @@ public ResponseEntity> getReferencesData( .body(referencesData); } + /** + * filters out the netmods which are not references and returns the references data as : + * referenced element uuid -> container of the reference (uuid of the composite if there is one, null if it is at the root level) + */ + @GetMapping(value = "/groups/{groupUuid}/references", produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Fetches references data of all the network modifications in a group, including in the composites' submodifications") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The references data were returned")}) + public ResponseEntity> getAllReferencesDataFromGroup( + @Parameter(description = "Group UUID") @PathVariable("groupUuid") UUID groupUuid) { + // TODO : for now shared modification are only at the root level and can't be inside composites, + // but when it will be the case a specific function will have to be done in order to fetch all the references inside the composites and only return uuids + List netModUuids = networkModificationService.getNetworkModifications(groupUuid, true, false, false) + .stream().map(ModificationInfos::getUuid) + .toList(); + Map referencesData = networkModificationService.getReferencesData(netModUuids); + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON) + .body(referencesData); + } + @PutMapping(value = "/network-modifications", produces = MediaType.APPLICATION_JSON_VALUE) @Operation(summary = "Updates the metadata of network modifications") @ApiResponse(responseCode = "200", description = "The metadata of the network modifications has been successfully updated") 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 cfe3b5cf2..2f5bf32f5 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -720,10 +720,9 @@ public Map getReferencesData(@NonNull List modificationUuids) ModificationEntity modificationEntity = this.modificationRepository .findById(modificationUuid) .orElseThrow(() -> new NetworkModificationException(MODIFICATION_NOT_FOUND, String.format(MODIFICATION_NOT_FOUND_MESSAGE, modificationUuid))); - - if (modificationEntity instanceof ModificationReferenceEntity modificationReference) { - // TODO : fetch the composite uuid containing the modificationReference ? null (groupUuid) si je n'en trouve pas ? - // TODO : et faire ça dans une requête spécifique ?? + if (Boolean.FALSE.equals(modificationEntity.getStashed()) && modificationEntity instanceof ModificationReferenceEntity modificationReference) { + // TODO : for now shared modification are only at the root level and can't be inside composites, so the composite uuid is set to null + // but when it will be the case a specific function will have to be done in order to fetch the composite containing the modificationReference (if there is one) referencesToBeDeleted.putIfAbsent(modificationReference.getReferenceId(), null); } } From e5c6c0fe6f8a942ec509cf1b1a86506ce4fd63fa Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Wed, 17 Jun 2026 15:08:57 +0200 Subject: [PATCH 13/26] corrects previous Tus Signed-off-by: Mathieu DEHARBE --- .../server/NetworkModificationController.java | 2 +- .../server/CompositeControllerTest.java | 16 +++++++++------- .../server/ModificationControllerTest.java | 2 +- .../modification/server/utils/TestUtils.java | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java index 0b8b89aff..2701f20b0 100644 --- a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java +++ b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java @@ -262,7 +262,7 @@ public ResponseEntity> getReferencesData( public ResponseEntity> getAllReferencesDataFromGroup( @Parameter(description = "Group UUID") @PathVariable("groupUuid") UUID groupUuid) { // TODO : for now shared modification are only at the root level and can't be inside composites, - // but when it will be the case a specific function will have to be done in order to fetch all the references inside the composites and only return uuids + // but when it will be the case a specific function will have to be done in order to fetch recursively all the references inside the composites and only return uuids List netModUuids = networkModificationService.getNetworkModifications(groupUuid, true, false, false) .stream().map(ModificationInfos::getUuid) .toList(); diff --git a/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java b/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java index 3a9e5c465..3afcfff11 100644 --- a/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java @@ -18,6 +18,7 @@ import org.gridsuite.modification.dto.CompositeModificationInfos; import org.gridsuite.modification.dto.EquipmentAttributeModificationInfos; import org.gridsuite.modification.dto.ModificationInfos; +import org.gridsuite.modification.server.dto.CompositesToBeInserted; import org.gridsuite.modification.server.dto.NetworkModificationResult; import org.gridsuite.modification.server.dto.NetworkModificationsResult; import org.gridsuite.modification.server.entities.CompositeModificationEntity; @@ -166,8 +167,8 @@ void testSplit() throws Exception { checkCompositeModificationContent(compositeModificationContent); // Insert the composite modification in the group - final String bodyJson = getJsonBodyModificationCompositeInfos( - List.of(Pair.of(compositeModificationUuid, "random name"))); + final String bodyJson = getJsonBodyModificationCompositeToBeInserted( + List.of(new CompositesToBeInserted(compositeModificationUuid, "random name", false))); mvcResult = runRequestAsync( mockMvc, put(URI_COMPOSITE_NETWORK_MODIF_BASE + "/groups/" + TEST_GROUP_ID + "?action=SPLIT") @@ -202,8 +203,8 @@ void testInsert() throws Exception { assertEquals(modificationsNumber, modificationInfosList.size()); // Insert the composite modification in the group - final String bodyJson = getJsonBodyModificationCompositeInfos( - List.of(Pair.of(compositeModificationUuid, "random name"))); + final String bodyJson = getJsonBodyModificationCompositeToBeInserted( + List.of(new CompositesToBeInserted(compositeModificationUuid, "random name", false))); // insert the same composite modification inside as a complete composite, not split into regular network modifications mvcResult = runRequestAsync( @@ -246,7 +247,7 @@ private List createSomeSwitchModifications(UUID groupId, int return modificationList; } - private String getJsonBodyModificationCompositeInfos(List> modifs) throws JsonProcessingException { + private String getJsonBodyModificationCompositeToBeInserted(List modifs) throws JsonProcessingException { return TestUtils.getJsonBodyModificationCompositeInfos(modifs, TEST_NETWORK_ID, VARIANT_ID); } @@ -445,7 +446,8 @@ void testMoveSubModificationFromCompositeToRoot() throws Exception { runRequestAsync(mockMvc, put(URI_COMPOSITE_NETWORK_MODIF_BASE + "/groups/{groupUuid}?action=INSERT", TEST_GROUP_ID) - .content(getJsonBodyModificationCompositeInfos(List.of(Pair.of(compositeUuid, "composite")))) + .content(getJsonBodyModificationCompositeToBeInserted( + List.of(new CompositesToBeInserted(compositeUuid, "composite", false)))) .contentType(MediaType.APPLICATION_JSON), status().isOk()); @@ -657,7 +659,7 @@ void testMoveSubModificationFromRootToComposite() throws Exception { runRequestAsync(mockMvc, put(URI_COMPOSITE_NETWORK_MODIF_BASE + "/groups/{groupUuid}?action=INSERT", TEST_GROUP_ID) - .content(getJsonBodyModificationCompositeInfos(List.of(Pair.of(compositeUuid, "composite")))) + .content(getJsonBodyModificationCompositeToBeInserted(List.of(new CompositesToBeInserted(compositeUuid, "composite", false)))) .contentType(MediaType.APPLICATION_JSON), status().isOk()); diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index 6f5c64a3c..bdbe72592 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -1815,7 +1815,7 @@ private UUID createComposite(List modificationUuids) throws Exception { /** Inserts a COPY of a standalone composite at the end of the group's root list. */ private void insertCompositeIntoGroup(UUID groupId, UUID compositeUuid, String name) throws Exception { String body = TestUtils.getJsonBodyModificationCompositeInfos( - List.of(org.springframework.data.util.Pair.of(compositeUuid, name)), + List.of(new CompositesToBeInserted(compositeUuid, "composite", false)), TEST_NETWORK_ID, NetworkCreation.VARIANT_ID); runRequestAsync(mockMvc, put("/v1/network-composite-modifications/groups/" + groupId + "?action=INSERT") 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 d9971e2f8..8b1b52b10 100644 --- a/src/test/java/org/gridsuite/modification/server/utils/TestUtils.java +++ b/src/test/java/org/gridsuite/modification/server/utils/TestUtils.java @@ -227,7 +227,7 @@ public static String getJsonBody(List uuids, UUID networkUuid, String vari return createJsonPayload(uuids, networkUuid, variantId); } - public static String getJsonBodyModificationCompositeInfos(List> modifs, UUID networkUuid, String variantId) throws JsonProcessingException { + public static String getJsonBodyModificationCompositeInfos(List modifs, UUID networkUuid, String variantId) throws JsonProcessingException { return createJsonPayload(modifs, networkUuid, variantId); } From 14b4aa0515be19507ed1efd845331c7b9304aed8 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Wed, 17 Jun 2026 15:51:12 +0200 Subject: [PATCH 14/26] cleans imports Signed-off-by: Mathieu DEHARBE --- .../gridsuite/modification/server/CompositeControllerTest.java | 1 - .../modification/server/ModificationControllerTest.java | 2 +- .../java/org/gridsuite/modification/server/utils/TestUtils.java | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java b/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java index 3afcfff11..9328bfef0 100644 --- a/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java @@ -35,7 +35,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.util.Pair; import org.springframework.http.MediaType; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index bdbe72592..825d6cc74 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -1815,7 +1815,7 @@ private UUID createComposite(List modificationUuids) throws Exception { /** Inserts a COPY of a standalone composite at the end of the group's root list. */ private void insertCompositeIntoGroup(UUID groupId, UUID compositeUuid, String name) throws Exception { String body = TestUtils.getJsonBodyModificationCompositeInfos( - List.of(new CompositesToBeInserted(compositeUuid, "composite", false)), + List.of(new CompositesToBeInserted(compositeUuid, name, false)), TEST_NETWORK_ID, NetworkCreation.VARIANT_ID); runRequestAsync(mockMvc, put("/v1/network-composite-modifications/groups/" + groupId + "?action=INSERT") 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 8b1b52b10..fb2b3263a 100644 --- a/src/test/java/org/gridsuite/modification/server/utils/TestUtils.java +++ b/src/test/java/org/gridsuite/modification/server/utils/TestUtils.java @@ -27,7 +27,6 @@ import org.junit.platform.commons.util.StringUtils; import org.mockito.ArgumentCaptor; import org.springframework.cloud.stream.binder.test.OutputDestination; -import org.springframework.data.util.Pair; import org.springframework.test.web.servlet.*; import java.io.IOException; From 4de2680720e1570656e66d9776e4816049dbcf72 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Wed, 17 Jun 2026 16:21:26 +0200 Subject: [PATCH 15/26] testGetReferencesData Signed-off-by: Mathieu DEHARBE --- .../server/CompositeControllerTest.java | 10 ++-- .../server/ModificationControllerTest.java | 60 ++++++++++++++++--- 2 files changed, 57 insertions(+), 13 deletions(-) diff --git a/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java b/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java index 9328bfef0..4e0762354 100644 --- a/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java @@ -398,7 +398,7 @@ void testMoveSubModificationWithinComposite() throws Exception { // Move the first sub-modification to the end (no beforeUuid = append) // was [0,1,2] → [1,2,0] mockMvc.perform(put(URI_COMPOSITE_NETWORK_MODIF_BASE + "/groups/{groupUuid}/sub-modifications/{modificationUuid}", - TEST_GROUP_ID, subUuids.get(0)) + TEST_GROUP_ID, subUuids.getFirst()) .queryParam("sourceCompositeUuid", compositeUuid.toString()) .queryParam("targetCompositeUuid", compositeUuid.toString())) .andExpect(status().isOk()); @@ -461,7 +461,7 @@ void testMoveSubModificationFromCompositeToRoot() throws Exception { int rootSizeBefore = modificationRepository.getModifications(TEST_GROUP_ID, true, true).size(); // Move first sub-modification from composite to root level (no targetCompositeUuid) - UUID movingUuid = actualSubUuids.get(0); + UUID movingUuid = actualSubUuids.getFirst(); mockMvc.perform(put(URI_COMPOSITE_NETWORK_MODIF_BASE + "/groups/{groupUuid}/sub-modifications/{modificationUuid}", TEST_GROUP_ID, movingUuid) .queryParam("sourceCompositeUuid", compositeUuid.toString())) @@ -473,7 +473,7 @@ void testMoveSubModificationFromCompositeToRoot() throws Exception { .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(), new TypeReference<>() { }); assertEquals(1, resultMap.get(compositeUuid).size()); - assertEquals(actualSubUuids.get(1), resultMap.get(compositeUuid).get(0).getUuid()); + assertEquals(actualSubUuids.get(1), resultMap.get(compositeUuid).getFirst().getUuid()); // Root group should have one more modification assertEquals(rootSizeBefore + 1, modificationRepository.getModifications(TEST_GROUP_ID, true, true).size()); @@ -597,7 +597,7 @@ void testExpandToLeafUuidsNestedComposites() throws Exception { assertEquals(2, actualInnerSubUuids.size()); List outerLeafs = createSomeSwitchModifications(TEST_GROUP2_ID, 1); - UUID leaf3RootUuid = outerLeafs.get(0).getUuid(); + UUID leaf3RootUuid = outerLeafs.getFirst().getUuid(); mvcResult = mockMvc.perform(post(URI_COMPOSITE_NETWORK_MODIF_BASE) .content(mapper.writeValueAsString(List.of(innerCompositeUuid, leaf3RootUuid))).contentType(MediaType.APPLICATION_JSON)) @@ -721,7 +721,7 @@ void testMoveSubModificationCycleDetection() throws Exception { UUID composite1Uuid = mapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); List extraLeafs = createSomeSwitchModifications(TEST_GROUP2_ID, 1); - UUID leaf4Uuid = extraLeafs.get(0).getUuid(); + UUID leaf4Uuid = extraLeafs.getFirst().getUuid(); mvcResult = mockMvc.perform(post(URI_COMPOSITE_NETWORK_MODIF_BASE) .content(mapper.writeValueAsString(List.of(composite1Uuid, leaf4Uuid))).contentType(MediaType.APPLICATION_JSON)) diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index 825d6cc74..80de96537 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -175,8 +175,8 @@ private boolean existTombstonedEquipmentInfos(String equipmentId, UUID networkUu private void assertApplicationStatusOK(MvcResult mvcResult) throws Exception { NetworkModificationsResult networkModificationsResult = mapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); assertEquals(1, networkModificationsResult.modificationResults().size()); - assertTrue(networkModificationsResult.modificationResults().get(0).isPresent()); - assertNotEquals(NetworkModificationResult.ApplicationStatus.WITH_ERRORS, networkModificationsResult.modificationResults().get(0).get().getApplicationStatus()); + assertTrue(networkModificationsResult.modificationResults().getFirst().isPresent()); + assertNotEquals(NetworkModificationResult.ApplicationStatus.WITH_ERRORS, networkModificationsResult.modificationResults().getFirst().get().getApplicationStatus()); } private String getJsonBody(List uuids, String variantId) throws JsonProcessingException { @@ -369,7 +369,7 @@ void testRestoreNetworkModifications() throws Exception { List modifications = modificationRepository.getModifications(TEST_GROUP_ID, true, true, false); assertEquals(1, modifications.size()); - String uuidString = modifications.get(0).getUuid().toString(); + String uuidString = modifications.getFirst().getUuid().toString(); mockMvc.perform(put(URI_NETWORK_MODIF_BASE) .queryParam("groupUuid", TEST_GROUP_ID.toString()) .queryParam("uuids", uuidString) @@ -1557,7 +1557,7 @@ void testDeleteStashedNetworkModifications() throws Exception { List modifications = modificationRepository.getModifications(TEST_GROUP_ID, true, true); assertEquals(1, modifications.size()); - String uuidString = modifications.get(0).getUuid().toString(); + String uuidString = modifications.getFirst().getUuid().toString(); mockMvc.perform(put(URI_NETWORK_MODIF_BASE) .queryParam("groupUuid", TEST_GROUP_ID.toString()) .queryParam("uuids", uuidString) @@ -1593,22 +1593,22 @@ void testGetModificationsCount() throws Exception { void testMetadata() throws Exception { // create a single switch attribute modification in a group List modificationList = createSomeSwitchModifications(TEST_GROUP_ID, 1); - UUID switchModificationId = modificationList.get(0).getUuid(); + UUID switchModificationId = modificationList.getFirst().getUuid(); MvcResult mvcResult = mockMvc.perform(get(URI_NETWORK_MODIF_BASE + "/metadata?ids={id}", switchModificationId) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); List metadata = mapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); assertEquals(1, metadata.size()); - assertEquals(switchModificationId, metadata.get(0).getId()); - assertEquals(EQUIPMENT_ATTRIBUTE_MODIFICATION, metadata.get(0).getType()); + assertEquals(switchModificationId, metadata.getFirst().getId()); + assertEquals(EQUIPMENT_ATTRIBUTE_MODIFICATION, metadata.getFirst().getType()); } @Test void testStandaloneDeletionError() throws Exception { // create a single switch attribute modification in a group List modificationList = createSomeSwitchModifications(TEST_GROUP_ID, 1); - UUID switchModificationId = modificationList.get(0).getUuid(); + UUID switchModificationId = modificationList.getFirst().getUuid(); // Try to delete this modification without its group: not allowed mockMvc.perform(delete(URI_NETWORK_MODIF_BASE) @@ -1906,4 +1906,48 @@ void testMoveCompositeAndSubModificationInterGroup() throws Exception { // destination receives C(intact), D, extracted E1 assertEquals(l.cSubs(), fetchCompositeSubUuids(l.c())); } + + @Test + void testGetReferencesData() throws Exception { + // Create a non-reference modification: it must be ignored by getReferencesData + List switchModifications = createSomeSwitchModifications(TEST_GROUP_ID, 1); + UUID nonReferenceModificationUuid = switchModifications.getFirst().getUuid(); + + // Create a referenced modification, not owned by the tested group + ModificationInfos referencedLoadModificationInfo = ModificationCreation.getCreationLoad("v1", "idLoad", "nameLoad", "1.1", LoadType.UNDEFINED); + referencedLoadModificationInfo = modificationRepository.saveModifications(UUID.randomUUID(), List.of(ModificationEntity.fromDTO(referencedLoadModificationInfo))).getFirst(); + + // Create an active reference to this modification + ModificationInfos activeReferenceInfo = ModificationReferenceInfos.builder() + .referenceType(ModificationReferenceInfos.Type.BASIC) + .referenceId(referencedLoadModificationInfo.getUuid()) + .referenceInfos(referencedLoadModificationInfo) + .stashed(false) + .build(); + activeReferenceInfo = modificationRepository.saveModifications(TEST_GROUP_ID, List.of(ModificationEntity.fromDTO(activeReferenceInfo))).getFirst(); + + // Create a stashed reference: it must also be ignored by getReferencesData + ModificationInfos stashedReferenceInfo = ModificationReferenceInfos.builder() + .referenceType(ModificationReferenceInfos.Type.BASIC) + .referenceId(referencedLoadModificationInfo.getUuid()) + .referenceInfos(referencedLoadModificationInfo) + .stashed(true) + .build(); + stashedReferenceInfo = modificationRepository.saveModifications(TEST_GROUP_ID, List.of(ModificationEntity.fromDTO(stashedReferenceInfo))).getFirst(); + + MvcResult mvcResult = mockMvc.perform(get("/v1/references") + .queryParam("uuids", + activeReferenceInfo.getUuid().toString(), + nonReferenceModificationUuid.toString(), + stashedReferenceInfo.getUuid().toString()) + .contentType(MediaType.APPLICATION_JSON)) + .andExpectAll(status().isOk(), content().contentType(MediaType.APPLICATION_JSON)) + .andReturn(); + + Map referencesData = mapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + + assertEquals(1, referencesData.size()); + assertTrue(referencesData.containsKey(referencedLoadModificationInfo.getUuid())); + assertNull(referencesData.get(referencedLoadModificationInfo.getUuid())); + } } From 06a5aa9bcd3d4e5d52099a8c406a90dd72b30e71 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Wed, 17 Jun 2026 16:55:21 +0200 Subject: [PATCH 16/26] testGetAllReferencesDataFromGroup Signed-off-by: Mathieu DEHARBE --- .../server/ModificationControllerTest.java | 72 ++++++++++++++++--- 1 file changed, 62 insertions(+), 10 deletions(-) diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index 80de96537..dbd6455b5 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -395,7 +395,7 @@ void testStashNetworkModifications() throws Exception { List modifications = modificationRepository.getModifications(TEST_GROUP_ID, false, true); assertEquals(1, modifications.size()); - String uuidString = modifications.get(0).getUuid().toString(); + String uuidString = modifications.getFirst().getUuid().toString(); mockMvc.perform(put(URI_NETWORK_MODIF_BASE) .queryParam("groupUuid", TEST_GROUP_ID.toString()) .queryParam("uuids", uuidString) @@ -422,7 +422,7 @@ void testDisableNetworkModifications() throws Exception { List modifications = modificationRepository.getModifications(TEST_GROUP_ID, true, true); assertEquals(1, modifications.size()); - assertEquals(true, modifications.get(0).getActivated()); + assertEquals(true, modifications.getFirst().getActivated()); ModificationInfos metadata = new ModificationInfos(); metadata.setType(LINE_MODIFICATION); @@ -434,7 +434,7 @@ void testDisableNetworkModifications() throws Exception { .content(mapper.writeValueAsString(metadata)) .contentType(MediaType.APPLICATION_JSON) ).andExpect(status().isOk()); - assertEquals(false, modificationRepository.getModifications(TEST_GROUP_ID, true, true).get(0).getActivated()); + assertEquals(false, modificationRepository.getModifications(TEST_GROUP_ID, true, true).getFirst().getActivated()); } @Test @@ -508,7 +508,7 @@ void testDeleteModification() throws Exception { List modifications = modificationRepository.getModifications(TEST_GROUP_ID, false, true); assertEquals(1, modifications.size()); - String uuidString = modifications.get(0).getUuid().toString(); + String uuidString = modifications.getFirst().getUuid().toString(); mockMvc.perform(delete(URI_NETWORK_MODIF_BASE) .queryParam("groupUuid", UUID.randomUUID().toString()) .queryParam("uuids", uuidString)) @@ -916,8 +916,8 @@ void testMoveModificationBetweenTwoGroups() throws Exception { // incremental build: deletion impacts expected, all related to the moved load deletion (dealing with "s1" substation) NetworkModificationsResult networkModificationsResult = mapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); assertEquals(1, networkModificationsResult.modificationResults().size()); - assertTrue(networkModificationsResult.modificationResults().get(0).isPresent()); - networkModificationsResult.modificationResults().get(0).get().getNetworkImpacts().forEach(i -> { + assertTrue(networkModificationsResult.modificationResults().getFirst().isPresent()); + networkModificationsResult.modificationResults().getFirst().get().getNetworkImpacts().forEach(i -> { assertTrue(i.isSimple()); SimpleElementImpact simpleImpact = (SimpleElementImpact) i; assertEquals(Set.of(substationS1), simpleImpact.getSubstationIds()); @@ -949,7 +949,7 @@ void testMoveModificationWithUnexistingId() throws Exception { // 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); - String url = "/v1/groups/" + TEST_GROUP_ID + "?action=MOVE" + "&originGroupUuid=" + TEST_GROUP_ID + "&before=" + modificationUuidList.get(0); + String url = "/v1/groups/" + TEST_GROUP_ID + "?action=MOVE" + "&originGroupUuid=" + TEST_GROUP_ID + "&before=" + modificationUuidList.getFirst(); mockMvc.perform(put(url).content(bodyJson) .contentType(MediaType.APPLICATION_JSON)) @@ -1038,7 +1038,7 @@ void testDuplicateModificationGroup() throws Exception { List modifications = modificationRepository.getModifications(TEST_GROUP_ID, true, true, false); assertEquals(5, modifications.size()); //stash the first modification - String uuidString = modifications.get(0).getUuid().toString(); + String uuidString = modifications.getFirst().getUuid().toString(); mockMvc.perform(put(URI_NETWORK_MODIF_BASE) .queryParam("groupUuid", TEST_GROUP_ID.toString()) @@ -1538,7 +1538,7 @@ void testCreateVoltageInitModification() throws Exception { List modificationsInfos2 = mapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); assertEquals(1, modificationsInfos2.size()); - assertThat(modificationsInfos2.get(0)).recursivelyEquals(modificationsInfos1); + assertThat(modificationsInfos2.getFirst()).recursivelyEquals(modificationsInfos1); } @Test @@ -1624,7 +1624,7 @@ void testStandaloneDeletionError() throws Exception { void testVerifyModifications() throws Exception { // create a single switch attribute modification in a group List modificationList = createSomeSwitchModifications(TEST_GROUP_ID, 1); - UUID switchModificationId = modificationList.get(0).getUuid(); + UUID switchModificationId = modificationList.getFirst().getUuid(); createSomeSwitchModifications(TEST_GROUP2_ID, 1); @@ -1950,4 +1950,56 @@ void testGetReferencesData() throws Exception { assertTrue(referencesData.containsKey(referencedLoadModificationInfo.getUuid())); assertNull(referencesData.get(referencedLoadModificationInfo.getUuid())); } + + @Test + void testGetAllReferencesDataFromGroup() throws Exception { + // Create a non-reference modification in the group: it must be ignored by getAllReferencesDataFromGroup + createSomeSwitchModifications(TEST_GROUP_ID, 1); + + // Create a referenced modification, not owned by the tested group + ModificationInfos referencedLoadModificationInfo = ModificationCreation.getCreationLoad("v1", "idLoad", "nameLoad", "1.1", LoadType.UNDEFINED); + referencedLoadModificationInfo = modificationRepository.saveModifications(UUID.randomUUID(), List.of(ModificationEntity.fromDTO(referencedLoadModificationInfo))).getFirst(); + + // Create an active reference in the tested group: it must be returned + ModificationInfos activeReferenceInfo = ModificationReferenceInfos.builder() + .referenceType(ModificationReferenceInfos.Type.BASIC) + .referenceId(referencedLoadModificationInfo.getUuid()) + .referenceInfos(referencedLoadModificationInfo) + .stashed(false) + .build(); + modificationRepository.saveModifications(TEST_GROUP_ID, List.of(ModificationEntity.fromDTO(activeReferenceInfo))); + + // Create a stashed reference in the tested group: it must be ignored + ModificationInfos stashedReferenceInfo = ModificationReferenceInfos.builder() + .referenceType(ModificationReferenceInfos.Type.BASIC) + .referenceId(referencedLoadModificationInfo.getUuid()) + .referenceInfos(referencedLoadModificationInfo) + .stashed(true) + .build(); + modificationRepository.saveModifications(TEST_GROUP_ID, List.of(ModificationEntity.fromDTO(stashedReferenceInfo))); + + // Create an active reference in another group: it must not be returned for TEST_GROUP_ID + ModificationInfos otherGroupReferencedLoadModificationInfo = ModificationCreation.getCreationLoad("v1", "idLoadOther", "nameLoadOther", "1.1", LoadType.UNDEFINED); + otherGroupReferencedLoadModificationInfo = modificationRepository.saveModifications(UUID.randomUUID(), List.of(ModificationEntity.fromDTO(otherGroupReferencedLoadModificationInfo))).getFirst(); + + ModificationInfos otherGroupReferenceInfo = ModificationReferenceInfos.builder() + .referenceType(ModificationReferenceInfos.Type.BASIC) + .referenceId(otherGroupReferencedLoadModificationInfo.getUuid()) + .referenceInfos(otherGroupReferencedLoadModificationInfo) + .stashed(false) + .build(); + modificationRepository.saveModifications(TEST_GROUP2_ID, List.of(ModificationEntity.fromDTO(otherGroupReferenceInfo))); + + MvcResult mvcResult = mockMvc.perform(get("/v1/groups/{groupUuid}/references", TEST_GROUP_ID) + .contentType(MediaType.APPLICATION_JSON)) + .andExpectAll(status().isOk(), content().contentType(MediaType.APPLICATION_JSON)) + .andReturn(); + + Map referencesData = mapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + + assertEquals(1, referencesData.size()); + assertTrue(referencesData.containsKey(referencedLoadModificationInfo.getUuid())); + assertNull(referencesData.get(referencedLoadModificationInfo.getUuid())); + assertFalse(referencesData.containsKey(otherGroupReferencedLoadModificationInfo.getUuid())); + } } From a722039e4cc99e0d3ffeb6371b93b0c966236cac Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Wed, 17 Jun 2026 17:43:16 +0200 Subject: [PATCH 17/26] testInsertSharedComposite Signed-off-by: Mathieu DEHARBE --- .../server/CompositeControllerTest.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java b/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java index 4e0762354..cd8c47fda 100644 --- a/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java @@ -18,6 +18,7 @@ import org.gridsuite.modification.dto.CompositeModificationInfos; import org.gridsuite.modification.dto.EquipmentAttributeModificationInfos; import org.gridsuite.modification.dto.ModificationInfos; +import org.gridsuite.modification.dto.ModificationReferenceInfos; import org.gridsuite.modification.server.dto.CompositesToBeInserted; import org.gridsuite.modification.server.dto.NetworkModificationResult; import org.gridsuite.modification.server.dto.NetworkModificationsResult; @@ -219,6 +220,47 @@ void testInsert() throws Exception { assertNotNull(insertedComposite); checkCompositeModificationContent(insertedComposite.getModificationsInfos()); } + @Test + void testInsertSharedComposite() throws Exception { + int modificationsNumber = 2; + List modificationList = createSomeSwitchModifications(TEST_GROUP_ID, modificationsNumber); + + MvcResult mvcResult = mockMvc.perform(post(URI_COMPOSITE_NETWORK_MODIF_BASE) + .content(mapper.writeValueAsString(modificationList.stream().map(ModificationInfos::getUuid).toList())) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn(); + UUID compositeModificationUuid = mapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); + + String bodyJson = getJsonBodyModificationCompositeToBeInserted( + List.of(new CompositesToBeInserted(compositeModificationUuid, "shared composite", true))); + + mvcResult = runRequestAsync( + mockMvc, + put(URI_COMPOSITE_NETWORK_MODIF_BASE + "/groups/" + TEST_GROUP_ID + "?action=INSERT") + .content(bodyJson) + .contentType(MediaType.APPLICATION_JSON), + status().isOk()); + + assertApplicationStatusOK(mvcResult); + + List newModificationList = modificationRepository.getModifications(TEST_GROUP_ID, false, true); + assertEquals(modificationsNumber + 1, newModificationList.size()); + + ModificationReferenceInfos insertedReference = assertInstanceOf( + ModificationReferenceInfos.class, + newModificationList.getLast() + ); + assertEquals(compositeModificationUuid, insertedReference.getReferenceId()); + assertEquals(ModificationReferenceInfos.Type.BASIC, insertedReference.getReferenceType()); + + CompositeModificationInfos referencedComposite = assertInstanceOf( + CompositeModificationInfos.class, + insertedReference.getReferenceInfos() + ); + assertEquals(compositeModificationUuid, referencedComposite.getUuid()); + checkCompositeModificationContent(referencedComposite.getModificationsInfos()); + } private static void checkCompositeModificationContent(List compositeModificationContent) { assertEquals("open", ((EquipmentAttributeModificationInfos) compositeModificationContent.getFirst()).getEquipmentAttributeName()); From 1c9beff84e1fa703b001f59506b8e08736a2ef65 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Wed, 17 Jun 2026 17:46:13 +0200 Subject: [PATCH 18/26] format Signed-off-by: Mathieu DEHARBE --- .../gridsuite/modification/server/CompositeControllerTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java b/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java index cd8c47fda..ec95ad7c5 100644 --- a/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java @@ -220,6 +220,7 @@ void testInsert() throws Exception { assertNotNull(insertedComposite); checkCompositeModificationContent(insertedComposite.getModificationsInfos()); } + @Test void testInsertSharedComposite() throws Exception { int modificationsNumber = 2; From 3cb0381456a4ca731faa16d6702df2ae3e4779f9 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Fri, 19 Jun 2026 16:31:49 +0200 Subject: [PATCH 19/26] updates TODOs Signed-off-by: Mathieu DEHARBE --- .../modification/server/NetworkModificationController.java | 2 +- .../server/repositories/NetworkModificationRepository.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java index 2701f20b0..dd22af117 100644 --- a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java +++ b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java @@ -261,7 +261,7 @@ public ResponseEntity> getReferencesData( @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The references data were returned")}) public ResponseEntity> getAllReferencesDataFromGroup( @Parameter(description = "Group UUID") @PathVariable("groupUuid") UUID groupUuid) { - // TODO : for now shared modification are only at the root level and can't be inside composites, + // TODO GRD-4785 : for now shared modification are only at the root level and can't be inside composites, // but when it will be the case a specific function will have to be done in order to fetch recursively all the references inside the composites and only return uuids List netModUuids = networkModificationService.getNetworkModifications(groupUuid, true, false, false) .stream().map(ModificationInfos::getUuid) 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 2f5bf32f5..b50131477 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -721,7 +721,7 @@ public Map getReferencesData(@NonNull List modificationUuids) .findById(modificationUuid) .orElseThrow(() -> new NetworkModificationException(MODIFICATION_NOT_FOUND, String.format(MODIFICATION_NOT_FOUND_MESSAGE, modificationUuid))); if (Boolean.FALSE.equals(modificationEntity.getStashed()) && modificationEntity instanceof ModificationReferenceEntity modificationReference) { - // TODO : for now shared modification are only at the root level and can't be inside composites, so the composite uuid is set to null + // TODO GRD-4785 : for now shared modification are only at the root level and can't be inside composites, so the composite uuid is set to null // but when it will be the case a specific function will have to be done in order to fetch the composite containing the modificationReference (if there is one) referencesToBeDeleted.putIfAbsent(modificationReference.getReferenceId(), null); } @@ -774,8 +774,8 @@ public Map restoreNetworkModifications(@NonNull List modificat modification.setModificationsOrder(modificationOrder++); if (modification instanceof ModificationReferenceEntity modificationReference) { - // TODO : fetch the composite uuid containing the modificationReference ? null (groupUuid) si je n'en trouve pas ? - // bof : montrer à Slimane et en discuter + // TODO GRD-4785 : fetch the composite uuid containing the modificationReference and add it as second value + // null (groupUuid) if none is found referencesToBeRecreated.putIfAbsent(modificationReference.getReferenceId(), null); } } From 27b41f2fa042d90a00bf4c57247ed1ce50d38e17 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Fri, 19 Jun 2026 16:43:00 +0200 Subject: [PATCH 20/26] cleans useless returns Signed-off-by: Mathieu DEHARBE --- .../repositories/NetworkModificationRepository.java | 10 +--------- .../server/service/NetworkModificationService.java | 4 ++-- 2 files changed, 3 insertions(+), 11 deletions(-) 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 b50131477..d4dfca1a7 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -762,9 +762,8 @@ public void reorderNetworkModifications(UUID groupId, Boolean stashed) { } @Transactional - public Map restoreNetworkModifications(@NonNull List modificationUuids, int unstashedSize) { + public void restoreNetworkModifications(@NonNull List modificationUuids, int unstashedSize) { int modificationOrder = unstashedSize; - Map referencesToBeRecreated = new HashMap<>(); List modifications = modificationRepository.findAllByIdInReverse(modificationUuids); if (modifications.size() != modificationUuids.size()) { throw new NetworkModificationException(MODIFICATION_NOT_FOUND); @@ -772,15 +771,8 @@ public Map restoreNetworkModifications(@NonNull List modificat for (ModificationEntity modification : modifications) { modification.setStashed(false); modification.setModificationsOrder(modificationOrder++); - - if (modification instanceof ModificationReferenceEntity modificationReference) { - // TODO GRD-4785 : fetch the composite uuid containing the modificationReference and add it as second value - // null (groupUuid) if none is found - referencesToBeRecreated.putIfAbsent(modificationReference.getReferenceId(), null); - } } this.modificationRepository.saveAll(modifications); - return referencesToBeRecreated; } @Transactional 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 d5e2656b2..4dd64692a 100644 --- a/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java @@ -292,8 +292,8 @@ public void reorderNetworkModifications(UUID groupId, Boolean stashed) { } @Transactional - public Map restoreNetworkModifications(UUID groupUuid, @NonNull List modificationUuids) { - return networkModificationRepository.restoreNetworkModifications(modificationUuids, + public void restoreNetworkModifications(UUID groupUuid, @NonNull List modificationUuids) { + networkModificationRepository.restoreNetworkModifications(modificationUuids, networkModificationRepository.getModificationsCount(groupUuid, false)); } From 1291229df2aa1e6754015b7c5f21f14632c2791d Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Tue, 7 Jul 2026 11:12:13 +0200 Subject: [PATCH 21/26] new sonar locks Signed-off-by: Mathieu DEHARBE --- .../gridsuite/modification/server/CompositeController.java | 2 +- .../server/repositories/NetworkModificationRepository.java | 2 +- .../server/service/NetworkModificationService.java | 2 +- .../modification/server/ModificationControllerTest.java | 5 ++++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/CompositeController.java b/src/main/java/org/gridsuite/modification/server/CompositeController.java index 69ebfbf8a..d2971bb9b 100644 --- a/src/main/java/org/gridsuite/modification/server/CompositeController.java +++ b/src/main/java/org/gridsuite/modification/server/CompositeController.java @@ -11,8 +11,8 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; -import org.gridsuite.modification.server.dto.CompositesToBeInserted; import org.gridsuite.modification.dto.ModificationInfos; +import org.gridsuite.modification.server.dto.CompositesToBeInserted; import org.gridsuite.modification.server.dto.ModificationApplicationContext; import org.gridsuite.modification.server.dto.NetworkModificationsResult; import org.gridsuite.modification.server.service.NetworkModificationService; 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 e0554671c..1799bdd01 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -12,13 +12,13 @@ import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.NetworkModificationException; import org.gridsuite.modification.dto.CompositeModificationInfos; -import org.gridsuite.modification.server.dto.CompositesToBeInserted; import org.gridsuite.modification.dto.ModificationInfos; import org.gridsuite.modification.dto.ModificationReferenceInfos; import org.gridsuite.modification.dto.tabular.LimitSetsTabularModificationInfos; import org.gridsuite.modification.dto.tabular.TabularBaseInfos; import org.gridsuite.modification.dto.tabular.TabularCreationInfos; import org.gridsuite.modification.dto.tabular.TabularModificationInfos; +import org.gridsuite.modification.server.dto.CompositesToBeInserted; import org.gridsuite.modification.server.dto.ModificationMetadata; import org.gridsuite.modification.server.elasticsearch.ModificationApplicationInfosService; import org.gridsuite.modification.server.entities.CompositeModificationEntity; 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 42a1479ae..a94a027c0 100644 --- a/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java @@ -21,13 +21,13 @@ import org.gridsuite.filter.AbstractFilter; import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.NetworkModificationException; -import org.gridsuite.modification.server.dto.CompositesToBeInserted; import org.gridsuite.modification.dto.CompositeModificationInfos; import org.gridsuite.modification.dto.EquipmentModificationInfos; import org.gridsuite.modification.dto.GenerationDispatchInfos; import org.gridsuite.modification.dto.ModificationInfos; import org.gridsuite.modification.server.NetworkModificationServerException; import org.gridsuite.modification.server.dto.*; +import org.gridsuite.modification.server.dto.CompositesToBeInserted; import org.gridsuite.modification.server.dto.elasticsearch.ModificationApplicationInfos; import org.gridsuite.modification.server.elasticsearch.EquipmentInfosService; import org.gridsuite.modification.server.elasticsearch.ModificationApplicationInfosService; diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index 3302f54f9..abaf34ed2 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -1984,7 +1984,10 @@ void testGetAllReferencesDataFromGroup() throws Exception { // Create an active reference in another group: it must not be returned for TEST_GROUP_ID ModificationInfos otherGroupReferencedLoadModificationInfo = ModificationCreation.getCreationLoad("v1", "idLoadOther", "nameLoadOther", "1.1", LoadType.UNDEFINED); - otherGroupReferencedLoadModificationInfo = modificationRepository.saveModifications(UUID.randomUUID(), List.of(ModificationEntity.fromDTO(otherGroupReferencedLoadModificationInfo))).getFirst(); + otherGroupReferencedLoadModificationInfo = modificationRepository.saveModifications( + UUID.randomUUID(), + List.of(ModificationEntity.fromDTO(otherGroupReferencedLoadModificationInfo)) + ).getFirst(); ModificationInfos otherGroupReferenceInfo = ModificationReferenceInfos.builder() .referenceType(ModificationReferenceInfos.Type.BASIC) From bedc75286467da110c7bd9c81328a42a25f26696 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Tue, 7 Jul 2026 15:10:40 +0200 Subject: [PATCH 22/26] review1 Signed-off-by: Mathieu DEHARBE --- .../NetworkModificationRepository.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) 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 1799bdd01..f2bd59062 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -711,23 +711,25 @@ private List getUnstashedModificationsInfosNonTransactional(U } /** - * @return elementUuid of the shared modification -> Uuid of the composite containing the reference, null if the composite is at the root level + * @return elementUuid of the shared modification -> Uuid of the composite containing the reference, null if the modification reference is at the root level */ @Transactional public Map getReferencesData(@NonNull List modificationUuids) { - Map referencesToBeDeleted = new HashMap<>(); - for (UUID modificationUuid : modificationUuids) { - ModificationEntity modificationEntity = this.modificationRepository - .findById(modificationUuid) - .orElseThrow(() -> new NetworkModificationException(MODIFICATION_NOT_FOUND, String.format(MODIFICATION_NOT_FOUND_MESSAGE, modificationUuid))); - if (Boolean.FALSE.equals(modificationEntity.getStashed()) && modificationEntity instanceof ModificationReferenceEntity modificationReference) { + Map references = new HashMap<>(); + + List modificationEntities = this.modificationRepository.findAllByIdIn(modificationUuids); + + modificationEntities.stream() // TODO GRD-4785 : for now shared modification are only at the root level and can't be inside composites, so the composite uuid is set to null // but when it will be the case a specific function will have to be done in order to fetch the composite containing the modificationReference (if there is one) - referencesToBeDeleted.putIfAbsent(modificationReference.getReferenceId(), null); + .filter(modificationEntity -> Boolean.FALSE.equals(modificationEntity.getStashed())) + .forEach(modificationEntity -> { + if (modificationEntity instanceof ModificationReferenceEntity modificationReference) { + references.putIfAbsent(modificationReference.getReferenceId(), null); } - } + }); - return referencesToBeDeleted; + return references; } @Transactional From a13d923a683258545298e134021564f949140548 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Tue, 7 Jul 2026 17:10:10 +0200 Subject: [PATCH 23/26] reorganize insertCompositeModifications Signed-off-by: Mathieu DEHARBE --- .../NetworkModificationRepository.java | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) 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 f2bd59062..46c08cc9b 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -964,30 +964,24 @@ public List insertCompositeModifications( List newCompositeModifications = new ArrayList<>(); List modificationInfos = getModificationsInfosNonTransactional(compositeUuids); for (CompositesToBeInserted compositeToBeInserted : compositesToBeInserted) { - if (compositeToBeInserted.isShared()) { - CompositeModificationInfos referencedCompositeModification = (CompositeModificationInfos) modificationInfos.stream() - .filter(modif -> modif.getUuid().equals(compositeToBeInserted.id())) - .findFirst().orElse(null); - if (referencedCompositeModification != null) { - referencedCompositeModification.setName(compositeToBeInserted.name()); + CompositeModificationInfos compositeModification = (CompositeModificationInfos) modificationInfos.stream() + .filter(modif -> modif.getUuid().equals(compositeToBeInserted.id())) + .findFirst().orElse(null); + if (compositeModification != null) { + if (compositeToBeInserted.isShared()) { ModificationReferenceInfos newModificationReference = ModificationReferenceInfos.builder() .referenceId(compositeToBeInserted.id()) .referenceType(ModificationReferenceInfos.Type.BASIC) - .referenceInfos(referencedCompositeModification) + .referenceInfos(compositeModification) .build(); newCompositeModifications.add(newModificationReference); - } - } else { - // apply the new composite name to the corresponding composite modifications - CompositeModificationInfos newCompositeModification = (CompositeModificationInfos) modificationInfos.stream() - .filter(modif -> modif.getUuid().equals(compositeToBeInserted.id())) - .findFirst().orElse(null); - if (newCompositeModification != null) { - newCompositeModification.setName(compositeToBeInserted.name()); - newCompositeModifications.add(newCompositeModification); } else { - LOGGER.error("Could not find composite modification with uuid {} to apply its name {}", compositeToBeInserted.id(), compositeToBeInserted.name()); + // apply the new composite name to the corresponding composite modification + compositeModification.setName(compositeToBeInserted.name()); + newCompositeModifications.add(compositeModification); } + } else { + LOGGER.error("Could not find composite modification with uuid {} to apply its name {}", compositeToBeInserted.id(), compositeToBeInserted.name()); } } List newEntities = saveModificationInfosNonTransactional(targetGroupUuid, newCompositeModifications); From 9db8e5137c004a55d4a0dea33e78498a30e601d1 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Tue, 7 Jul 2026 18:48:12 +0200 Subject: [PATCH 24/26] getReferencesData don't care about stashed or not Signed-off-by: Mathieu DEHARBE --- .../server/repositories/NetworkModificationRepository.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) 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 46c08cc9b..ac2199c13 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -719,10 +719,9 @@ public Map getReferencesData(@NonNull List modificationUuids) List modificationEntities = this.modificationRepository.findAllByIdIn(modificationUuids); - modificationEntities.stream() - // TODO GRD-4785 : for now shared modification are only at the root level and can't be inside composites, so the composite uuid is set to null - // but when it will be the case a specific function will have to be done in order to fetch the composite containing the modificationReference (if there is one) - .filter(modificationEntity -> Boolean.FALSE.equals(modificationEntity.getStashed())) + // TODO GRD-4785 : for now shared modification are only at the root level and can't be inside composites, so the composite uuid is set to null + // but when it will be the case a specific function will have to be done in order to fetch the composite containing the modificationReference (if there is one) + modificationEntities .forEach(modificationEntity -> { if (modificationEntity instanceof ModificationReferenceEntity modificationReference) { references.putIfAbsent(modificationReference.getReferenceId(), null); From 46e7d22502333bdbc9d95c060da0c886619d848e Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Tue, 7 Jul 2026 18:58:40 +0200 Subject: [PATCH 25/26] checkstyle Signed-off-by: Mathieu DEHARBE --- .../server/repositories/NetworkModificationRepository.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 ac2199c13..3cd20fdfc 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -721,8 +721,7 @@ public Map getReferencesData(@NonNull List modificationUuids) // TODO GRD-4785 : for now shared modification are only at the root level and can't be inside composites, so the composite uuid is set to null // but when it will be the case a specific function will have to be done in order to fetch the composite containing the modificationReference (if there is one) - modificationEntities - .forEach(modificationEntity -> { + modificationEntities.forEach(modificationEntity -> { if (modificationEntity instanceof ModificationReferenceEntity modificationReference) { references.putIfAbsent(modificationReference.getReferenceId(), null); } From 35e1670c36aeecb73cfb6fafdbadf9123855efac Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Tue, 7 Jul 2026 19:27:14 +0200 Subject: [PATCH 26/26] cleaning Signed-off-by: Mathieu DEHARBE --- .../modification/server/CompositeControllerTest.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java b/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java index ec95ad7c5..36ce1ed23 100644 --- a/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java @@ -236,15 +236,13 @@ void testInsertSharedComposite() throws Exception { String bodyJson = getJsonBodyModificationCompositeToBeInserted( List.of(new CompositesToBeInserted(compositeModificationUuid, "shared composite", true))); - mvcResult = runRequestAsync( + runRequestAsync( mockMvc, put(URI_COMPOSITE_NETWORK_MODIF_BASE + "/groups/" + TEST_GROUP_ID + "?action=INSERT") .content(bodyJson) .contentType(MediaType.APPLICATION_JSON), status().isOk()); - assertApplicationStatusOK(mvcResult); - List newModificationList = modificationRepository.getModifications(TEST_GROUP_ID, false, true); assertEquals(modificationsNumber + 1, newModificationList.size());