From b16e3e69bc51db323983fbe0a7980a843aa7eb51 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Wed, 4 Feb 2026 16:18:44 +0100 Subject: [PATCH 1/9] apply CompositeModification Signed-off-by: Mathieu DEHARBE --- .../modifications/CompositeModification.java | 10 ++++- .../CompositeModificationsTest.java | 37 +++++++++++++------ 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/modifications/CompositeModification.java b/src/main/java/org/gridsuite/modification/modifications/CompositeModification.java index 8feacfcd..aa9c1158 100644 --- a/src/main/java/org/gridsuite/modification/modifications/CompositeModification.java +++ b/src/main/java/org/gridsuite/modification/modifications/CompositeModification.java @@ -15,12 +15,20 @@ */ public class CompositeModification extends AbstractModification { + private final CompositeModificationInfos compositeModificationInfos; + public CompositeModification(CompositeModificationInfos compositeModificationInfos) { + this.compositeModificationInfos = compositeModificationInfos; } @Override public void apply(Network network, ReportNode subReportNode) { - throw new UnsupportedOperationException(); + // TODO : ajouer un log parent INFO structurant + compositeModificationInfos.getModifications().forEach( + modif -> + // TODO : en cas d'erreur ne pas interrompre l'exécution de la composite en soit + modif.toModification().apply(network, subReportNode) + ); } @Override diff --git a/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java b/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java index ac004b93..a3ccc413 100644 --- a/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java @@ -6,6 +6,7 @@ */ package org.gridsuite.modification.modifications; +import com.powsybl.iidm.network.Generator; import com.powsybl.iidm.network.LoadType; import com.powsybl.iidm.network.Network; @@ -17,6 +18,7 @@ import java.util.List; import java.util.UUID; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; /** @@ -27,13 +29,7 @@ class CompositeModificationsTest extends AbstractNetworkModificationTest { @Override public void checkModification() { - } - - @Override - public void testApply() throws Exception { - CompositeModificationInfos compositeModificationInfos = (CompositeModificationInfos) buildModification(); - compositeModificationInfos.getModifications().forEach(modificationInfos -> modificationInfos.toModification().apply(getNetwork())); - assertAfterNetworkModificationApplication(); + // TODO } @Override @@ -43,11 +39,28 @@ protected Network createNetwork(UUID networkUuid) { @Override protected ModificationInfos buildModification() { + CompositeModificationInfos subSubCompo = CompositeModificationInfos.builder() + .modifications( + List.of(ModificationCreation.getModificationGenerator( "idGenerator", "other idGenerator name again")) + ).build(); + CompositeModificationInfos subCompo1 = CompositeModificationInfos.builder() + .modifications( + List.of(ModificationCreation.getModificationGenerator( "idGenerator", "other idGenerator name")) + ).build(); + CompositeModificationInfos subCompo2 = CompositeModificationInfos.builder() + .modifications( + List.of( + subSubCompo, + ModificationCreation.getModificationGenerator( "idGenerator", "even newer idGenerator name") + ) + ).build(); List modifications = List.of( - ModificationCreation.getCreationGenerator("v1", "idGenerator", "nameGenerator", "1B", "v2load", "LOAD", - "v1"), + subCompo1, + ModificationCreation.getModificationGenerator( "idGenerator", "new idGenerator name"), ModificationCreation.getCreationLoad("v1", "idLoad", "nameLoad", "1.1", LoadType.UNDEFINED), - ModificationCreation.getCreationBattery("v1", "idBattery", "nameBattry", "1.1")); + ModificationCreation.getCreationBattery("v1", "idBattery", "nameBattery", "1.1"), + subCompo2 + ); return CompositeModificationInfos.builder() .modifications(modifications) .stashed(false) @@ -56,7 +69,9 @@ protected ModificationInfos buildModification() { @Override protected void assertAfterNetworkModificationApplication() { - assertNotNull(getNetwork().getGenerator("idGenerator")); + Generator gen = getNetwork().getGenerator("idGenerator"); + assertNotNull(gen); + assertEquals("even newer idGenerator name", gen.getOptionalName().orElseThrow()); assertNotNull(getNetwork().getLoad("idLoad")); assertNotNull(getNetwork().getBattery("idBattery")); } From 801c348624082f740e9efad209e059e257e577de Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Thu, 5 Feb 2026 11:55:31 +0100 Subject: [PATCH 2/9] better style Signed-off-by: Mathieu DEHARBE --- .../CompositeModificationsTest.java | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java b/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java index a3ccc413..f0246985 100644 --- a/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java @@ -39,27 +39,25 @@ protected Network createNetwork(UUID networkUuid) { @Override protected ModificationInfos buildModification() { - CompositeModificationInfos subSubCompo = CompositeModificationInfos.builder() - .modifications( - List.of(ModificationCreation.getModificationGenerator( "idGenerator", "other idGenerator name again")) - ).build(); - CompositeModificationInfos subCompo1 = CompositeModificationInfos.builder() - .modifications( - List.of(ModificationCreation.getModificationGenerator( "idGenerator", "other idGenerator name")) - ).build(); - CompositeModificationInfos subCompo2 = CompositeModificationInfos.builder() - .modifications( - List.of( - subSubCompo, - ModificationCreation.getModificationGenerator( "idGenerator", "even newer idGenerator name") - ) - ).build(); List modifications = List.of( - subCompo1, - ModificationCreation.getModificationGenerator( "idGenerator", "new idGenerator name"), + CompositeModificationInfos.builder() + .modifications( + List.of(ModificationCreation.getModificationGenerator("idGenerator", "other idGenerator name")) + ).build(), + ModificationCreation.getModificationGenerator("idGenerator", "new idGenerator name"), ModificationCreation.getCreationLoad("v1", "idLoad", "nameLoad", "1.1", LoadType.UNDEFINED), ModificationCreation.getCreationBattery("v1", "idBattery", "nameBattery", "1.1"), - subCompo2 + // test of a composite modification inside a composite modification inside a composite modification + CompositeModificationInfos.builder() + .modifications( + List.of( + CompositeModificationInfos.builder() + .modifications( + List.of(ModificationCreation.getModificationGenerator("idGenerator", "other idGenerator name again")) + ).build(), + ModificationCreation.getModificationGenerator("idGenerator", "even newer idGenerator name") + ) + ).build() ); return CompositeModificationInfos.builder() .modifications(modifications) From 6a39c7020cb013a95c661ee65b5288e5445cb747 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Thu, 5 Feb 2026 14:13:55 +0100 Subject: [PATCH 3/9] handle exceptions Signed-off-by: Mathieu DEHARBE --- .../modifications/CompositeModification.java | 28 ++++++++++++++++--- .../gridsuite/modification/reports.properties | 2 ++ .../CompositeModificationsTest.java | 10 ++++++- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/modifications/CompositeModification.java b/src/main/java/org/gridsuite/modification/modifications/CompositeModification.java index aa9c1158..a7885ace 100644 --- a/src/main/java/org/gridsuite/modification/modifications/CompositeModification.java +++ b/src/main/java/org/gridsuite/modification/modifications/CompositeModification.java @@ -7,8 +7,12 @@ package org.gridsuite.modification.modifications; import com.powsybl.commons.report.ReportNode; +import com.powsybl.commons.report.TypedValue; import com.powsybl.iidm.network.Network; import org.gridsuite.modification.dto.CompositeModificationInfos; +import org.gridsuite.modification.report.NetworkModificationReportResourceBundle; + +import static org.gridsuite.modification.modifications.byfilter.AbstractModificationByAssignment.VALUE_KEY_ERROR_MESSAGE; /** * @author Ghazwa Rehili @@ -23,11 +27,27 @@ public CompositeModification(CompositeModificationInfos compositeModificationInf @Override public void apply(Network network, ReportNode subReportNode) { - // TODO : ajouer un log parent INFO structurant + ReportNode compositeNode = subReportNode.newReportNode() + .withMessageTemplate("network.modification.composite") + .withUntypedValue("modificationName", this.getName()) + .withSeverity(TypedValue.INFO_SEVERITY) + .add(); compositeModificationInfos.getModifications().forEach( - modif -> - // TODO : en cas d'erreur ne pas interrompre l'exécution de la composite en soit - modif.toModification().apply(network, subReportNode) + modif -> { + try { + modif.toModification().apply(network, compositeNode); + } catch (Exception e) { + // in case of error in a network modification, the composite modification doens't interrupt its execution + // the following modifications will be carried out + compositeNode.newReportNode() + .withResourceBundles(NetworkModificationReportResourceBundle.BASE_NAME) + .withMessageTemplate("network.modification.compositeReportException") + .withUntypedValue("modificationName", modif.toModification().getName()) + .withUntypedValue(VALUE_KEY_ERROR_MESSAGE, e.getMessage()) + .withSeverity(TypedValue.WARN_SEVERITY) + .add(); + } + } ); } diff --git a/src/main/resources/org/gridsuite/modification/reports.properties b/src/main/resources/org/gridsuite/modification/reports.properties index fc3f9203..0bc7c829 100644 --- a/src/main/resources/org/gridsuite/modification/reports.properties +++ b/src/main/resources/org/gridsuite/modification/reports.properties @@ -189,6 +189,8 @@ network.modification.noLimitSetSelectedOnSide1 = No limit set selected on side 1 network.modification.noLimitSetSelectedOnSide2 = No limit set selected on side 2 network.modification.limitSetAbsentOnSide1 = limit set '${selectedOperationalLimitsGroup}' on side 1 does not exist network.modification.limitSetAbsentOnSide2 = limit set '${selectedOperationalLimitsGroup}' on side 2 does not exist +network.modification.composite = composite modification : '${modificationName}' +network.modification.compositeReportException = Cannot execute ${modificationName} : ${errorMessage} network.modification.applicabilityChanged = limit set ${operationalLimitsGroupName} applicability changed to ${applicability} network.modification.limits = Limits network.modification.activeLimitsSets = Active limits sets diff --git a/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java b/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java index f0246985..e2636f9c 100644 --- a/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java @@ -42,7 +42,12 @@ protected ModificationInfos buildModification() { List modifications = List.of( CompositeModificationInfos.builder() .modifications( - List.of(ModificationCreation.getModificationGenerator("idGenerator", "other idGenerator name")) + List.of( + ModificationCreation.getModificationGenerator("idGenerator", "other idGenerator name"), + // this should throw an error but not stop the execution of the composite modification and all the other content + ModificationCreation.getCreationGenerator( + "v1", "idGenerator", "nameGenerator", "1B", "v2load", "LOAD","v1") + ) ).build(), ModificationCreation.getModificationGenerator("idGenerator", "new idGenerator name"), ModificationCreation.getCreationLoad("v1", "idLoad", "nameLoad", "1.1", LoadType.UNDEFINED), @@ -78,4 +83,7 @@ protected void assertAfterNetworkModificationApplication() { protected void testCreationModificationMessage(ModificationInfos modificationInfos) throws Exception { assertNotNull(ModificationType.COMPOSITE_MODIFICATION.name(), modificationInfos.getMessageType()); } + + // TODO : tester les messages + // TODO : tester qu'il y a bien un throw, choppé et passé et présent dans les messages } From 5d41375b410b3a2e8d09cabbaf6835788c091580 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Thu, 5 Feb 2026 14:39:52 +0100 Subject: [PATCH 4/9] CI Signed-off-by: Mathieu DEHARBE --- .../modification/modifications/CompositeModificationsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java b/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java index e2636f9c..77ed1f3f 100644 --- a/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java @@ -46,7 +46,7 @@ protected ModificationInfos buildModification() { ModificationCreation.getModificationGenerator("idGenerator", "other idGenerator name"), // this should throw an error but not stop the execution of the composite modification and all the other content ModificationCreation.getCreationGenerator( - "v1", "idGenerator", "nameGenerator", "1B", "v2load", "LOAD","v1") + "v1", "idGenerator", "nameGenerator", "1B", "v2load", "LOAD", "v1") ) ).build(), ModificationCreation.getModificationGenerator("idGenerator", "new idGenerator name"), From b0da849d6555ec0903cf73d18ece1016c4101a57 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Thu, 5 Feb 2026 15:20:44 +0100 Subject: [PATCH 5/9] TU on exceptions Signed-off-by: Mathieu DEHARBE --- .../modifications/CompositeModification.java | 2 +- .../CompositeModificationsTest.java | 27 ++++++++++++++----- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/modifications/CompositeModification.java b/src/main/java/org/gridsuite/modification/modifications/CompositeModification.java index a7885ace..5186cacc 100644 --- a/src/main/java/org/gridsuite/modification/modifications/CompositeModification.java +++ b/src/main/java/org/gridsuite/modification/modifications/CompositeModification.java @@ -37,7 +37,7 @@ public void apply(Network network, ReportNode subReportNode) { try { modif.toModification().apply(network, compositeNode); } catch (Exception e) { - // in case of error in a network modification, the composite modification doens't interrupt its execution + // in case of error in a network modification, the composite modification doesn't interrupt its execution // the following modifications will be carried out compositeNode.newReportNode() .withResourceBundles(NetworkModificationReportResourceBundle.BASE_NAME) diff --git a/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java b/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java index 77ed1f3f..4212c80c 100644 --- a/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java @@ -6,20 +6,19 @@ */ package org.gridsuite.modification.modifications; +import com.powsybl.commons.PowsyblException; import com.powsybl.iidm.network.Generator; 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.*; import org.gridsuite.modification.utils.ModificationCreation; import org.gridsuite.modification.utils.NetworkCreation; import java.util.List; import java.util.UUID; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.*; /** * @author Ghazwa Rehili @@ -29,7 +28,22 @@ class CompositeModificationsTest extends AbstractNetworkModificationTest { @Override public void checkModification() { - // TODO + Network network = getNetwork(); + CompositeModificationInfos compositeModificationInfos = (CompositeModificationInfos) buildModification(); + + // regular throwing exception netmod + GeneratorCreation throwingExceptionNetMod = (GeneratorCreation) buildThrowingModification().toModification(); + assertThrows(PowsyblException.class, () -> throwingExceptionNetMod.apply(network)); + // but doesn't throw once inside a composite modification + compositeModificationInfos.setModifications(List.of(buildThrowingModification())); + CompositeModification netmod = (CompositeModification) compositeModificationInfos.toModification(); + assertDoesNotThrow(() -> netmod.apply(network)); + } + + private GeneratorCreationInfos buildThrowingModification() { + return ModificationCreation.getCreationGenerator( + "v1", "idGenerator", "nameGenerator", "1B", "v2load", "LOAD", "v1" + ); } @Override @@ -45,8 +59,7 @@ protected ModificationInfos buildModification() { List.of( ModificationCreation.getModificationGenerator("idGenerator", "other idGenerator name"), // this should throw an error but not stop the execution of the composite modification and all the other content - ModificationCreation.getCreationGenerator( - "v1", "idGenerator", "nameGenerator", "1B", "v2load", "LOAD", "v1") + buildThrowingModification() ) ).build(), ModificationCreation.getModificationGenerator("idGenerator", "new idGenerator name"), From f010e683f1f96a846beeb332db57bfef3d36da67 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Thu, 5 Feb 2026 16:50:51 +0100 Subject: [PATCH 6/9] better log structure Signed-off-by: Mathieu DEHARBE --- .../modification/dto/CompositeModificationInfos.java | 9 +++++++++ .../modifications/CompositeModification.java | 12 ++++-------- .../org/gridsuite/modification/reports.properties | 2 +- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/dto/CompositeModificationInfos.java b/src/main/java/org/gridsuite/modification/dto/CompositeModificationInfos.java index 96ea4838..c99e0ebf 100644 --- a/src/main/java/org/gridsuite/modification/dto/CompositeModificationInfos.java +++ b/src/main/java/org/gridsuite/modification/dto/CompositeModificationInfos.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.powsybl.commons.report.ReportNode; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.NoArgsConstructor; @@ -41,4 +42,12 @@ public class CompositeModificationInfos extends ModificationInfos { public AbstractModification toModification() { return new CompositeModification(this); } + + @Override + public ReportNode createSubReportNode(ReportNode reportNode) { + return reportNode.newReportNode() + .withMessageTemplate("network.modification.composite") + .withUntypedValue("modificationName", "nom bidon TODO") // TODO : ajouter un nom à CompositeModificationInfos + .add(); + } } diff --git a/src/main/java/org/gridsuite/modification/modifications/CompositeModification.java b/src/main/java/org/gridsuite/modification/modifications/CompositeModification.java index 5186cacc..66270398 100644 --- a/src/main/java/org/gridsuite/modification/modifications/CompositeModification.java +++ b/src/main/java/org/gridsuite/modification/modifications/CompositeModification.java @@ -27,19 +27,15 @@ public CompositeModification(CompositeModificationInfos compositeModificationInf @Override public void apply(Network network, ReportNode subReportNode) { - ReportNode compositeNode = subReportNode.newReportNode() - .withMessageTemplate("network.modification.composite") - .withUntypedValue("modificationName", this.getName()) - .withSeverity(TypedValue.INFO_SEVERITY) - .add(); compositeModificationInfos.getModifications().forEach( modif -> { + ReportNode modifNode = modif.createSubReportNode(subReportNode); try { - modif.toModification().apply(network, compositeNode); + modif.toModification().apply(network, modifNode); } catch (Exception e) { - // in case of error in a network modification, the composite modification doesn't interrupt its execution + // in case of error in a network modification, the composite modification doesn't interrupt its execution : // the following modifications will be carried out - compositeNode.newReportNode() + modifNode.newReportNode() .withResourceBundles(NetworkModificationReportResourceBundle.BASE_NAME) .withMessageTemplate("network.modification.compositeReportException") .withUntypedValue("modificationName", modif.toModification().getName()) diff --git a/src/main/resources/org/gridsuite/modification/reports.properties b/src/main/resources/org/gridsuite/modification/reports.properties index 0bc7c829..6a1d7a7f 100644 --- a/src/main/resources/org/gridsuite/modification/reports.properties +++ b/src/main/resources/org/gridsuite/modification/reports.properties @@ -189,7 +189,7 @@ network.modification.noLimitSetSelectedOnSide1 = No limit set selected on side 1 network.modification.noLimitSetSelectedOnSide2 = No limit set selected on side 2 network.modification.limitSetAbsentOnSide1 = limit set '${selectedOperationalLimitsGroup}' on side 1 does not exist network.modification.limitSetAbsentOnSide2 = limit set '${selectedOperationalLimitsGroup}' on side 2 does not exist -network.modification.composite = composite modification : '${modificationName}' +network.modification.composite = Composite modification : '${modificationName}' network.modification.compositeReportException = Cannot execute ${modificationName} : ${errorMessage} network.modification.applicabilityChanged = limit set ${operationalLimitsGroupName} applicability changed to ${applicability} network.modification.limits = Limits From b5d8beca731f8f60248daae9c8ed0e6090778a57 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Thu, 5 Feb 2026 17:18:57 +0100 Subject: [PATCH 7/9] test thrown message in reports Signed-off-by: Mathieu DEHARBE --- .../CompositeModificationsTest.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java b/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java index 4212c80c..cafbc41b 100644 --- a/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java @@ -7,17 +7,20 @@ package org.gridsuite.modification.modifications; import com.powsybl.commons.PowsyblException; +import com.powsybl.commons.report.ReportNode; import com.powsybl.iidm.network.Generator; import com.powsybl.iidm.network.LoadType; import com.powsybl.iidm.network.Network; import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.dto.*; +import org.gridsuite.modification.report.NetworkModificationReportResourceBundle; import org.gridsuite.modification.utils.ModificationCreation; import org.gridsuite.modification.utils.NetworkCreation; import java.util.List; import java.util.UUID; +import static org.gridsuite.modification.utils.TestUtils.assertLogMessageWithoutRank; import static org.junit.jupiter.api.Assertions.*; /** @@ -35,9 +38,19 @@ public void checkModification() { GeneratorCreation throwingExceptionNetMod = (GeneratorCreation) buildThrowingModification().toModification(); assertThrows(PowsyblException.class, () -> throwingExceptionNetMod.apply(network)); // but doesn't throw once inside a composite modification + ReportNode report = compositeModificationInfos.createSubReportNode(ReportNode.newRootReportNode() + .withResourceBundles(NetworkModificationReportResourceBundle.BASE_NAME) + .withMessageTemplate("test") + .build()); compositeModificationInfos.setModifications(List.of(buildThrowingModification())); CompositeModification netmod = (CompositeModification) compositeModificationInfos.toModification(); - assertDoesNotThrow(() -> netmod.apply(network)); + assertDoesNotThrow(() -> netmod.apply(network, report)); + // but the thrown message is inside the report : + assertLogMessageWithoutRank( + "Cannot execute GeneratorCreation : The network " + getNetwork().getId() + " already contains an object 'GeneratorImpl' with the id 'idGenerator'", + "network.modification.compositeReportException", + report + ); } private GeneratorCreationInfos buildThrowingModification() { @@ -97,6 +110,5 @@ protected void testCreationModificationMessage(ModificationInfos modificationInf assertNotNull(ModificationType.COMPOSITE_MODIFICATION.name(), modificationInfos.getMessageType()); } - // TODO : tester les messages - // TODO : tester qu'il y a bien un throw, choppé et passé et présent dans les messages + // TODO : tester les messages, en tout cas celui de la composite avec son nom } From 8bdec701f4a24a32523741245dde049b9fb84253 Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Fri, 6 Feb 2026 13:25:57 +0100 Subject: [PATCH 8/9] getMessageFromReporterAtDepth Signed-off-by: Mathieu DEHARBE --- .../CompositeModificationsTest.java | 22 ++++++++++---- .../modification/utils/TestUtils.java | 30 +++++++++++++++++++ 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java b/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java index cafbc41b..6f0f03cc 100644 --- a/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java @@ -20,7 +20,7 @@ import java.util.List; import java.util.UUID; -import static org.gridsuite.modification.utils.TestUtils.assertLogMessageWithoutRank; +import static org.gridsuite.modification.utils.TestUtils.*; import static org.junit.jupiter.api.Assertions.*; /** @@ -34,17 +34,27 @@ public void checkModification() { Network network = getNetwork(); CompositeModificationInfos compositeModificationInfos = (CompositeModificationInfos) buildModification(); - // regular throwing exception netmod - GeneratorCreation throwingExceptionNetMod = (GeneratorCreation) buildThrowingModification().toModification(); - assertThrows(PowsyblException.class, () -> throwingExceptionNetMod.apply(network)); - // but doesn't throw once inside a composite modification + // checks that the sub sub sub netmod is executed at the right depth ReportNode report = compositeModificationInfos.createSubReportNode(ReportNode.newRootReportNode() .withResourceBundles(NetworkModificationReportResourceBundle.BASE_NAME) .withMessageTemplate("test") .build()); - compositeModificationInfos.setModifications(List.of(buildThrowingModification())); CompositeModification netmod = (CompositeModification) compositeModificationInfos.toModification(); assertDoesNotThrow(() -> netmod.apply(network, report)); + assertLogMessageAtDepth( + "Generator with id=idGenerator modified :", + "network.modification.generatorModification", + report, + 3 + ); + + // regular throwing exception netmod + GeneratorCreation throwingExceptionNetMod = (GeneratorCreation) buildThrowingModification().toModification(); + assertThrows(PowsyblException.class, () -> throwingExceptionNetMod.apply(network)); + // but doesn't throw once inside a composite modification + compositeModificationInfos.setModifications(List.of(buildThrowingModification())); + CompositeModification netmodContainingError = (CompositeModification) compositeModificationInfos.toModification(); + assertDoesNotThrow(() -> netmodContainingError.apply(network, report)); // but the thrown message is inside the report : assertLogMessageWithoutRank( "Cannot execute GeneratorCreation : The network " + getNetwork().getId() + " already contains an object 'GeneratorImpl' with the id 'idGenerator'", diff --git a/src/test/java/org/gridsuite/modification/utils/TestUtils.java b/src/test/java/org/gridsuite/modification/utils/TestUtils.java index 52c73bdb..94ae7662 100644 --- a/src/test/java/org/gridsuite/modification/utils/TestUtils.java +++ b/src/test/java/org/gridsuite/modification/utils/TestUtils.java @@ -58,6 +58,12 @@ public static void assertLogNthMessage(String expectedMessage, String reportKey, assertEquals(expectedMessage, message.get().trim()); } + public static void assertLogMessageAtDepth(String expectedMessage, String reportKey, ReportNode reportNode, int depth) { + Optional message = getMessageFromReporterAtDepth(reportKey, reportNode, 0, depth); + assertTrue(message.isPresent()); + assertEquals(expectedMessage, message.get().trim()); + } + public static void assertLogMessage(String expectedMessage, String reportKey, ReportNode reportNode) { assertLogNthMessage(expectedMessage, reportKey, reportNode, 1); } @@ -85,6 +91,30 @@ private static boolean assertMessageFoundFromReporter(String expectedMessage, St return foundInSubReporters; } + private static Optional getMessageFromReporterAtDepth(String reportKey, ReportNode reporterModel, int currentDepth, int expectedDepth) { + Optional message = Optional.empty(); + + Iterator reportersIterator = reporterModel.getChildren().iterator(); + while (message.isEmpty() && reportersIterator.hasNext() && currentDepth < expectedDepth) { + message = getMessageFromReporterAtDepth(reportKey, reportersIterator.next(), currentDepth + 1, expectedDepth); + } + + Iterator reportsIterator = reporterModel.getChildren().iterator(); + while (message.isEmpty() && reportsIterator.hasNext()) { + ReportNode report = reportsIterator.next(); + if (currentDepth == expectedDepth) { + if (report.getMessageKey().equals(reportKey)) { + message = Optional.of(formatReportMessage(report, reporterModel)); + } + } + } + + return message; + } + + /** + * @param rank order position inside reporterModel + */ private static Optional getMessageFromReporter(String reportKey, ReportNode reporterModel, int rank) { Optional message = Optional.empty(); From 3797c2f2ebbaccd91b64c9bb1c4fe099b80196fa Mon Sep 17 00:00:00 2001 From: Mathieu DEHARBE Date: Fri, 6 Feb 2026 14:46:29 +0100 Subject: [PATCH 9/9] adds a name to the composite modifications Signed-off-by: Mathieu DEHARBE --- .../dto/CompositeModificationInfos.java | 5 ++++- .../modifications/CompositeModificationsTest.java | 14 +++++++++++--- .../gridsuite/modification/utils/TestUtils.java | 8 +++----- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/dto/CompositeModificationInfos.java b/src/main/java/org/gridsuite/modification/dto/CompositeModificationInfos.java index c99e0ebf..5941ed58 100644 --- a/src/main/java/org/gridsuite/modification/dto/CompositeModificationInfos.java +++ b/src/main/java/org/gridsuite/modification/dto/CompositeModificationInfos.java @@ -34,6 +34,9 @@ @ModificationErrorTypeName("COMPOSITE_MODIFICATION_ERROR") public class CompositeModificationInfos extends ModificationInfos { + @Schema(description = "composite modification name") + private String compositeName; + @Schema(description = "composite modification list") @JsonInclude(JsonInclude.Include.NON_NULL) private List modifications; @@ -47,7 +50,7 @@ public AbstractModification toModification() { public ReportNode createSubReportNode(ReportNode reportNode) { return reportNode.newReportNode() .withMessageTemplate("network.modification.composite") - .withUntypedValue("modificationName", "nom bidon TODO") // TODO : ajouter un nom à CompositeModificationInfos + .withUntypedValue("modificationName", getCompositeName()) .add(); } } diff --git a/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java b/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java index 6f0f03cc..ed6644c3 100644 --- a/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/CompositeModificationsTest.java @@ -45,7 +45,13 @@ public void checkModification() { "Generator with id=idGenerator modified :", "network.modification.generatorModification", report, - 3 + 4 + ); + assertLogMessageAtDepth( + "Composite modification : 'sub sub composite'", + "network.modification.composite", + report, + 2 ); // regular throwing exception netmod @@ -78,6 +84,7 @@ protected Network createNetwork(UUID networkUuid) { protected ModificationInfos buildModification() { List modifications = List.of( CompositeModificationInfos.builder() + .compositeName("sub composite 1") .modifications( List.of( ModificationCreation.getModificationGenerator("idGenerator", "other idGenerator name"), @@ -90,9 +97,11 @@ protected ModificationInfos buildModification() { ModificationCreation.getCreationBattery("v1", "idBattery", "nameBattery", "1.1"), // test of a composite modification inside a composite modification inside a composite modification CompositeModificationInfos.builder() + .compositeName("sub composite 2") .modifications( List.of( CompositeModificationInfos.builder() + .compositeName("sub sub composite") .modifications( List.of(ModificationCreation.getModificationGenerator("idGenerator", "other idGenerator name again")) ).build(), @@ -101,6 +110,7 @@ protected ModificationInfos buildModification() { ).build() ); return CompositeModificationInfos.builder() + .compositeName("main composite") .modifications(modifications) .stashed(false) .build(); @@ -119,6 +129,4 @@ protected void assertAfterNetworkModificationApplication() { protected void testCreationModificationMessage(ModificationInfos modificationInfos) throws Exception { assertNotNull(ModificationType.COMPOSITE_MODIFICATION.name(), modificationInfos.getMessageType()); } - - // TODO : tester les messages, en tout cas celui de la composite avec son nom } diff --git a/src/test/java/org/gridsuite/modification/utils/TestUtils.java b/src/test/java/org/gridsuite/modification/utils/TestUtils.java index 94ae7662..bf93c9e0 100644 --- a/src/test/java/org/gridsuite/modification/utils/TestUtils.java +++ b/src/test/java/org/gridsuite/modification/utils/TestUtils.java @@ -59,7 +59,7 @@ public static void assertLogNthMessage(String expectedMessage, String reportKey, } public static void assertLogMessageAtDepth(String expectedMessage, String reportKey, ReportNode reportNode, int depth) { - Optional message = getMessageFromReporterAtDepth(reportKey, reportNode, 0, depth); + Optional message = getMessageFromReporterAtDepth(reportKey, reportNode, 1, depth); assertTrue(message.isPresent()); assertEquals(expectedMessage, message.get().trim()); } @@ -102,10 +102,8 @@ private static Optional getMessageFromReporterAtDepth(String reportKey, Iterator reportsIterator = reporterModel.getChildren().iterator(); while (message.isEmpty() && reportsIterator.hasNext()) { ReportNode report = reportsIterator.next(); - if (currentDepth == expectedDepth) { - if (report.getMessageKey().equals(reportKey)) { - message = Optional.of(formatReportMessage(report, reporterModel)); - } + if (currentDepth == expectedDepth && report.getMessageKey().equals(reportKey)) { + message = Optional.of(formatReportMessage(report, reporterModel)); } }