diff --git a/pom.xml b/pom.xml index 292d28ef5..242abc163 100644 --- a/pom.xml +++ b/pom.xml @@ -44,14 +44,12 @@ - 38.0.0 + 38.1.0-SNAPSHOT 1.0.5 5.0.0-alpha.14 org.gridsuite.modification.server **/migration/**/* - 0.13.0 - - 1.24.0 + 0.13.0-SNAPSHOT gridsuite org.gridsuite:network-modification-server @@ -97,25 +95,6 @@ import - - com.powsybl - powsybl-network-store-client - - ${powsybl-network-store.version} - - - - com.powsybl - powsybl-network-store-iidm-impl - ${powsybl-network-store.version} - - - - com.powsybl - powsybl-network-store-model - ${powsybl-network-store.version} - - org.gridsuite diff --git a/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java b/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java index cc8064eca..1edd1db9a 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java @@ -173,7 +173,10 @@ private ApplicationStatus apply(ModificationApplicationGroup modificationGroupIn ReportNode reportNode; if (modificationGroupInfos.reportInfos().getNodeUuid() != null) { UUID reporterId = modificationGroupInfos.reportInfos().getNodeUuid(); - reportNode = ReportNode.newRootReportNode().withMessageTemplate(reporterId.toString(), reporterId.toString()).build(); + reportNode = ReportNode.newRootReportNode() + .withAllResourceBundlesFromClasspath() + .withMessageTemplate("network.modification.server.nodeUuid") + .withUntypedValue("nodeUuid", reporterId.toString()).build(); } else { reportNode = ReportNode.NO_OP; } diff --git a/src/main/java/org/gridsuite/modification/server/report/NetworkModificationServerReportResourceBundle.java b/src/main/java/org/gridsuite/modification/server/report/NetworkModificationServerReportResourceBundle.java new file mode 100644 index 000000000..a89cbcaa7 --- /dev/null +++ b/src/main/java/org/gridsuite/modification/server/report/NetworkModificationServerReportResourceBundle.java @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2025, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * SPDX-License-Identifier: MPL-2.0 + */ +package org.gridsuite.modification.server.report; + +import com.google.auto.service.AutoService; +import com.powsybl.commons.report.ReportResourceBundle; + +/** + * @author Charly Boutier {@literal } + */ +@AutoService(ReportResourceBundle.class) +public final class NetworkModificationServerReportResourceBundle implements ReportResourceBundle { + + public static final String BASE_NAME = "org.gridsuite.modification.server.reports"; + + public String getBaseName() { + return BASE_NAME; + } +} diff --git a/src/main/resources/org/gridsuite/modification/server/reports.properties b/src/main/resources/org/gridsuite/modification/server/reports.properties new file mode 100644 index 000000000..829aff99e --- /dev/null +++ b/src/main/resources/org/gridsuite/modification/server/reports.properties @@ -0,0 +1 @@ +network.modification.server.nodeUuid = ${nodeUuid} diff --git a/src/main/resources/org/gridsuite/modification/server/reports_en_US.properties b/src/main/resources/org/gridsuite/modification/server/reports_en_US.properties new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/src/main/resources/org/gridsuite/modification/server/reports_en_US.properties @@ -0,0 +1 @@ + diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index 9f0a628cd..65b7b271f 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -1330,7 +1330,10 @@ void testTombstonedEquipmentInfos() throws Exception { mvcResult = mockMvc.perform(post(NETWORK_MODIFICATION_URI).content(equipmentDeletionInfosJson).contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()).andReturn(); assertApplicationStatusOK(mvcResult); - expectedImpacts = createMultipleDeletionImpacts( + expectedImpacts = new ArrayList<>(); + // Two winding transformer trf2 (in s1) is regulating on v3load (in s2), resetting regulation on delete of v3load adds a modification impact on the substation s1 + expectedImpacts.add(createModificationImpactType(IdentifiableType.SUBSTATION, "s1", Set.of("s1"))); + expectedImpacts.addAll(createMultipleDeletionImpacts( List.of( Pair.of(IdentifiableType.SUBSTATION, "s2"), Pair.of(IdentifiableType.VOLTAGE_LEVEL, "v3"), Pair.of(IdentifiableType.BUSBAR_SECTION, "3A"), Pair.of(IdentifiableType.LOAD, "v3load"), @@ -1339,7 +1342,7 @@ void testTombstonedEquipmentInfos() throws Exception { Pair.of(IdentifiableType.SWITCH, "v3bl3"), Pair.of(IdentifiableType.SWITCH, "v3dl3") ), Set.of("s2") - ); + )); expectedImpacts.addAll(createMultipleDeletionImpacts( List.of( Pair.of(IdentifiableType.SWITCH, "v1bl3"), Pair.of(IdentifiableType.SWITCH, "v1dl3"), @@ -1382,7 +1385,7 @@ private void testBranchDeletionImpacts(String resultAsString, TestImpactUtils.testBranchDeletionImpacts(mapper, resultAsString, branchType, branchId, breakerId1, disconnectorId1, substationId1, breakerId2, disconnectorId2, substationId2); // line and switches have been removed from network - assertNull(network.getLine(branchId)); + assertNull(network.getBranch(branchId)); assertNull(network.getSwitch(breakerId1)); assertNull(network.getSwitch(disconnectorId1)); assertNull(network.getSwitch(breakerId2)); @@ -1427,7 +1430,7 @@ private void test3WTDeletionImpacts(String resultAsString, String w3tId, private void testMultipleDeletionImpacts(String networkModificationResultAsString, List expectedImpacts) throws Exception { for (AbstractBaseImpact impact : expectedImpacts) { - if (impact instanceof SimpleElementImpact simpleImpact) { + if (impact instanceof SimpleElementImpact simpleImpact && simpleImpact.isDeletion()) { // Equipment has been removed from network assertNull(network.getIdentifiable(simpleImpact.getElementId())); diff --git a/src/test/java/org/gridsuite/modification/server/impacts/TestImpactUtils.java b/src/test/java/org/gridsuite/modification/server/impacts/TestImpactUtils.java index 3e122fc69..d41190bb0 100644 --- a/src/test/java/org/gridsuite/modification/server/impacts/TestImpactUtils.java +++ b/src/test/java/org/gridsuite/modification/server/impacts/TestImpactUtils.java @@ -152,16 +152,23 @@ public static void testBranchImpacts(ObjectMapper mapper, SimpleImpactType type, private static List createBranchImpacts(SimpleImpactType type, IdentifiableType branchType, String branchId, String breakerId1, String disconnectorId1, String substationId1, String breakerId2, String disconnectorId2, String substationId2) { - if (type == SimpleImpactType.DELETION) { - return List.of( + if (type != SimpleImpactType.DELETION) { + return createSubstationImpacts(Set.copyOf(List.of(substationId1, substationId2))); + } + + List expectedImpacts = new ArrayList<>(); + // For two windings transformers, resetting regulation on delete adds a modification impact on the substation + if (branchType == IdentifiableType.TWO_WINDINGS_TRANSFORMER) { + expectedImpacts.add(createModificationImpactType(IdentifiableType.SUBSTATION, substationId1, Set.of(substationId1))); + } + expectedImpacts.addAll(List.of( createElementImpact(SimpleImpactType.DELETION, branchType, branchId, Set.copyOf(List.of(substationId1, substationId2))), createElementImpact(SimpleImpactType.DELETION, IdentifiableType.SWITCH, breakerId1, Set.of(substationId1)), createElementImpact(SimpleImpactType.DELETION, IdentifiableType.SWITCH, disconnectorId1, Set.of(substationId1)), createElementImpact(SimpleImpactType.DELETION, IdentifiableType.SWITCH, breakerId2, Set.of(substationId2)), createElementImpact(SimpleImpactType.DELETION, IdentifiableType.SWITCH, disconnectorId2, Set.of(substationId2)) - ); - } - return createSubstationImpacts(Set.copyOf(List.of(substationId1, substationId2))); + )); + return expectedImpacts; } public static void test3WTDeletionImpacts(ObjectMapper mapper, String resultAsString, String w3tId, @@ -184,6 +191,8 @@ private static List create3wtDeletionImpacts(String w3tId, String breakerId3, String disconnectorId3, String substationId) { return List.of( + // For three windings transformers, resetting regulation on delete adds a modification impact on the substation + createModificationImpactType(IdentifiableType.SUBSTATION, substationId, Set.of(substationId)), createDeletionImpactType(IdentifiableType.SWITCH, breakerId1, Set.of(substationId)), createDeletionImpactType(IdentifiableType.SWITCH, disconnectorId1, Set.of(substationId)), createDeletionImpactType(IdentifiableType.SWITCH, breakerId2, Set.of(substationId)), diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularShuntCompensatorModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularShuntCompensatorModificationsTest.java index ff1b91b06..70e782e7d 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularShuntCompensatorModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularShuntCompensatorModificationsTest.java @@ -124,7 +124,8 @@ void testCheckModificationConflict() { when(shuntCompensator.getModelType()).thenReturn(ShuntCompensatorModelType.LINEAR); when(shuntCompensator.getId()).thenReturn("id"); ReportNode reportNode = ReportNode.newRootReportNode() - .withMessageTemplate("test", "test") + .withResourceBundles("i18n.reports") + .withMessageTemplate("test") .build(); tabularModification.checkShuntCompensatorModification(network, shuntModification, reportNode); @@ -159,7 +160,8 @@ void testCheckModificationNonLinear() { when(shuntCompensator.getId()).thenReturn("id"); ReportNode reportNode = ReportNode.newRootReportNode() - .withMessageTemplate("test", "test") + .withResourceBundles("i18n.reports") + .withMessageTemplate("test") .build(); tabularModification.checkShuntCompensatorModification(network, shuntModification, reportNode); @@ -187,7 +189,8 @@ void testCheckModificationOK() { when(shuntCompensator.getModelType()).thenReturn(ShuntCompensatorModelType.LINEAR); when(shuntCompensator.getId()).thenReturn("id"); ReportNode reportNode = ReportNode.newRootReportNode() - .withMessageTemplate("test", "test") + .withResourceBundles("i18n.reports") + .withMessageTemplate("test") .build(); tabularModification.checkShuntCompensatorModification(network, shuntModification, reportNode); diff --git a/src/test/java/org/gridsuite/modification/server/service/NetworkModificationApplicatorTest.java b/src/test/java/org/gridsuite/modification/server/service/NetworkModificationApplicatorTest.java index 07cbe08bf..ea34efbe2 100644 --- a/src/test/java/org/gridsuite/modification/server/service/NetworkModificationApplicatorTest.java +++ b/src/test/java/org/gridsuite/modification/server/service/NetworkModificationApplicatorTest.java @@ -107,15 +107,16 @@ void computeHigherSeverity(List reports, ApplicationStatus expectedS assertEquals(6, reports.size(), "We need exactly 6 reports to run the test"); ReportNode rootReportNode = ReportNode.newRootReportNode() - .withMessageTemplate("rep1", "") + .withResourceBundles("i18n.reports") + .withMessageTemplate("rep1") .build(); - ReportNode subReportNode1 = rootReportNode.newReportNode().withMessageTemplate("subrep1", "").add(); - ReportNode subReportNode2 = rootReportNode.newReportNode().withMessageTemplate("subrep2", "").add(); - ReportNode subReportNode3 = rootReportNode.newReportNode().withMessageTemplate("rep2", "").add(); + ReportNode subReportNode1 = rootReportNode.newReportNode().withMessageTemplate("subrep1").add(); + ReportNode subReportNode2 = rootReportNode.newReportNode().withMessageTemplate("subrep2").add(); + ReportNode subReportNode3 = rootReportNode.newReportNode().withMessageTemplate("rep2").add(); - ReportNode subSubReportNode1 = subReportNode3.newReportNode().withMessageTemplate("subsubrep1", "").add(); - ReportNode subSubReportNode2 = subReportNode3.newReportNode().withMessageTemplate("subsubrep2", "").add(); + ReportNode subSubReportNode1 = subReportNode3.newReportNode().withMessageTemplate("subsubrep1").add(); + ReportNode subSubReportNode2 = subReportNode3.newReportNode().withMessageTemplate("subsubrep2").add(); addSubReport(rootReportNode, reports.get(0)); addSubReport(subReportNode1, reports.get(1)); @@ -129,7 +130,9 @@ void computeHigherSeverity(List reports, ApplicationStatus expectedS } private static void addSubReport(ReportNode parent, ReportNode child) { - ReportNodeAdder adder = parent.newReportNode().withMessageTemplate(child.getMessageKey(), child.getMessageTemplate()); + ReportNodeAdder adder = parent.newReportNode() + .withMessageTemplate("message") + .withUntypedValue("message", child.getMessageTemplate()); TypedValue severity = child.getValue(ReportConstants.SEVERITY_KEY).orElse(null); if (severity != null) { adder.withSeverity(severity); @@ -140,10 +143,11 @@ private static void addSubReport(ReportNode parent, ReportNode child) { @Test void shouldThrowExceptionOnBadSeverity() { ReportNode rootReportNode = ReportNode.newRootReportNode() - .withMessageTemplate("rep1", "") + .withResourceBundles("i18n.reports") + .withMessageTemplate("rep1") .build(); rootReportNode.newReportNode() - .withMessageTemplate("badSeverity", "Bad severity message") + .withMessageTemplate("badSeverity") .withUntypedValue("reportSeverity", "bad severity") .add(); @@ -228,22 +232,26 @@ private static Stream provideArgumentsForComputeHigherSeverity() { } private static ReportNode infoReport = ReportNode.newRootReportNode() - .withMessageTemplate("info", "Info severity message") + .withResourceBundles("i18n.reports") + .withMessageTemplate("info") .withSeverity(TypedValue.INFO_SEVERITY) .build(); private static ReportNode warningReport = ReportNode.newRootReportNode() - .withMessageTemplate("warning", "Warning severity message") + .withResourceBundles("i18n.reports") + .withMessageTemplate("warning") .withSeverity(TypedValue.WARN_SEVERITY) .build(); private static ReportNode errorReport = ReportNode.newRootReportNode() - .withMessageTemplate("error", "Error severity message") + .withResourceBundles("i18n.reports") + .withMessageTemplate("error") .withSeverity(TypedValue.ERROR_SEVERITY) .build(); private static ReportNode notSeverityReport = ReportNode.newRootReportNode() - .withMessageTemplate("notSeverity", "Not a severity message") + .withResourceBundles("i18n.reports") + .withMessageTemplate("notSeverity") .withUntypedValue("rand", "random value") .build(); } diff --git a/src/test/resources/i18n/reports.properties b/src/test/resources/i18n/reports.properties new file mode 100644 index 000000000..2b303b061 --- /dev/null +++ b/src/test/resources/i18n/reports.properties @@ -0,0 +1,14 @@ +badSeverity = Bad severity message +error = Error severity message +info = Info severity message +message = ${message} +notSeverity = Not a severity message +rep1 = rep1 +rep2 = rep2 +subrep1 = subrep1 +subrep2 = subrep2 +subsubrep1 = subsubrep1 +subsubrep2 = subsubrep2 +test = test +testSubReporterId1 = ${testSubReporterId1} +warning = Warning severity message diff --git a/src/test/resources/reports_voltage_init_modification_ok.json b/src/test/resources/reports_voltage_init_modification_ok.json index 86e3b5e99..3ec7a9126 100644 --- a/src/test/resources/reports_voltage_init_modification_ok.json +++ b/src/test/resources/reports_voltage_init_modification_ok.json @@ -1,10 +1,10 @@ { - "version": "2.1", + "version": "3.0", "dictionaries": { "default": { "2WindingsTransformerModification": "2 windings transformer with id=${id} modified :", "2WindingsTransformersModifications": "2 windings transformers", - "99999999-9999-9999-9999-999999999999": "99999999-9999-9999-9999-999999999999", + "network.modification.server.nodeUuid": "${nodeUuid}", "GeneratorsModifications": "Generators", "ShuntCompensatorsModifications": "Shunt compensators", "StaticVarCompensatorsModifications": "Static var compensators", @@ -24,7 +24,7 @@ } }, "reportRoot": { - "messageKey": "99999999-9999-9999-9999-999999999999", + "messageKey": "network.modification.server.nodeUuid", "children": [ { "messageKey": "VOLTAGE_INIT_MODIFICATION", diff --git a/src/test/resources/reports_voltage_init_modification_warnings.json b/src/test/resources/reports_voltage_init_modification_warnings.json index 141b9f2d0..f32fb5092 100644 --- a/src/test/resources/reports_voltage_init_modification_warnings.json +++ b/src/test/resources/reports_voltage_init_modification_warnings.json @@ -1,12 +1,12 @@ { - "version": "2.1", + "version": "3.0", "dictionaries": { "default": { "2WindingsTransformerNotFound": "2 windings transformer with id=${id} not found", "2WindingsTransformersModifications": "2 windings transformers", "3WindingsTransformerNotFound": "3 windings transformer with id=${id} not found", "3WindingsTransformersModifications": "3 windings transformers", - "99999999-9999-9999-9999-999999999999": "99999999-9999-9999-9999-999999999999", + "network.modification.server.nodeUuid": "${nodeUuid}", "GeneratorsModifications": "Generators", "ShuntCompensatorsModifications": "Shunt compensators", "StaticVarCompensatorsModifications": "Static var compensators", @@ -21,7 +21,7 @@ } }, "reportRoot": { - "messageKey": "99999999-9999-9999-9999-999999999999", + "messageKey": "network.modification.server.nodeUuid", "children": [ { "messageKey": "VOLTAGE_INIT_MODIFICATION",