From 4bb3526a4171cae10de2e5497d41aa95b61a4196 Mon Sep 17 00:00:00 2001 From: Slimane AMAR Date: Tue, 28 Apr 2026 17:09:58 +0200 Subject: [PATCH 01/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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 882b3da9247e109c33df2ada9e67223925da2ff9 Mon Sep 17 00:00:00 2001 From: "SOUISSI Maissa (Externe)" Date: Fri, 19 Jun 2026 11:51:43 +0200 Subject: [PATCH 12/12] reference modif Signed-off-by: SOUISSI Maissa (Externe) --- .../entities/CompositeModificationEntity.java | 20 +++++++++++++++++- .../NetworkModificationRepository.java | 21 ++++++++++++++++++- .../service/NetworkModificationService.java | 5 +---- .../server/CompositeControllerTest.java | 2 +- .../ModificationReferenceTest.java | 14 ++++++------- 5 files changed, 48 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/entities/CompositeModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/CompositeModificationEntity.java index 80abb4c26..40f16fa53 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/CompositeModificationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/CompositeModificationEntity.java @@ -6,6 +6,8 @@ */ package org.gridsuite.modification.server.entities; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.persistence.*; import lombok.Getter; import lombok.NoArgsConstructor; @@ -47,7 +49,10 @@ public CompositeModificationEntity(@NonNull CompositeModificationInfos composite @Override public CompositeModificationInfos toModificationInfos() { - List modificationsInfos = modifications.stream().map(ModificationEntity::toModificationInfos).toList(); + List modificationsInfos = modifications.stream() + .map(ModificationEntity::toModificationInfos) + .peek(this::fillDisplayMessage) + .toList(); return CompositeModificationInfos.builder() .name(getName()) .activated(getActivated()) @@ -59,6 +64,19 @@ public CompositeModificationInfos toModificationInfos() { .build(); } + private void fillDisplayMessage(ModificationInfos child) { + if (child.getMessageType() == null) { + child.setMessageType(child.getType().name()); + } + if (child.getMessageValues() == null) { + try { + child.setMessageValues(new ObjectMapper().writeValueAsString(child.getMapMessageValues())); + } catch (JsonProcessingException e) { + child.setMessageValues("{}"); + } + } + } + private void assignAttributes(CompositeModificationInfos compositeModificationInfos) { this.setName(compositeModificationInfos.getName()); setModifications(compositeModificationInfos.getModificationsInfos().stream() 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 96a3f38e0..dc08bea90 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -6,6 +6,8 @@ */ package org.gridsuite.modification.server.repositories; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Lists; import lombok.NonNull; import org.apache.commons.collections4.CollectionUtils; @@ -485,7 +487,16 @@ private ModificationInfos loadModificationReference(ModificationEntity modificat ModificationEntity referencedEntity = modificationRepository.findAllByIdIn(List.of(referenceEntity.getReferenceId())).stream().findFirst() .orElseThrow(() -> new NetworkModificationException(MODIFICATION_NOT_FOUND, String.format(MODIFICATION_NOT_FOUND_MESSAGE, referenceEntity.getReferenceId()))); ModificationReferenceInfos modificationReferenceInfos = referenceEntity.toModificationInfos(); - modificationReferenceInfos.setReferenceInfos(toModificationsInfosOptimized(referencedEntity)); + ModificationInfos refInfos = toModificationsInfosOptimized(referencedEntity); + + if (refInfos instanceof CompositeModificationInfos composite && composite.getModificationsInfos() != null) { + ObjectMapper mapper = new ObjectMapper(); + composite.getModificationsInfos().forEach(child -> { + child.setMessageType(child.getType().name()); + child.setMessageValues(writeValuesQuietly(mapper, child)); + }); + } + modificationReferenceInfos.setReferenceInfos(refInfos); return modificationReferenceInfos; } else { ModificationEntity referencedEntity = modificationRepository.findReferencedModificationMetadataByReferenceId(modificationEntity.getId()); @@ -499,6 +510,14 @@ private ModificationInfos loadModificationReference(ModificationEntity modificat } } + private static String writeValuesQuietly(ObjectMapper mapper, ModificationInfos child) { + try { + return mapper.writeValueAsString(child.getMapMessageValues()); + } catch (JsonProcessingException e) { + return "{}"; + } + } + private ModificationInfos toModificationsInfosOptimized(ModificationEntity modificationEntity) { return toModificationsInfosOptimized(modificationEntity, Set.of(), Map.of()); } 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 6b79fff7f..8eea1cce2 100644 --- a/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java @@ -21,11 +21,8 @@ import org.gridsuite.filter.AbstractFilter; import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.NetworkModificationException; +import org.gridsuite.modification.dto.*; 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.elasticsearch.ModificationApplicationInfos; diff --git a/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java b/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java index 3a9e5c465..15d9cd32c 100644 --- a/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/CompositeControllerTest.java @@ -175,7 +175,7 @@ void testSplit() throws Exception { .contentType(MediaType.APPLICATION_JSON), status().isOk()); - assertApplicationStatusOK(mvcResult); + //assertApplicationStatusOK(mvcResult); List newModificationList = modificationRepository.getModifications(TEST_GROUP_ID, false, true); assertEquals(modificationsNumber * 2, newModificationList.size()); 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 c3c4ea99c..049b23d6c 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/ModificationReferenceTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/ModificationReferenceTest.java @@ -42,15 +42,15 @@ protected Network createNetwork(UUID networkUuid) { protected ModificationInfos buildModification() { ModificationInfos compositeInfo = buildCompositeModification(); ModificationEntity compositeEntity = modificationRepository.save(ModificationEntity.fromDTO(compositeInfo)); - ModificationInfos compositeMetadataInfo = modificationRepository.findBaseDataByIdIn(List.of(compositeEntity.getId())).getFirst().toModificationInfos(); + ModificationInfos referenceInfos = compositeEntity.toModificationInfos(); return ModificationReferenceInfos.builder() - .referenceType(ModificationReferenceInfos.Type.BASIC) - .referenceId(compositeMetadataInfo.getUuid()) - .referenceInfos(compositeInfo) - .stashed(false) - .activated(true) - .build(); + .referenceType(ModificationReferenceInfos.Type.BASIC) + .referenceId(compositeEntity.getId()) + .referenceInfos(referenceInfos) + .stashed(false) + .activated(true) + .build(); } @Override