From 50a891638de7a016a3ead10969fe6004ab572d39 Mon Sep 17 00:00:00 2001 From: Franck LECUYER Date: Wed, 21 Jun 2023 15:01:04 +0200 Subject: [PATCH 1/7] Traversal from terminal by depth or breadth first Signed-off-by: Franck LECUYER --- .../store/iidm/impl/BusBreakerViewImpl.java | 11 +- .../store/iidm/impl/NodeBreakerViewImpl.java | 127 +++++++++++++---- .../network/store/iidm/impl/TerminalImpl.java | 16 ++- .../TopologyTraverseDepthAndBreadthTest.java | 132 ++++++++++++++++++ .../traversalByDepthOrBreadthNetwork.svg | 4 + 5 files changed, 250 insertions(+), 40 deletions(-) create mode 100644 network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/TopologyTraverseDepthAndBreadthTest.java create mode 100644 network-store-iidm-impl/src/test/javadoc/com/powsybl/network/store/iidm/impl/doc-files/traversalByDepthOrBreadthNetwork.svg diff --git a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/BusBreakerViewImpl.java b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/BusBreakerViewImpl.java index fc7f9fc9d..2e32b3932 100644 --- a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/BusBreakerViewImpl.java +++ b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/BusBreakerViewImpl.java @@ -8,6 +8,7 @@ import com.powsybl.commons.PowsyblException; import com.powsybl.iidm.network.*; +import com.powsybl.math.graph.TraversalType; import com.powsybl.math.graph.TraverseResult; import com.powsybl.network.store.model.Resource; import com.powsybl.network.store.model.VoltageLevelAttributes; @@ -204,14 +205,14 @@ private Bus getOtherBus(String switchId, String busId) { } } - boolean traverseFromTerminal(Terminal terminal, Terminal.TopologyTraverser traverser, Set traversedTerminals) { + boolean traverseFromTerminal(Terminal terminal, Terminal.TopologyTraverser traverser, Set traversedTerminals, TraversalType traversalType) { checkNodeBreakerTopology(); Objects.requireNonNull(traverser); - return traverseFromBus(terminal.getBusBreakerView().getBus(), traverser, traversedTerminals, new HashSet<>()); + return traverseFromBus(terminal.getBusBreakerView().getBus(), traverser, traversedTerminals, new HashSet<>(), traversalType); } - private boolean traverseFromBus(Bus bus, Terminal.TopologyTraverser traverser, Set traversedTerminals, Set traversedBuses) { + private boolean traverseFromBus(Bus bus, Terminal.TopologyTraverser traverser, Set traversedTerminals, Set traversedBuses, TraversalType traversalType) { Objects.requireNonNull(bus); Objects.requireNonNull(traverser); @@ -232,7 +233,7 @@ private boolean traverseFromBus(Bus bus, Terminal.TopologyTraverser traverser, S } else if (result == TraverseResult.CONTINUE) { Set otherSideTerminals = ((TerminalImpl) terminal).getOtherSideTerminals(); for (Terminal otherSideTerminal : otherSideTerminals) { - if (!((TerminalImpl) otherSideTerminal).traverse(traverser, traversedTerminals)) { + if (!((TerminalImpl) otherSideTerminal).traverse(traverser, traversedTerminals, traversalType)) { return false; } } @@ -248,7 +249,7 @@ private boolean traverseFromBus(Bus bus, Terminal.TopologyTraverser traverser, S return false; } else if (result == TraverseResult.CONTINUE) { Bus otherBus = getOtherBus(s.getId(), bus.getId()); - if (!traverseFromBus(otherBus, traverser, traversedTerminals, traversedBuses)) { + if (!traverseFromBus(otherBus, traverser, traversedTerminals, traversedBuses, traversalType)) { return false; } } diff --git a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/NodeBreakerViewImpl.java b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/NodeBreakerViewImpl.java index 3f8eb33f6..e1b39b557 100644 --- a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/NodeBreakerViewImpl.java +++ b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/NodeBreakerViewImpl.java @@ -8,6 +8,7 @@ import com.powsybl.commons.PowsyblException; import com.powsybl.iidm.network.*; +import com.powsybl.math.graph.TraversalType; import com.powsybl.math.graph.TraverseResult; import com.powsybl.network.store.model.*; import org.jgrapht.Graph; @@ -115,7 +116,7 @@ public void traverse(int[] nodes, VoltageLevel.NodeBreakerView.TopologyTraverser Graph graph = NodeBreakerTopology.INSTANCE.buildGraph(index, getVoltageLevelResource(), true, true); Set done = new HashSet<>(); for (int node : nodes) { - if (!traverseFromNode(graph, node, traverser, done)) { + if (!traverseFromNode(graph, node, TraversalType.DEPTH_FIRST, traverser, done)) { break; } } @@ -125,44 +126,110 @@ public void traverse(int[] nodes, VoltageLevel.NodeBreakerView.TopologyTraverser public void traverse(int node, VoltageLevel.NodeBreakerView.TopologyTraverser traverser) { Objects.requireNonNull(traverser); checkBusBreakerTopology(); - traverseFromNode(node, traverser); + traverseFromNode(node, TraversalType.DEPTH_FIRST, traverser); } - boolean traverseFromNode(int node, VoltageLevel.NodeBreakerView.TopologyTraverser traverser) { + boolean traverseFromNode(int node, TraversalType traversalType, VoltageLevel.NodeBreakerView.TopologyTraverser traverser) { Graph graph = NodeBreakerTopology.INSTANCE.buildGraph(index, getVoltageLevelResource(), true, true); Set done = new HashSet<>(); - return traverseFromNode(graph, node, traverser, done); + return traverseFromNode(graph, node, traversalType, traverser, done); } - private boolean traverseFromNode(Graph graph, int node, VoltageLevel.NodeBreakerView.TopologyTraverser traverser, + private boolean traverseFromNode(Graph graph, int node, TraversalType traversalType, VoltageLevel.NodeBreakerView.TopologyTraverser traverser, Set done) { - if (done.contains(node)) { - return true; - } - done.add(node); - - for (Edge edge : graph.edgesOf(node)) { - NodeBreakerBiConnectable biConnectable = edge.getBiConnectable(); - int nextNode = biConnectable.getNode1() == node ? biConnectable.getNode2() : biConnectable.getNode1(); - TraverseResult result; - if (done.contains(nextNode)) { - continue; - } - if (biConnectable instanceof SwitchAttributes) { - result = traverseSwitch(traverser, biConnectable, node, nextNode); - } else if (biConnectable instanceof InternalConnectionAttributes) { - result = traverser.traverse(node, null, nextNode); - } else { - throw new AssertionError(); + if (traversalType == TraversalType.DEPTH_FIRST) { // traversal by depth first + if (done.contains(node)) { + return true; } - if (result == TraverseResult.CONTINUE) { - if (!traverseFromNode(graph, nextNode, traverser, done)) { + done.add(node); + + for (Edge edge : graph.edgesOf(node)) { + NodeBreakerBiConnectable biConnectable = edge.getBiConnectable(); + int nextNode = biConnectable.getNode1() == node ? biConnectable.getNode2() : biConnectable.getNode1(); + TraverseResult result; + if (done.contains(nextNode)) { + continue; + } + if (biConnectable instanceof SwitchAttributes) { + result = traverseSwitch(traverser, biConnectable, node, nextNode); + } else if (biConnectable instanceof InternalConnectionAttributes) { + result = traverser.traverse(node, null, nextNode); + } else { + throw new AssertionError(); + } + if (result == TraverseResult.CONTINUE) { + if (!traverseFromNode(graph, nextNode, traversalType, traverser, done)) { + return false; + } + } else if (result == TraverseResult.TERMINATE_TRAVERSER) { return false; } - } else if (result == TraverseResult.TERMINATE_TRAVERSER) { - return false; } + } else { // traversal by breadth first + boolean keepGoing = true; + Set encounteredEdges = new HashSet<>(); + + LinkedList vertexToTraverse = new LinkedList<>(); + vertexToTraverse.offer(node); + while (!vertexToTraverse.isEmpty()) { + int firstV = vertexToTraverse.getFirst(); + vertexToTraverse.poll(); + if (done.contains(firstV)) { + continue; + } + done.add(firstV); + + Set adjacentEdges = graph.edgesOf(firstV); + + for (Edge edge : adjacentEdges) { + if (encounteredEdges.contains(edge)) { + continue; + } + encounteredEdges.add(edge); + + NodeBreakerBiConnectable biConnectable = edge.getBiConnectable(); + int node1 = biConnectable.getNode1(); + int node2 = biConnectable.getNode2(); + + TraverseResult traverserResult; + if (!done.contains(node1)) { + if (biConnectable instanceof SwitchAttributes) { + traverserResult = traverseSwitch(traverser, biConnectable, node2, node1); + } else if (biConnectable instanceof InternalConnectionAttributes) { + traverserResult = traverser.traverse(node2, null, node1); + } else { + throw new AssertionError(); + } + if (traverserResult == TraverseResult.CONTINUE) { + vertexToTraverse.offer(node1); + } else if (traverserResult == TraverseResult.TERMINATE_TRAVERSER) { + keepGoing = false; + } + } else if (!done.contains(node2)) { + if (biConnectable instanceof SwitchAttributes) { + traverserResult = traverseSwitch(traverser, biConnectable, node1, node2); + } else if (biConnectable instanceof InternalConnectionAttributes) { + traverserResult = traverser.traverse(node1, null, node2); + } else { + throw new AssertionError(); + } + if (traverserResult == TraverseResult.CONTINUE) { + vertexToTraverse.offer(node2); + } else if (traverserResult == TraverseResult.TERMINATE_TRAVERSER) { + keepGoing = false; + } + } + if (!keepGoing) { + break; + } + } + if (!keepGoing) { + break; + } + } + return keepGoing; } + return true; } @@ -175,12 +242,12 @@ private TraverseResult traverseSwitch(VoltageLevel.NodeBreakerView.TopologyTrave /** * This is the method called when we traverse the topology stating from a terminal. */ - boolean traverseFromTerminal(Terminal terminal, Terminal.TopologyTraverser traverser, Set traversedTerminals) { + boolean traverseFromTerminal(Terminal terminal, Terminal.TopologyTraverser traverser, Set traversedTerminals, TraversalType traversalType) { checkBusBreakerTopology(); Objects.requireNonNull(traverser); List nexTerminals = new ArrayList<>(); - if (!traverseFromNode(terminal.getNodeBreakerView().getNode(), (node1, sw, node2) -> { + if (!traverseFromNode(terminal.getNodeBreakerView().getNode(), traversalType, (node1, sw, node2) -> { if (sw != null) { TraverseResult result = traverser.traverse(sw); if (result != TraverseResult.CONTINUE) { @@ -204,7 +271,7 @@ boolean traverseFromTerminal(Terminal terminal, Terminal.TopologyTraverser trave } for (Terminal nextTerminal : nexTerminals) { - if (!((TerminalImpl) nextTerminal).traverse(traverser, traversedTerminals)) { + if (!((TerminalImpl) nextTerminal).traverse(traverser, traversedTerminals, traversalType)) { return false; } } diff --git a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/TerminalImpl.java b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/TerminalImpl.java index 49813ee9d..3453dc184 100644 --- a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/TerminalImpl.java +++ b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/TerminalImpl.java @@ -9,6 +9,7 @@ import com.powsybl.commons.PowsyblException; import com.powsybl.iidm.network.*; import com.powsybl.math.graph.TraverseResult; +import com.powsybl.math.graph.TraversalType; import com.powsybl.network.store.model.*; import org.jgrapht.Graph; import org.jgrapht.alg.connectivity.ConnectivityInspector; @@ -359,25 +360,30 @@ public String getMessageHeader() { @Override public void traverse(Terminal.TopologyTraverser traverser) { + traverse(traverser, TraversalType.DEPTH_FIRST); + } + + @Override + public void traverse(Terminal.TopologyTraverser traverser, TraversalType traversalType) { Set traversedTerminals = new HashSet<>(); if (getAbstractIdentifiable().getOptionalResource().isEmpty()) { throw new PowsyblException("Associated equipment is removed"); } // One side - if (!traverse(traverser, traversedTerminals)) { + if (!traverse(traverser, traversedTerminals, traversalType)) { return; } // Other sides for (Terminal otherSideTerminal : getOtherSideTerminals()) { - if (!((TerminalImpl) otherSideTerminal).traverse(traverser, traversedTerminals)) { + if (!((TerminalImpl) otherSideTerminal).traverse(traverser, traversedTerminals, traversalType)) { return; } } } - boolean traverse(Terminal.TopologyTraverser traverser, Set traversedTerminals) { + boolean traverse(Terminal.TopologyTraverser traverser, Set traversedTerminals, TraversalType traversalType) { if (traversedTerminals.contains(this)) { return true; } @@ -393,9 +399,9 @@ boolean traverse(Terminal.TopologyTraverser traverser, Set traversedTe TopologyKind topologyKind = getTopologyKind(); switch (topologyKind) { case NODE_BREAKER: - return ((NodeBreakerViewImpl) voltageLevel.getNodeBreakerView()).traverseFromTerminal(this, traverser, traversedTerminals); + return ((NodeBreakerViewImpl) voltageLevel.getNodeBreakerView()).traverseFromTerminal(this, traverser, traversedTerminals, traversalType); case BUS_BREAKER: - return ((BusBreakerViewImpl) voltageLevel.getBusBreakerView()).traverseFromTerminal(this, traverser, traversedTerminals); + return ((BusBreakerViewImpl) voltageLevel.getBusBreakerView()).traverseFromTerminal(this, traverser, traversedTerminals, traversalType); default: throw new IllegalStateException("Unknown topology kind: " + topologyKind); } diff --git a/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/TopologyTraverseDepthAndBreadthTest.java b/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/TopologyTraverseDepthAndBreadthTest.java new file mode 100644 index 000000000..3acaaaf11 --- /dev/null +++ b/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/TopologyTraverseDepthAndBreadthTest.java @@ -0,0 +1,132 @@ +/** + * Copyright (c) 2022, 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 com.powsybl.network.store.iidm.impl; + +import com.powsybl.iidm.network.Country; +import com.powsybl.iidm.network.IdentifiableType; +import com.powsybl.iidm.network.Network; +import com.powsybl.iidm.network.Substation; +import com.powsybl.iidm.network.Switch; +import com.powsybl.iidm.network.Terminal; +import com.powsybl.iidm.network.TopologyKind; +import com.powsybl.iidm.network.VoltageLevel; +import com.powsybl.math.graph.TraversalType; +import com.powsybl.math.graph.TraverseResult; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Small network to test topology traversal by depth first or breadth first + * Below is a diagram of the network: + *
+ * + *
+ * + * @author Franck Lecuyer + */ +class TopologyTraverseDepthAndBreadthTest { + + private Network network; + + @BeforeEach + public void setUp() { + network = Network.create("test", "test"); + Substation s1 = network.newSubstation().setId("S1").setCountry(Country.FR).add(); + VoltageLevel vl1 = s1.newVoltageLevel().setId("VL1").setNominalV(400f).setTopologyKind(TopologyKind.NODE_BREAKER).add(); + vl1.getNodeBreakerView().newBusbarSection().setId("VL1_B1").setNode(0).add(); + vl1.getNodeBreakerView().newBusbarSection().setId("VL1_B2").setNode(1).add(); + vl1.newGenerator().setId("G1").setNode(2).setMinP(0).setMaxP(1).setTargetP(1).setTargetQ(0).setVoltageRegulatorOn(false).add(); + vl1.newGenerator().setId("G2").setNode(5).setMinP(0).setMaxP(1).setTargetP(1).setTargetQ(0).setVoltageRegulatorOn(false).add(); + vl1.getNodeBreakerView().newBreaker().setId("VL1_BREAKER3").setOpen(false).setNode1(3).setNode2(9).add(); + vl1.getNodeBreakerView().newBreaker().setId("VL1_BREAKER1").setOpen(false).setNode1(3).setNode2(4).add(); + vl1.getNodeBreakerView().newBreaker().setId("VL1_BREAKER2").setOpen(false).setNode1(9).setNode2(10).add(); + vl1.getNodeBreakerView().newBreaker().setId("VL1_BREAKER7").setOpen(false).setNode1(6).setNode2(12).add(); + vl1.getNodeBreakerView().newBreaker().setId("VL1_BREAKER5").setOpen(false).setNode1(6).setNode2(7).add(); + vl1.getNodeBreakerView().newBreaker().setId("VL1_BREAKER6").setOpen(false).setNode1(12).setNode2(13).add(); + vl1.getNodeBreakerView().newDisconnector().setId("VL1_DISCONNECTOR1").setOpen(false).setNode1(2).setNode2(3).add(); + vl1.getNodeBreakerView().newDisconnector().setId("VL1_DISCONNECTOR2").setOpen(false).setNode1(8).setNode2(9).add(); + vl1.getNodeBreakerView().newDisconnector().setId("VL1_DISCONNECTOR3").setOpen(false).setNode1(1).setNode2(4).add(); + vl1.getNodeBreakerView().newDisconnector().setId("VL1_DISCONNECTOR4").setOpen(false).setNode1(0).setNode2(10).add(); + vl1.getNodeBreakerView().newDisconnector().setId("VL1_DISCONNECTOR5").setOpen(false).setNode1(5).setNode2(6).add(); + vl1.getNodeBreakerView().newDisconnector().setId("VL1_DISCONNECTOR6").setOpen(false).setNode1(1).setNode2(7).add(); + vl1.getNodeBreakerView().newDisconnector().setId("VL1_DISCONNECTOR7").setOpen(false).setNode1(11).setNode2(12).add(); + vl1.getNodeBreakerView().newDisconnector().setId("VL1_DISCONNECTOR8").setOpen(false).setNode1(0).setNode2(13).add(); + + Substation s2 = network.newSubstation().setId("S2").setCountry(Country.FR).add(); + VoltageLevel vl2 = s2.newVoltageLevel().setId("VL2").setNominalV(400f).setTopologyKind(TopologyKind.NODE_BREAKER).add(); + vl2.getNodeBreakerView().newBusbarSection().setId("VL2_B1").setNode(0).add(); + vl2.getNodeBreakerView().newBreaker().setId("VL2_BREAKER1").setOpen(false).setNode1(1).setNode2(2).add(); + vl2.getNodeBreakerView().newDisconnector().setId("VL2_DISCONNECTOR1").setOpen(false).setNode1(0).setNode2(2).add(); + + Substation s3 = network.newSubstation().setId("S3").setCountry(Country.FR).add(); + VoltageLevel vl3 = s3.newVoltageLevel().setId("VL3").setNominalV(400f).setTopologyKind(TopologyKind.NODE_BREAKER).add(); + vl3.getNodeBreakerView().newBusbarSection().setId("VL3_B1").setNode(0).add(); + vl3.getNodeBreakerView().newBreaker().setId("VL3_BREAKER1").setOpen(false).setNode1(1).setNode2(2).add(); + vl3.getNodeBreakerView().newDisconnector().setId("VL3_DISCONNECTOR1").setOpen(false).setNode1(0).setNode2(2).add(); + + network.newLine().setId("L1").setVoltageLevel1("VL1").setVoltageLevel2("VL2").setNode1(8).setNode2(1).setR(1).setX(1).setG1(0).setB1(0).setG2(0).setB2(0).add(); + network.newLine().setId("L2").setVoltageLevel1("VL1").setVoltageLevel2("VL3").setNode1(11).setNode2(1).setR(1).setX(1).setG1(0).setB1(0).setG2(0).setB2(0).add(); + } + + private static class BusbarSectionFinderTraverser implements Terminal.TopologyTraverser { + private final boolean onlyConnectedBbs; + private String firstTraversedBbsId; + + public BusbarSectionFinderTraverser(boolean onlyConnectedBbs) { + this.onlyConnectedBbs = onlyConnectedBbs; + } + + @Override + public TraverseResult traverse(Terminal terminal, boolean connected) { + if (terminal.getConnectable().getType() == IdentifiableType.BUSBAR_SECTION) { + firstTraversedBbsId = terminal.getConnectable().getId(); + return TraverseResult.TERMINATE_TRAVERSER; + } + return TraverseResult.CONTINUE; + } + + @Override + public TraverseResult traverse(Switch aSwitch) { + if (onlyConnectedBbs && aSwitch.isOpen()) { + return TraverseResult.TERMINATE_PATH; + } + return TraverseResult.CONTINUE; + } + + public String getFirstTraversedBbsId() { + return firstTraversedBbsId; + } + } + + private String getBusbarSectionId(Terminal terminal, TraversalType traversalType) { + BusbarSectionFinderTraverser connectedBusbarSectionFinder = new BusbarSectionFinderTraverser(terminal.isConnected()); + terminal.traverse(connectedBusbarSectionFinder, traversalType); + return connectedBusbarSectionFinder.getFirstTraversedBbsId(); + } + + @Test + void testTraverseDepthFirst() { + assertEquals("VL1_B1", getBusbarSectionId(network.getGenerator("G1").getTerminal(), TraversalType.DEPTH_FIRST)); + assertEquals("VL1_B1", getBusbarSectionId(network.getGenerator("G2").getTerminal(), TraversalType.DEPTH_FIRST)); + assertEquals("VL1_B2", getBusbarSectionId(network.getLine("L1").getTerminal("VL1"), TraversalType.DEPTH_FIRST)); + assertEquals("VL2_B1", getBusbarSectionId(network.getLine("L1").getTerminal("VL2"), TraversalType.DEPTH_FIRST)); + assertEquals("VL1_B2", getBusbarSectionId(network.getLine("L2").getTerminal("VL1"), TraversalType.DEPTH_FIRST)); + assertEquals("VL3_B1", getBusbarSectionId(network.getLine("L2").getTerminal("VL3"), TraversalType.DEPTH_FIRST)); + } + + @Test + void testTraverseBreadthFirst() { + assertEquals("VL1_B2", getBusbarSectionId(network.getGenerator("G1").getTerminal(), TraversalType.BREADTH_FIRST)); + assertEquals("VL1_B2", getBusbarSectionId(network.getGenerator("G2").getTerminal(), TraversalType.BREADTH_FIRST)); + assertEquals("VL1_B1", getBusbarSectionId(network.getLine("L1").getTerminal("VL1"), TraversalType.BREADTH_FIRST)); + assertEquals("VL2_B1", getBusbarSectionId(network.getLine("L1").getTerminal("VL2"), TraversalType.BREADTH_FIRST)); + assertEquals("VL1_B1", getBusbarSectionId(network.getLine("L2").getTerminal("VL1"), TraversalType.BREADTH_FIRST)); + assertEquals("VL3_B1", getBusbarSectionId(network.getLine("L2").getTerminal("VL3"), TraversalType.BREADTH_FIRST)); + } +} diff --git a/network-store-iidm-impl/src/test/javadoc/com/powsybl/network/store/iidm/impl/doc-files/traversalByDepthOrBreadthNetwork.svg b/network-store-iidm-impl/src/test/javadoc/com/powsybl/network/store/iidm/impl/doc-files/traversalByDepthOrBreadthNetwork.svg new file mode 100644 index 000000000..e1f9a4a9d --- /dev/null +++ b/network-store-iidm-impl/src/test/javadoc/com/powsybl/network/store/iidm/impl/doc-files/traversalByDepthOrBreadthNetwork.svg @@ -0,0 +1,4 @@ + + + +
G1
G1
G2
G2
L2
L2
VL1_B1
VL1_B1
VL1_B2
VL1_B2
L1
L1
VL2_B1
VL2_B1
VL3_B1
VL3_B1
VL2
VL2
VL3
VL3
VL1
VL1
Text is not SVG - cannot display
\ No newline at end of file From 0e471694278fa5c87c02ca76dad4d08f6222a219 Mon Sep 17 00:00:00 2001 From: BOUTIER Charly Date: Tue, 1 Aug 2023 10:21:52 +0200 Subject: [PATCH 2/7] Adds equipment information on problematic VSC and Busbar index in error messages Signed-off-by: BOUTIER Charly --- .../iidm/impl/BusbarSectionPositionImpl.java | 14 +++--- .../extensions/StandbyAutomatonAdderImpl.java | 2 +- .../impl/extensions/StandbyAutomatonImpl.java | 43 ++++++++----------- 3 files changed, 27 insertions(+), 32 deletions(-) diff --git a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/BusbarSectionPositionImpl.java b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/BusbarSectionPositionImpl.java index 7878b3885..e1f5152a4 100644 --- a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/BusbarSectionPositionImpl.java +++ b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/BusbarSectionPositionImpl.java @@ -8,6 +8,8 @@ import com.powsybl.commons.extensions.AbstractExtension; import com.powsybl.iidm.network.BusbarSection; +import com.powsybl.iidm.network.Validable; +import com.powsybl.iidm.network.ValidationException; import com.powsybl.iidm.network.extensions.BusbarSectionPosition; import com.powsybl.network.store.model.BusbarSectionAttributes; import com.powsybl.network.store.model.BusbarSectionPositionAttributes; @@ -20,13 +22,13 @@ public class BusbarSectionPositionImpl extends AbstractExtension public BusbarSectionPositionImpl(BusbarSectionImpl busbarSectionImpl) { super(busbarSectionImpl); - checkIndex(getBusbarIndex()); - checkIndex(getSectionIndex()); + checkIndex(busbarSectionImpl, getBusbarIndex()); + checkIndex(busbarSectionImpl, getSectionIndex()); } - private static int checkIndex(int index) { + private static int checkIndex(Validable validable, int index) { if (index < 0) { - throw new IllegalArgumentException("Busbar index has to be greater or equals to zero"); + throw new ValidationException(validable, "Busbar index has to be greater or equals to zero"); } return index; } @@ -50,7 +52,7 @@ private BusbarSectionPositionAttributes getPositionAttributes(Resource getPositionAttributes(res).setBusbarIndex(checkIndex(busbarIndex))); + getBusbarSection().updateResource(res -> getPositionAttributes(res).setBusbarIndex(checkIndex(getBusbarSection(), busbarIndex))); return this; } @@ -61,7 +63,7 @@ public int getSectionIndex() { @Override public BusbarSectionPosition setSectionIndex(int sectionIndex) { - getBusbarSection().updateResource(res -> getPositionAttributes(res).setSectionIndex(checkIndex(sectionIndex))); + getBusbarSection().updateResource(res -> getPositionAttributes(res).setSectionIndex(checkIndex(getBusbarSection(), sectionIndex))); return this; } } diff --git a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/extensions/StandbyAutomatonAdderImpl.java b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/extensions/StandbyAutomatonAdderImpl.java index 695856ac9..e86664b36 100644 --- a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/extensions/StandbyAutomatonAdderImpl.java +++ b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/extensions/StandbyAutomatonAdderImpl.java @@ -36,7 +36,7 @@ public StandbyAutomatonAdderImpl(StaticVarCompensator svc) { @Override protected StandbyAutomaton createExtension(StaticVarCompensator svc) { - var attributes = StandbyAutomatonImpl.createAttributes(b0, standby, + var attributes = StandbyAutomatonImpl.createAttributes((StaticVarCompensatorImpl) svc, b0, standby, lowVoltageSetpoint, highVoltageSetpoint, lowVoltageThreshold, highVoltageThreshold); ((StaticVarCompensatorImpl) svc).updateResource(res -> res.getAttributes().setStandbyAutomaton(attributes)); return new StandbyAutomatonImpl(svc); diff --git a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/extensions/StandbyAutomatonImpl.java b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/extensions/StandbyAutomatonImpl.java index 84c6581f3..9b0c07c1a 100644 --- a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/extensions/StandbyAutomatonImpl.java +++ b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/extensions/StandbyAutomatonImpl.java @@ -8,6 +8,8 @@ import com.powsybl.commons.extensions.AbstractExtension; import com.powsybl.iidm.network.StaticVarCompensator; +import com.powsybl.iidm.network.Validable; +import com.powsybl.iidm.network.ValidationException; import com.powsybl.iidm.network.extensions.StandbyAutomaton; import com.powsybl.network.store.iidm.impl.StaticVarCompensatorImpl; import com.powsybl.network.store.model.Resource; @@ -23,29 +25,29 @@ public class StandbyAutomatonImpl extends AbstractExtension= highVoltageThreshold) { - throw new IllegalArgumentException("Inconsistent low (" + lowVoltageThreshold + ") and high (" + highVoltageThreshold + ") voltage thresholds"); + throw new ValidationException(validable, "Inconsistent low (" + lowVoltageThreshold + ") and high (" + highVoltageThreshold + ") voltage thresholds"); } if (lowVoltageSetpoint < lowVoltageThreshold) { LOGGER.warn("Invalid low voltage setpoint {} < threshold {}", lowVoltageSetpoint, lowVoltageThreshold); @@ -55,19 +57,10 @@ private static void checkVoltageConfig(double lowVoltageSetpoint, double highVol } } - public static StandbyAutomatonAttributes createAttributes(StandbyAutomaton standbyAutomaton) { - return createAttributes(standbyAutomaton.getB0(), - standbyAutomaton.isStandby(), - standbyAutomaton.getLowVoltageSetpoint(), - standbyAutomaton.getHighVoltageSetpoint(), - standbyAutomaton.getLowVoltageThreshold(), - standbyAutomaton.getHighVoltageThreshold()); - } - - public static StandbyAutomatonAttributes createAttributes(double b0, boolean standby, double lowVoltageSetpoint, double highVoltageSetpoint, + public static StandbyAutomatonAttributes createAttributes(Validable validable, double b0, boolean standby, double lowVoltageSetpoint, double highVoltageSetpoint, double lowVoltageThreshold, double highVoltageThreshold) { - checkVoltageConfig(lowVoltageSetpoint, highVoltageSetpoint, lowVoltageThreshold, highVoltageThreshold); - checkB0(b0); + checkVoltageConfig(validable, lowVoltageSetpoint, highVoltageSetpoint, lowVoltageThreshold, highVoltageThreshold); + checkB0(validable, b0); return StandbyAutomatonAttributes.builder() .b0(b0) .standby(standby) @@ -112,7 +105,7 @@ public double getB0() { @Override public StandbyAutomatonImpl setB0(double b0) { - getSvc().updateResource(res -> getAttributes(res).setB0(checkB0(b0))); + getSvc().updateResource(res -> getAttributes(res).setB0(checkB0(getSvc(), b0))); return this; } @@ -123,7 +116,7 @@ public double getHighVoltageSetpoint() { @Override public StandbyAutomatonImpl setHighVoltageSetpoint(double highVoltageSetpoint) { - checkVoltageConfig(getLowVoltageSetpoint(), highVoltageSetpoint, getLowVoltageThreshold(), getHighVoltageThreshold()); + checkVoltageConfig(getSvc(), getLowVoltageSetpoint(), highVoltageSetpoint, getLowVoltageThreshold(), getHighVoltageThreshold()); getSvc().updateResource(res -> getAttributes(res).setHighVoltageSetpoint(highVoltageSetpoint)); return this; } @@ -135,7 +128,7 @@ public double getHighVoltageThreshold() { @Override public StandbyAutomatonImpl setHighVoltageThreshold(double highVoltageThreshold) { - checkVoltageConfig(getLowVoltageSetpoint(), getHighVoltageSetpoint(), getLowVoltageThreshold(), highVoltageThreshold); + checkVoltageConfig(getSvc(), getLowVoltageSetpoint(), getHighVoltageSetpoint(), getLowVoltageThreshold(), highVoltageThreshold); getSvc().updateResource(res -> getAttributes(res).setHighVoltageThreshold(highVoltageThreshold)); return this; } @@ -147,7 +140,7 @@ public double getLowVoltageSetpoint() { @Override public StandbyAutomatonImpl setLowVoltageSetpoint(double lowVoltageSetpoint) { - checkVoltageConfig(lowVoltageSetpoint, getHighVoltageSetpoint(), getLowVoltageThreshold(), getHighVoltageThreshold()); + checkVoltageConfig(getSvc(), lowVoltageSetpoint, getHighVoltageSetpoint(), getLowVoltageThreshold(), getHighVoltageThreshold()); getSvc().updateResource(res -> getAttributes(res).setLowVoltageSetpoint(lowVoltageSetpoint)); return this; } @@ -159,7 +152,7 @@ public double getLowVoltageThreshold() { @Override public StandbyAutomatonImpl setLowVoltageThreshold(double lowVoltageThreshold) { - checkVoltageConfig(getLowVoltageSetpoint(), getHighVoltageSetpoint(), lowVoltageThreshold, getHighVoltageThreshold()); + checkVoltageConfig(getSvc(), getLowVoltageSetpoint(), getHighVoltageSetpoint(), lowVoltageThreshold, getHighVoltageThreshold()); getSvc().updateResource(res -> getAttributes(res).setLowVoltageThreshold(lowVoltageThreshold)); return this; } From 9ade47a46079d88071fca2524298c4f12b5f940f Mon Sep 17 00:00:00 2001 From: BOUTIER Charly Date: Tue, 1 Aug 2023 12:23:20 +0200 Subject: [PATCH 3/7] Fixes unit tests Signed-off-by: BOUTIER Charly --- .../store/iidm/impl/VoltageLevelTest.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/VoltageLevelTest.java b/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/VoltageLevelTest.java index 32124045b..2496bec2d 100644 --- a/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/VoltageLevelTest.java +++ b/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/VoltageLevelTest.java @@ -61,27 +61,27 @@ public void testBusbarSectionPositions() { assertNotNull(network.getVoltageLevel("VL").getNodeBreakerView().getBusbarSection("idBBS")); BusbarSectionPositionAdder busbarSectionPositionAdder = bbs.newExtension(BusbarSectionPositionAdder.class); - assertEquals("Busbar index has to be greater or equals to zero", - assertThrows(IllegalArgumentException.class, busbarSectionPositionAdder::add).getMessage()); + assertEquals("Busbar section 'idBBS': Busbar index has to be greater or equals to zero", + assertThrows(ValidationException.class, busbarSectionPositionAdder::add).getMessage()); busbarSectionPositionAdder = bbs.newExtension(BusbarSectionPositionAdder.class).withBusbarIndex(0); - assertEquals("Busbar index has to be greater or equals to zero", - assertThrows(IllegalArgumentException.class, busbarSectionPositionAdder::add).getMessage()); + assertEquals("Busbar section 'idBBS': Busbar index has to be greater or equals to zero", + assertThrows(ValidationException.class, busbarSectionPositionAdder::add).getMessage()); busbarSectionPositionAdder = bbs.newExtension(BusbarSectionPositionAdder.class).withSectionIndex(0); - assertEquals("Busbar index has to be greater or equals to zero", - assertThrows(IllegalArgumentException.class, busbarSectionPositionAdder::add).getMessage()); + assertEquals("Busbar section 'idBBS': Busbar index has to be greater or equals to zero", + assertThrows(ValidationException.class, busbarSectionPositionAdder::add).getMessage()); busbarSectionPositionAdder = bbs.newExtension(BusbarSectionPositionAdder.class).withBusbarIndex(-1).withSectionIndex(0); - assertEquals("Busbar index has to be greater or equals to zero", - assertThrows(IllegalArgumentException.class, busbarSectionPositionAdder::add).getMessage()); + assertEquals("Busbar section 'idBBS': Busbar index has to be greater or equals to zero", + assertThrows(ValidationException.class, busbarSectionPositionAdder::add).getMessage()); busbarSectionPositionAdder = bbs.newExtension(BusbarSectionPositionAdder.class).withBusbarIndex(0).withSectionIndex(-1); - assertEquals("Busbar index has to be greater or equals to zero", - assertThrows(IllegalArgumentException.class, busbarSectionPositionAdder::add).getMessage()); + assertEquals("Busbar section 'idBBS': Busbar index has to be greater or equals to zero", + assertThrows(ValidationException.class, busbarSectionPositionAdder::add).getMessage()); busbarSectionPositionAdder = bbs.newExtension(BusbarSectionPositionAdder.class).withBusbarIndex(-1).withSectionIndex(-1); - assertEquals("Busbar index has to be greater or equals to zero", - assertThrows(IllegalArgumentException.class, busbarSectionPositionAdder::add).getMessage()); + assertEquals("Busbar section 'idBBS': Busbar index has to be greater or equals to zero", + assertThrows(ValidationException.class, busbarSectionPositionAdder::add).getMessage()); } } From 05074ac8037d2074cb7bcdbb10dba7692b0fcef7 Mon Sep 17 00:00:00 2001 From: BOUTIER Charly Date: Tue, 1 Aug 2023 17:06:09 +0200 Subject: [PATCH 4/7] Fixes coverage Signed-off-by: BOUTIER Charly --- .../tck/extensions/StandbyAutomatonTest.java | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/tck/extensions/StandbyAutomatonTest.java b/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/tck/extensions/StandbyAutomatonTest.java index b8d32096c..1abbf0d51 100644 --- a/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/tck/extensions/StandbyAutomatonTest.java +++ b/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/tck/extensions/StandbyAutomatonTest.java @@ -6,7 +6,12 @@ */ package com.powsybl.network.store.iidm.impl.tck.extensions; +import com.powsybl.iidm.network.*; +import com.powsybl.iidm.network.extensions.StandbyAutomatonAdder; import com.powsybl.iidm.network.tck.extensions.AbstractStandbyAutomatonTest; +import org.junit.Test; + +import static org.junit.Assert.*; /** * @author Geoffroy Jamgotchian @@ -16,4 +21,83 @@ public class StandbyAutomatonTest extends AbstractStandbyAutomatonTest { public void variantsCloneTest() { // FIXME } + + @Test + public void testStandbyAutomatonCheckVoltageConfig() { + Network network = Network.create("test", "test"); + Substation s = network.newSubstation() + .setId("S") + .setCountry(Country.FR) + .add(); + VoltageLevel vl = s.newVoltageLevel() + .setId("VL") + .setNominalV(400.0) + .setTopologyKind(TopologyKind.BUS_BREAKER) + .add(); + vl.getBusBreakerView().newBus() + .setId("BUS") + .add(); + StaticVarCompensator svc = vl.newStaticVarCompensator() + .setId("SVC") + .setConnectableBus("BUS") + .setBmin(12.2) + .setBmax(32.2) + .setRegulationMode(StaticVarCompensator.RegulationMode.VOLTAGE) + .setVoltageSetpoint(23.8) + .add(); + + StandbyAutomatonAdder standbyAutomatonAdder = svc.newExtension(StandbyAutomatonAdder.class) + .withHighVoltageSetpoint(21.3) + .withLowVoltageSetpoint(1.7) + .withHighVoltageThreshold(0.0) + .withLowVoltageThreshold(0.0); + assertEquals("Static var compensator 'SVC': Inconsistent low (0.0) and high (0.0) voltage thresholds", assertThrows(ValidationException.class, standbyAutomatonAdder::add).getMessage()); + + standbyAutomatonAdder = svc.newExtension(StandbyAutomatonAdder.class).withLowVoltageSetpoint(Double.NaN); + assertEquals("Static var compensator 'SVC': lowVoltageSetpoint is invalid", assertThrows(ValidationException.class, standbyAutomatonAdder::add).getMessage()); + + standbyAutomatonAdder = svc.newExtension(StandbyAutomatonAdder.class).withHighVoltageSetpoint(Double.NaN); + assertEquals("Static var compensator 'SVC': highVoltageSetpoint is invalid", assertThrows(ValidationException.class, standbyAutomatonAdder::add).getMessage()); + + standbyAutomatonAdder = svc.newExtension(StandbyAutomatonAdder.class).withHighVoltageThreshold(Double.NaN); + assertEquals("Static var compensator 'SVC': highVoltageThreshold is invalid", assertThrows(ValidationException.class, standbyAutomatonAdder::add).getMessage()); + + standbyAutomatonAdder = svc.newExtension(StandbyAutomatonAdder.class).withLowVoltageThreshold(Double.NaN); + assertEquals("Static var compensator 'SVC': lowVoltageThreshold is invalid", assertThrows(ValidationException.class, standbyAutomatonAdder::add).getMessage()); + } + + @Test + public void testStandbyAutomatonCheckB0() { + + Network network = Network.create("test", "test"); + Substation s = network.newSubstation() + .setId("S") + .setCountry(Country.FR) + .add(); + VoltageLevel vl = s.newVoltageLevel() + .setId("VL") + .setNominalV(400.0) + .setTopologyKind(TopologyKind.BUS_BREAKER) + .add(); + vl.getBusBreakerView().newBus() + .setId("BUS") + .add(); + StaticVarCompensator svc = vl.newStaticVarCompensator() + .setId("SVC") + .setConnectableBus("BUS") + .setBmin(12.2) + .setBmax(32.2) + .setRegulationMode(StaticVarCompensator.RegulationMode.VOLTAGE) + .setVoltageSetpoint(23.8) + .add(); + + StandbyAutomatonAdder standbyAutomatonAdder = svc.newExtension(StandbyAutomatonAdder.class) + .withHighVoltageSetpoint(21.3) + .withLowVoltageSetpoint(1.7) + .withHighVoltageThreshold(10.0) + .withLowVoltageThreshold(3.0) + .withB0(Double.NaN); + + assertEquals("Static var compensator 'SVC': b0 is invalid", assertThrows(ValidationException.class, standbyAutomatonAdder::add).getMessage()); + } } From c060ade9b44c423db86c8b56330ee33b34b2bc25 Mon Sep 17 00:00:00 2001 From: BOUTIER Charly Date: Tue, 1 Aug 2023 17:38:00 +0200 Subject: [PATCH 5/7] PR Review Signed-off-by: BOUTIER Charly --- .../tck/extensions/StandbyAutomatonTest.java | 30 ++----------------- 1 file changed, 2 insertions(+), 28 deletions(-) diff --git a/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/tck/extensions/StandbyAutomatonTest.java b/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/tck/extensions/StandbyAutomatonTest.java index 1abbf0d51..aeb0bf9c7 100644 --- a/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/tck/extensions/StandbyAutomatonTest.java +++ b/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/tck/extensions/StandbyAutomatonTest.java @@ -23,7 +23,7 @@ public void variantsCloneTest() { } @Test - public void testStandbyAutomatonCheckVoltageConfig() { + public void testStandbyAutomatonChecks() { Network network = Network.create("test", "test"); Substation s = network.newSubstation() .setId("S") @@ -64,34 +64,8 @@ public void testStandbyAutomatonCheckVoltageConfig() { standbyAutomatonAdder = svc.newExtension(StandbyAutomatonAdder.class).withLowVoltageThreshold(Double.NaN); assertEquals("Static var compensator 'SVC': lowVoltageThreshold is invalid", assertThrows(ValidationException.class, standbyAutomatonAdder::add).getMessage()); - } - - @Test - public void testStandbyAutomatonCheckB0() { - - Network network = Network.create("test", "test"); - Substation s = network.newSubstation() - .setId("S") - .setCountry(Country.FR) - .add(); - VoltageLevel vl = s.newVoltageLevel() - .setId("VL") - .setNominalV(400.0) - .setTopologyKind(TopologyKind.BUS_BREAKER) - .add(); - vl.getBusBreakerView().newBus() - .setId("BUS") - .add(); - StaticVarCompensator svc = vl.newStaticVarCompensator() - .setId("SVC") - .setConnectableBus("BUS") - .setBmin(12.2) - .setBmax(32.2) - .setRegulationMode(StaticVarCompensator.RegulationMode.VOLTAGE) - .setVoltageSetpoint(23.8) - .add(); - StandbyAutomatonAdder standbyAutomatonAdder = svc.newExtension(StandbyAutomatonAdder.class) + standbyAutomatonAdder = svc.newExtension(StandbyAutomatonAdder.class) .withHighVoltageSetpoint(21.3) .withLowVoltageSetpoint(1.7) .withHighVoltageThreshold(10.0) From 0c576a1150c2729a5cda2c1249a3c282309a8be4 Mon Sep 17 00:00:00 2001 From: BOUTIER Charly Date: Wed, 16 Aug 2023 11:54:46 +0200 Subject: [PATCH 6/7] PR Review Signed-off-by: BOUTIER Charly --- .../iidm/impl/BusbarSectionPositionImpl.java | 29 +++++++++++++++---- .../store/iidm/impl/VoltageLevelTest.java | 4 +-- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/BusbarSectionPositionImpl.java b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/BusbarSectionPositionImpl.java index e1f5152a4..9daae29ef 100644 --- a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/BusbarSectionPositionImpl.java +++ b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/BusbarSectionPositionImpl.java @@ -15,20 +15,37 @@ import com.powsybl.network.store.model.BusbarSectionPositionAttributes; import com.powsybl.network.store.model.Resource; +import java.util.Objects; + /** * @author Jon Harper */ public class BusbarSectionPositionImpl extends AbstractExtension implements BusbarSectionPosition { + private enum BusbarSectionType { + BUSBAR("Busbar"), + SECTION("Section"); + + final String description; + + BusbarSectionType(String description) { + this.description = Objects.requireNonNull(description); + } + + String getDescription() { + return description; + } + } + public BusbarSectionPositionImpl(BusbarSectionImpl busbarSectionImpl) { super(busbarSectionImpl); - checkIndex(busbarSectionImpl, getBusbarIndex()); - checkIndex(busbarSectionImpl, getSectionIndex()); + checkIndex(busbarSectionImpl, getBusbarIndex(), BusbarSectionType.BUSBAR); + checkIndex(busbarSectionImpl, getSectionIndex(), BusbarSectionType.SECTION); } - private static int checkIndex(Validable validable, int index) { + private static int checkIndex(Validable validable, int index, BusbarSectionType type) { if (index < 0) { - throw new ValidationException(validable, "Busbar index has to be greater or equals to zero"); + throw new ValidationException(validable, type.getDescription() + " index has to be greater or equals to zero"); } return index; } @@ -52,7 +69,7 @@ private BusbarSectionPositionAttributes getPositionAttributes(Resource getPositionAttributes(res).setBusbarIndex(checkIndex(getBusbarSection(), busbarIndex))); + getBusbarSection().updateResource(res -> getPositionAttributes(res).setBusbarIndex(checkIndex(getBusbarSection(), busbarIndex, BusbarSectionType.BUSBAR))); return this; } @@ -63,7 +80,7 @@ public int getSectionIndex() { @Override public BusbarSectionPosition setSectionIndex(int sectionIndex) { - getBusbarSection().updateResource(res -> getPositionAttributes(res).setSectionIndex(checkIndex(getBusbarSection(), sectionIndex))); + getBusbarSection().updateResource(res -> getPositionAttributes(res).setSectionIndex(checkIndex(getBusbarSection(), sectionIndex, BusbarSectionType.SECTION))); return this; } } diff --git a/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/VoltageLevelTest.java b/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/VoltageLevelTest.java index 2496bec2d..1ffe9b351 100644 --- a/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/VoltageLevelTest.java +++ b/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/VoltageLevelTest.java @@ -65,7 +65,7 @@ public void testBusbarSectionPositions() { assertThrows(ValidationException.class, busbarSectionPositionAdder::add).getMessage()); busbarSectionPositionAdder = bbs.newExtension(BusbarSectionPositionAdder.class).withBusbarIndex(0); - assertEquals("Busbar section 'idBBS': Busbar index has to be greater or equals to zero", + assertEquals("Busbar section 'idBBS': Section index has to be greater or equals to zero", assertThrows(ValidationException.class, busbarSectionPositionAdder::add).getMessage()); busbarSectionPositionAdder = bbs.newExtension(BusbarSectionPositionAdder.class).withSectionIndex(0); @@ -77,7 +77,7 @@ public void testBusbarSectionPositions() { assertThrows(ValidationException.class, busbarSectionPositionAdder::add).getMessage()); busbarSectionPositionAdder = bbs.newExtension(BusbarSectionPositionAdder.class).withBusbarIndex(0).withSectionIndex(-1); - assertEquals("Busbar section 'idBBS': Busbar index has to be greater or equals to zero", + assertEquals("Busbar section 'idBBS': Section index has to be greater or equals to zero", assertThrows(ValidationException.class, busbarSectionPositionAdder::add).getMessage()); busbarSectionPositionAdder = bbs.newExtension(BusbarSectionPositionAdder.class).withBusbarIndex(-1).withSectionIndex(-1); From cd63fa60a3488746aa9b793928f989ed4fd556aa Mon Sep 17 00:00:00 2001 From: BOUTIER Charly Date: Fri, 18 Aug 2023 13:57:21 +0200 Subject: [PATCH 7/7] PR Review Signed-off-by: BOUTIER Charly --- .../iidm/impl/BusbarSectionPositionImpl.java | 29 ++++--------------- 1 file changed, 6 insertions(+), 23 deletions(-) diff --git a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/BusbarSectionPositionImpl.java b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/BusbarSectionPositionImpl.java index 9daae29ef..f6aea7f33 100644 --- a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/BusbarSectionPositionImpl.java +++ b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/BusbarSectionPositionImpl.java @@ -15,37 +15,20 @@ import com.powsybl.network.store.model.BusbarSectionPositionAttributes; import com.powsybl.network.store.model.Resource; -import java.util.Objects; - /** * @author Jon Harper */ public class BusbarSectionPositionImpl extends AbstractExtension implements BusbarSectionPosition { - private enum BusbarSectionType { - BUSBAR("Busbar"), - SECTION("Section"); - - final String description; - - BusbarSectionType(String description) { - this.description = Objects.requireNonNull(description); - } - - String getDescription() { - return description; - } - } - public BusbarSectionPositionImpl(BusbarSectionImpl busbarSectionImpl) { super(busbarSectionImpl); - checkIndex(busbarSectionImpl, getBusbarIndex(), BusbarSectionType.BUSBAR); - checkIndex(busbarSectionImpl, getSectionIndex(), BusbarSectionType.SECTION); + checkIndex(busbarSectionImpl, getBusbarIndex(), "Busbar"); + checkIndex(busbarSectionImpl, getSectionIndex(), "Section"); } - private static int checkIndex(Validable validable, int index, BusbarSectionType type) { + private static int checkIndex(Validable validable, int index, String equipmentTypeLabel) { if (index < 0) { - throw new ValidationException(validable, type.getDescription() + " index has to be greater or equals to zero"); + throw new ValidationException(validable, equipmentTypeLabel + " index has to be greater or equals to zero"); } return index; } @@ -69,7 +52,7 @@ private BusbarSectionPositionAttributes getPositionAttributes(Resource getPositionAttributes(res).setBusbarIndex(checkIndex(getBusbarSection(), busbarIndex, BusbarSectionType.BUSBAR))); + getBusbarSection().updateResource(res -> getPositionAttributes(res).setBusbarIndex(checkIndex(getBusbarSection(), busbarIndex, "Busbar"))); return this; } @@ -80,7 +63,7 @@ public int getSectionIndex() { @Override public BusbarSectionPosition setSectionIndex(int sectionIndex) { - getBusbarSection().updateResource(res -> getPositionAttributes(res).setSectionIndex(checkIndex(getBusbarSection(), sectionIndex, BusbarSectionType.SECTION))); + getBusbarSection().updateResource(res -> getPositionAttributes(res).setSectionIndex(checkIndex(getBusbarSection(), sectionIndex, "Section"))); return this; } }