From 7c311714cace40338e4235cd120a33ad76c878ac Mon Sep 17 00:00:00 2001 From: Florent MILLOT Date: Thu, 14 Dec 2023 16:37:06 +0100 Subject: [PATCH 1/3] Add two windings transformer modifications to TabularModificationEntity. Signed-off-by: Florent MILLOT --- .../entities/TabularModificationEntity.java | 7 ++ .../modifications/TabularModification.java | 11 +- ...oWindingsTransformerModificationsTest.java | 102 ++++++++++++++++++ 3 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java diff --git a/src/main/java/org/gridsuite/modification/server/entities/TabularModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/TabularModificationEntity.java index 5fec9f1c4..bcfc22dc4 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/TabularModificationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/TabularModificationEntity.java @@ -18,6 +18,7 @@ import org.gridsuite.modification.server.dto.*; import org.gridsuite.modification.server.entities.equipment.modification.GeneratorModificationEntity; import org.gridsuite.modification.server.entities.equipment.modification.LoadModificationEntity; +import org.gridsuite.modification.server.entities.equipment.modification.TwoWindingsTransformerModificationEntity; /** * @author Etienne Homer @@ -46,6 +47,9 @@ public TabularModificationEntity(TabularModificationInfos tabularModificationInf case "LOAD_MODIFICATION": modifications = tabularModificationInfos.getModifications().stream().map(loadModificationInfos -> new LoadModificationEntity((LoadModificationInfos) loadModificationInfos)).collect(Collectors.toList()); break; + case "TWT_MODIFICATION": + modifications = tabularModificationInfos.getModifications().stream().map(twtModificationInfos -> new TwoWindingsTransformerModificationEntity((TwoWindingsTransformerModificationInfos) twtModificationInfos)).collect(Collectors.toList()); + break; default: break; } @@ -76,6 +80,9 @@ public void update(@NonNull ModificationInfos modificationInfos) { case "LOAD_MODIFICATION": modifications.addAll(tabularModificationInfos.getModifications().stream().map(loadModificationInfos -> new LoadModificationEntity((LoadModificationInfos) loadModificationInfos)).collect(Collectors.toList())); break; + case "TWT_MODIFICATION": + modifications.addAll(tabularModificationInfos.getModifications().stream().map(twtModificationInfos -> new TwoWindingsTransformerModificationEntity((TwoWindingsTransformerModificationInfos) twtModificationInfos)).collect(Collectors.toList())); + break; default: break; } diff --git a/src/main/java/org/gridsuite/modification/server/modifications/TabularModification.java b/src/main/java/org/gridsuite/modification/server/modifications/TabularModification.java index 2296e8e14..9f5aa8f25 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/TabularModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/TabularModification.java @@ -45,13 +45,15 @@ public void check(Network network) throws NetworkModificationException { @Override public void apply(Network network, Reporter subReporter) { AtomicInteger applicationFailuresCount = new AtomicInteger(0); - modificationInfos.getModifications().forEach(modification -> { + modificationInfos.getModifications().forEach(modificationInfos -> { try { - modification.toModification().apply(network); + AbstractModification modification = modificationInfos.toModification(); + modification.check(network); + modification.apply(network); } catch (PowsyblException e) { applicationFailuresCount.incrementAndGet(); subReporter.report(Report.builder() - .withKey(modification.getType().name() + applicationFailuresCount.get()) + .withKey(modificationInfos.getType().name() + applicationFailuresCount.get()) .withDefaultMessage(e.getMessage()) .withSeverity(TypedValue.WARN_SEVERITY) .build()); @@ -66,6 +68,9 @@ public void apply(Network network, Reporter subReporter) { case "LOAD_MODIFICATION": defaultMessage = "loads" + defaultMessage; break; + case "TWT_MODIFICATION": + defaultMessage = "two windings transformers" + defaultMessage; + break; default: defaultMessage = "equipments of unknown type" + defaultMessage; break; diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java new file mode 100644 index 000000000..a906b37fd --- /dev/null +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java @@ -0,0 +1,102 @@ +/** + * Copyright (c) 2023, 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.tabularmodifications; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.powsybl.iidm.network.Network; +import lombok.SneakyThrows; +import org.gridsuite.modification.server.ModificationType; +import org.gridsuite.modification.server.dto.*; +import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest; +import org.gridsuite.modification.server.utils.NetworkCreation; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Tag; + +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import static org.gridsuite.modification.server.utils.TestUtils.assertLogMessage; +import static org.junit.Assert.assertEquals; + +/** + * @author Florent MILLOT + */ +@Tag("IntegrationTest") +public class TabularTwoWindingsTransformerModificationsTest extends AbstractNetworkModificationTest { + @Override + protected Network createNetwork(UUID networkUuid) { + return NetworkCreation.create(networkUuid, true); + } + + @Override + protected ModificationInfos buildModification() { + List modifications = List.of( + buildOneModification("trf1", 0.0), + buildOneModification("trf2", 1.0), + buildOneModification("unknownTwt", 1.0) + ); + return TabularModificationInfos.builder() + .modificationType("TWT_MODIFICATION") + .modifications(modifications) + .stashed(false) + .build(); + } + + @Override + protected ModificationInfos buildModificationUpdate() { + List modifications = List.of( + buildOneModification("trf1", 3.0), + buildOneModification("trf2", 4.0) + ); + return TabularModificationInfos.builder() + .modificationType("TWT_MODIFICATION") + .modifications(modifications) + .stashed(false) + .build(); + } + + protected TwoWindingsTransformerModificationInfos buildOneModification(String equipmentId, Double seriesResistance) { + return TwoWindingsTransformerModificationInfos.builder().equipmentId(equipmentId) + .seriesResistance(new AttributeModification<>(seriesResistance, OperationType.SET)) + .phaseTapChanger(PhaseTapChangerModificationInfos.builder().build()) // null pointer if we don't add it (call on getEnabled) + .ratioTapChanger(RatioTapChangerModificationInfos.builder().build()) // null pointer if we don't add it (call on getEnabled) + .build(); + } + + @Override + protected void assertAfterNetworkModificationCreation() { + assertEquals(0.0, getNetwork().getTwoWindingsTransformer("trf1").getR(), 0.001); + assertEquals(1.0, getNetwork().getTwoWindingsTransformer("trf2").getR(), 0.001); + assertLogMessage("TWO_WINDINGS_TRANSFORMER_NOT_FOUND : Two windings transformer with ID 'unknownTwt' does not exist in the network", ModificationType.TWO_WINDINGS_TRANSFORMER_MODIFICATION.name() + "1", reportService); + } + + @Override + protected void assertAfterNetworkModificationDeletion() { + assertEquals(2.0, getNetwork().getTwoWindingsTransformer("trf1").getR(), 0.001); + assertEquals(2.0, getNetwork().getTwoWindingsTransformer("trf2").getR(), 0.001); + } + + //TODO create AbstractTabularModification and put testCheckSqlRequestsCount and testAllModificationsHaveFailed inside + + @Override + @SneakyThrows + protected void testCreationModificationMessage(ModificationInfos modificationInfos) { + assertEquals("TABULAR_MODIFICATION", modificationInfos.getMessageType()); + Map createdValues = mapper.readValue(modificationInfos.getMessageValues(), new TypeReference<>() { }); + Assertions.assertEquals("TWT_MODIFICATION", createdValues.get("tabularModificationType")); + } + + @Override + @SneakyThrows + protected void testUpdateModificationMessage(ModificationInfos modificationInfos) { + assertEquals("TABULAR_MODIFICATION", modificationInfos.getMessageType()); + Map updatedValues = mapper.readValue(modificationInfos.getMessageValues(), new TypeReference<>() { }); + Assertions.assertEquals("TWT_MODIFICATION", updatedValues.get("tabularModificationType")); + } +} From 93a92a118062241a76f36e84d6ffba4d9c440780 Mon Sep 17 00:00:00 2001 From: Florent MILLOT Date: Fri, 15 Dec 2023 14:23:34 +0100 Subject: [PATCH 2/3] Fix tests and correct string constant Signed-off-by: Florent MILLOT --- .../dto/TwoWindingsTransformerModificationInfos.java | 11 +++++------ .../server/entities/TabularModificationEntity.java | 4 ++-- .../server/modifications/TabularModification.java | 2 +- ...bularTwoWindingsTransformerModificationsTest.java | 12 ++++-------- 4 files changed, 12 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/dto/TwoWindingsTransformerModificationInfos.java b/src/main/java/org/gridsuite/modification/server/dto/TwoWindingsTransformerModificationInfos.java index 926b893f7..5c87d7c93 100644 --- a/src/main/java/org/gridsuite/modification/server/dto/TwoWindingsTransformerModificationInfos.java +++ b/src/main/java/org/gridsuite/modification/server/dto/TwoWindingsTransformerModificationInfos.java @@ -10,10 +10,7 @@ import com.powsybl.commons.reporter.Reporter; import com.powsybl.commons.reporter.ReporterModel; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; +import lombok.*; import lombok.experimental.SuperBuilder; import org.gridsuite.modification.server.dto.annotation.ModificationErrorTypeName; import org.gridsuite.modification.server.entities.equipment.modification.TwoWindingsTransformerModificationEntity; @@ -49,10 +46,12 @@ public class TwoWindingsTransformerModificationInfos extends BranchModificationI private AttributeModification ratedS; @Schema(description = "Ratio tap changer") - private RatioTapChangerModificationInfos ratioTapChanger; + @Builder.Default + private RatioTapChangerModificationInfos ratioTapChanger = new RatioTapChangerModificationInfos(); @Schema(description = "Phase tap changer") - private PhaseTapChangerModificationInfos phaseTapChanger; + @Builder.Default + private PhaseTapChangerModificationInfos phaseTapChanger = new PhaseTapChangerModificationInfos(); @Override public TwoWindingsTransformerModificationEntity toEntity() { diff --git a/src/main/java/org/gridsuite/modification/server/entities/TabularModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/TabularModificationEntity.java index bcfc22dc4..a11c1f55e 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/TabularModificationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/TabularModificationEntity.java @@ -47,7 +47,7 @@ public TabularModificationEntity(TabularModificationInfos tabularModificationInf case "LOAD_MODIFICATION": modifications = tabularModificationInfos.getModifications().stream().map(loadModificationInfos -> new LoadModificationEntity((LoadModificationInfos) loadModificationInfos)).collect(Collectors.toList()); break; - case "TWT_MODIFICATION": + case "TWO_WINDINGS_TRANSFORMER_MODIFICATION": modifications = tabularModificationInfos.getModifications().stream().map(twtModificationInfos -> new TwoWindingsTransformerModificationEntity((TwoWindingsTransformerModificationInfos) twtModificationInfos)).collect(Collectors.toList()); break; default: @@ -80,7 +80,7 @@ public void update(@NonNull ModificationInfos modificationInfos) { case "LOAD_MODIFICATION": modifications.addAll(tabularModificationInfos.getModifications().stream().map(loadModificationInfos -> new LoadModificationEntity((LoadModificationInfos) loadModificationInfos)).collect(Collectors.toList())); break; - case "TWT_MODIFICATION": + case "TWO_WINDINGS_TRANSFORMER_MODIFICATION": modifications.addAll(tabularModificationInfos.getModifications().stream().map(twtModificationInfos -> new TwoWindingsTransformerModificationEntity((TwoWindingsTransformerModificationInfos) twtModificationInfos)).collect(Collectors.toList())); break; default: diff --git a/src/main/java/org/gridsuite/modification/server/modifications/TabularModification.java b/src/main/java/org/gridsuite/modification/server/modifications/TabularModification.java index 9f5aa8f25..1c5c67e1b 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/TabularModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/TabularModification.java @@ -68,7 +68,7 @@ public void apply(Network network, Reporter subReporter) { case "LOAD_MODIFICATION": defaultMessage = "loads" + defaultMessage; break; - case "TWT_MODIFICATION": + case "TWO_WINDINGS_TRANSFORMER_MODIFICATION": defaultMessage = "two windings transformers" + defaultMessage; break; default: diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java index a906b37fd..2a8a7c41f 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java @@ -42,7 +42,7 @@ protected ModificationInfos buildModification() { buildOneModification("unknownTwt", 1.0) ); return TabularModificationInfos.builder() - .modificationType("TWT_MODIFICATION") + .modificationType("TWO_WINDINGS_TRANSFORMER_MODIFICATION") .modifications(modifications) .stashed(false) .build(); @@ -55,7 +55,7 @@ protected ModificationInfos buildModificationUpdate() { buildOneModification("trf2", 4.0) ); return TabularModificationInfos.builder() - .modificationType("TWT_MODIFICATION") + .modificationType("TWO_WINDINGS_TRANSFORMER_MODIFICATION") .modifications(modifications) .stashed(false) .build(); @@ -64,8 +64,6 @@ protected ModificationInfos buildModificationUpdate() { protected TwoWindingsTransformerModificationInfos buildOneModification(String equipmentId, Double seriesResistance) { return TwoWindingsTransformerModificationInfos.builder().equipmentId(equipmentId) .seriesResistance(new AttributeModification<>(seriesResistance, OperationType.SET)) - .phaseTapChanger(PhaseTapChangerModificationInfos.builder().build()) // null pointer if we don't add it (call on getEnabled) - .ratioTapChanger(RatioTapChangerModificationInfos.builder().build()) // null pointer if we don't add it (call on getEnabled) .build(); } @@ -82,14 +80,12 @@ protected void assertAfterNetworkModificationDeletion() { assertEquals(2.0, getNetwork().getTwoWindingsTransformer("trf2").getR(), 0.001); } - //TODO create AbstractTabularModification and put testCheckSqlRequestsCount and testAllModificationsHaveFailed inside - @Override @SneakyThrows protected void testCreationModificationMessage(ModificationInfos modificationInfos) { assertEquals("TABULAR_MODIFICATION", modificationInfos.getMessageType()); Map createdValues = mapper.readValue(modificationInfos.getMessageValues(), new TypeReference<>() { }); - Assertions.assertEquals("TWT_MODIFICATION", createdValues.get("tabularModificationType")); + Assertions.assertEquals("TWO_WINDINGS_TRANSFORMER_MODIFICATION", createdValues.get("tabularModificationType")); } @Override @@ -97,6 +93,6 @@ protected void testCreationModificationMessage(ModificationInfos modificationInf protected void testUpdateModificationMessage(ModificationInfos modificationInfos) { assertEquals("TABULAR_MODIFICATION", modificationInfos.getMessageType()); Map updatedValues = mapper.readValue(modificationInfos.getMessageValues(), new TypeReference<>() { }); - Assertions.assertEquals("TWT_MODIFICATION", updatedValues.get("tabularModificationType")); + Assertions.assertEquals("TWO_WINDINGS_TRANSFORMER_MODIFICATION", updatedValues.get("tabularModificationType")); } } From 38cca56934ea88c605300247b10132bdefb300e8 Mon Sep 17 00:00:00 2001 From: Florent MILLOT Date: Wed, 20 Dec 2023 10:29:52 +0100 Subject: [PATCH 3/3] Refactor forEach loop variable name to 'modifInfos' in TabularModification.java. Signed-off-by: Florent MILLOT --- .../server/modifications/TabularModification.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/modifications/TabularModification.java b/src/main/java/org/gridsuite/modification/server/modifications/TabularModification.java index 18108c9a8..a60e35514 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/TabularModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/TabularModification.java @@ -45,15 +45,15 @@ public void check(Network network) throws NetworkModificationException { @Override public void apply(Network network, Reporter subReporter) { AtomicInteger applicationFailuresCount = new AtomicInteger(0); - modificationInfos.getModifications().forEach(modificationInfos -> { + modificationInfos.getModifications().forEach(modifInfos -> { try { - AbstractModification modification = modificationInfos.toModification(); + AbstractModification modification = modifInfos.toModification(); modification.check(network); modification.apply(network); } catch (PowsyblException e) { applicationFailuresCount.incrementAndGet(); subReporter.report(Report.builder() - .withKey(modificationInfos.getType().name() + applicationFailuresCount.get()) + .withKey(modifInfos.getType().name() + applicationFailuresCount.get()) .withDefaultMessage(e.getMessage()) .withSeverity(TypedValue.WARN_SEVERITY) .build());