diff --git a/README.md b/README.md index 886124223..2a4737043 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ for (Line line : network.lines) { parameterSetId "CLA" controlledQuadripole line.id iMeasurement line.id - iMeasurementSide Branch.Side.TWO + iMeasurementSide TwoSides.TWO } } ``` diff --git a/commons/pom.xml b/commons/pom.xml index eaade231c..68c1efed5 100644 --- a/commons/pom.xml +++ b/commons/pom.xml @@ -51,7 +51,7 @@ com.powsybl - powsybl-iidm-xml-converter + powsybl-iidm-serde com.powsybl diff --git a/commons/src/main/java/com/powsybl/dynawo/commons/DynawoConstants.java b/commons/src/main/java/com/powsybl/dynawo/commons/DynawoConstants.java index 25474862e..9e1eebdd9 100644 --- a/commons/src/main/java/com/powsybl/dynawo/commons/DynawoConstants.java +++ b/commons/src/main/java/com/powsybl/dynawo/commons/DynawoConstants.java @@ -7,7 +7,7 @@ */ package com.powsybl.dynawo.commons; -import com.powsybl.iidm.xml.IidmXmlVersion; +import com.powsybl.iidm.serde.IidmVersion; import java.util.List; @@ -22,7 +22,7 @@ private DynawoConstants() { /** * write the network to XIIDM v1.4 because currently Dynawo does not support versions above */ - public static final String IIDM_VERSION = IidmXmlVersion.V_1_4.toString("."); + public static final String IIDM_VERSION = IidmVersion.V_1_4.toString("."); public static final String DYNAWO_CMD_NAME = "dynawo"; diff --git a/commons/src/main/java/com/powsybl/dynawo/commons/DynawoUtil.java b/commons/src/main/java/com/powsybl/dynawo/commons/DynawoUtil.java index 3cf6da070..1fd602023 100644 --- a/commons/src/main/java/com/powsybl/dynawo/commons/DynawoUtil.java +++ b/commons/src/main/java/com/powsybl/dynawo/commons/DynawoUtil.java @@ -11,7 +11,7 @@ import com.powsybl.commons.PowsyblException; import com.powsybl.computation.*; import com.powsybl.iidm.network.Network; -import com.powsybl.iidm.xml.XMLExporter; +import com.powsybl.iidm.serde.AbstractTreeDataExporter; import java.io.IOException; import java.io.InputStream; @@ -35,8 +35,8 @@ public static void writeIidm(Network network, Path file) { Objects.requireNonNull(network); Objects.requireNonNull(file); Properties params = new Properties(); - params.setProperty(XMLExporter.VERSION, IIDM_VERSION); - params.setProperty(XMLExporter.EXTENSIONS_LIST, String.join(",", IIDM_EXTENSIONS)); + params.setProperty(AbstractTreeDataExporter.VERSION, IIDM_VERSION); + params.setProperty(AbstractTreeDataExporter.EXTENSIONS_LIST, String.join(",", IIDM_EXTENSIONS)); network.write("XIIDM", params, file); } diff --git a/commons/src/main/java/com/powsybl/dynawo/commons/NetworkResultsUpdater.java b/commons/src/main/java/com/powsybl/dynawo/commons/NetworkResultsUpdater.java index ec6cca474..520cf1102 100644 --- a/commons/src/main/java/com/powsybl/dynawo/commons/NetworkResultsUpdater.java +++ b/commons/src/main/java/com/powsybl/dynawo/commons/NetworkResultsUpdater.java @@ -78,10 +78,10 @@ public static void update(Network targetNetwork, Network sourceNetwork, boolean private static void updateHvdcLines(Network targetNetwork, Iterable hvdcLines) { for (HvdcLine sourceHvdcLine : hvdcLines) { - Terminal targetTerminal1 = targetNetwork.getHvdcLine(sourceHvdcLine.getId()).getConverterStation(HvdcLine.Side.ONE).getTerminal(); - Terminal targetTerminal2 = targetNetwork.getHvdcLine(sourceHvdcLine.getId()).getConverterStation(HvdcLine.Side.TWO).getTerminal(); - Terminal sourceTerminal1 = sourceHvdcLine.getConverterStation(HvdcLine.Side.ONE).getTerminal(); - Terminal sourceTerminal2 = sourceHvdcLine.getConverterStation(HvdcLine.Side.TWO).getTerminal(); + Terminal targetTerminal1 = targetNetwork.getHvdcLine(sourceHvdcLine.getId()).getConverterStation(TwoSides.ONE).getTerminal(); + Terminal targetTerminal2 = targetNetwork.getHvdcLine(sourceHvdcLine.getId()).getConverterStation(TwoSides.TWO).getTerminal(); + Terminal sourceTerminal1 = sourceHvdcLine.getConverterStation(TwoSides.ONE).getTerminal(); + Terminal sourceTerminal2 = sourceHvdcLine.getConverterStation(TwoSides.TWO).getTerminal(); update(targetTerminal1, sourceTerminal1); update(targetTerminal2, sourceTerminal2); } diff --git a/commons/src/main/java/com/powsybl/dynawo/commons/loadmerge/LoadsMerger.java b/commons/src/main/java/com/powsybl/dynawo/commons/loadmerge/LoadsMerger.java index dfb5de9e3..5b17b9bb1 100644 --- a/commons/src/main/java/com/powsybl/dynawo/commons/loadmerge/LoadsMerger.java +++ b/commons/src/main/java/com/powsybl/dynawo/commons/loadmerge/LoadsMerger.java @@ -12,7 +12,7 @@ import com.powsybl.iidm.network.Load; import com.powsybl.iidm.network.Network; import com.powsybl.iidm.network.VoltageLevel; -import com.powsybl.iidm.xml.NetworkXml; +import com.powsybl.iidm.serde.NetworkSerDe; import java.util.EnumMap; import java.util.List; @@ -33,7 +33,7 @@ private LoadsMerger() { } public static Network mergeLoads(Network network) throws PowsyblException { - Network mergedLoadsNetwork = NetworkXml.copy(network); + Network mergedLoadsNetwork = NetworkSerDe.copy(network); mergedLoadsNetwork.getVoltageLevelStream().forEach(LoadsMerger::mergeLoadsInVoltageLevel); return mergedLoadsNetwork; } diff --git a/commons/src/main/java/com/powsybl/dynawo/commons/timeline/XmlTimeLineParser.java b/commons/src/main/java/com/powsybl/dynawo/commons/timeline/XmlTimeLineParser.java index fe697a08b..33d344983 100644 --- a/commons/src/main/java/com/powsybl/dynawo/commons/timeline/XmlTimeLineParser.java +++ b/commons/src/main/java/com/powsybl/dynawo/commons/timeline/XmlTimeLineParser.java @@ -75,13 +75,18 @@ private static List read(XMLStreamReader xmlReader) throws XMLStr while (state == XMLStreamConstants.COMMENT) { state = xmlReader.next(); } - XmlUtil.readUntilEndElement("timeline", xmlReader, () -> { - if (xmlReader.getLocalName().equals("event")) { - String time = xmlReader.getAttributeValue(null, TIME); - String modelName = xmlReader.getAttributeValue(null, MODEL_NAME); - String message = xmlReader.getAttributeValue(null, MESSAGE); - TimeLineUtil.createEvent(time, modelName, message) - .ifPresent(timeline::add); + XmlUtil.readSubElements(xmlReader, elementName -> { + try { + if (elementName.equals("event")) { + String time = xmlReader.getAttributeValue(null, TIME); + String modelName = xmlReader.getAttributeValue(null, MODEL_NAME); + String message = xmlReader.getAttributeValue(null, MESSAGE); + XmlUtil.readEndElementOrThrow(xmlReader); + TimeLineUtil.createEvent(time, modelName, message) + .ifPresent(timeline::add); + } + } catch (XMLStreamException e) { + throw new UncheckedXmlStreamException(e); } }); return timeline; diff --git a/commons/src/test/java/com/powsybl/dynawo/commons/AbstractDynawoCommonsTest.java b/commons/src/test/java/com/powsybl/dynawo/commons/AbstractDynawoCommonsTest.java index 8ac2f3dda..d284f684d 100644 --- a/commons/src/test/java/com/powsybl/dynawo/commons/AbstractDynawoCommonsTest.java +++ b/commons/src/test/java/com/powsybl/dynawo/commons/AbstractDynawoCommonsTest.java @@ -7,9 +7,9 @@ */ package com.powsybl.dynawo.commons; -import com.powsybl.commons.test.AbstractConverterTest; +import com.powsybl.commons.test.AbstractSerDeTest; import com.powsybl.iidm.network.Network; -import com.powsybl.iidm.xml.NetworkXml; +import com.powsybl.iidm.serde.NetworkSerDe; import java.io.IOException; import java.io.InputStream; @@ -17,25 +17,25 @@ import java.nio.file.Path; import java.util.Objects; -import static com.powsybl.commons.test.ComparisonUtils.compareTxt; +import static com.powsybl.commons.test.ComparisonUtils.compareXml; /** * @author Florian Dupuy {@literal } */ -abstract class AbstractDynawoCommonsTest extends AbstractConverterTest { +abstract class AbstractDynawoCommonsTest extends AbstractSerDeTest { protected void compare(String expectedIidmResource, Network actual) throws IOException { InputStream expected = Objects.requireNonNull(getClass().getResourceAsStream(expectedIidmResource)); - compareTxt(expected, getInputStream(actual, tmpDir.resolve("actual.xiidm"))); + compareXml(expected, getInputStream(actual, tmpDir.resolve("actual.xiidm"))); } protected void compare(Network expected, Network actual) throws IOException { - compareTxt(getInputStream(expected, tmpDir.resolve("expected.xiidm")), + compareXml(getInputStream(expected, tmpDir.resolve("expected.xiidm")), getInputStream(actual, tmpDir.resolve("actual.xiidm"))); } private InputStream getInputStream(Network n, Path path) throws IOException { - NetworkXml.write(n, path); + NetworkSerDe.write(n, path); return Files.newInputStream(path); } } diff --git a/commons/src/test/java/com/powsybl/dynawo/commons/DynawoVersionTest.java b/commons/src/test/java/com/powsybl/dynawo/commons/DynawoVersionTest.java index 7526d49a9..4abbb8fa8 100644 --- a/commons/src/test/java/com/powsybl/dynawo/commons/DynawoVersionTest.java +++ b/commons/src/test/java/com/powsybl/dynawo/commons/DynawoVersionTest.java @@ -8,7 +8,6 @@ package com.powsybl.dynawo.commons; import com.powsybl.commons.PowsyblException; -import com.powsybl.commons.test.AbstractConverterTest; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; @@ -16,7 +15,7 @@ /** * @author Laurent Issertial {@literal } */ -class DynawoVersionTest extends AbstractConverterTest { +class DynawoVersionTest { private static final DynawoVersion DV_MIN = new DynawoVersion(1, 3, 0); diff --git a/commons/src/test/java/com/powsybl/dynawo/commons/NetworkResultsUpdaterTest.java b/commons/src/test/java/com/powsybl/dynawo/commons/NetworkResultsUpdaterTest.java index 50a2ec135..2f36f3d50 100644 --- a/commons/src/test/java/com/powsybl/dynawo/commons/NetworkResultsUpdaterTest.java +++ b/commons/src/test/java/com/powsybl/dynawo/commons/NetworkResultsUpdaterTest.java @@ -9,8 +9,8 @@ import com.powsybl.dynawo.commons.loadmerge.LoadsMerger; import com.powsybl.iidm.network.*; import com.powsybl.iidm.network.test.FourSubstationsNodeBreakerFactory; -import com.powsybl.iidm.xml.ExportOptions; -import com.powsybl.iidm.xml.NetworkXml; +import com.powsybl.iidm.serde.ExportOptions; +import com.powsybl.iidm.serde.NetworkSerDe; import org.junit.jupiter.api.Test; import java.io.IOException; @@ -24,7 +24,7 @@ class NetworkResultsUpdaterTest extends AbstractDynawoCommonsTest { @Test void testUpdateWithoutMergeLoads() throws IOException { Network expected = TestNetworkFactory.createMultiBusesVoltageLevelNetwork(); - Network actual = NetworkXml.copy(expected); + Network actual = NetworkSerDe.copy(expected); reset(actual); NetworkResultsUpdater.update(actual, expected, false); compare(expected, actual); @@ -33,7 +33,7 @@ void testUpdateWithoutMergeLoads() throws IOException { @Test void testUpdateWithMergeLoads() throws IOException { Network expected = TestNetworkFactory.createMultiBusesVoltageLevelNetwork(); - Network actual = NetworkXml.copy(expected); + Network actual = NetworkSerDe.copy(expected); NetworkResultsUpdater.update(actual, LoadsMerger.mergeLoads(expected), true); compare(expected, actual); } @@ -41,7 +41,7 @@ void testUpdateWithMergeLoads() throws IOException { @Test void testUpdateNetworkPassingThroughBusBreaker() throws IOException { Network expected = TestNetworkFactory.createMultiBusesVoltageLevelNetwork(); - Network actual = NetworkXml.copy(expected); + Network actual = NetworkSerDe.copy(expected); reset(actual); // We assume that the original network will be updated by some analysis tool @@ -50,8 +50,8 @@ void testUpdateNetworkPassingThroughBusBreaker() throws IOException { // is properly updated from the Bus/Breaker "solution" exchanged // with the external analysis tool Path pexpectedAsBusBreaker = tmpDir.resolve("expected-as-busbreaker.xiidm"); - NetworkXml.write(expected, new ExportOptions().setTopologyLevel(TopologyLevel.BUS_BREAKER), pexpectedAsBusBreaker); - Network expectedBusBreaker = NetworkXml.read(pexpectedAsBusBreaker); + NetworkSerDe.write(expected, new ExportOptions().setTopologyLevel(TopologyLevel.BUS_BREAKER), pexpectedAsBusBreaker); + Network expectedBusBreaker = NetworkSerDe.read(pexpectedAsBusBreaker); NetworkResultsUpdater.update(actual, expectedBusBreaker, false); compare(expected, actual); @@ -60,7 +60,7 @@ void testUpdateNetworkPassingThroughBusBreaker() throws IOException { @Test void testUpdateWithDisconnects() throws IOException { Network expected = FourSubstationsNodeBreakerFactory.create(); - Network actual = NetworkXml.copy(expected); + Network actual = NetworkSerDe.copy(expected); reset(actual); // Test with some elements disconnected in the network @@ -89,8 +89,8 @@ private static void reset(Network targetNetwork) { reset(targetDangling.getTerminal()); } for (HvdcLine targetHvdcLine : targetNetwork.getHvdcLines()) { - reset(targetHvdcLine.getConverterStation(HvdcLine.Side.ONE).getTerminal()); - reset(targetHvdcLine.getConverterStation(HvdcLine.Side.TWO).getTerminal()); + reset(targetHvdcLine.getConverterStation(TwoSides.ONE).getTerminal()); + reset(targetHvdcLine.getConverterStation(TwoSides.TWO).getTerminal()); } for (TwoWindingsTransformer targetTwoWindingsTransformer : targetNetwork.getTwoWindingsTransformers()) { reset(targetTwoWindingsTransformer.getTerminal1()); diff --git a/commons/src/test/java/com/powsybl/dynawo/commons/TestNetworkFactory.java b/commons/src/test/java/com/powsybl/dynawo/commons/TestNetworkFactory.java index b3588c79c..51bf19394 100644 --- a/commons/src/test/java/com/powsybl/dynawo/commons/TestNetworkFactory.java +++ b/commons/src/test/java/com/powsybl/dynawo/commons/TestNetworkFactory.java @@ -8,8 +8,8 @@ package com.powsybl.dynawo.commons; import com.powsybl.iidm.network.*; -import org.joda.time.DateTime; +import java.time.ZonedDateTime; import java.util.List; /** @@ -22,7 +22,7 @@ private TestNetworkFactory() { static Network createMultiBusesVoltageLevelNetwork() { Network network = Network.create("multiBusesVl", "test") - .setCaseDate(DateTime.parse("2023-02-17T05:41:11.194+01:00")); + .setCaseDate(ZonedDateTime.parse("2023-02-17T05:41:11.194+01:00")); Substation s = network.newSubstation().setId("substation").add(); VoltageLevel vl1 = s.newVoltageLevel().setId("vl1").setNominalV(250).setTopologyKind(TopologyKind.NODE_BREAKER).add(); @@ -70,7 +70,7 @@ static Network createMultiBusesVoltageLevelNetwork() { */ static Network createMultiLoadsBusesNetwork(List loadStates) { Network network = Network.create("multiLoads", "test") - .setCaseDate(DateTime.parse("2023-02-17T05:41:11.194+01:00")); + .setCaseDate(ZonedDateTime.parse("2023-02-17T05:41:11.194+01:00")); Substation s = network.newSubstation().setId("substation").add(); // First node breaker voltage level diff --git a/dynaflow/pom.xml b/dynaflow/pom.xml index b66ead0ca..791b35d8c 100644 --- a/dynaflow/pom.xml +++ b/dynaflow/pom.xml @@ -28,7 +28,7 @@ com.powsybl - powsybl-iidm-xml-converter + powsybl-iidm-serde com.powsybl diff --git a/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowProvider.java b/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowProvider.java index a5cfa4986..260795236 100644 --- a/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowProvider.java +++ b/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowProvider.java @@ -24,7 +24,7 @@ import com.powsybl.dynawo.commons.timeline.TimelineEntry; import com.powsybl.dynawo.commons.timeline.XmlTimeLineParser; import com.powsybl.iidm.network.Network; -import com.powsybl.iidm.xml.NetworkXml; +import com.powsybl.iidm.serde.NetworkSerDe; import com.powsybl.loadflow.LoadFlowParameters; import com.powsybl.loadflow.LoadFlowProvider; import com.powsybl.loadflow.LoadFlowResult; @@ -187,7 +187,7 @@ public LoadFlowResult after(Path workingDir, ExecutionReport report) { boolean status = true; Path outputNetworkFile = workingDir.resolve("outputs").resolve("finalState").resolve(OUTPUT_IIDM_FILENAME); if (Files.exists(outputNetworkFile)) { - NetworkResultsUpdater.update(network, NetworkXml.read(outputNetworkFile), dynaFlowParameters.isMergeLoads()); + NetworkResultsUpdater.update(network, NetworkSerDe.read(outputNetworkFile), dynaFlowParameters.isMergeLoads()); } else { status = false; } diff --git a/dynaflow/src/main/java/com/powsybl/dynaflow/xml/ConstraintsReader.java b/dynaflow/src/main/java/com/powsybl/dynaflow/xml/ConstraintsReader.java index c46b29f14..9531b1c82 100644 --- a/dynaflow/src/main/java/com/powsybl/dynaflow/xml/ConstraintsReader.java +++ b/dynaflow/src/main/java/com/powsybl/dynaflow/xml/ConstraintsReader.java @@ -72,21 +72,30 @@ public static List read(Network network, InputStream is) { state = reader.next(); } - XmlUtil.readUntilEndElement(CONSTRAINTS_ELEMENT_NAME, reader, () -> { - if (!reader.getLocalName().equals(CONSTRAINT_ELEMENT_NAME)) { - throw new AssertionError(); + if (!CONSTRAINTS_ELEMENT_NAME.equals(reader.getLocalName())) { + throw new PowsyblException("Unknown element name '" + reader.getLocalName() + "' in constraints file"); + } + XmlUtil.readSubElements(reader, elementName -> { + try { + if (!elementName.equals(CONSTRAINT_ELEMENT_NAME)) { + throw new PowsyblException("Unknown element name '" + elementName + "' in constraints tag"); + } + String name = reader.getAttributeValue(null, MODEL_NAME); + reader.getAttributeValue(null, DESCRIPTION); // description: unused + reader.getAttributeValue(null, TYPE); // type: unused + String kind = reader.getAttributeValue(null, KIND); + double limit = readDouble(reader, LIMIT); + double value = readDouble(reader, VALUE); + Integer side = readInteger(reader, SIDE); + Integer acceptableDuration = readInteger(reader, ACCEPTABLE_DURATION, Integer.MAX_VALUE); + XmlUtil.readEndElementOrThrow(reader); + + getLimitViolation(network, name, kind, limit, 1f, value, side, acceptableDuration) + .ifPresent(lvRead -> addOrDismiss(lvRead, limitViolations)); + + } catch (XMLStreamException e) { + throw new UncheckedXmlStreamException(e); } - String name = reader.getAttributeValue(null, MODEL_NAME); - reader.getAttributeValue(null, DESCRIPTION); // description: unused - reader.getAttributeValue(null, TYPE); // type: unused - String kind = reader.getAttributeValue(null, KIND); - double limit = XmlUtil.readOptionalDoubleAttribute(reader, LIMIT); - double value = XmlUtil.readOptionalDoubleAttribute(reader, VALUE); - Integer side = XmlUtil.readOptionalIntegerAttribute(reader, SIDE); - Integer acceptableDuration = XmlUtil.readOptionalIntegerAttribute(reader, ACCEPTABLE_DURATION, Integer.MAX_VALUE); - - getLimitViolation(network, name, kind, limit, 1f, value, side, acceptableDuration) - .ifPresent(lvRead -> addOrDismiss(lvRead, limitViolations)); }); return limitViolations; } catch (XMLStreamException e) { @@ -94,6 +103,21 @@ public static List read(Network network, InputStream is) { } } + private static double readDouble(XMLStreamReader reader, String name) { + String doubleStr = reader.getAttributeValue(null, name); + return doubleStr != null ? Double.parseDouble(doubleStr) : Double.NaN; + } + + private static Integer readInteger(XMLStreamReader reader, String name) { + String intStr = reader.getAttributeValue(null, name); + return intStr != null ? Integer.valueOf(intStr) : null; + } + + private static int readInteger(XMLStreamReader reader, String name, int defaultValue) { + String intStr = reader.getAttributeValue(null, name); + return intStr != null ? Integer.parseInt(intStr) : defaultValue; + } + private static void addOrDismiss(LimitViolation lvRead, List limitViolations) { LimitViolationComparator comparator = new LimitViolationComparator(); limitViolations.stream().filter(lv -> comparator.compare(lvRead, lv) == 0).findFirst() @@ -117,7 +141,7 @@ private static Optional getLimitViolation(Network network, Strin .map(identifiable -> new LimitViolation( identifiable.getId(), identifiable.getOptionalName().orElse(null), toLimitViolationType(kind), kind, acceptableDuration, - limit, limitReduction, value, toBranchSide(side))); + limit, limitReduction, value, toThreeSides(side))); } private static Optional> getLimitViolationIdentifiable(Network network, String name) { @@ -142,16 +166,11 @@ private static Optional> getLimitViolationIdentifiable(Network n } } - private static Branch.Side toBranchSide(Integer side) { + private static ThreeSides toThreeSides(Integer side) { if (side == null) { return null; - } else if (side == 1) { - return Branch.Side.ONE; - } else if (side == 2) { - return Branch.Side.TWO; - } else { - return null; } + return ThreeSides.valueOf(side); } private static LimitViolationType toLimitViolationType(String kind) { diff --git a/dynaflow/src/test/java/com/powsybl/dynaflow/DynaFlowParametersTest.java b/dynaflow/src/test/java/com/powsybl/dynaflow/DynaFlowParametersTest.java index 022543290..52347e736 100644 --- a/dynaflow/src/test/java/com/powsybl/dynaflow/DynaFlowParametersTest.java +++ b/dynaflow/src/test/java/com/powsybl/dynaflow/DynaFlowParametersTest.java @@ -10,7 +10,7 @@ import com.google.common.jimfs.Jimfs; import com.powsybl.commons.config.InMemoryPlatformConfig; import com.powsybl.commons.config.MapModuleConfig; -import com.powsybl.commons.test.AbstractConverterTest; +import com.powsybl.commons.test.AbstractSerDeTest; import com.powsybl.dynaflow.DynaFlowConstants.ActivePowerCompensation; import com.powsybl.dynaflow.DynaFlowConstants.OutputTypes; import com.powsybl.dynaflow.DynaFlowConstants.StartingPointMode; @@ -34,7 +34,7 @@ * * @author Guillaume Pernin {@literal } */ -class DynaFlowParametersTest extends AbstractConverterTest { +class DynaFlowParametersTest extends AbstractSerDeTest { private InMemoryPlatformConfig platformConfig; diff --git a/dynaflow/src/test/java/com/powsybl/dynaflow/DynaFlowProviderTest.java b/dynaflow/src/test/java/com/powsybl/dynaflow/DynaFlowProviderTest.java index b45e099e1..e04371357 100644 --- a/dynaflow/src/test/java/com/powsybl/dynaflow/DynaFlowProviderTest.java +++ b/dynaflow/src/test/java/com/powsybl/dynaflow/DynaFlowProviderTest.java @@ -7,14 +7,14 @@ package com.powsybl.dynaflow; import com.powsybl.commons.PowsyblException; -import com.powsybl.commons.test.AbstractConverterTest; +import com.powsybl.commons.test.AbstractSerDeTest; import com.powsybl.computation.ComputationManager; import com.powsybl.computation.local.LocalCommandExecutor; import com.powsybl.computation.local.LocalComputationConfig; import com.powsybl.computation.local.LocalComputationManager; import com.powsybl.dynawo.commons.DynawoConstants; import com.powsybl.iidm.network.*; -import com.powsybl.iidm.xml.NetworkXml; +import com.powsybl.iidm.serde.NetworkSerDe; import com.powsybl.loadflow.LoadFlow; import com.powsybl.loadflow.LoadFlowParameters; import com.powsybl.loadflow.LoadFlowResult; @@ -40,7 +40,7 @@ /** * @author Guillaume Pernin {@literal } */ -class DynaFlowProviderTest extends AbstractConverterTest { +class DynaFlowProviderTest extends AbstractSerDeTest { private Path homeDir; private DynaFlowConfig config; @@ -137,7 +137,7 @@ void testWithoutMergeLoads() throws Exception { assertTrue(result.isOk()); InputStream pReferenceOutput = getClass().getResourceAsStream("/output.xiidm"); - Network expectedNetwork = NetworkXml.read(pReferenceOutput); + Network expectedNetwork = NetworkSerDe.read(pReferenceOutput); compare(expectedNetwork, network); } @@ -158,7 +158,7 @@ void testWithMergeLoads() throws Exception { assertTrue(result.isOk()); InputStream pReferenceOutput = getClass().getResourceAsStream("/output.xiidm"); - Network expectedNetwork = NetworkXml.read(pReferenceOutput); + Network expectedNetwork = NetworkSerDe.read(pReferenceOutput); compare(expectedNetwork, network); } @@ -217,9 +217,9 @@ private void compare(Network expected, Network actual) throws IOException { assertNotNull(pexpected); Path pactual = tmpDir.resolve("actual.xiidm"); assertNotNull(pactual); - NetworkXml.write(expected, pexpected); + NetworkSerDe.write(expected, pexpected); actual.setCaseDate(expected.getCaseDate()); - NetworkXml.write(actual, pactual); + NetworkSerDe.write(actual, pactual); compareXml(Files.newInputStream(pexpected), Files.newInputStream(pactual)); } diff --git a/dynaflow/src/test/java/com/powsybl/dynaflow/DynaFlowSecurityAnalysisTest.java b/dynaflow/src/test/java/com/powsybl/dynaflow/DynaFlowSecurityAnalysisTest.java index c20d88729..60d6c4910 100644 --- a/dynaflow/src/test/java/com/powsybl/dynaflow/DynaFlowSecurityAnalysisTest.java +++ b/dynaflow/src/test/java/com/powsybl/dynaflow/DynaFlowSecurityAnalysisTest.java @@ -7,7 +7,7 @@ package com.powsybl.dynaflow; import com.powsybl.commons.PowsyblException; -import com.powsybl.commons.test.AbstractConverterTest; +import com.powsybl.commons.test.AbstractSerDeTest; import com.powsybl.computation.ComputationManager; import com.powsybl.computation.local.LocalCommandExecutor; import com.powsybl.computation.local.LocalComputationConfig; @@ -22,7 +22,6 @@ import com.powsybl.security.SecurityAnalysisReport; import com.powsybl.security.SecurityAnalysisResult; import com.powsybl.security.json.SecurityAnalysisResultSerializer; -import org.joda.time.DateTime; import org.junit.jupiter.api.Test; import java.io.IOException; @@ -31,6 +30,7 @@ import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; +import java.time.ZonedDateTime; import java.util.List; import java.util.Map; import java.util.Objects; @@ -40,12 +40,13 @@ import static com.powsybl.commons.test.ComparisonUtils.compareXml; import static com.powsybl.dynaflow.DynaFlowConstants.DYNAFLOW_NAME; import static com.powsybl.dynaflow.DynaFlowConstants.IIDM_FILENAME; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * @author Marcos de Miguel {@literal } */ -class DynaFlowSecurityAnalysisTest extends AbstractConverterTest { +class DynaFlowSecurityAnalysisTest extends AbstractSerDeTest { private static class LocalCommandExecutorMock extends AbstractLocalCommandExecutor { @@ -142,7 +143,7 @@ void testCallingBadVersionDynawo() throws IOException { private static Network buildNetwork() { Network network = EurostagTutorialExample1Factory.create(); - network.setCaseDate(DateTime.parse("2023-03-23T16:40:48.060+01:00")); + network.setCaseDate(ZonedDateTime.parse("2023-03-23T16:40:48.060+01:00")); // Changing the network for having some pre-contingencies violations network.getBusBreakerView().getBus("NHV1").setV(380.0); diff --git a/dynaflow/src/test/java/com/powsybl/dynaflow/json/JsonDynaFlowParametersSerializerTest.java b/dynaflow/src/test/java/com/powsybl/dynaflow/json/JsonDynaFlowParametersSerializerTest.java index 58dc5f866..fcc5c4982 100644 --- a/dynaflow/src/test/java/com/powsybl/dynaflow/json/JsonDynaFlowParametersSerializerTest.java +++ b/dynaflow/src/test/java/com/powsybl/dynaflow/json/JsonDynaFlowParametersSerializerTest.java @@ -6,8 +6,8 @@ */ package com.powsybl.dynaflow.json; -import com.powsybl.commons.test.AbstractConverterTest; import com.powsybl.commons.config.InMemoryPlatformConfig; +import com.powsybl.commons.test.AbstractSerDeTest; import com.powsybl.dynaflow.DynaFlowConstants; import com.powsybl.dynaflow.DynaFlowParameters; import com.powsybl.loadflow.LoadFlowParameters; @@ -25,7 +25,7 @@ * * @author Guillaume Pernin {@literal } */ -class JsonDynaFlowParametersSerializerTest extends AbstractConverterTest { +class JsonDynaFlowParametersSerializerTest extends AbstractSerDeTest { @Test void testDeserialize() { diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/AbstractEquipmentGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/AbstractEquipmentGroovyExtension.groovy index 16caa0de9..c28430e5b 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/AbstractEquipmentGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/AbstractEquipmentGroovyExtension.groovy @@ -7,14 +7,18 @@ */ package com.powsybl.dynawaltz.dsl +import com.powsybl.commons.reporter.Reporter +import com.powsybl.dynamicsimulation.DynamicModel +import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.DynaWaltzProvider import com.powsybl.iidm.network.Network import java.util.function.Consumer + /** * @author Laurent Issertial {@literal } */ -abstract class AbstractEquipmentGroovyExtension { +abstract class AbstractEquipmentGroovyExtension implements DynamicModelGroovyExtension { protected static final String MODELS_CONFIG = "models.json" @@ -28,21 +32,26 @@ abstract class AbstractEquipmentGroovyExtension { equipmentConfigs = ModelsSlurper.instance.getEquipmentConfigs(modelConfigUrl, modelTag) } - abstract protected ModelBuilder createBuilder(Network network, EquipmentConfig equipmentConfig) + abstract protected ModelBuilder createBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) + @Override String getName() { DynaWaltzProvider.NAME } + @Override List getModelNames() { equipmentConfigs.collect(eq -> eq.lib) } - void load(Binding binding, Consumer consumer) { + @Override + void load(Binding binding, Consumer consumer, Reporter reporter) { equipmentConfigs.forEach { binding.setVariable(it.lib, { Closure closure -> def cloned = closure.clone() - ModelBuilder builder = createBuilder(binding.getVariable("network") as Network, it) + ModelBuilder builder = createBuilder(binding.getVariable("network") as Network, + it, + Reporters.createModelBuilderReporter(reporter, it.lib)) cloned.delegate = builder cloned() builder.build()?.tap { diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/AbstractPureDynamicGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/AbstractPureDynamicGroovyExtension.groovy index 493a2ba46..b0658bf45 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/AbstractPureDynamicGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/AbstractPureDynamicGroovyExtension.groovy @@ -7,6 +7,8 @@ */ package com.powsybl.dynawaltz.dsl +import com.powsybl.commons.reporter.Reporter +import com.powsybl.dynamicsimulation.groovy.GroovyExtension import com.powsybl.dynawaltz.DynaWaltzProvider import com.powsybl.iidm.network.Network @@ -16,12 +18,13 @@ import java.util.function.Consumer * Superclass for automaton & event groovy extensions * @author Laurent Issertial {@literal } */ -abstract class AbstractPureDynamicGroovyExtension { +abstract class AbstractPureDynamicGroovyExtension implements GroovyExtension { protected List modelTags - abstract protected ModelBuilder createBuilder(Network network) + abstract protected ModelBuilder createBuilder(Network network, Reporter reporter) + @Override String getName() { DynaWaltzProvider.NAME } @@ -30,11 +33,13 @@ abstract class AbstractPureDynamicGroovyExtension { modelTags } - void load(Binding binding, Consumer consumer) { + @Override + void load(Binding binding, Consumer consumer, Reporter reporter) { modelTags.forEach { binding.setVariable(it, { Closure closure -> def cloned = closure.clone() - ModelBuilder builder = createBuilder(binding.getVariable("network") as Network) + ModelBuilder builder = createBuilder(binding.getVariable("network") as Network, + Reporters.createModelBuilderReporter(reporter, it)) cloned.delegate = builder cloned() builder.build()?.tap { diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/AbstractSimpleEquipmentGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/AbstractSimpleEquipmentGroovyExtension.groovy index 4c5eed638..f24e36ed0 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/AbstractSimpleEquipmentGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/AbstractSimpleEquipmentGroovyExtension.groovy @@ -7,6 +7,9 @@ */ package com.powsybl.dynawaltz.dsl +import com.powsybl.commons.reporter.Reporter +import com.powsybl.dynamicsimulation.DynamicModel +import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.DynaWaltzProvider import com.powsybl.iidm.network.Network @@ -15,7 +18,7 @@ import java.util.function.Consumer /** * @author Laurent Issertial {@literal } */ -abstract class AbstractSimpleEquipmentGroovyExtension { +abstract class AbstractSimpleEquipmentGroovyExtension implements DynamicModelGroovyExtension { protected EquipmentConfig equipmentConfig @@ -23,21 +26,25 @@ abstract class AbstractSimpleEquipmentGroovyExtension { equipmentConfig = new EquipmentConfig(modelTag) } + abstract protected ModelBuilder createBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) - abstract protected ModelBuilder createBuilder(Network network, EquipmentConfig equipmentConfig) - + @Override String getName() { DynaWaltzProvider.NAME } + @Override List getModelNames() { List.of(equipmentConfig.lib) } - void load(Binding binding, Consumer consumer) { + @Override + void load(Binding binding, Consumer consumer, Reporter reporter) { binding.setVariable(equipmentConfig.lib, { Closure closure -> def cloned = closure.clone() - ModelBuilder builder = createBuilder(binding.getVariable("network") as Network, equipmentConfig) + ModelBuilder builder = createBuilder(binding.getVariable("network") as Network, + equipmentConfig, + Reporters.createModelBuilderReporter(reporter, equipmentConfig.lib)) cloned.delegate = builder cloned() builder.build()?.tap { diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/DslEquipment.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/DslEquipment.groovy index a6046e488..c45e322ce 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/DslEquipment.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/DslEquipment.groovy @@ -7,9 +7,9 @@ */ package com.powsybl.dynawaltz.dsl +import com.powsybl.commons.reporter.Reporter import com.powsybl.iidm.network.Identifiable import com.powsybl.iidm.network.IdentifiableType -import org.slf4j.Logger import java.util.function.Function @@ -48,12 +48,12 @@ class DslEquipment { equipment = equipmentSupplier(staticId) } - boolean checkEquipmentData(Logger logger, String lib) { + boolean checkEquipmentData(Reporter reporter) { if (!staticId) { - logger.warn("$lib: '$fieldName' field is not set") + Reporters.reportFieldNotSet(reporter, fieldName) return false } else if (!equipment) { - logger.warn("$lib: $equipmentType static id unknown : $staticId") + Reporters.reportStaticIdUnknown(reporter, fieldName, staticId, equipmentType) return false } true diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/DynaWaltzCurveGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/DynaWaltzCurveGroovyExtension.groovy index 717166fcd..63f698aba 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/DynaWaltzCurveGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/DynaWaltzCurveGroovyExtension.groovy @@ -7,6 +7,7 @@ package com.powsybl.dynawaltz.dsl import com.google.auto.service.AutoService +import com.powsybl.commons.reporter.Reporter import com.powsybl.dsl.DslException import com.powsybl.dynamicsimulation.Curve import com.powsybl.dynamicsimulation.groovy.CurveGroovyExtension @@ -51,6 +52,7 @@ class DynaWaltzCurveGroovyExtension implements CurveGroovyExtension { } } + @Override String getName() { DynaWaltzProvider.NAME } @@ -76,7 +78,8 @@ class DynaWaltzCurveGroovyExtension implements CurveGroovyExtension { } } - void load(Binding binding, Consumer consumer) { + @Override + void load(Binding binding, Consumer consumer, Reporter reporter) { binding.curve = { Closure closure -> def cloned = closure.clone() CurvesSpec curveSpec = new CurvesSpec() diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/Reporters.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/Reporters.groovy new file mode 100644 index 000000000..3ea04159f --- /dev/null +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/Reporters.groovy @@ -0,0 +1,111 @@ +/** + * 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/. + * SPDX-License-Identifier: MPL-2.0 + */ +package com.powsybl.dynawaltz.dsl + +import com.powsybl.commons.reporter.Report +import com.powsybl.commons.reporter.Reporter +import com.powsybl.commons.reporter.TypedValue +import com.powsybl.iidm.network.IdentifiableType + +/** + * @author Laurent Issertial + */ +final class Reporters { + + private Reporters() { + } + + static Reporter createModelBuilderReporter(Reporter reporter, String lib) { + reporter.createSubReporter("DSLModelBuilder", + 'DSL model builder for ${lib}', + "lib", lib) + } + + static void reportModelInstantiation(Reporter reporter, String dynamicId) { + reporter.report(Report.builder() + .withKey("modelInstantiation") + .withDefaultMessage('Model ${dynamicId} instantiation successful') + .withValue("dynamicId", dynamicId) + .withSeverity(TypedValue.TRACE_SEVERITY) + .build()) + } + + static void reportModelInstantiationFailure(Reporter reporter, String dynamicId) { + reporter.report(Report.builder() + .withKey("modelInstantiation") + .withDefaultMessage('Model ${dynamicId} cannot be instantiated') + .withValue("dynamicId", dynamicId) + .withSeverity(TypedValue.WARN_SEVERITY) + .build()) + } + + static void reportFieldReplacement(Reporter reporter, String fieldName, String replacementName, String replacement) { + reporter.report(Report.builder() + .withKey("fieldReplacement") + .withDefaultMessage('\'${fieldName}\' field is not set, ${replacementName} ${replacement} will be used instead') + .withValue("fieldName", fieldName) + .withValue("replacementName", replacementName) + .withValue("replacement", replacement) + .withSeverity(TypedValue.TRACE_SEVERITY) + .build()) + } + + static void reportFieldNotSet(Reporter reporter, String fieldName) { + reporter.report(Report.builder() + .withKey("fieldNotSet") + .withDefaultMessage('\'${fieldName}\' field is not set') + .withValue("fieldName", fieldName) + .withSeverity(TypedValue.WARN_SEVERITY) + .build()) + } + + static void reportStaticIdUnknown(Reporter reporter, String fieldName, String staticId, String equipmentType) { + reporter.report(Report.builder() + .withKey("staticIdUnknown") + .withDefaultMessage('\'${fieldName}\' field value \'${staticId}\' not found for equipment type(s) ${equipmentType}') + .withValue("equipmentType", equipmentType) + .withValue("fieldName", fieldName) + .withValue("staticId", staticId) + .withSeverity(TypedValue.WARN_SEVERITY) + .build()) + } + + static void reportCrossThreshold(Reporter reporter, String fieldName, double fieldValue, String threshold) { + reporter.report(Report.builder() + .withKey("crossThreshold") + .withDefaultMessage('${fieldName} should be ${threshold} (${fieldValue})') + .withValue("fieldName", fieldName) + .withValue("fieldValue", fieldValue) + .withValue("threshold", threshold) + .withSeverity(TypedValue.WARN_SEVERITY) + .build()) + } + + static void reportEmptyList(Reporter reporter, String fieldName) { + reporter.report(Report.builder() + .withKey("emptyList") + .withDefaultMessage('\'${fieldName}\' list is empty') + .withValue("fieldName", fieldName) + .withSeverity(TypedValue.WARN_SEVERITY) + .build()) + } + + static void reportFieldSetWithWrongEquipment(Reporter reporter, String fieldName, IdentifiableType equipmentType, String staticId) { + reportFieldSetWithWrongEquipment(reporter, fieldName, equipmentType.toString() + " " + staticId) + } + + static void reportFieldSetWithWrongEquipment(Reporter reporter, String fieldName, String equipment) { + reporter.report(Report.builder() + .withKey("fieldSetWithWrongEquipment") + .withDefaultMessage('\'${fieldName}\' field is set but ${equipment} does not possess this option') + .withValue("fieldName", fieldName) + .withValue("equipment", equipment) + .withSeverity(TypedValue.WARN_SEVERITY) + .build()) + } +} diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/AbstractPhaseShifterModelBuilder.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/AbstractPhaseShifterModelBuilder.groovy index 686acbed4..766242183 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/AbstractPhaseShifterModelBuilder.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/AbstractPhaseShifterModelBuilder.groovy @@ -7,6 +7,7 @@ */ package com.powsybl.dynawaltz.dsl.automatons +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynawaltz.dsl.DslEquipment import com.powsybl.dynawaltz.dsl.builders.AbstractPureDynamicModelBuilder import com.powsybl.iidm.network.IdentifiableType @@ -20,8 +21,8 @@ abstract class AbstractPhaseShifterModelBuilder extends AbstractPureDynamicModel protected final DslEquipment dslTransformer - AbstractPhaseShifterModelBuilder(Network network, String lib) { - super(network, lib) + AbstractPhaseShifterModelBuilder(Network network, String lib, Reporter reporter) { + super(network, lib, reporter) dslTransformer = new DslEquipment<>(IdentifiableType.TWO_WINDINGS_TRANSFORMER, "transformer") } @@ -32,6 +33,6 @@ abstract class AbstractPhaseShifterModelBuilder extends AbstractPureDynamicModel @Override protected void checkData() { super.checkData() - isInstantiable &= dslTransformer.checkEquipmentData(LOGGER, getLib()) + isInstantiable &= dslTransformer.checkEquipmentData(reporter) } } diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/CurrentLimitAutomatonGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/CurrentLimitAutomatonGroovyExtension.groovy index a63db5d7d..00439dd46 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/CurrentLimitAutomatonGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/CurrentLimitAutomatonGroovyExtension.groovy @@ -8,16 +8,20 @@ package com.powsybl.dynawaltz.dsl.automatons import com.google.auto.service.AutoService +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.DynamicModel import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractPureDynamicGroovyExtension import com.powsybl.dynawaltz.dsl.DslEquipment +import com.powsybl.dynawaltz.dsl.Reporters import com.powsybl.dynawaltz.dsl.builders.AbstractPureDynamicModelBuilder import com.powsybl.dynawaltz.models.Side import com.powsybl.dynawaltz.models.automatons.CurrentLimitAutomaton import com.powsybl.dynawaltz.models.utils.SideConverter import com.powsybl.iidm.network.Branch +import com.powsybl.iidm.network.IdentifiableType import com.powsybl.iidm.network.Network +import com.powsybl.iidm.network.TwoSides /** * An implementation of {@link DynamicModelGroovyExtension} that adds the
CurrentLimitAutomaton
keyword to the DSL @@ -32,8 +36,8 @@ class CurrentLimitAutomatonGroovyExtension extends AbstractPureDynamicGroovyExte } @Override - protected CurrentLimitAutomatonBuilder createBuilder(Network network) { - new CurrentLimitAutomatonBuilder(network, getLib()) + protected CurrentLimitAutomatonBuilder createBuilder(Network network, Reporter reporter) { + new CurrentLimitAutomatonBuilder(network, getLib(), reporter) } protected String getLib() { @@ -46,17 +50,17 @@ class CurrentLimitAutomatonGroovyExtension extends AbstractPureDynamicGroovyExte protected Side iMeasurementSide protected final DslEquipment controlledEquipment - CurrentLimitAutomatonBuilder(Network network, String lib) { - super(network, lib) - iMeasurement = new DslEquipment<>("I measurement quadripole", "iMeasurement") - controlledEquipment = new DslEquipment<>("Controlled quadripole", "controlledQuadripole") + CurrentLimitAutomatonBuilder(Network network, String lib, Reporter reporter) { + super(network, lib, reporter) + iMeasurement = new DslEquipment<>("Quadripole", "iMeasurement") + controlledEquipment = new DslEquipment<>("Quadripole", "controlledQuadripole") } void iMeasurement(String staticId) { iMeasurement.addEquipment(staticId, network::getBranch) } - void iMeasurementSide(Branch.Side side) { + void iMeasurementSide(TwoSides side) { this.iMeasurementSide = SideConverter.convert(side) } @@ -67,10 +71,10 @@ class CurrentLimitAutomatonGroovyExtension extends AbstractPureDynamicGroovyExte @Override void checkData() { super.checkData() - isInstantiable &= controlledEquipment.checkEquipmentData(LOGGER, getLib()) - isInstantiable &= iMeasurement.checkEquipmentData(LOGGER, getLib()) + isInstantiable &= controlledEquipment.checkEquipmentData(reporter) + isInstantiable &= iMeasurement.checkEquipmentData(reporter) if (!iMeasurementSide) { - LOGGER.warn("${getLib()}: 'iMeasurementSide' field is not set") + Reporters.reportFieldNotSet(reporter, "iMeasurementSide") isInstantiable = false } } diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/CurrentLimitTwoLevelsAutomatonGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/CurrentLimitTwoLevelsAutomatonGroovyExtension.groovy index 289abdcf1..56aa888cc 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/CurrentLimitTwoLevelsAutomatonGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/CurrentLimitTwoLevelsAutomatonGroovyExtension.groovy @@ -8,16 +8,18 @@ package com.powsybl.dynawaltz.dsl.automatons import com.google.auto.service.AutoService -import com.powsybl.dsl.DslException +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.DynamicModel import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractPureDynamicGroovyExtension import com.powsybl.dynawaltz.dsl.DslEquipment +import com.powsybl.dynawaltz.dsl.Reporters import com.powsybl.dynawaltz.models.Side import com.powsybl.dynawaltz.models.automatons.CurrentLimitTwoLevelsAutomaton import com.powsybl.dynawaltz.models.utils.SideConverter import com.powsybl.iidm.network.Branch import com.powsybl.iidm.network.Network +import com.powsybl.iidm.network.TwoSides /** * @author Laurent Issertial {@literal } @@ -34,8 +36,8 @@ class CurrentLimitTwoLevelsAutomatonGroovyExtension extends AbstractPureDynamicG } @Override - protected CurrentLimitAutomatonTwoLevelBuilder createBuilder(Network network) { - new CurrentLimitAutomatonTwoLevelBuilder(network, getLib()) + protected CurrentLimitAutomatonTwoLevelBuilder createBuilder(Network network, Reporter reporter) { + new CurrentLimitAutomatonTwoLevelBuilder(network, getLib(), reporter) } static class CurrentLimitAutomatonTwoLevelBuilder extends CurrentLimitAutomatonGroovyExtension.CurrentLimitAutomatonBuilder { @@ -43,16 +45,16 @@ class CurrentLimitTwoLevelsAutomatonGroovyExtension extends AbstractPureDynamicG protected final DslEquipment iMeasurement2 protected Side iMeasurement2Side - CurrentLimitAutomatonTwoLevelBuilder(Network network, String lib) { - super(network, lib) - iMeasurement2 = new DslEquipment<>("I measurement 2 quadripole", "iMeasurement2") + CurrentLimitAutomatonTwoLevelBuilder(Network network, String lib, Reporter reporter) { + super(network, lib, reporter) + iMeasurement2 = new DslEquipment<>("Quadripole", "iMeasurement2") } void iMeasurement1(String staticId) { iMeasurement(staticId) } - void iMeasurement1Side(Branch.Side side) { + void iMeasurement1Side(TwoSides side) { iMeasurementSide(side) } @@ -60,16 +62,16 @@ class CurrentLimitTwoLevelsAutomatonGroovyExtension extends AbstractPureDynamicG iMeasurement2.addEquipment(staticId, network::getBranch) } - void iMeasurement2Side(Branch.Side side) { + void iMeasurement2Side(TwoSides side) { this.iMeasurement2Side = SideConverter.convert(side) } @Override void checkData() { super.checkData() - isInstantiable &= iMeasurement2.checkEquipmentData(LOGGER, getLib()) + isInstantiable &= iMeasurement2.checkEquipmentData(reporter) if (!iMeasurement2Side) { - LOGGER.warn("${getLib()}: 'iMeasurement2Side' field is not set") + Reporters.reportFieldNotSet(reporter, "iMeasurement2Side") isInstantiable = false } } diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/PhaseShifterIAutomatonGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/PhaseShifterIAutomatonGroovyExtension.groovy index 6a8614a68..a35512e94 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/PhaseShifterIAutomatonGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/PhaseShifterIAutomatonGroovyExtension.groovy @@ -8,6 +8,7 @@ package com.powsybl.dynawaltz.dsl.automatons import com.google.auto.service.AutoService +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.DynamicModel import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractPureDynamicGroovyExtension @@ -27,14 +28,14 @@ class PhaseShifterIAutomatonGroovyExtension extends AbstractPureDynamicGroovyExt } @Override - protected PhaseShifterPAutomatonBuilder createBuilder(Network network) { - new PhaseShifterPAutomatonBuilder(network, LIB) + protected PhaseShifterPAutomatonBuilder createBuilder(Network network, Reporter reporter) { + new PhaseShifterPAutomatonBuilder(network, LIB, reporter) } static class PhaseShifterPAutomatonBuilder extends AbstractPhaseShifterModelBuilder { - PhaseShifterPAutomatonBuilder(Network network, String lib) { - super(network, lib) + PhaseShifterPAutomatonBuilder(Network network, String lib, Reporter reporter) { + super(network, lib, reporter) } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/PhaseShifterPAutomatonGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/PhaseShifterPAutomatonGroovyExtension.groovy index 716d04875..e13c64ce3 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/PhaseShifterPAutomatonGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/PhaseShifterPAutomatonGroovyExtension.groovy @@ -8,6 +8,7 @@ package com.powsybl.dynawaltz.dsl.automatons import com.google.auto.service.AutoService +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.DynamicModel import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractPureDynamicGroovyExtension @@ -27,14 +28,14 @@ class PhaseShifterPAutomatonGroovyExtension extends AbstractPureDynamicGroovyExt } @Override - protected PhaseShifterPAutomatonBuilder createBuilder(Network network) { - new PhaseShifterPAutomatonBuilder(network, LIB) + protected PhaseShifterPAutomatonBuilder createBuilder(Network network, Reporter reporter) { + new PhaseShifterPAutomatonBuilder(network, LIB, reporter) } static class PhaseShifterPAutomatonBuilder extends AbstractPhaseShifterModelBuilder { - PhaseShifterPAutomatonBuilder(Network network, String lib) { - super(network, lib) + PhaseShifterPAutomatonBuilder(Network network, String lib, Reporter reporter) { + super(network, lib, reporter) } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/TapChangerAutomatonGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/TapChangerAutomatonGroovyExtension.groovy index 654da0b1e..d6afcc29e 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/TapChangerAutomatonGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/TapChangerAutomatonGroovyExtension.groovy @@ -8,6 +8,7 @@ package com.powsybl.dynawaltz.dsl.automatons import com.google.auto.service.AutoService +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.DynamicModel import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractPureDynamicGroovyExtension @@ -30,8 +31,8 @@ class TapChangerAutomatonGroovyExtension extends AbstractPureDynamicGroovyExtens } @Override - protected TapChangerAutomatonBuilder createBuilder(Network network) { - new TapChangerAutomatonBuilder(network, LIB) + protected TapChangerAutomatonBuilder createBuilder(Network network, Reporter reporter) { + new TapChangerAutomatonBuilder(network, LIB, reporter) } static class TapChangerAutomatonBuilder extends AbstractPureDynamicModelBuilder { @@ -39,8 +40,8 @@ class TapChangerAutomatonGroovyExtension extends AbstractPureDynamicGroovyExtens protected final DslEquipment dslLoad protected TransformerSide side = TransformerSide.NONE - TapChangerAutomatonBuilder(Network network, String lib) { - super(network, lib) + TapChangerAutomatonBuilder(Network network, String lib, Reporter reporter) { + super(network, lib, reporter) dslLoad = new DslEquipment<>(IdentifiableType.LOAD) } @@ -55,7 +56,7 @@ class TapChangerAutomatonGroovyExtension extends AbstractPureDynamicGroovyExtens @Override protected void checkData() { super.checkData() - isInstantiable &= dslLoad.checkEquipmentData(LOGGER, getLib()) + isInstantiable &= dslLoad.checkEquipmentData(reporter) } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/TapChangerBlockingAutomatonGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/TapChangerBlockingAutomatonGroovyExtension.groovy index 3cd89b287..376f81cf4 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/TapChangerBlockingAutomatonGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/TapChangerBlockingAutomatonGroovyExtension.groovy @@ -8,9 +8,11 @@ package com.powsybl.dynawaltz.dsl.automatons import com.google.auto.service.AutoService +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.DynamicModel import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractPureDynamicGroovyExtension +import com.powsybl.dynawaltz.dsl.Reporters import com.powsybl.dynawaltz.dsl.builders.AbstractPureDynamicModelBuilder import com.powsybl.dynawaltz.models.automatons.TapChangerBlockingAutomaton import com.powsybl.iidm.network.Bus @@ -33,8 +35,8 @@ class TapChangerBlockingAutomatonGroovyExtension extends AbstractPureDynamicGroo } @Override - protected TCBAutomatonBuilder createBuilder(Network network) { - new TCBAutomatonBuilder(network, LIB) + protected TCBAutomatonBuilder createBuilder(Network network, Reporter reporter) { + new TCBAutomatonBuilder(network, LIB, reporter) } static class TCBAutomatonBuilder extends AbstractPureDynamicModelBuilder { @@ -44,8 +46,8 @@ class TapChangerBlockingAutomatonGroovyExtension extends AbstractPureDynamicGroo List uMeasurements = [] List tapChangerAutomatonIds = [] - TCBAutomatonBuilder(Network network, String lib) { - super(network, lib) + TCBAutomatonBuilder(Network network, String lib, Reporter reporter) { + super(network, lib, reporter) } void transformers(String[] staticIds) { @@ -69,7 +71,7 @@ class TapChangerBlockingAutomatonGroovyExtension extends AbstractPureDynamicGroo Identifiable checkEquipment(String staticId) { network.getIdentifiable(staticId)?.tap { if (!TapChangerBlockingAutomaton.isCompatibleEquipment(type)) { - LOGGER.warn("${getLib()}: $type $staticId is not compatible") + Reporters.reportStaticIdUnknown(reporter, "uMeasurements", staticId, "LOAD/TWO_WINDINGS_TRANSFORMER") } } } @@ -78,7 +80,7 @@ class TapChangerBlockingAutomatonGroovyExtension extends AbstractPureDynamicGroo uMeasurements = staticIds.collect { def bus = network.busBreakerView.getBus(it) if (!bus) { - LOGGER.warn("${getLib()}: $IdentifiableType.BUS static id unknown : $it") + Reporters.reportStaticIdUnknown(reporter, "uMeasurements", it, IdentifiableType.BUS.toString()) } bus } @@ -87,17 +89,17 @@ class TapChangerBlockingAutomatonGroovyExtension extends AbstractPureDynamicGroo @Override protected void checkData() { if (!uMeasurements) { - LOGGER.warn("${getLib()}: 'uMeasurements' field is not set") + Reporters.reportFieldNotSet(reporter, "uMeasurements") isInstantiable = false } else { uMeasurements -= null if (!uMeasurements) { - LOGGER.warn("${getLib()}: 'uMeasurements' is empty") + Reporters.reportEmptyList(reporter, "uMeasurements") isInstantiable = false } } if(!loads && !transformers && !tapChangerAutomatonIds) { - LOGGER.warn("${getLib()}: 'transformers' field is empty") + Reporters.reportEmptyList(reporter, "transformers") isInstantiable = false } } diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/UnderVoltageAutomatonGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/UnderVoltageAutomatonGroovyExtension.groovy index b9e83c6fa..52d90a182 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/UnderVoltageAutomatonGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/UnderVoltageAutomatonGroovyExtension.groovy @@ -8,6 +8,7 @@ package com.powsybl.dynawaltz.dsl.automatons import com.google.auto.service.AutoService +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.DynamicModel import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractPureDynamicGroovyExtension @@ -31,16 +32,16 @@ class UnderVoltageAutomatonGroovyExtension extends AbstractPureDynamicGroovyExte } @Override - protected UnderVoltageAutomatonBuilder createBuilder(Network network) { - new UnderVoltageAutomatonBuilder(network, LIB) + protected UnderVoltageAutomatonBuilder createBuilder(Network network, Reporter reporter) { + new UnderVoltageAutomatonBuilder(network, LIB, reporter) } static class UnderVoltageAutomatonBuilder extends AbstractPureDynamicModelBuilder { protected final DslEquipment dslGenerator - UnderVoltageAutomatonBuilder(Network network, String lib) { - super(network, lib) + UnderVoltageAutomatonBuilder(Network network, String lib, Reporter reporter) { + super(network, lib, reporter) dslGenerator = new DslEquipment<>(IdentifiableType.GENERATOR, "generator") } @@ -51,7 +52,7 @@ class UnderVoltageAutomatonGroovyExtension extends AbstractPureDynamicGroovyExte @Override protected void checkData() { super.checkData() - isInstantiable &= dslGenerator.checkEquipmentData(LOGGER, getLib()) + isInstantiable &= dslGenerator.checkEquipmentData(reporter) } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/builders/AbstractDynamicModelBuilder.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/builders/AbstractDynamicModelBuilder.groovy index 80f863af7..34074ddde 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/builders/AbstractDynamicModelBuilder.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/builders/AbstractDynamicModelBuilder.groovy @@ -7,32 +7,36 @@ */ package com.powsybl.dynawaltz.dsl.builders +import com.powsybl.commons.reporter.Reporter +import com.powsybl.dynawaltz.dsl.Reporters import com.powsybl.iidm.network.Network -import org.slf4j.Logger -import org.slf4j.LoggerFactory /** * @author Laurent Issertial {@literal } */ abstract class AbstractDynamicModelBuilder { - protected static final Logger LOGGER = LoggerFactory.getLogger("DynamicModelBuilder") - protected final Network network + protected final Reporter reporter protected boolean isInstantiable = true + protected AbstractDynamicModelBuilder(Network network, Reporter reporter) { + this.network = network + this.reporter = reporter + } + protected AbstractDynamicModelBuilder(Network network) { this.network = network + this.reporter = null } abstract protected void checkData() protected final boolean isInstantiable() { checkData() - isInstantiable ? LOGGER.debug("${getLib()} instanciation successful") - : LOGGER.warn("${getLib()} cannot be instantiated") + isInstantiable ? Reporters.reportModelInstantiation(reporter, getModelId()) : Reporters.reportModelInstantiationFailure(reporter, getModelId()) isInstantiable } - abstract protected String getLib() + abstract protected String getModelId() } diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/builders/AbstractEquipmentModelBuilder.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/builders/AbstractEquipmentModelBuilder.groovy index 89269a4b0..4008d0356 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/builders/AbstractEquipmentModelBuilder.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/builders/AbstractEquipmentModelBuilder.groovy @@ -7,10 +7,12 @@ */ package com.powsybl.dynawaltz.dsl.builders +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.DynamicModel import com.powsybl.dynawaltz.dsl.DslEquipment import com.powsybl.dynawaltz.dsl.EquipmentConfig import com.powsybl.dynawaltz.dsl.ModelBuilder +import com.powsybl.dynawaltz.dsl.Reporters import com.powsybl.iidm.network.Identifiable import com.powsybl.iidm.network.IdentifiableType import com.powsybl.iidm.network.Network @@ -25,8 +27,8 @@ abstract class AbstractEquipmentModelBuilder extends Abs protected final EquipmentConfig equipmentConfig protected final DslEquipment dslEquipment - protected AbstractEquipmentModelBuilder(Network network, EquipmentConfig equipmentConfig, IdentifiableType equipmentType) { - super(network) + protected AbstractEquipmentModelBuilder(Network network, EquipmentConfig equipmentConfig, IdentifiableType equipmentType, Reporter reporter) { + super(network, reporter) this.equipmentConfig = equipmentConfig this.dslEquipment = new DslEquipment(equipmentType) } @@ -45,12 +47,13 @@ abstract class AbstractEquipmentModelBuilder extends Abs @Override protected void checkData() { - isInstantiable = dslEquipment.checkEquipmentData(LOGGER, getLib()) + isInstantiable = dslEquipment.checkEquipmentData(reporter) if (!parameterSetId) { - LOGGER.warn("${getLib()}: 'parameterSetId' field is not set") + Reporters.reportFieldNotSet(reporter, "parameterSetId") isInstantiable = false } if (!dynamicModelId) { + Reporters.reportFieldReplacement(reporter, "dynamicModelId", "staticId", dslEquipment.staticId ?: "(unknown staticId)") dynamicModelId = dslEquipment.staticId } } @@ -62,8 +65,8 @@ abstract class AbstractEquipmentModelBuilder extends Abs } @Override - String getLib() { - equipmentConfig.getLib() + String getModelId() { + dynamicModelId ?: "unknownDynamicId" } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/builders/AbstractEventModelBuilder.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/builders/AbstractEventModelBuilder.groovy index 36ad3aeea..115e991ec 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/builders/AbstractEventModelBuilder.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/builders/AbstractEventModelBuilder.groovy @@ -8,9 +8,12 @@ package com.powsybl.dynawaltz.dsl.builders +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.EventModel import com.powsybl.dynawaltz.dsl.DslEquipment import com.powsybl.dynawaltz.dsl.ModelBuilder +import com.powsybl.dynawaltz.dsl.Reporters +import com.powsybl.dynawaltz.models.events.AbstractEvent import com.powsybl.iidm.network.Identifiable import com.powsybl.iidm.network.Network @@ -24,8 +27,8 @@ abstract class AbstractEventModelBuilder extends Abstrac protected String staticId protected double startTime - AbstractEventModelBuilder(Network network, DslEquipment dslEquipment, String tag) { - super(network) + AbstractEventModelBuilder(Network network, DslEquipment dslEquipment, String tag, Reporter reporter) { + super(network, reporter) this.dslEquipment = dslEquipment this.tag = tag } @@ -40,9 +43,9 @@ abstract class AbstractEventModelBuilder extends Abstrac @Override protected void checkData() { - isInstantiable &= dslEquipment.checkEquipmentData(LOGGER, getLib()) + isInstantiable &= dslEquipment.checkEquipmentData(reporter) if (!startTime) { - LOGGER.warn("${getLib()}: 'startTime' field is not set") + Reporters.reportFieldNotSet(reporter, "startTime") isInstantiable = false } } @@ -50,8 +53,8 @@ abstract class AbstractEventModelBuilder extends Abstrac abstract protected Identifiable findEquipment(String staticId) @Override - protected String getLib() { - tag + String getModelId() { + AbstractEvent.generateEventId(tag + "_", dslEquipment.staticId ?: "unknownStaticId") } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/builders/AbstractPureDynamicModelBuilder.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/builders/AbstractPureDynamicModelBuilder.groovy index 454d4ae02..866f4e69a 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/builders/AbstractPureDynamicModelBuilder.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/builders/AbstractPureDynamicModelBuilder.groovy @@ -7,8 +7,10 @@ */ package com.powsybl.dynawaltz.dsl.builders +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.DynamicModel import com.powsybl.dynawaltz.dsl.ModelBuilder +import com.powsybl.dynawaltz.dsl.Reporters import com.powsybl.iidm.network.Network /** @@ -21,8 +23,8 @@ abstract class AbstractPureDynamicModelBuilder extends AbstractDynamicModelBuild protected String parameterSetId protected final String lib - AbstractPureDynamicModelBuilder(Network network, String lib) { - super(network) + AbstractPureDynamicModelBuilder(Network network, String lib, Reporter reporter) { + super(network, reporter) this.lib = lib } @@ -37,18 +39,18 @@ abstract class AbstractPureDynamicModelBuilder extends AbstractDynamicModelBuild @Override protected void checkData() { if (!dynamicModelId) { - LOGGER.warn("${getLib()}: 'dynamicModelId' field is not set") + Reporters.reportFieldNotSet(reporter, "dynamicModelId") isInstantiable = false } if (!parameterSetId) { - LOGGER.warn("${getLib()}: 'parameterSetId' field is not set") + Reporters.reportFieldNotSet(reporter, "dynamicModelId") isInstantiable = false } } @Override - protected String getLib() { - lib + String getModelId() { + dynamicModelId ?: "unknownDynamicId" } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/EventActivePowerVariationGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/EventActivePowerVariationGroovyExtension.groovy index 038875a18..36cbae18c 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/EventActivePowerVariationGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/EventActivePowerVariationGroovyExtension.groovy @@ -8,10 +8,12 @@ package com.powsybl.dynawaltz.dsl.events import com.google.auto.service.AutoService +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.EventModel import com.powsybl.dynamicsimulation.groovy.EventModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractPureDynamicGroovyExtension import com.powsybl.dynawaltz.dsl.DslFilteredEquipment +import com.powsybl.dynawaltz.dsl.Reporters import com.powsybl.dynawaltz.dsl.builders.AbstractEventModelBuilder import com.powsybl.dynawaltz.models.events.EventActivePowerVariation import com.powsybl.iidm.network.Identifiable @@ -31,16 +33,16 @@ class EventActivePowerVariationGroovyExtension extends AbstractPureDynamicGroovy } @Override - protected EventAPVBuilder createBuilder(Network network) { - new EventAPVBuilder(network, TAG) + protected EventAPVBuilder createBuilder(Network network, Reporter reporter) { + new EventAPVBuilder(network, TAG, reporter) } static class EventAPVBuilder extends AbstractEventModelBuilder { protected double deltaP - EventAPVBuilder(Network network, String tag) { - super(network, new DslFilteredEquipment("Generator/Load", EventActivePowerVariation::isConnectable), tag) + EventAPVBuilder(Network network, String tag, Reporter reporter) { + super(network, new DslFilteredEquipment("GENERATOR/LOAD", EventActivePowerVariation::isConnectable), tag, reporter) } void deltaP(double deltaP) { @@ -49,12 +51,8 @@ class EventActivePowerVariationGroovyExtension extends AbstractPureDynamicGroovy void checkData() { super.checkData() - if (dslEquipment.equipment && !EventActivePowerVariation.isConnectable(dslEquipment.equipment.type)) { - LOGGER.warn("${getLib()}: ${dslEquipment.equipment?.type} ${dslEquipment.staticId} cannot be disconnected") - isInstantiable = false - } if (!deltaP) { - LOGGER.warn("${getLib()}: 'deltaP' field is not set") + Reporters.reportFieldNotSet(reporter, "deltaP") isInstantiable = false } } diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/EventDisconnectionGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/EventDisconnectionGroovyExtension.groovy index 82d165476..d9d8a3d2d 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/EventDisconnectionGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/EventDisconnectionGroovyExtension.groovy @@ -8,20 +8,18 @@ package com.powsybl.dynawaltz.dsl.events import com.google.auto.service.AutoService +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.EventModel import com.powsybl.dynamicsimulation.groovy.EventModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractPureDynamicGroovyExtension import com.powsybl.dynawaltz.dsl.DslEquipment +import com.powsybl.dynawaltz.dsl.Reporters import com.powsybl.dynawaltz.dsl.builders.AbstractEventModelBuilder import com.powsybl.dynawaltz.models.events.AbstractEvent import com.powsybl.dynawaltz.models.events.EventHvdcDisconnection -import com.powsybl.dynawaltz.models.events.EventQuadripoleDisconnection import com.powsybl.dynawaltz.models.events.EventInjectionDisconnection -import com.powsybl.iidm.network.Branch -import com.powsybl.iidm.network.HvdcLine -import com.powsybl.iidm.network.Identifiable -import com.powsybl.iidm.network.IdentifiableType -import com.powsybl.iidm.network.Network +import com.powsybl.dynawaltz.models.events.EventQuadripoleDisconnection +import com.powsybl.iidm.network.* /** * @author Laurent Issertial {@literal } @@ -40,8 +38,8 @@ class EventDisconnectionGroovyExtension extends AbstractPureDynamicGroovyExtensi } @Override - protected EventQuadripoleDisconnectionBuilder createBuilder(Network network) { - new EventQuadripoleDisconnectionBuilder(network, TAG) + protected EventQuadripoleDisconnectionBuilder createBuilder(Network network, Reporter reporter) { + new EventQuadripoleDisconnectionBuilder(network, TAG, reporter) } static class EventQuadripoleDisconnectionBuilder extends AbstractEventModelBuilder { @@ -54,18 +52,18 @@ class EventDisconnectionGroovyExtension extends AbstractPureDynamicGroovyExtensi private enum DisconnectionType {INJECTION, QUADRIPOLE, HVDC, NONE} - EventQuadripoleDisconnectionBuilder(Network network, String tag) { - super(network, new DslEquipment("Disconnectable equipment"), tag) + EventQuadripoleDisconnectionBuilder(Network network, String tag, Reporter reporter) { + super(network, new DslEquipment("Disconnectable equipment"), tag, reporter) } - void disconnectOnly(Branch.Side side) { + void disconnectOnly(TwoSides side) { disconnectSide = true switch (side) { - case Branch.Side.ONE : + case TwoSides.ONE : disconnectOrigin = true disconnectExtremity = false break - case Branch.Side.TWO : + case TwoSides.TWO : disconnectOrigin = false disconnectExtremity = true break @@ -74,20 +72,20 @@ class EventDisconnectionGroovyExtension extends AbstractPureDynamicGroovyExtensi void checkData() { super.checkData() - disconnectionType(dslEquipment?.equipment?.type) + setDisconnectionType(dslEquipment?.equipment?.type) if(dslEquipment.equipment) { if (disconnectionType == DisconnectionType.NONE) { - LOGGER.warn("${getLib()}: ${dslEquipment.equipment?.type} ${dslEquipment.staticId} cannot be disconnected") + Reporters.reportStaticIdUnknown(reporter, "staticId", dslEquipment.staticId, "Disconnectable equipment") isInstantiable = false } if (DisconnectionType.INJECTION == disconnectionType && disconnectSide) { - LOGGER.warn("'${getLib()}: disconnectSide' has been set but ${dslEquipment.equipment?.type} ${dslEquipment.staticId} is not a quadripole with a disconnectable side") + Reporters.reportFieldSetWithWrongEquipment(reporter, "disconnectSide", dslEquipment.equipment?.type, dslEquipment.staticId) isInstantiable = false } } } - boolean disconnectionType(IdentifiableType type) { + void setDisconnectionType(IdentifiableType type) { if (type) { if (CONNECTABLE_INJECTIONS.contains(type)) { disconnectionType = DisconnectionType.INJECTION @@ -97,7 +95,6 @@ class EventDisconnectionGroovyExtension extends AbstractPureDynamicGroovyExtensi disconnectionType = DisconnectionType.HVDC } } - disconnectionType != DisconnectionType.NONE } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/NodeFaultEventGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/NodeFaultEventGroovyExtension.groovy index 31c4e6a5c..f839f869c 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/NodeFaultEventGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/NodeFaultEventGroovyExtension.groovy @@ -8,10 +8,12 @@ package com.powsybl.dynawaltz.dsl.events import com.google.auto.service.AutoService +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.EventModel import com.powsybl.dynamicsimulation.groovy.EventModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractPureDynamicGroovyExtension import com.powsybl.dynawaltz.dsl.DslEquipment +import com.powsybl.dynawaltz.dsl.Reporters import com.powsybl.dynawaltz.dsl.builders.AbstractEventModelBuilder import com.powsybl.dynawaltz.models.events.NodeFaultEvent import com.powsybl.iidm.network.Bus @@ -31,8 +33,8 @@ class NodeFaultEventGroovyExtension extends AbstractPureDynamicGroovyExtension { @@ -41,8 +43,8 @@ class NodeFaultEventGroovyExtension extends AbstractPureDynamicGroovyExtension(IdentifiableType.BUS), tag) + NodeFaultEventBuilder(Network network,String tag, Reporter reporter) { + super(network, new DslEquipment(IdentifiableType.BUS), tag, reporter) } void faultTime(double faultTime) { @@ -65,15 +67,15 @@ class NodeFaultEventGroovyExtension extends AbstractPureDynamicGroovyExtension { - AbstractBusBuilder(Network network, EquipmentConfig equipmentConfig) { - super(network, equipmentConfig, IdentifiableType.BUS) + AbstractBusBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + super(network, equipmentConfig, IdentifiableType.BUS, reporter) } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/buses/BusGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/buses/BusGroovyExtension.groovy index 971ef9e90..1e3c3efa0 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/buses/BusGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/buses/BusGroovyExtension.groovy @@ -8,7 +8,7 @@ package com.powsybl.dynawaltz.dsl.models.buses import com.google.auto.service.AutoService -import com.powsybl.dynamicsimulation.DynamicModel +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractSimpleEquipmentGroovyExtension import com.powsybl.dynawaltz.dsl.EquipmentConfig @@ -21,21 +21,21 @@ import com.powsybl.iidm.network.Network * @author Dimitri Baudrier {@literal } */ @AutoService(DynamicModelGroovyExtension.class) -class BusGroovyExtension extends AbstractSimpleEquipmentGroovyExtension implements DynamicModelGroovyExtension { +class BusGroovyExtension extends AbstractSimpleEquipmentGroovyExtension { BusGroovyExtension() { super("Bus") } @Override - protected BusBuilder createBuilder(Network network, EquipmentConfig equipmentConfig) { - new BusBuilder(network, equipmentConfig) + protected BusBuilder createBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + new BusBuilder(network, equipmentConfig, reporter) } static class BusBuilder extends AbstractBusBuilder { - BusBuilder(Network network, EquipmentConfig equipmentConfig) { - super(network, equipmentConfig) + BusBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + super(network, equipmentConfig, reporter) } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/buses/InfiniteBusGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/buses/InfiniteBusGroovyExtension.groovy index 1db7922d4..9964d19a0 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/buses/InfiniteBusGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/buses/InfiniteBusGroovyExtension.groovy @@ -8,7 +8,7 @@ package com.powsybl.dynawaltz.dsl.models.buses import com.google.auto.service.AutoService -import com.powsybl.dynamicsimulation.DynamicModel +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractEquipmentGroovyExtension import com.powsybl.dynawaltz.dsl.EquipmentConfig @@ -19,7 +19,7 @@ import com.powsybl.iidm.network.Network * @author Laurent Issertial {@literal } */ @AutoService(DynamicModelGroovyExtension.class) -class InfiniteBusGroovyExtension extends AbstractEquipmentGroovyExtension implements DynamicModelGroovyExtension { +class InfiniteBusGroovyExtension extends AbstractEquipmentGroovyExtension { protected static final String BUSES = "infiniteBuses" @@ -28,14 +28,14 @@ class InfiniteBusGroovyExtension extends AbstractEquipmentGroovyExtension { - AbstractGeneratorBuilder(Network network, EquipmentConfig equipmentConfig) { - super(network, equipmentConfig, IdentifiableType.GENERATOR) + AbstractGeneratorBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + super(network, equipmentConfig, IdentifiableType.GENERATOR, reporter) } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/generators/GeneratorFictitiousGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/generators/GeneratorFictitiousGroovyExtension.groovy index 0cbec26c8..c0a34a798 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/generators/GeneratorFictitiousGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/generators/GeneratorFictitiousGroovyExtension.groovy @@ -7,7 +7,7 @@ package com.powsybl.dynawaltz.dsl.models.generators import com.google.auto.service.AutoService -import com.powsybl.dynamicsimulation.DynamicModel +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractSimpleEquipmentGroovyExtension import com.powsybl.dynawaltz.dsl.EquipmentConfig @@ -18,21 +18,21 @@ import com.powsybl.iidm.network.Network * @author Dimitri Baudrier {@literal } */ @AutoService(DynamicModelGroovyExtension.class) -class GeneratorFictitiousGroovyExtension extends AbstractSimpleEquipmentGroovyExtension implements DynamicModelGroovyExtension { +class GeneratorFictitiousGroovyExtension extends AbstractSimpleEquipmentGroovyExtension { GeneratorFictitiousGroovyExtension() { super("GeneratorFictitious") } @Override - protected GeneratorFictitiousBuilder createBuilder(Network network, EquipmentConfig equipmentConfig) { - new GeneratorFictitiousBuilder(network, equipmentConfig) + protected GeneratorFictitiousBuilder createBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + new GeneratorFictitiousBuilder(network, equipmentConfig, reporter) } static class GeneratorFictitiousBuilder extends AbstractGeneratorBuilder { - GeneratorFictitiousBuilder(Network network, EquipmentConfig equipmentConfig) { - super(network, equipmentConfig) + GeneratorFictitiousBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + super(network, equipmentConfig, reporter) } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/generators/GridFormingConverterGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/generators/GridFormingConverterGroovyExtension.groovy index 082f80e51..dc376c2a8 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/generators/GridFormingConverterGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/generators/GridFormingConverterGroovyExtension.groovy @@ -8,7 +8,7 @@ package com.powsybl.dynawaltz.dsl.models.generators import com.google.auto.service.AutoService -import com.powsybl.dynamicsimulation.DynamicModel +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractEquipmentGroovyExtension import com.powsybl.dynawaltz.dsl.EquipmentConfig @@ -19,7 +19,7 @@ import com.powsybl.iidm.network.Network * @author Laurent Issertial {@literal } */ @AutoService(DynamicModelGroovyExtension.class) -class GridFormingConverterGroovyExtension extends AbstractEquipmentGroovyExtension implements DynamicModelGroovyExtension { +class GridFormingConverterGroovyExtension extends AbstractEquipmentGroovyExtension { private static final String GRID_FORMING_CONVERTER = "gridFormingConverter" @@ -28,14 +28,14 @@ class GridFormingConverterGroovyExtension extends AbstractEquipmentGroovyExtensi } @Override - protected GridFormingConverterBuilder createBuilder(Network network, EquipmentConfig equipmentConfig) { - new GridFormingConverterBuilder(network, equipmentConfig) + protected GridFormingConverterBuilder createBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + new GridFormingConverterBuilder(network, equipmentConfig, reporter) } static class GridFormingConverterBuilder extends AbstractGeneratorBuilder { - GridFormingConverterBuilder(Network network, EquipmentConfig equipmentConfig) { - super(network, equipmentConfig) + GridFormingConverterBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + super(network, equipmentConfig, reporter) } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/generators/SynchronizedGeneratorGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/generators/SynchronizedGeneratorGroovyExtension.groovy index ab9e5c0a7..899277d45 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/generators/SynchronizedGeneratorGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/generators/SynchronizedGeneratorGroovyExtension.groovy @@ -8,7 +8,7 @@ package com.powsybl.dynawaltz.dsl.models.generators import com.google.auto.service.AutoService -import com.powsybl.dynamicsimulation.DynamicModel +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractEquipmentGroovyExtension import com.powsybl.dynawaltz.dsl.EquipmentConfig @@ -21,7 +21,7 @@ import com.powsybl.iidm.network.Network * @author Dimitri Baudrier {@literal } */ @AutoService(DynamicModelGroovyExtension.class) -class SynchronizedGeneratorGroovyExtension extends AbstractEquipmentGroovyExtension implements DynamicModelGroovyExtension { +class SynchronizedGeneratorGroovyExtension extends AbstractEquipmentGroovyExtension { private static final String SYNCHRONIZED_GENERATORS = "synchronizedGenerators" @@ -34,14 +34,14 @@ class SynchronizedGeneratorGroovyExtension extends AbstractEquipmentGroovyExtens } @Override - protected SynchronizedGeneratorBuilder createBuilder(Network network, EquipmentConfig equipmentConfig) { - new SynchronizedGeneratorBuilder(network, equipmentConfig) + protected SynchronizedGeneratorBuilder createBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + new SynchronizedGeneratorBuilder(network, equipmentConfig, reporter) } static class SynchronizedGeneratorBuilder extends AbstractGeneratorBuilder { - SynchronizedGeneratorBuilder(Network network, EquipmentConfig equipmentConfig) { - super(network, equipmentConfig) + SynchronizedGeneratorBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + super(network, equipmentConfig, reporter) } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/generators/SynchronousGeneratorGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/generators/SynchronousGeneratorGroovyExtension.groovy index 132920b2d..7b094e7c4 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/generators/SynchronousGeneratorGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/generators/SynchronousGeneratorGroovyExtension.groovy @@ -7,8 +7,8 @@ package com.powsybl.dynawaltz.dsl.models.generators import com.google.auto.service.AutoService +import com.powsybl.commons.reporter.Reporter import com.powsybl.dsl.DslException -import com.powsybl.dynamicsimulation.DynamicModel import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractEquipmentGroovyExtension import com.powsybl.dynawaltz.dsl.EquipmentConfig @@ -21,7 +21,7 @@ import com.powsybl.iidm.network.Network * @author Marcos de Miguel {@literal } */ @AutoService(DynamicModelGroovyExtension.class) -class SynchronousGeneratorGroovyExtension extends AbstractEquipmentGroovyExtension implements DynamicModelGroovyExtension { +class SynchronousGeneratorGroovyExtension extends AbstractEquipmentGroovyExtension { protected static final String SYNCHRONOUS_GENERATORS = "synchronousGenerators" @@ -34,14 +34,14 @@ class SynchronousGeneratorGroovyExtension extends AbstractEquipmentGroovyExtensi } @Override - protected SynchronousGeneratorBuilder createBuilder(Network network, EquipmentConfig equipmentConfig) { - new SynchronousGeneratorBuilder(network, equipmentConfig) + protected SynchronousGeneratorBuilder createBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + new SynchronousGeneratorBuilder(network, equipmentConfig, reporter) } static class SynchronousGeneratorBuilder extends AbstractGeneratorBuilder { - SynchronousGeneratorBuilder(Network network, EquipmentConfig equipmentConfig) { - super(network, equipmentConfig) + SynchronousGeneratorBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + super(network, equipmentConfig, reporter) } protected EnumGeneratorComponent getGeneratorComponent() { diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/generators/WeccGenGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/generators/WeccGenGroovyExtension.groovy index fed1d3bca..9a30a019a 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/generators/WeccGenGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/generators/WeccGenGroovyExtension.groovy @@ -8,7 +8,7 @@ package com.powsybl.dynawaltz.dsl.models.generators import com.google.auto.service.AutoService -import com.powsybl.dynamicsimulation.DynamicModel +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractEquipmentGroovyExtension import com.powsybl.dynawaltz.dsl.EquipmentConfig @@ -20,7 +20,7 @@ import com.powsybl.iidm.network.Network * @author Laurent Issertial {@literal } */ @AutoService(DynamicModelGroovyExtension.class) -class WeccGenGroovyExtension extends AbstractEquipmentGroovyExtension implements DynamicModelGroovyExtension { +class WeccGenGroovyExtension extends AbstractEquipmentGroovyExtension { private static final String WECC = "wecc" @@ -29,14 +29,14 @@ class WeccGenGroovyExtension extends AbstractEquipmentGroovyExtension} @@ -23,11 +25,11 @@ abstract class AbstractHvdcBuilder extends AbstractEquipmentModelBuilder} */ @AutoService(DynamicModelGroovyExtension.class) -class HvdcPGroovyExtension extends AbstractEquipmentGroovyExtension implements DynamicModelGroovyExtension { +class HvdcPGroovyExtension extends AbstractEquipmentGroovyExtension { protected static final String HVDC_P = "hvdcP" @@ -33,14 +33,14 @@ class HvdcPGroovyExtension extends AbstractEquipmentGroovyExtension} */ @AutoService(DynamicModelGroovyExtension.class) -class HvdcVscGroovyExtension extends AbstractEquipmentGroovyExtension implements DynamicModelGroovyExtension { +class HvdcVscGroovyExtension extends AbstractEquipmentGroovyExtension { protected static final String HVDC_VSC = "hvdcVsc" @@ -29,14 +29,14 @@ class HvdcVscGroovyExtension extends AbstractEquipmentGroovyExtension} */ @AutoService(DynamicModelGroovyExtension.class) -class LineGroovyExtension extends AbstractSimpleEquipmentGroovyExtension implements DynamicModelGroovyExtension { +class LineGroovyExtension extends AbstractSimpleEquipmentGroovyExtension { LineGroovyExtension() { super("Line") } @Override - protected LineBuilder createBuilder(Network network, EquipmentConfig equipmentConfig) { - new LineBuilder(network, equipmentConfig) + protected LineBuilder createBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + new LineBuilder(network, equipmentConfig, reporter) } static class LineBuilder extends AbstractEquipmentModelBuilder { - LineBuilder(Network network, EquipmentConfig equipmentConfig) { - super(network, equipmentConfig, IdentifiableType.LINE) + LineBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + super(network, equipmentConfig, IdentifiableType.LINE, reporter) } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/loads/AbstractLoadModelBuilder.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/loads/AbstractLoadModelBuilder.groovy index b34399cf4..c6abe1649 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/loads/AbstractLoadModelBuilder.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/loads/AbstractLoadModelBuilder.groovy @@ -7,6 +7,7 @@ */ package com.powsybl.dynawaltz.dsl.models.loads +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynawaltz.dsl.EquipmentConfig import com.powsybl.dynawaltz.dsl.builders.AbstractEquipmentModelBuilder import com.powsybl.iidm.network.IdentifiableType @@ -18,8 +19,8 @@ import com.powsybl.iidm.network.Network */ abstract class AbstractLoadModelBuilder extends AbstractEquipmentModelBuilder { - AbstractLoadModelBuilder(Network network, EquipmentConfig equipmentConfig) { - super(network, equipmentConfig, IdentifiableType.LOAD) + AbstractLoadModelBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + super(network, equipmentConfig, IdentifiableType.LOAD, reporter) } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/loads/BaseLoadGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/loads/BaseLoadGroovyExtension.groovy index a80a6168e..b7a69a1de 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/loads/BaseLoadGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/loads/BaseLoadGroovyExtension.groovy @@ -7,7 +7,7 @@ package com.powsybl.dynawaltz.dsl.models.loads import com.google.auto.service.AutoService -import com.powsybl.dynamicsimulation.DynamicModel +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractEquipmentGroovyExtension import com.powsybl.dynawaltz.dsl.EquipmentConfig @@ -21,7 +21,7 @@ import com.powsybl.iidm.network.Network * @author Marcos de Miguel {@literal } */ @AutoService(DynamicModelGroovyExtension.class) -class BaseLoadGroovyExtension extends AbstractEquipmentGroovyExtension implements DynamicModelGroovyExtension { +class BaseLoadGroovyExtension extends AbstractEquipmentGroovyExtension { private static final String LOADS = "baseLoads" @@ -30,14 +30,14 @@ class BaseLoadGroovyExtension extends AbstractEquipmentGroovyExtension} */ @AutoService(DynamicModelGroovyExtension.class) -class LoadOneTransformerGroovyExtension extends AbstractSimpleEquipmentGroovyExtension implements DynamicModelGroovyExtension { +class LoadOneTransformerGroovyExtension extends AbstractSimpleEquipmentGroovyExtension { LoadOneTransformerGroovyExtension() { super("LoadOneTransformer") } @Override - protected LoadOneTransformerBuilder createBuilder(Network network, EquipmentConfig equipmentConfig) { - new LoadOneTransformerBuilder(network, equipmentConfig) + protected LoadOneTransformerBuilder createBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + new LoadOneTransformerBuilder(network, equipmentConfig, reporter) } static class LoadOneTransformerBuilder extends AbstractLoadModelBuilder { - LoadOneTransformerBuilder(Network network, EquipmentConfig equipmentConfig) { - super(network, equipmentConfig) + LoadOneTransformerBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + super(network, equipmentConfig, reporter) } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/loads/LoadOneTransformerTapChangerGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/loads/LoadOneTransformerTapChangerGroovyExtension.groovy index 96660215b..e0d01d9a8 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/loads/LoadOneTransformerTapChangerGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/loads/LoadOneTransformerTapChangerGroovyExtension.groovy @@ -8,7 +8,7 @@ package com.powsybl.dynawaltz.dsl.models.loads import com.google.auto.service.AutoService -import com.powsybl.dynamicsimulation.DynamicModel +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractSimpleEquipmentGroovyExtension import com.powsybl.dynawaltz.dsl.EquipmentConfig @@ -19,21 +19,21 @@ import com.powsybl.iidm.network.Network * @author Laurent Issertial {@literal } */ @AutoService(DynamicModelGroovyExtension.class) -class LoadOneTransformerTapChangerGroovyExtension extends AbstractSimpleEquipmentGroovyExtension implements DynamicModelGroovyExtension { +class LoadOneTransformerTapChangerGroovyExtension extends AbstractSimpleEquipmentGroovyExtension { LoadOneTransformerTapChangerGroovyExtension() { super("LoadOneTransformerTapChanger") } @Override - protected LoadOneTransformerTapChangerBuilder createBuilder(Network network, EquipmentConfig equipmentConfig) { - new LoadOneTransformerTapChangerBuilder(network, equipmentConfig) + protected LoadOneTransformerTapChangerBuilder createBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + new LoadOneTransformerTapChangerBuilder(network, equipmentConfig, reporter) } static class LoadOneTransformerTapChangerBuilder extends AbstractLoadModelBuilder { - LoadOneTransformerTapChangerBuilder(Network network, EquipmentConfig equipmentConfig) { - super(network, equipmentConfig) + LoadOneTransformerTapChangerBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + super(network, equipmentConfig, reporter) } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/loads/LoadTwoTransformersGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/loads/LoadTwoTransformersGroovyExtension.groovy index 5d0e7a758..bd85b2aaf 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/loads/LoadTwoTransformersGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/loads/LoadTwoTransformersGroovyExtension.groovy @@ -8,7 +8,7 @@ package com.powsybl.dynawaltz.dsl.models.loads import com.google.auto.service.AutoService -import com.powsybl.dynamicsimulation.DynamicModel +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractSimpleEquipmentGroovyExtension import com.powsybl.dynawaltz.dsl.EquipmentConfig @@ -19,21 +19,21 @@ import com.powsybl.iidm.network.Network * @author Laurent Issertial {@literal } */ @AutoService(DynamicModelGroovyExtension.class) -class LoadTwoTransformersGroovyExtension extends AbstractSimpleEquipmentGroovyExtension implements DynamicModelGroovyExtension { +class LoadTwoTransformersGroovyExtension extends AbstractSimpleEquipmentGroovyExtension { LoadTwoTransformersGroovyExtension() { super("LoadTwoTransformers") } @Override - protected LoadTwoTransformersBuilder createBuilder(Network network, EquipmentConfig equipmentConfig) { - new LoadTwoTransformersBuilder(network, equipmentConfig) + protected LoadTwoTransformersBuilder createBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + new LoadTwoTransformersBuilder(network, equipmentConfig, reporter) } static class LoadTwoTransformersBuilder extends AbstractLoadModelBuilder { - LoadTwoTransformersBuilder(Network network, EquipmentConfig equipmentConfig) { - super(network, equipmentConfig) + LoadTwoTransformersBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + super(network, equipmentConfig, reporter) } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/loads/LoadTwoTransformersTapChangersGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/loads/LoadTwoTransformersTapChangersGroovyExtension.groovy index 642db1859..18bf77353 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/loads/LoadTwoTransformersTapChangersGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/loads/LoadTwoTransformersTapChangersGroovyExtension.groovy @@ -8,7 +8,7 @@ package com.powsybl.dynawaltz.dsl.models.loads import com.google.auto.service.AutoService -import com.powsybl.dynamicsimulation.DynamicModel +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractSimpleEquipmentGroovyExtension import com.powsybl.dynawaltz.dsl.EquipmentConfig @@ -19,21 +19,21 @@ import com.powsybl.iidm.network.Network * @author Laurent Issertial {@literal } */ @AutoService(DynamicModelGroovyExtension.class) -class LoadTwoTransformersTapChangersGroovyExtension extends AbstractSimpleEquipmentGroovyExtension implements DynamicModelGroovyExtension { +class LoadTwoTransformersTapChangersGroovyExtension extends AbstractSimpleEquipmentGroovyExtension { LoadTwoTransformersTapChangersGroovyExtension() { super("LoadTwoTransformersTapChangers") } @Override - protected LoadTwoTransformersTapChangersBuilder createBuilder(Network network, EquipmentConfig equipmentConfig) { - new LoadTwoTransformersTapChangersBuilder(network, equipmentConfig) + protected LoadTwoTransformersTapChangersBuilder createBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + new LoadTwoTransformersTapChangersBuilder(network, equipmentConfig, reporter) } static class LoadTwoTransformersTapChangersBuilder extends AbstractLoadModelBuilder { - LoadTwoTransformersTapChangersBuilder(Network network, EquipmentConfig equipmentConfig) { - super(network, equipmentConfig) + LoadTwoTransformersTapChangersBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + super(network, equipmentConfig, reporter) } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/svarcs/SvarcGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/svarcs/SvarcGroovyExtension.groovy index ae11ab92f..dab946e13 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/svarcs/SvarcGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/svarcs/SvarcGroovyExtension.groovy @@ -8,7 +8,7 @@ package com.powsybl.dynawaltz.dsl.models.svarcs import com.google.auto.service.AutoService -import com.powsybl.dynamicsimulation.DynamicModel +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.dsl.builders.AbstractEquipmentModelBuilder import com.powsybl.dynawaltz.models.svarcs.StaticVarCompensator as DynamicSvarc @@ -22,7 +22,7 @@ import com.powsybl.iidm.network.StaticVarCompensator as StaticSvarc * @author Laurent Issertial {@literal } */ @AutoService(DynamicModelGroovyExtension.class) -class SvarcGroovyExtension extends AbstractEquipmentGroovyExtension implements DynamicModelGroovyExtension { +class SvarcGroovyExtension extends AbstractEquipmentGroovyExtension { protected static final String SVARC = "staticVarCompensators" @@ -31,14 +31,14 @@ class SvarcGroovyExtension extends AbstractEquipmentGroovyExtension { - SvcBuilder(Network network, EquipmentConfig equipmentConfig) { - super(network, equipmentConfig, IdentifiableType.STATIC_VAR_COMPENSATOR) + SvcBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + super(network, equipmentConfig, IdentifiableType.STATIC_VAR_COMPENSATOR, reporter) } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/transformers/TransformerFixedRatioGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/transformers/TransformerFixedRatioGroovyExtension.groovy index 84c4e0288..9e67b4a3a 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/transformers/TransformerFixedRatioGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/transformers/TransformerFixedRatioGroovyExtension.groovy @@ -8,7 +8,7 @@ package com.powsybl.dynawaltz.dsl.models.transformers import com.google.auto.service.AutoService -import com.powsybl.dynamicsimulation.DynamicModel +import com.powsybl.commons.reporter.Reporter import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractEquipmentGroovyExtension import com.powsybl.dynawaltz.dsl.EquipmentConfig @@ -22,7 +22,7 @@ import com.powsybl.iidm.network.TwoWindingsTransformer * @author Laurent Issertial {@literal } */ @AutoService(DynamicModelGroovyExtension.class) -class TransformerFixedRatioGroovyExtension extends AbstractEquipmentGroovyExtension implements DynamicModelGroovyExtension { +class TransformerFixedRatioGroovyExtension extends AbstractEquipmentGroovyExtension { private static final String TRANSFORMERS = "transformers" @@ -31,14 +31,14 @@ class TransformerFixedRatioGroovyExtension extends AbstractEquipmentGroovyExtens } @Override - protected TransformerBuilder createBuilder(Network network, EquipmentConfig equipmentConfig) { - new TransformerBuilder(network, equipmentConfig) + protected TransformerBuilder createBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + new TransformerBuilder(network, equipmentConfig, reporter) } static class TransformerBuilder extends AbstractEquipmentModelBuilder { - TransformerBuilder(Network network, EquipmentConfig equipmentConfig) { - super(network, equipmentConfig, IdentifiableType.TWO_WINDINGS_TRANSFORMER) + TransformerBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { + super(network, equipmentConfig, IdentifiableType.TWO_WINDINGS_TRANSFORMER, reporter) } @Override diff --git a/dynawaltz-dsl/src/test/java/com/powsybl/dynawaltz/dsl/AbstractModelSupplierTest.java b/dynawaltz-dsl/src/test/java/com/powsybl/dynawaltz/dsl/AbstractModelSupplierTest.java index efafba9a6..7776a7b20 100644 --- a/dynawaltz-dsl/src/test/java/com/powsybl/dynawaltz/dsl/AbstractModelSupplierTest.java +++ b/dynawaltz-dsl/src/test/java/com/powsybl/dynawaltz/dsl/AbstractModelSupplierTest.java @@ -7,15 +7,29 @@ */ package com.powsybl.dynawaltz.dsl; +import com.powsybl.commons.reporter.ReporterModel; +import com.powsybl.commons.test.TestUtil; + import java.io.InputStream; +import java.io.StringWriter; import java.util.Objects; +import static org.junit.jupiter.api.Assertions.assertEquals; + /** * @author Laurent Issertial {@literal } */ abstract class AbstractModelSupplierTest { + protected final ReporterModel reporter = new ReporterModel("dslTests", "DSL tests"); + protected InputStream getResourceAsStream(String name) { return Objects.requireNonNull(AbstractModelSupplierTest.class.getResourceAsStream(name)); } + + protected void checkReporter(String report) { + StringWriter sw = new StringWriter(); + reporter.export(sw); + assertEquals(report, TestUtil.normalizeLineSeparator(sw.toString())); + } } diff --git a/dynawaltz-dsl/src/test/java/com/powsybl/dynawaltz/dsl/DynamicModelsSupplierTest.java b/dynawaltz-dsl/src/test/java/com/powsybl/dynawaltz/dsl/DynamicModelsSupplierTest.java index 1241f0cd5..063ce9a59 100644 --- a/dynawaltz-dsl/src/test/java/com/powsybl/dynawaltz/dsl/DynamicModelsSupplierTest.java +++ b/dynawaltz-dsl/src/test/java/com/powsybl/dynawaltz/dsl/DynamicModelsSupplierTest.java @@ -74,19 +74,22 @@ void testAutomatonDynamicModels(String groovyScriptName, Class modelClass, Network network, String terminalVarName) { + void testGeneratorPrefixes(String groovyScriptName, Class modelClass, Network network, String terminalVarName, String report) { DynamicModelsSupplier supplier = new GroovyDynamicModelsSupplier(getResourceAsStream(groovyScriptName), EXTENSIONS); - List dynamicModels = supplier.get(network); + List dynamicModels = supplier.get(network, reporter); assertEquals(1, dynamicModels.size()); assertTrue(modelClass.isInstance(dynamicModels.get(0))); assertEquals(terminalVarName, modelClass.cast(dynamicModels.get(0)).getTerminalVarName()); + checkReporter(report); + } void assertEquipmentBlackBoxModel(EquipmentBlackBoxModel bbm, String dynamicId, String staticId, String parameterId, String lib) { @@ -144,27 +147,142 @@ private static Stream provideAutomatonModelData() { private static Stream provideWarningsModel() { return Stream.of( - Arguments.of("/warnings/missingStaticId.groovy", EurostagTutorialExample1Factory.create()), - Arguments.of("/warnings/missingParameterId.groovy", EurostagTutorialExample1Factory.create()), - Arguments.of("/warnings/missingEquipment.groovy", EurostagTutorialExample1Factory.create()), - Arguments.of("/warnings/missingDangling.groovy", HvdcTestNetwork.createVsc()), - Arguments.of("/warnings/missingDanglingProperty.groovy", HvdcTestNetwork.createVsc()), - Arguments.of("/warnings/underVoltageMissingGenerator.groovy", EurostagTutorialExample1Factory.create()), - Arguments.of("/warnings/phaseShifterMissingTransformer.groovy", EurostagTutorialExample1Factory.create()), - Arguments.of("/warnings/claMissingMeasurement.groovy", EurostagTutorialExample1Factory.create()), - Arguments.of("/warnings/claMissingMeasurementSide.groovy", EurostagTutorialExample1Factory.create()), - Arguments.of("/warnings/claMissingControlled.groovy", EurostagTutorialExample1Factory.create()), - Arguments.of("/warnings/cla2MissingMeasurement2.groovy", EurostagTutorialExample1Factory.create()), - Arguments.of("/warnings/cla2MissingMeasurementSide2.groovy", EurostagTutorialExample1Factory.create()), - Arguments.of("/warnings/tapChangerMissingBus.groovy", EurostagTutorialExample1Factory.create()), - Arguments.of("/warnings/tapChangerCompatible.groovy", EurostagTutorialExample1Factory.create()) + Arguments.of("/warnings/missingStaticId.groovy", EurostagTutorialExample1Factory.create(), + """ + + DSL tests + + Groovy Dynamic Models Supplier + + DSL model builder for LoadAlphaBeta + 'staticId' field is not set + 'dynamicModelId' field is not set, staticId (unknown staticId) will be used instead + Model unknownDynamicId cannot be instantiated + """), + Arguments.of("/warnings/missingParameterId.groovy", EurostagTutorialExample1Factory.create(), + """ + + DSL tests + + Groovy Dynamic Models Supplier + + DSL model builder for LoadAlphaBeta + 'parameterSetId' field is not set + 'dynamicModelId' field is not set, staticId LOAD will be used instead + Model LOAD cannot be instantiated + """), + Arguments.of("/warnings/missingEquipment.groovy", EurostagTutorialExample1Factory.create(), + """ + + DSL tests + + Groovy Dynamic Models Supplier + + DSL model builder for LoadAlphaBeta + 'staticId' field value 'GEN' not found for equipment type(s) LOAD + 'dynamicModelId' field is not set, staticId GEN will be used instead + Model GEN cannot be instantiated + """), + Arguments.of("/warnings/missingDangling.groovy", HvdcTestNetwork.createVsc(), + """ + + DSL tests + + Groovy Dynamic Models Supplier + + DSL model builder for HvdcPVDangling + 'dangling' field is not set + Model BBM_HVDC_L cannot be instantiated + """), + Arguments.of("/warnings/missingDanglingProperty.groovy", HvdcTestNetwork.createVsc(), + """ + + DSL tests + + Groovy Dynamic Models Supplier + + DSL model builder for HvdcPV + 'dangling' field is set but HvdcPV does not possess this option + Model BBM_HVDC_L cannot be instantiated + """), + Arguments.of("/warnings/underVoltageMissingGenerator.groovy", EurostagTutorialExample1Factory.create(), + """ + + DSL tests + + Groovy Dynamic Models Supplier + + DSL model builder for UnderVoltage + 'generator' field value 'NGEN' not found for equipment type(s) GENERATOR + Model UV_GEN cannot be instantiated + """), + Arguments.of("/warnings/phaseShifterMissingTransformer.groovy", EurostagTutorialExample1Factory.create(), + """ + + DSL tests + + Groovy Dynamic Models Supplier + + DSL model builder for PhaseShifterI + 'transformer' field value 'NGEN' not found for equipment type(s) TWO_WINDINGS_TRANSFORMER + Model PS_NGEN_NHV1 cannot be instantiated + """), + Arguments.of("/warnings/claMissingMeasurement.groovy", EurostagTutorialExample1Factory.create(), + """ + + DSL tests + + Groovy Dynamic Models Supplier + + DSL model builder for CurrentLimitAutomaton + 'iMeasurement' field value 'NGEN' not found for equipment type(s) Quadripole + Model CLA_NGEN cannot be instantiated + """), + Arguments.of("/warnings/claMissingMeasurementSide.groovy", EurostagTutorialExample1Factory.create(), + """ + + DSL tests + + Groovy Dynamic Models Supplier + + DSL model builder for CurrentLimitAutomaton + 'iMeasurementSide' field is not set + Model CLA_NGEN cannot be instantiated + """), + Arguments.of("/warnings/claMissingControlled.groovy", EurostagTutorialExample1Factory.create(), + """ + + DSL tests + + Groovy Dynamic Models Supplier + + DSL model builder for CurrentLimitAutomaton + 'controlledQuadripole' field value 'GEN' not found for equipment type(s) Quadripole + Model CLA_NGEN cannot be instantiated + """), + Arguments.of("/warnings/cla2MissingMeasurement2.groovy", EurostagTutorialExample1Factory.create(), + """ + + DSL tests + + Groovy Dynamic Models Supplier + + DSL model builder for CurrentLimitAutomatonTwoLevels + 'iMeasurement2' field value 'NGEN' not found for equipment type(s) Quadripole + Model CLA_NGEN cannot be instantiated + """), + Arguments.of("/warnings/cla2MissingMeasurementSide2.groovy", EurostagTutorialExample1Factory.create(), + """ + + DSL tests + + Groovy Dynamic Models Supplier + + DSL model builder for CurrentLimitAutomatonTwoLevels + 'iMeasurement2Side' field is not set + Model CLA_NGEN cannot be instantiated + """), + Arguments.of("/warnings/tapChangerMissingBus.groovy", EurostagTutorialExample1Factory.create(), + """ + + DSL tests + + Groovy Dynamic Models Supplier + + DSL model builder for TapChangerBlockingAutomaton + 'uMeasurements' field value 'LOAD' not found for equipment type(s) BUS + 'uMeasurements' list is empty + Model ZAB cannot be instantiated + """), + Arguments.of("/warnings/tapChangerCompatible.groovy", EurostagTutorialExample1Factory.create(), + """ + + DSL tests + + Groovy Dynamic Models Supplier + + DSL model builder for TapChangerBlockingAutomaton + 'uMeasurements' field value 'GEN' not found for equipment type(s) LOAD/TWO_WINDINGS_TRANSFORMER + 'transformers' list is empty + Model ZAB cannot be instantiated + """) ); } private static Stream provideGenerator() { return Stream.of( - Arguments.of("/dynamicModels/gen.groovy", SynchronousGenerator.class, EurostagTutorialExample1Factory.create(), "generator_terminal"), - Arguments.of("/dynamicModels/genTfo.groovy", SynchronousGenerator.class, EurostagTutorialExample1Factory.create(), "transformer_terminal1") + Arguments.of("/dynamicModels/gen.groovy", SynchronousGenerator.class, EurostagTutorialExample1Factory.create(), "generator_terminal", + """ + + DSL tests + + Groovy Dynamic Models Supplier + + DSL model builder for GeneratorSynchronousThreeWindings + Model BBM_GEN instantiation successful + """), + Arguments.of("/dynamicModels/genTfo.groovy", SynchronousGenerator.class, EurostagTutorialExample1Factory.create(), "transformer_terminal1", + """ + + DSL tests + + Groovy Dynamic Models Supplier + + DSL model builder for GeneratorSynchronousThreeWindingsPmConstVRNordicTfo + Model BBM_GEN instantiation successful + """) ); } } diff --git a/dynawaltz-dsl/src/test/java/com/powsybl/dynawaltz/dsl/EventModelsSupplierTest.java b/dynawaltz-dsl/src/test/java/com/powsybl/dynawaltz/dsl/EventModelsSupplierTest.java index 27702044d..0a37595ad 100644 --- a/dynawaltz-dsl/src/test/java/com/powsybl/dynawaltz/dsl/EventModelsSupplierTest.java +++ b/dynawaltz-dsl/src/test/java/com/powsybl/dynawaltz/dsl/EventModelsSupplierTest.java @@ -18,6 +18,7 @@ import com.powsybl.iidm.network.Network; import com.powsybl.iidm.network.test.EurostagTutorialExample1Factory; import com.powsybl.iidm.network.test.HvdcTestNetwork; +import com.powsybl.iidm.network.test.SvcTestCaseFactory; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -46,9 +47,10 @@ void testEventModels(String groovyScriptName, Class mod @ParameterizedTest(name = "{0}") @MethodSource("provideWarningsModel") - void testDslWarnings(String groovyScriptName, Network network) { + void testDslWarnings(String groovyScriptName, Network network, String report) { EventModelsSupplier supplier = new GroovyEventModelsSupplier(getResourceAsStream(groovyScriptName), EXTENSIONS); - assertTrue(supplier.get(network).isEmpty()); + assertTrue(supplier.get(network, reporter).isEmpty()); + checkReporter(report); } void assertEventModel(AbstractEvent em, String dynamicId, String equipmentStaticId, String lib, double startTime) { @@ -76,12 +78,55 @@ private static Stream provideEventModelData() { private static Stream provideWarningsModel() { return Stream.of( - Arguments.of("/eventWarnings/missingStaticId.groovy", EurostagTutorialExample1Factory.create()), - Arguments.of("/eventWarnings/missingStartTime.groovy", EurostagTutorialExample1Factory.create()), - Arguments.of("/eventWarnings/missingNodeFaultParameters.groovy", EurostagTutorialExample1Factory.create()), - Arguments.of("/eventWarnings/missingAPVParameters.groovy", EurostagTutorialExample1Factory.create()), - Arguments.of("/eventWarnings/missingDisconnectionEquipment.groovy", EurostagTutorialExample1Factory.create()), - Arguments.of("/eventWarnings/missingDisconnectionSide.groovy", EurostagTutorialExample1Factory.create()) + Arguments.of("/eventWarnings/missingStaticId.groovy", EurostagTutorialExample1Factory.create(), + """ + + DSL tests + + Groovy Event Models Supplier + + DSL model builder for NodeFault + 'staticId' field value 'GEN' not found for equipment type(s) BUS + Model NodeFault_GEN cannot be instantiated + """), + Arguments.of("/eventWarnings/missingStartTime.groovy", EurostagTutorialExample1Factory.create(), + """ + + DSL tests + + Groovy Event Models Supplier + + DSL model builder for NodeFault + 'startTime' field is not set + Model NodeFault_NGEN cannot be instantiated + """), + Arguments.of("/eventWarnings/missingNodeFaultParameters.groovy", EurostagTutorialExample1Factory.create(), + """ + + DSL tests + + Groovy Event Models Supplier + + DSL model builder for NodeFault + faultTime should be strictly positive (0.0) + Model NodeFault_NGEN cannot be instantiated + """), + Arguments.of("/eventWarnings/missingAPVParameters.groovy", SvcTestCaseFactory.create(), + """ + + DSL tests + + Groovy Event Models Supplier + + DSL model builder for Step + 'staticId' field value 'SVC2' not found for equipment type(s) GENERATOR/LOAD + 'deltaP' field is not set + Model Step_SVC2 cannot be instantiated + """), + Arguments.of("/eventWarnings/missingDisconnectionEquipment.groovy", EurostagTutorialExample1Factory.create(), + """ + + DSL tests + + Groovy Event Models Supplier + + DSL model builder for Disconnect + 'staticId' field value 'NGEN' not found for equipment type(s) Disconnectable equipment + Model Disconnect_NGEN cannot be instantiated + """), + Arguments.of("/eventWarnings/missingDisconnectionSide.groovy", EurostagTutorialExample1Factory.create(), + """ + + DSL tests + + Groovy Event Models Supplier + + DSL model builder for Disconnect + 'disconnectSide' field is set but GENERATOR GEN does not possess this option + Model Disconnect_GEN cannot be instantiated + """) ); } } diff --git a/dynawaltz-dsl/src/test/java/com/powsybl/dynawaltz/dsl/ieee/AbstractIeeeTest.java b/dynawaltz-dsl/src/test/java/com/powsybl/dynawaltz/dsl/ieee/AbstractIeeeTest.java index 0e5c8c374..3824017fa 100644 --- a/dynawaltz-dsl/src/test/java/com/powsybl/dynawaltz/dsl/ieee/AbstractIeeeTest.java +++ b/dynawaltz-dsl/src/test/java/com/powsybl/dynawaltz/dsl/ieee/AbstractIeeeTest.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.concurrent.ForkJoinPool; +import static com.powsybl.commons.reporter.Reporter.NO_OP; import static org.junit.jupiter.api.Assertions.assertEquals; /** @@ -69,7 +70,7 @@ protected void setup(String parametersFile, String networkParametersFile, String List dynamicModelGroovyExtensions = GroovyExtension.find(DynamicModelGroovyExtension.class, DynaWaltzProvider.NAME); dynamicModelsSupplier = new GroovyDynamicModelsSupplier(workingDir.resolve("dynamicModels.groovy"), dynamicModelGroovyExtensions); } else { - dynamicModelsSupplier = n -> Collections.emptyList(); + dynamicModelsSupplier = (n, NO_OP) -> Collections.emptyList(); } // Event models @@ -116,7 +117,7 @@ public DynamicSimulationResult runSimulation(LocalCommandExecutor commandExecuto assertEquals(DynaWaltzProvider.NAME, dynawoSimulation.getName()); return dynawoSimulation.run(network, dynamicModelsSupplier, eventModelsSupplier, curvesSupplier, network.getVariantManager().getWorkingVariantId(), - computationManager, parameters); + computationManager, parameters, NO_OP); } } diff --git a/dynawaltz-dsl/src/test/resources/dynamicModels.groovy b/dynawaltz-dsl/src/test/resources/dynamicModels.groovy index baf9282e9..a9849a1ac 100644 --- a/dynawaltz-dsl/src/test/resources/dynamicModels.groovy +++ b/dynawaltz-dsl/src/test/resources/dynamicModels.groovy @@ -5,16 +5,14 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -import com.powsybl.iidm.network.Branch import com.powsybl.iidm.network.Bus +import com.powsybl.iidm.network.Generator import com.powsybl.iidm.network.Line import com.powsybl.iidm.network.Load -import com.powsybl.iidm.network.Generator - +import com.powsybl.iidm.network.TwoSides for (Load load : network.loads) { - if (load == "LOAD2") { + if (load.id == "LOAD2") { LoadOneTransformer { staticId load.id // dynamicModelId "BBM_" + load.id (dynamicModelId could be optional and equal to staticId) @@ -76,7 +74,7 @@ for (Line line : network.lines) { dynamicModelId "BBM_" + line.id parameterSetId "CLA" iMeasurement line.id - iMeasurementSide Branch.Side.TWO + iMeasurementSide TwoSides.TWO } Line { diff --git a/dynawaltz-dsl/src/test/resources/dynamicModels/currentLimit.groovy b/dynawaltz-dsl/src/test/resources/dynamicModels/currentLimit.groovy index 494926b7a..3d4ed0531 100644 --- a/dynawaltz-dsl/src/test/resources/dynamicModels/currentLimit.groovy +++ b/dynawaltz-dsl/src/test/resources/dynamicModels/currentLimit.groovy @@ -8,12 +8,12 @@ package dynamicModels -import com.powsybl.iidm.network.Branch +import com.powsybl.iidm.network.TwoSides CurrentLimitAutomaton { dynamicModelId "AM_NHV1_NHV2_1" parameterSetId "CLA" controlledQuadripole "NHV1_NHV2_2" iMeasurement "NHV1_NHV2_1" - iMeasurementSide Branch.Side.TWO + iMeasurementSide TwoSides.TWO } diff --git a/dynawaltz-dsl/src/test/resources/dynamicModels/currentLimitTwoLevels.groovy b/dynawaltz-dsl/src/test/resources/dynamicModels/currentLimitTwoLevels.groovy index aba0b1b9c..2d47e3581 100644 --- a/dynawaltz-dsl/src/test/resources/dynamicModels/currentLimitTwoLevels.groovy +++ b/dynawaltz-dsl/src/test/resources/dynamicModels/currentLimitTwoLevels.groovy @@ -8,14 +8,14 @@ package dynamicModels -import com.powsybl.iidm.network.Branch +import com.powsybl.iidm.network.TwoSides CurrentLimitAutomatonTwoLevels { dynamicModelId "AM_NHV1_NHV2_1" parameterSetId "CLA" controlledQuadripole "NHV1_NHV2_2" iMeasurement1 "NHV1_NHV2_1" - iMeasurement1Side Branch.Side.TWO + iMeasurement1Side TwoSides.TWO iMeasurement2 "NGEN_NHV1" - iMeasurement2Side Branch.Side.ONE + iMeasurement2Side TwoSides.ONE } diff --git a/dynawaltz-dsl/src/test/resources/dynamicModels/danglingHvdcException.groovy b/dynawaltz-dsl/src/test/resources/dynamicModels/danglingHvdcException.groovy index 2fbfadcaf..f01664494 100644 --- a/dynawaltz-dsl/src/test/resources/dynamicModels/danglingHvdcException.groovy +++ b/dynawaltz-dsl/src/test/resources/dynamicModels/danglingHvdcException.groovy @@ -8,11 +8,11 @@ package dynamicModels -import com.powsybl.iidm.network.Branch +import com.powsybl.iidm.network.TwoSides HvdcPV { staticId "L" dynamicModelId "BBM_HVDC_L" parameterSetId "HVDC" - dangling Branch.Side.ONE + dangling TwoSides.ONE } diff --git a/dynawaltz-dsl/src/test/resources/dynamicModels/hvdcPDangling.groovy b/dynawaltz-dsl/src/test/resources/dynamicModels/hvdcPDangling.groovy index 780a0bec4..aa0169587 100644 --- a/dynawaltz-dsl/src/test/resources/dynamicModels/hvdcPDangling.groovy +++ b/dynawaltz-dsl/src/test/resources/dynamicModels/hvdcPDangling.groovy @@ -8,11 +8,11 @@ package dynamicModels -import com.powsybl.iidm.network.Branch +import com.powsybl.iidm.network.TwoSides HvdcPVDanglingDiagramPQ { staticId "L" dynamicModelId "BBM_HVDC_L" parameterSetId "HVDC" - dangling Branch.Side.ONE + dangling TwoSides.ONE } diff --git a/dynawaltz-dsl/src/test/resources/dynamicModels/hvdcVscDangling.groovy b/dynawaltz-dsl/src/test/resources/dynamicModels/hvdcVscDangling.groovy index a1290c328..6218b71f5 100644 --- a/dynawaltz-dsl/src/test/resources/dynamicModels/hvdcVscDangling.groovy +++ b/dynawaltz-dsl/src/test/resources/dynamicModels/hvdcVscDangling.groovy @@ -8,11 +8,11 @@ package dynamicModels -import com.powsybl.iidm.network.Branch +import com.powsybl.iidm.network.TwoSides HvdcVSCDanglingUdc { staticId "L" dynamicModelId "BBM_HVDC_L" parameterSetId "HVDC" - dangling Branch.Side.TWO + dangling TwoSides.TWO } diff --git a/dynawaltz-dsl/src/test/resources/eventModels.groovy b/dynawaltz-dsl/src/test/resources/eventModels.groovy index c632eda86..0e868bdee 100644 --- a/dynawaltz-dsl/src/test/resources/eventModels.groovy +++ b/dynawaltz-dsl/src/test/resources/eventModels.groovy @@ -5,13 +5,14 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + import com.powsybl.iidm.network.Line -import com.powsybl.iidm.network.Branch +import com.powsybl.iidm.network.TwoSides for (Line line : network.lines) { Disconnect { staticId line.id startTime 4 - disconnectOnly Branch.Side.TWO + disconnectOnly TwoSides.TWO } } diff --git a/dynawaltz-dsl/src/test/resources/eventModels/hvdcDisconnection.groovy b/dynawaltz-dsl/src/test/resources/eventModels/hvdcDisconnection.groovy index d3a1af481..a41ad8f93 100644 --- a/dynawaltz-dsl/src/test/resources/eventModels/hvdcDisconnection.groovy +++ b/dynawaltz-dsl/src/test/resources/eventModels/hvdcDisconnection.groovy @@ -8,10 +8,10 @@ package eventModels -import com.powsybl.iidm.network.Branch +import com.powsybl.iidm.network.TwoSides Disconnect { staticId "L" startTime 2 - disconnectOnly Branch.Side.TWO + disconnectOnly TwoSides.TWO } diff --git a/dynawaltz-dsl/src/test/resources/eventModels/quadripoleDisconnection.groovy b/dynawaltz-dsl/src/test/resources/eventModels/quadripoleDisconnection.groovy index 1e3c5ad9e..d7684f961 100644 --- a/dynawaltz-dsl/src/test/resources/eventModels/quadripoleDisconnection.groovy +++ b/dynawaltz-dsl/src/test/resources/eventModels/quadripoleDisconnection.groovy @@ -8,10 +8,10 @@ package eventModels -import com.powsybl.iidm.network.Branch +import com.powsybl.iidm.network.TwoSides Disconnect { staticId "NHV1_NHV2_1" startTime 4 - disconnectOnly Branch.Side.ONE + disconnectOnly TwoSides.ONE } diff --git a/dynawaltz-dsl/src/test/resources/eventWarnings/missingAPVParameters.groovy b/dynawaltz-dsl/src/test/resources/eventWarnings/missingAPVParameters.groovy index 7c95a02fd..94afd90f9 100644 --- a/dynawaltz-dsl/src/test/resources/eventWarnings/missingAPVParameters.groovy +++ b/dynawaltz-dsl/src/test/resources/eventWarnings/missingAPVParameters.groovy @@ -9,6 +9,6 @@ package eventWarnings Step { - staticId "NGEN" + staticId "SVC2" startTime 2 } diff --git a/dynawaltz-dsl/src/test/resources/eventWarnings/missingDisconnectionSide.groovy b/dynawaltz-dsl/src/test/resources/eventWarnings/missingDisconnectionSide.groovy index 08821b753..4d4d6eb99 100644 --- a/dynawaltz-dsl/src/test/resources/eventWarnings/missingDisconnectionSide.groovy +++ b/dynawaltz-dsl/src/test/resources/eventWarnings/missingDisconnectionSide.groovy @@ -8,10 +8,10 @@ package eventWarnings -import com.powsybl.iidm.network.Branch +import com.powsybl.iidm.network.TwoSides Disconnect { staticId "GEN" startTime 1 - disconnectOnly Branch.Side.ONE + disconnectOnly TwoSides.ONE } diff --git a/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/powsybl-inputs/dynamicModels.groovy b/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/powsybl-inputs/dynamicModels.groovy index 40f4299e5..6a5457d7f 100644 --- a/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/powsybl-inputs/dynamicModels.groovy +++ b/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/powsybl-inputs/dynamicModels.groovy @@ -5,10 +5,9 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import com.powsybl.iidm.network.Branch -import com.powsybl.iidm.network.Load import com.powsybl.iidm.network.Generator - +import com.powsybl.iidm.network.Load +import com.powsybl.iidm.network.TwoSides for (Load load : network.loads) { if (load.id != "_LOAD___8_EC") { @@ -38,7 +37,7 @@ CurrentLimitAutomaton { parameterSetId "CLA_2_4" controlledQuadripole "_BUS____2-BUS____4-1_AC" iMeasurement "_BUS____2-BUS____4-1_AC" - iMeasurementSide Branch.Side.TWO + iMeasurementSide TwoSides.TWO } CurrentLimitAutomaton { @@ -46,6 +45,6 @@ CurrentLimitAutomaton { parameterSetId "CLA_2_5" controlledQuadripole "_BUS____2-BUS____5-1_AC" iMeasurement "_BUS____2-BUS____5-1_AC" - iMeasurementSide Branch.Side.TWO + iMeasurementSide TwoSides.TWO } diff --git a/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/powsybl-inputs/eventModels.groovy b/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/powsybl-inputs/eventModels.groovy index 448840913..8e328b8c6 100644 --- a/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/powsybl-inputs/eventModels.groovy +++ b/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/powsybl-inputs/eventModels.groovy @@ -5,10 +5,10 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import com.powsybl.iidm.network.Branch +import com.powsybl.iidm.network.TwoSides Disconnect { staticId "_BUS____1-BUS____5-1_AC" startTime 5 - disconnectOnly Branch.Side.TWO + disconnectOnly TwoSides.TWO } diff --git a/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/powsybl-inputs/eventModels.groovy b/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/powsybl-inputs/eventModels.groovy index 585e7a483..f15f829a7 100644 --- a/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/powsybl-inputs/eventModels.groovy +++ b/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/powsybl-inputs/eventModels.groovy @@ -5,10 +5,10 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import com.powsybl.iidm.network.Branch +import com.powsybl.iidm.network.TwoSides Disconnect { staticId "_BUS____1-BUS____5-1_AC" startTime 1 - disconnectOnly Branch.Side.TWO + disconnectOnly TwoSides.TWO } diff --git a/dynawaltz-dsl/src/test/resources/warnings/cla2MissingMeasurement2.groovy b/dynawaltz-dsl/src/test/resources/warnings/cla2MissingMeasurement2.groovy index 918b54b70..3f9c32d81 100644 --- a/dynawaltz-dsl/src/test/resources/warnings/cla2MissingMeasurement2.groovy +++ b/dynawaltz-dsl/src/test/resources/warnings/cla2MissingMeasurement2.groovy @@ -8,14 +8,14 @@ package warnings -import com.powsybl.iidm.network.Branch +import com.powsybl.iidm.network.TwoSides CurrentLimitAutomatonTwoLevels { dynamicModelId "CLA_NGEN" parameterSetId "CLA" controlledQuadripole "NHV1_NHV2_2" iMeasurement1 "NHV1_NHV2_1" - iMeasurement1Side Branch.Side.TWO + iMeasurement1Side TwoSides.TWO iMeasurement2 "NGEN" - iMeasurement2Side Branch.Side.ONE + iMeasurement2Side TwoSides.ONE } diff --git a/dynawaltz-dsl/src/test/resources/warnings/cla2MissingMeasurementSide2.groovy b/dynawaltz-dsl/src/test/resources/warnings/cla2MissingMeasurementSide2.groovy index 6723e4cb8..bcf6345ea 100644 --- a/dynawaltz-dsl/src/test/resources/warnings/cla2MissingMeasurementSide2.groovy +++ b/dynawaltz-dsl/src/test/resources/warnings/cla2MissingMeasurementSide2.groovy @@ -8,13 +8,13 @@ package warnings -import com.powsybl.iidm.network.Branch +import com.powsybl.iidm.network.TwoSides CurrentLimitAutomatonTwoLevels { dynamicModelId "CLA_NGEN" parameterSetId "CLA" controlledQuadripole "NHV1_NHV2_2" iMeasurement1 "NHV1_NHV2_1" - iMeasurement1Side Branch.Side.TWO + iMeasurement1Side TwoSides.TWO iMeasurement2 "NHV1_NHV2_2" } diff --git a/dynawaltz-dsl/src/test/resources/warnings/claMissingControlled.groovy b/dynawaltz-dsl/src/test/resources/warnings/claMissingControlled.groovy index 753e11468..0e7d57c6b 100644 --- a/dynawaltz-dsl/src/test/resources/warnings/claMissingControlled.groovy +++ b/dynawaltz-dsl/src/test/resources/warnings/claMissingControlled.groovy @@ -8,12 +8,12 @@ package warnings -import com.powsybl.iidm.network.Branch +import com.powsybl.iidm.network.TwoSides CurrentLimitAutomaton { dynamicModelId "CLA_NGEN" parameterSetId "CLA" controlledQuadripole "GEN" iMeasurement "NHV1_NHV2_1" - iMeasurementSide Branch.Side.TWO + iMeasurementSide TwoSides.TWO } diff --git a/dynawaltz-dsl/src/test/resources/warnings/claMissingMeasurement.groovy b/dynawaltz-dsl/src/test/resources/warnings/claMissingMeasurement.groovy index 805d56a76..f5e5b3e21 100644 --- a/dynawaltz-dsl/src/test/resources/warnings/claMissingMeasurement.groovy +++ b/dynawaltz-dsl/src/test/resources/warnings/claMissingMeasurement.groovy @@ -8,12 +8,12 @@ package warnings -import com.powsybl.iidm.network.Branch +import com.powsybl.iidm.network.TwoSides CurrentLimitAutomaton { dynamicModelId "CLA_NGEN" parameterSetId "CLA" controlledQuadripole "NHV1_NHV2_2" iMeasurement "NGEN" - iMeasurementSide Branch.Side.TWO + iMeasurementSide TwoSides.TWO } diff --git a/dynawaltz-dsl/src/test/resources/warnings/missingDanglingProperty.groovy b/dynawaltz-dsl/src/test/resources/warnings/missingDanglingProperty.groovy index 8eea58d83..2637a52e2 100644 --- a/dynawaltz-dsl/src/test/resources/warnings/missingDanglingProperty.groovy +++ b/dynawaltz-dsl/src/test/resources/warnings/missingDanglingProperty.groovy @@ -8,11 +8,11 @@ package warnings -import com.powsybl.iidm.network.Branch +import com.powsybl.iidm.network.TwoSides HvdcPV { staticId "L" dynamicModelId "BBM_HVDC_L" parameterSetId "HVDC" - dangling Branch.Side.ONE + dangling TwoSides.ONE } diff --git a/dynawaltz/pom.xml b/dynawaltz/pom.xml index 66da83472..d5e7ea19d 100644 --- a/dynawaltz/pom.xml +++ b/dynawaltz/pom.xml @@ -55,7 +55,7 @@
com.powsybl - powsybl-iidm-xml-converter + powsybl-iidm-serde com.powsybl diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzContext.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzContext.java index 8f214d55d..bdf4ed3ab 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzContext.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzContext.java @@ -7,6 +7,7 @@ package com.powsybl.dynawaltz; import com.powsybl.commons.PowsyblException; +import com.powsybl.commons.reporter.Reporter; import com.powsybl.dynamicsimulation.Curve; import com.powsybl.dynamicsimulation.DynamicSimulationParameters; import com.powsybl.dynawaltz.models.*; @@ -44,6 +45,7 @@ public class DynaWaltzContext { private static final String MODEL_ID_EXCEPTION = "The model identified by the static id %s does not match the expected model (%s)"; private static final String MODEL_ID_LOG = "The model identified by the static id {} does not match the expected model ({})"; + private final Reporter reporter; private final Network network; private final String workingVariantId; private final DynamicSimulationParameters parameters; @@ -61,13 +63,20 @@ public class DynaWaltzContext { public DynaWaltzContext(Network network, String workingVariantId, List dynamicModels, List eventModels, List curves, DynamicSimulationParameters parameters, DynaWaltzParameters dynaWaltzParameters) { + this(network, workingVariantId, dynamicModels, eventModels, curves, parameters, dynaWaltzParameters, Reporter.NO_OP); + } + + public DynaWaltzContext(Network network, String workingVariantId, List dynamicModels, List eventModels, + List curves, DynamicSimulationParameters parameters, DynaWaltzParameters dynaWaltzParameters, Reporter reporter) { + + this.reporter = DynawaltzReports.createDynaWaltzContextReporter(reporter); this.network = Objects.requireNonNull(network); this.workingVariantId = Objects.requireNonNull(workingVariantId); this.dynamicModels = Objects.requireNonNull(dynamicModels).stream() - .filter(distinctByDynamicId().and(distinctByStaticId())) + .filter(distinctByDynamicId(reporter).and(distinctByStaticId(reporter))) .toList(); this.eventModels = Objects.requireNonNull(eventModels).stream() - .filter(distinctByDynamicId()) + .filter(distinctByDynamicId(reporter)) .toList(); this.staticIdBlackBoxModelMap = getInputBlackBoxDynamicModelStream() .filter(EquipmentBlackBoxModel.class::isInstance) @@ -184,22 +193,22 @@ public EquipmentConnectionPoint getConnectionPointDynamicModel(String staticId) throw new PowsyblException(String.format(MODEL_ID_EXCEPTION, staticId, "ConnectionPoint")); } - protected static Predicate distinctByStaticId() { + protected static Predicate distinctByStaticId(Reporter reporter) { Set seen = new HashSet<>(); return bbm -> { if (bbm instanceof EquipmentBlackBoxModel eBbm && !seen.add(eBbm.getStaticId())) { - LOGGER.warn("Duplicate static id found: {} -> dynamic model {} {} will be skipped", eBbm.getStaticId(), eBbm.getLib(), eBbm.getDynamicModelId()); + DynawaltzReports.reportDuplicateStaticId(reporter, eBbm.getStaticId(), eBbm.getLib(), eBbm.getDynamicModelId()); return false; } return true; }; } - protected static Predicate distinctByDynamicId() { + protected static Predicate distinctByDynamicId(Reporter reporter) { Set seen = new HashSet<>(); return bbm -> { if (!seen.add(bbm.getDynamicModelId())) { - LOGGER.warn("Duplicate dynamic id found: {} -> model {} will be skipped", bbm.getDynamicModelId(), bbm.getName()); + DynawaltzReports.reportDuplicateDynamicId(reporter, bbm.getDynamicModelId(), bbm.getName()); return false; } return true; @@ -283,4 +292,8 @@ public List getDynamicModelsParameters() { public String getSimulationParFile() { return getNetwork().getId() + ".par"; } + + public Reporter getReporter() { + return reporter; + } } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzProvider.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzProvider.java index 0df2081f7..2699ed989 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzProvider.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzProvider.java @@ -8,7 +8,7 @@ import com.google.auto.service.AutoService; import com.powsybl.commons.config.PlatformConfig; -import com.powsybl.commons.exceptions.UncheckedXmlStreamException; +import com.powsybl.commons.reporter.Reporter; import com.powsybl.computation.*; import com.powsybl.dynamicsimulation.*; import com.powsybl.dynawaltz.models.BlackBoxModel; @@ -22,7 +22,7 @@ import com.powsybl.dynawo.commons.PowsyblDynawoVersion; import com.powsybl.dynawo.commons.loadmerge.LoadsMerger; import com.powsybl.iidm.network.Network; -import com.powsybl.iidm.xml.NetworkXml; +import com.powsybl.iidm.serde.NetworkSerDe; import com.powsybl.timeseries.TimeSeries; import com.powsybl.timeseries.TimeSeries.TimeFormat; import com.powsybl.timeseries.TimeSeriesConstants; @@ -30,9 +30,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.xml.stream.XMLStreamException; import java.io.IOException; -import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; @@ -103,14 +101,15 @@ public static Command getVersionCommand(DynaWaltzConfig dynaWaltzConfig) { @Override public CompletableFuture run(Network network, DynamicModelsSupplier dynamicModelsSupplier, EventModelsSupplier eventModelsSupplier, CurvesSupplier curvesSupplier, String workingVariantId, - ComputationManager computationManager, DynamicSimulationParameters parameters) { + ComputationManager computationManager, DynamicSimulationParameters parameters, Reporter reporter) { Objects.requireNonNull(dynamicModelsSupplier); Objects.requireNonNull(eventModelsSupplier); Objects.requireNonNull(curvesSupplier); Objects.requireNonNull(workingVariantId); Objects.requireNonNull(parameters); + Objects.requireNonNull(reporter); DynaWaltzParameters dynaWaltzParameters = getDynaWaltzSimulationParameters(parameters); - return run(network, dynamicModelsSupplier, eventModelsSupplier, curvesSupplier, workingVariantId, computationManager, parameters, dynaWaltzParameters); + return run(network, dynamicModelsSupplier, eventModelsSupplier, curvesSupplier, workingVariantId, computationManager, parameters, dynaWaltzParameters, reporter); } private DynaWaltzParameters getDynaWaltzSimulationParameters(DynamicSimulationParameters parameters) { @@ -122,22 +121,23 @@ private DynaWaltzParameters getDynaWaltzSimulationParameters(DynamicSimulationPa } private CompletableFuture run(Network network, DynamicModelsSupplier dynamicModelsSupplier, EventModelsSupplier eventsModelsSupplier, CurvesSupplier curvesSupplier, - String workingVariantId, ComputationManager computationManager, DynamicSimulationParameters parameters, DynaWaltzParameters dynaWaltzParameters) { + String workingVariantId, ComputationManager computationManager, DynamicSimulationParameters parameters, DynaWaltzParameters dynaWaltzParameters, Reporter reporter) { + Reporter dsReporter = DynawaltzReports.createDynaWaltzReporter(reporter, network.getId()); network.getVariantManager().setWorkingVariant(workingVariantId); ExecutionEnvironment execEnv = new ExecutionEnvironment(Collections.emptyMap(), WORKING_DIR_PREFIX, dynaWaltzConfig.isDebug()); Command versionCmd = getVersionCommand(dynaWaltzConfig); DynawoUtil.requireDynaMinVersion(execEnv, computationManager, versionCmd, DynawoConstants.DYNAWO_CMD_NAME, false); - List blackBoxModels = dynamicModelsSupplier.get(network).stream() + List blackBoxModels = dynamicModelsSupplier.get(network, dsReporter).stream() .filter(BlackBoxModel.class::isInstance) .map(BlackBoxModel.class::cast) .collect(Collectors.toList()); - List blackBoxEventModels = eventsModelsSupplier.get(network).stream() + List blackBoxEventModels = eventsModelsSupplier.get(network, dsReporter).stream() .filter(BlackBoxModel.class::isInstance) .map(BlackBoxModel.class::cast) .collect(Collectors.toList()); - DynaWaltzContext context = new DynaWaltzContext(network, workingVariantId, blackBoxModels, blackBoxEventModels, curvesSupplier.get(network), parameters, dynaWaltzParameters); + DynaWaltzContext context = new DynaWaltzContext(network, workingVariantId, blackBoxModels, blackBoxEventModels, curvesSupplier.get(network, dsReporter), parameters, dynaWaltzParameters, reporter); return computationManager.execute(execEnv, new DynaWaltzHandler(context)); } @@ -178,7 +178,7 @@ public DynamicSimulationResult after(Path workingDir, ExecutionReport report) th if (parameters.isWriteFinalState()) { Path outputNetworkFile = workingDir.resolve(OUTPUTS_FOLDER).resolve(FINAL_STATE_FOLDER).resolve(OUTPUT_IIDM_FILENAME); if (Files.exists(outputNetworkFile)) { - NetworkResultsUpdater.update(context.getNetwork(), NetworkXml.read(outputNetworkFile), context.getDynaWaltzParameters().isMergeLoads()); + NetworkResultsUpdater.update(context.getNetwork(), NetworkSerDe.read(outputNetworkFile), context.getDynaWaltzParameters().isMergeLoads()); } else { status = false; } @@ -204,27 +204,20 @@ public DynamicSimulationResult after(Path workingDir, ExecutionReport report) th return new DynamicSimulationResultImpl(status, null, curves, DynamicSimulationResult.emptyTimeLine()); } - private void writeInputFiles(Path workingDir) { - try { - DynawoUtil.writeIidm(dynawoInput, workingDir.resolve(NETWORK_FILENAME)); - JobsXml.write(workingDir, context); - DydXml.write(workingDir, context); - ParametersXml.write(workingDir, context); - if (context.withCurves()) { - CurvesXml.write(workingDir, context); - } - DumpFileParameters dumpFileParameters = context.getDynaWaltzParameters().getDumpFileParameters(); - if (dumpFileParameters.useDumpFile()) { - Path dumpFilePath = dumpFileParameters.getDumpFilePath(); - if (dumpFilePath != null) { - Files.copy(dumpFilePath, workingDir.resolve(dumpFileParameters.dumpFile()), StandardCopyOption.REPLACE_EXISTING); - } + private void writeInputFiles(Path workingDir) throws IOException { + DynawoUtil.writeIidm(dynawoInput, workingDir.resolve(NETWORK_FILENAME)); + JobsXml.write(workingDir, context); + DydXml.write(workingDir, context); + ParametersXml.write(workingDir, context); + if (context.withCurves()) { + CurvesXml.write(workingDir, context); + } + DumpFileParameters dumpFileParameters = context.getDynaWaltzParameters().getDumpFileParameters(); + if (dumpFileParameters.useDumpFile()) { + Path dumpFilePath = dumpFileParameters.getDumpFilePath(); + if (dumpFilePath != null) { + Files.copy(dumpFilePath, workingDir.resolve(dumpFileParameters.dumpFile()), StandardCopyOption.REPLACE_EXISTING); } - - } catch (IOException e) { - throw new UncheckedIOException(e); - } catch (XMLStreamException e) { - throw new UncheckedXmlStreamException(e); } } } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynawaltzReports.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynawaltzReports.java new file mode 100644 index 000000000..06ee86e81 --- /dev/null +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynawaltzReports.java @@ -0,0 +1,71 @@ +/** + * 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/. + * SPDX-License-Identifier: MPL-2.0 + */ +package com.powsybl.dynawaltz; + +import com.powsybl.commons.reporter.Report; +import com.powsybl.commons.reporter.Reporter; +import com.powsybl.commons.reporter.TypedValue; + +/** + * @author Laurent Issertial + */ +public final class DynawaltzReports { + + private DynawaltzReports() { + } + + public static Reporter createDynaWaltzReporter(Reporter reporter, String networkId) { + return reporter.createSubReporter("dynawaltz", + "Dynawaltz dynamic simulation on network '${networkId}'", + "networkId", networkId); + } + + public static Reporter createDynaWaltzContextReporter(Reporter reporter) { + return reporter.createSubReporter("dynawaltzContext", + "Dynawaltz models processing"); + } + + public static void reportDuplicateStaticId(Reporter reporter, String duplicateId, String modelName, String dynamicId) { + reporter.report(Report.builder() + .withKey("duplicateStaticId") + .withDefaultMessage("Duplicate static id found: ${duplicateId} -> model ${modelName} ${dynamicId} will be skipped") + .withValue("duplicateId", duplicateId) + .withValue("modelName", modelName) + .withValue("dynamicId", dynamicId) + .withSeverity(TypedValue.WARN_SEVERITY) + .build()); + } + + public static void reportDuplicateDynamicId(Reporter reporter, String duplicateId, String modelName) { + reporter.report(Report.builder() + .withKey("duplicateDynamicId") + .withDefaultMessage("Duplicate dynamic id found: ${duplicateId} -> model ${modelName} will be skipped") + .withValue("duplicateId", duplicateId) + .withValue("modelName", modelName) + .withSeverity(TypedValue.WARN_SEVERITY) + .build()); + } + + public static void reportEmptyTapChanger(Reporter reporter, String dynamicId) { + reporter.report(Report.builder() + .withKey("emptyTC") + .withDefaultMessage("TapChangerAutomaton ${dynamicId} load does not possess a transformer, the automaton will be skipped") + .withValue("dynamicId", dynamicId) + .withSeverity(TypedValue.WARN_SEVERITY) + .build()); + } + + public static void reportEmptyTapChangerBlockingAutomaton(Reporter reporter, String dynamicId) { + reporter.report(Report.builder() + .withKey("emptyTCB") + .withDefaultMessage("None of TapChangerBlockingAutomaton {} equipments are TapChangerModel, the automaton will be skipped") + .withValue("dynamicId", dynamicId) + .withSeverity(TypedValue.WARN_SEVERITY) + .build()); + } +} diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/TapChangerAutomaton.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/TapChangerAutomaton.java index 516d1c2d4..a1e8780fe 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/TapChangerAutomaton.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/TapChangerAutomaton.java @@ -8,14 +8,13 @@ package com.powsybl.dynawaltz.models.automatons; import com.powsybl.dynawaltz.DynaWaltzContext; +import com.powsybl.dynawaltz.DynawaltzReports; import com.powsybl.dynawaltz.models.AbstractPureDynamicBlackBoxModel; import com.powsybl.dynawaltz.models.TransformerSide; import com.powsybl.dynawaltz.models.VarConnection; import com.powsybl.dynawaltz.models.loads.LoadWithTransformers; import com.powsybl.dynawaltz.models.transformers.TapChangerModel; import com.powsybl.iidm.network.Load; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; @@ -27,8 +26,6 @@ */ public class TapChangerAutomaton extends AbstractPureDynamicBlackBoxModel implements TapChangerModel { - private static final Logger LOGGER = LoggerFactory.getLogger(TapChangerAutomaton.class); - private final Load load; private final TransformerSide side; @@ -66,7 +63,7 @@ public void createMacroConnections(DynaWaltzContext context) { boolean isSkipped = createMacroConnectionsOrSkip(load, LoadWithTransformers.class, this::getVarConnectionsWith, context); if (isSkipped) { connection = ConnectionState.NOT_CONNECTED; - LOGGER.warn("TapChangerAutomaton {} load does not possess a transformer, the automaton will be skipped", getDynamicModelId()); + DynawaltzReports.reportEmptyTapChanger(context.getReporter(), getDynamicModelId()); } else { connection = ConnectionState.CONNECTED; } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/TapChangerBlockingAutomaton.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/TapChangerBlockingAutomaton.java index 78777cf85..7ed93890c 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/TapChangerBlockingAutomaton.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/TapChangerBlockingAutomaton.java @@ -9,6 +9,7 @@ import com.powsybl.commons.PowsyblException; import com.powsybl.dynawaltz.DynaWaltzContext; +import com.powsybl.dynawaltz.DynawaltzReports; import com.powsybl.dynawaltz.models.AbstractPureDynamicBlackBoxModel; import com.powsybl.dynawaltz.models.MeasurementPointSuffix; import com.powsybl.dynawaltz.models.VarConnection; @@ -18,8 +19,6 @@ import com.powsybl.iidm.network.IdentifiableType; import com.powsybl.iidm.network.Load; import com.powsybl.iidm.network.TwoWindingsTransformer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; @@ -30,7 +29,6 @@ */ public class TapChangerBlockingAutomaton extends AbstractPureDynamicBlackBoxModel { - private static final Logger LOGGER = LoggerFactory.getLogger(TapChangerBlockingAutomaton.class); private static final Set COMPATIBLE_EQUIPMENTS = EnumSet.of(IdentifiableType.LOAD, IdentifiableType.TWO_WINDINGS_TRANSFORMER); private static final int MAX_MEASUREMENTS = 5; @@ -104,7 +102,7 @@ public void createMacroConnections(DynaWaltzContext context) { } } else { isConnected = false; - LOGGER.warn("None of TapChangerBlockingAutomaton {} equipments are TapChangerModel, the automaton will be skipped", getDynamicModelId()); + DynawaltzReports.reportEmptyTapChangerBlockingAutomaton(context.getReporter(), getDynamicModelId()); } } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/AbstractEvent.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/AbstractEvent.java index 1891db848..813643272 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/AbstractEvent.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/AbstractEvent.java @@ -25,12 +25,12 @@ public abstract class AbstractEvent extends AbstractPureDynamicBlackBoxModel imp private final double startTime; protected AbstractEvent(Identifiable equipment, double startTime, String eventPrefix) { - super(generateEventId(equipment.getId(), eventPrefix)); + super(generateEventId(eventPrefix, equipment.getId())); this.equipment = equipment; this.startTime = startTime; } - private static String generateEventId(String equipmentStaticId, String eventPrefix) { + public static String generateEventId(String eventPrefix, String equipmentStaticId) { return eventPrefix + equipmentStaticId; } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/utils/SideConverter.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/utils/SideConverter.java index 2c368c76e..b98214c53 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/utils/SideConverter.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/utils/SideConverter.java @@ -8,8 +8,7 @@ package com.powsybl.dynawaltz.models.utils; import com.powsybl.dynawaltz.models.Side; -import com.powsybl.iidm.network.Branch; -import com.powsybl.iidm.network.HvdcLine; +import com.powsybl.iidm.network.TwoSides; /** * @author Laurent Issertial {@literal } @@ -19,17 +18,17 @@ public final class SideConverter { private SideConverter() { } - public static Side convert(Branch.Side side) { + public static Side convert(TwoSides side) { return switch (side) { case ONE -> Side.ONE; case TWO -> Side.TWO; }; } - public static HvdcLine.Side convert(Side side) { + public static TwoSides convert(Side side) { return switch (side) { - case ONE -> HvdcLine.Side.ONE; - case TWO -> HvdcLine.Side.TWO; + case ONE -> TwoSides.ONE; + case TWO -> TwoSides.TWO; }; } } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/XmlUtil.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/AbstractXmlDynawaltzWriter.java similarity index 54% rename from dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/XmlUtil.java rename to dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/AbstractXmlDynawaltzWriter.java index 59f93e77e..281ce2ff4 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/XmlUtil.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/AbstractXmlDynawaltzWriter.java @@ -1,12 +1,13 @@ /** - * Copyright (c) 2020, RTE (http://www.rte-france.com) + * 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/. + * SPDX-License-Identifier: MPL-2.0 */ - package com.powsybl.dynawaltz.xml; +import com.powsybl.commons.exceptions.UncheckedXmlStreamException; import com.powsybl.dynawaltz.DynaWaltzContext; import javax.xml.stream.XMLStreamException; @@ -22,39 +23,43 @@ import static com.powsybl.dynawaltz.xml.DynaWaltzXmlConstants.DYN_URI; /** - * @author Mathieu Bague {@literal } + * @author Florian Dupuy {@literal } */ -public final class XmlUtil { +public abstract class AbstractXmlDynawaltzWriter implements XmlDynawaltzWriter { - @FunctionalInterface - public interface XmlDynawaltzWriter { - void write(XMLStreamWriter writer, DynaWaltzContext dynaWaltzContext) throws XMLStreamException; - } + private final String xmlFileName; + private final String xmlRootName; - private XmlUtil() { + protected AbstractXmlDynawaltzWriter(String xmlFileName, String xmlRootName) { + this.xmlFileName = Objects.requireNonNull(xmlFileName); + this.xmlRootName = Objects.requireNonNull(xmlRootName); } - public static void write(Path file, DynaWaltzContext context, String elementName, XmlDynawaltzWriter xmlDynawaltzWriter) throws IOException, XMLStreamException { - Objects.requireNonNull(file); + @Override + public void createXmlFileFromContext(Path workingDir, DynaWaltzContext context) throws IOException { + Objects.requireNonNull(workingDir); Objects.requireNonNull(context); - Objects.requireNonNull(elementName); - Objects.requireNonNull(xmlDynawaltzWriter); + Path file = workingDir.resolve(xmlFileName); try (Writer writer = Files.newBufferedWriter(file, StandardCharsets.UTF_8)) { XMLStreamWriter xmlWriter = XmlStreamWriterFactory.newInstance(writer); try { xmlWriter.writeStartDocument(StandardCharsets.UTF_8.toString(), "1.0"); xmlWriter.setPrefix(DYN_PREFIX, DYN_URI); - xmlWriter.writeStartElement(DYN_URI, elementName); + xmlWriter.writeStartElement(DYN_URI, xmlRootName); xmlWriter.writeNamespace(DYN_PREFIX, DYN_URI); - xmlDynawaltzWriter.write(xmlWriter, context); + write(xmlWriter, context); xmlWriter.writeEndElement(); xmlWriter.writeEndDocument(); } finally { xmlWriter.close(); } + } catch (XMLStreamException e) { + throw new UncheckedXmlStreamException(e); } } + + abstract void write(XMLStreamWriter writer, DynaWaltzContext dynaWaltzContext) throws XMLStreamException; } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/CurvesXml.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/CurvesXml.java index 1de66e92c..3fe6aec83 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/CurvesXml.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/CurvesXml.java @@ -14,7 +14,6 @@ import javax.xml.stream.XMLStreamWriter; import java.io.IOException; import java.nio.file.Path; -import java.util.Objects; import static com.powsybl.dynawaltz.xml.DynaWaltzConstants.CRV_FILENAME; import static com.powsybl.dynawaltz.xml.DynaWaltzXmlConstants.DYN_URI; @@ -22,19 +21,18 @@ /** * @author Marcos de Miguel {@literal } */ -public final class CurvesXml { +public final class CurvesXml extends AbstractXmlDynawaltzWriter { private CurvesXml() { + super(CRV_FILENAME, "curvesInput"); } - public static void write(Path workingDir, DynaWaltzContext context) throws IOException, XMLStreamException { - Objects.requireNonNull(workingDir); - Path file = workingDir.resolve(CRV_FILENAME); - - XmlUtil.write(file, context, "curvesInput", CurvesXml::write); + public static void write(Path workingDir, DynaWaltzContext context) throws IOException { + new CurvesXml().createXmlFileFromContext(workingDir, context); } - private static void write(XMLStreamWriter writer, DynaWaltzContext context) throws XMLStreamException { + @Override + public void write(XMLStreamWriter writer, DynaWaltzContext context) throws XMLStreamException { for (Curve curve : context.getCurves()) { DynaWaltzCurve dynCurve = (DynaWaltzCurve) curve; writer.writeEmptyElement(DYN_URI, "curve"); diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/DydXml.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/DydXml.java index c477e2b7f..6774e22e6 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/DydXml.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/DydXml.java @@ -16,26 +16,24 @@ import javax.xml.stream.XMLStreamWriter; import java.io.IOException; import java.nio.file.Path; -import java.util.Objects; import static com.powsybl.dynawaltz.xml.DynaWaltzConstants.DYD_FILENAME; /** * @author Mathieu Bague {@literal } */ -public final class DydXml { +public final class DydXml extends AbstractXmlDynawaltzWriter { private DydXml() { + super(DYD_FILENAME, "dynamicModelsArchitecture"); } - public static void write(Path workingDir, DynaWaltzContext context) throws IOException, XMLStreamException { - Objects.requireNonNull(workingDir); - Path file = workingDir.resolve(DYD_FILENAME); - - XmlUtil.write(file, context, "dynamicModelsArchitecture", DydXml::write); + public static void write(Path workingDir, DynaWaltzContext context) throws IOException { + new DydXml().createXmlFileFromContext(workingDir, context); } - private static void write(XMLStreamWriter writer, DynaWaltzContext context) throws XMLStreamException { + @Override + public void write(XMLStreamWriter writer, DynaWaltzContext context) throws XMLStreamException { // loop over the values of the map indexed by dynamicIds to write only once objects with the same dynamicId for (BlackBoxModel model : context.getBlackBoxDynamicModels()) { model.write(writer, context); diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/JobsXml.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/JobsXml.java index 329ad79f0..2dcf216b8 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/JobsXml.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/JobsXml.java @@ -15,7 +15,6 @@ import javax.xml.stream.XMLStreamWriter; import java.io.IOException; import java.nio.file.Path; -import java.util.Objects; import static com.powsybl.dynawaltz.xml.DynaWaltzConstants.*; import static com.powsybl.dynawaltz.xml.DynaWaltzXmlConstants.DYN_URI; @@ -23,19 +22,18 @@ /** * @author Marcos de Miguel {@literal } */ -public final class JobsXml { +public final class JobsXml extends AbstractXmlDynawaltzWriter { private JobsXml() { + super(JOBS_FILENAME, "jobs"); } - public static void write(Path workingDir, DynaWaltzContext context) throws IOException, XMLStreamException { - Objects.requireNonNull(workingDir); - Path file = workingDir.resolve(JOBS_FILENAME); - - XmlUtil.write(file, context, "jobs", JobsXml::write); + public static void write(Path workingDir, DynaWaltzContext context) throws IOException { + new JobsXml().createXmlFileFromContext(workingDir, context); } - private static void write(XMLStreamWriter writer, DynaWaltzContext context) throws XMLStreamException { + @Override + public void write(XMLStreamWriter writer, DynaWaltzContext context) throws XMLStreamException { writer.writeStartElement(DYN_URI, "job"); writer.writeAttribute("name", "Job"); writeSolver(writer, context); diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/ParametersXml.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/ParametersXml.java index 2d19b6999..5b0039a06 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/ParametersXml.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/ParametersXml.java @@ -9,6 +9,7 @@ import com.powsybl.commons.PowsyblException; import com.powsybl.commons.exceptions.UncheckedXmlStreamException; +import com.powsybl.commons.xml.XmlUtil; import com.powsybl.dynawaltz.DynaWaltzContext; import com.powsybl.dynawaltz.DynaWaltzParameters; import com.powsybl.dynawaltz.parameters.Parameter; @@ -93,8 +94,8 @@ public static ParametersSet load(Path parametersFile, String parameterSetId) { private static List readAndClose(XMLStreamReader xmlReader) throws XMLStreamException { List parametersSets = new ArrayList<>(); skipComments(xmlReader); - com.powsybl.commons.xml.XmlUtil.readUntilEndElement(PARAMETERS_SET_ELEMENT_NAME, xmlReader, () -> { - if (!xmlReader.getLocalName().equals("set")) { + XmlUtil.readSubElements(xmlReader, elementName -> { + if (!elementName.equals("set")) { closeAndThrowException(xmlReader, xmlReader.getLocalName()); } String parameterSetIdRead = xmlReader.getAttributeValue(null, "id"); @@ -107,40 +108,49 @@ private static List readAndClose(XMLStreamReader xmlReader) throw private static ParametersSet readOneSetAndClose(XMLStreamReader xmlReader, String parameterSetId) throws XMLStreamException { AtomicReference parametersSet = new AtomicReference<>(); skipComments(xmlReader); - com.powsybl.commons.xml.XmlUtil.readUntilEndElement(PARAMETERS_SET_ELEMENT_NAME, xmlReader, () -> { + XmlUtil.readSubElements(xmlReader, elementName -> { if (parametersSet.get() != null) { return; } - if (!xmlReader.getLocalName().equals("set")) { + if (!elementName.equals("set")) { closeAndThrowException(xmlReader, xmlReader.getLocalName()); } - if (xmlReader.getAttributeValue(null, "id").equals(parameterSetId)) { + String idSetRead = xmlReader.getAttributeValue(null, "id"); + if (idSetRead.equals(parameterSetId)) { parametersSet.set(createParametersSet(xmlReader, parameterSetId)); } else { - com.powsybl.commons.xml.XmlUtil.readUntilEndElement("set", xmlReader, () -> { - }); + XmlUtil.readSubElements(xmlReader); } }); xmlReader.close(); return parametersSet.get(); } - private static ParametersSet createParametersSet(XMLStreamReader xmlReader, String parameterSetId) throws XMLStreamException { + private static ParametersSet createParametersSet(XMLStreamReader xmlReader, String parameterSetId) { ParametersSet parametersSet = new ParametersSet(parameterSetId); - com.powsybl.commons.xml.XmlUtil.readUntilEndElement("set", xmlReader, () -> { - String name = xmlReader.getAttributeValue(null, "name"); - ParameterType type = ParameterType.valueOf(xmlReader.getAttributeValue(null, "type")); - if (xmlReader.getLocalName().equals("par")) { - String value = xmlReader.getAttributeValue(null, "value"); - parametersSet.addParameter(name, type, value); - } else if (xmlReader.getLocalName().equals("reference")) { - String origData = xmlReader.getAttributeValue(null, "origData"); - String origName = xmlReader.getAttributeValue(null, "origName"); - String componentId = xmlReader.getAttributeValue(null, "componentId"); - parametersSet.addReference(name, type, origData, origName, componentId); - } else { - closeAndThrowException(xmlReader, xmlReader.getLocalName()); + XmlUtil.readSubElements(xmlReader, elementName -> { + try { + String name = xmlReader.getAttributeValue(null, "name"); + ParameterType type = ParameterType.valueOf(xmlReader.getAttributeValue(null, "type")); + switch (elementName) { + case "par" -> { + String value = xmlReader.getAttributeValue(null, "value"); + XmlUtil.readEndElementOrThrow(xmlReader); + parametersSet.addParameter(name, type, value); + } + case "reference" -> { + String origData = xmlReader.getAttributeValue(null, "origData"); + String origName = xmlReader.getAttributeValue(null, "origName"); + String componentId = xmlReader.getAttributeValue(null, "componentId"); + XmlUtil.readEndElementOrThrow(xmlReader); + parametersSet.addReference(name, type, origData, origName, componentId); + } + default -> closeAndThrowException(xmlReader, xmlReader.getLocalName()); + } + } catch (XMLStreamException e) { + throw new UncheckedXmlStreamException(e); } + }); return parametersSet; } @@ -159,12 +169,16 @@ private static void skipComments(XMLStreamReader xmlReader) throws XMLStreamExce } } - private static void closeAndThrowException(XMLStreamReader xmlReader, String unexpectedElement) throws XMLStreamException { - xmlReader.close(); + private static void closeAndThrowException(XMLStreamReader xmlReader, String unexpectedElement) { + try { + xmlReader.close(); + } catch (XMLStreamException e) { + throw new UncheckedXmlStreamException(e); + } throw new PowsyblException("Unexpected element: " + unexpectedElement); } - public static void write(Path workingDir, DynaWaltzContext context) throws IOException, XMLStreamException { + public static void write(Path workingDir, DynaWaltzContext context) { Objects.requireNonNull(workingDir); write(context.getDynamicModelsParameters(), context.getSimulationParFile(), workingDir, DYN_PREFIX); @@ -174,7 +188,7 @@ public static void write(Path workingDir, DynaWaltzContext context) throws IOExc write(List.of(parameters.getSolverParameters()), DynaWaltzParameters.SOLVER_OUTPUT_PARAMETERS_FILE, workingDir, ""); } - private static void write(Collection parametersSets, String filename, Path workingDir, String dynPrefix) throws IOException, XMLStreamException { + private static void write(Collection parametersSets, String filename, Path workingDir, String dynPrefix) { Path parametersPath = workingDir.resolve(filename); try (Writer writer = Files.newBufferedWriter(parametersPath, StandardCharsets.UTF_8)) { XMLStreamWriter xmlWriter = XmlStreamWriterFactory.newInstance(writer); @@ -191,6 +205,10 @@ private static void write(Collection parametersSets, String filen } finally { xmlWriter.close(); } + } catch (IOException e) { + throw new UncheckedIOException(e); + } catch (XMLStreamException e) { + throw new UncheckedXmlStreamException(e); } } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/XmlDynawaltzWriter.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/XmlDynawaltzWriter.java new file mode 100644 index 000000000..4668e8f06 --- /dev/null +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/XmlDynawaltzWriter.java @@ -0,0 +1,21 @@ +/** + * 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/. + * SPDX-License-Identifier: MPL-2.0 + */ +package com.powsybl.dynawaltz.xml; + +import com.powsybl.dynawaltz.DynaWaltzContext; + +import java.io.IOException; +import java.nio.file.Path; + +/** + * @author Florian Dupuy {@literal } + */ +@FunctionalInterface +public interface XmlDynawaltzWriter { + void createXmlFileFromContext(Path workingDir, DynaWaltzContext context) throws IOException; +} diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/DynaWaltzParametersTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/DynaWaltzParametersTest.java index c5c84add3..3a27d257a 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/DynaWaltzParametersTest.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/DynaWaltzParametersTest.java @@ -9,7 +9,7 @@ import com.powsybl.commons.PowsyblException; import com.powsybl.commons.config.InMemoryPlatformConfig; import com.powsybl.commons.config.MapModuleConfig; -import com.powsybl.commons.test.AbstractConverterTest; +import com.powsybl.commons.test.AbstractSerDeTest; import com.powsybl.dynamicsimulation.DynamicSimulationParameters; import com.powsybl.dynamicsimulation.json.JsonDynamicSimulationParameters; import com.powsybl.dynawaltz.DynaWaltzParameters.SolverType; @@ -31,7 +31,7 @@ /** * @author Marcos de Miguel {@literal } */ -class DynaWaltzParametersTest extends AbstractConverterTest { +class DynaWaltzParametersTest extends AbstractSerDeTest { public static final String USER_HOME = "/home/user/"; diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/DynaWaltzProviderTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/DynaWaltzProviderTest.java index 8324633b4..c6dbbe031 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/DynaWaltzProviderTest.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/DynaWaltzProviderTest.java @@ -7,7 +7,8 @@ package com.powsybl.dynawaltz; import com.powsybl.commons.PowsyblException; -import com.powsybl.commons.test.AbstractConverterTest; +import com.powsybl.commons.reporter.Reporter; +import com.powsybl.commons.test.AbstractSerDeTest; import com.powsybl.computation.ComputationManager; import com.powsybl.computation.local.LocalCommandExecutor; import com.powsybl.computation.local.LocalComputationConfig; @@ -31,13 +32,14 @@ import java.util.Map; import java.util.concurrent.ForkJoinPool; +import static com.powsybl.commons.reporter.Reporter.NO_OP; import static org.junit.jupiter.api.Assertions.*; /** * @author Florian Dupuy {@literal } * @author Marcos de Miguel {@literal } */ -class DynaWaltzProviderTest extends AbstractConverterTest { +class DynaWaltzProviderTest extends AbstractSerDeTest { private static final String OUTPUT_IIDM_FILENAME = "outputIIDM.xml"; private DynaWaltzConfig config; @@ -49,9 +51,8 @@ public void setUp() throws IOException { } public static class CurvesSupplierMock implements CurvesSupplier { - @Override - public List get(Network network) { + public List get(Network network, Reporter reporter) { return Collections.singletonList(new DynaWaltzCurve("bus", "uPu")); } } @@ -86,9 +87,9 @@ void testWithMergeLoads() throws Exception { ComputationManager computationManager = new LocalComputationManager(new LocalComputationConfig(tmpDir, 1), commandExecutor, ForkJoinPool.commonPool()); DynamicSimulation.Runner dynawoSimulation = DynamicSimulation.find(); assertEquals(DynaWaltzProvider.NAME, dynawoSimulation.getName()); - DynamicSimulationResult result = dynawoSimulation.run(network, n -> Collections.emptyList(), EventModelsSupplier.empty(), + DynamicSimulationResult result = dynawoSimulation.run(network, (n, r) -> Collections.emptyList(), EventModelsSupplier.empty(), CurvesSupplier.empty(), network.getVariantManager().getWorkingVariantId(), - computationManager, DynamicSimulationParameters.load()); + computationManager, DynamicSimulationParameters.load(), NO_OP); assertNotNull(result); } @@ -104,7 +105,7 @@ void testWithoutMergeLoads() throws Exception { dynamicSimulationParameters.addExtension(DynaWaltzParameters.class, dynaWaltzParameters); assertEquals(DynaWaltzProvider.NAME, dynawoSimulation.getName()); - DynamicSimulationResult result = dynawoSimulation.run(network, n -> Collections.emptyList(), EventModelsSupplier.empty(), + DynamicSimulationResult result = dynawoSimulation.run(network, (n, r) -> Collections.emptyList(), EventModelsSupplier.empty(), CurvesSupplier.empty(), network.getVariantManager().getWorkingVariantId(), computationManager, dynamicSimulationParameters); assertNotNull(result); @@ -128,9 +129,9 @@ void testWithDump() throws Exception { dynamicSimulationParameters.addExtension(DynaWaltzParameters.class, dynaWaltzParameters); assertEquals(DynaWaltzProvider.NAME, dynawoSimulation.getName()); - DynamicSimulationResult result = dynawoSimulation.run(network, n -> Collections.emptyList(), EventModelsSupplier.empty(), + DynamicSimulationResult result = dynawoSimulation.run(network, (n, r) -> Collections.emptyList(), EventModelsSupplier.empty(), CurvesSupplier.empty(), network.getVariantManager().getWorkingVariantId(), - computationManager, dynamicSimulationParameters); + computationManager, dynamicSimulationParameters, NO_OP); assertNotNull(result); } @@ -141,9 +142,9 @@ void testFail() throws Exception { ComputationManager computationManager = new LocalComputationManager(new LocalComputationConfig(tmpDir, 1), commandExecutor, ForkJoinPool.commonPool()); DynamicSimulation.Runner dynawoSimulation = DynamicSimulation.find(); assertEquals(DynaWaltzProvider.NAME, dynawoSimulation.getName()); - DynamicSimulationResult result = dynawoSimulation.run(network, n -> Collections.emptyList(), EventModelsSupplier.empty(), + DynamicSimulationResult result = dynawoSimulation.run(network, (n, r) -> Collections.emptyList(), EventModelsSupplier.empty(), CurvesSupplier.empty(), network.getVariantManager().getWorkingVariantId(), - computationManager, DynamicSimulationParameters.load()); + computationManager, DynamicSimulationParameters.load(), NO_OP); assertNotNull(result); assertFalse(result.isOk()); } @@ -155,9 +156,9 @@ void testWithoutCurves() throws Exception { ComputationManager computationManager = new LocalComputationManager(new LocalComputationConfig(tmpDir, 1), commandExecutor, ForkJoinPool.commonPool()); DynamicSimulation.Runner dynawoSimulation = DynamicSimulation.find(); assertEquals(DynaWaltzProvider.NAME, dynawoSimulation.getName()); - DynamicSimulationResult result = dynawoSimulation.run(network, n -> Collections.emptyList(), EventModelsSupplier.empty(), + DynamicSimulationResult result = dynawoSimulation.run(network, (n, r) -> Collections.emptyList(), EventModelsSupplier.empty(), new CurvesSupplierMock(), network.getVariantManager().getWorkingVariantId(), - computationManager, DynamicSimulationParameters.load()); + computationManager, DynamicSimulationParameters.load(), NO_OP); assertNotNull(result); assertFalse(result.isOk()); } @@ -189,12 +190,12 @@ void testCallingBadVersionDynawo() throws Exception { ComputationManager computationManager = new LocalComputationManager(new LocalComputationConfig(tmpDir, 1), commandExecutor, ForkJoinPool.commonPool()); DynamicSimulation.Runner dynawoSimulation = DynamicSimulation.find(); assertEquals(DynaWaltzProvider.NAME, dynawoSimulation.getName()); - DynamicModelsSupplier dms = n -> Collections.emptyList(); + DynamicModelsSupplier dms = (n, r) -> Collections.emptyList(); EventModelsSupplier ems = EventModelsSupplier.empty(); CurvesSupplier cs = CurvesSupplier.empty(); String wvId = network.getVariantManager().getWorkingVariantId(); DynamicSimulationParameters dsp = DynamicSimulationParameters.load(); - PowsyblException e = assertThrows(PowsyblException.class, () -> dynawoSimulation.run(network, dms, ems, cs, wvId, computationManager, dsp)); + PowsyblException e = assertThrows(PowsyblException.class, () -> dynawoSimulation.run(network, dms, ems, cs, wvId, computationManager, dsp, NO_OP)); assertEquals("dynawo version not supported. Must be >= " + DynawoConstants.VERSION_MIN, e.getMessage()); } diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/AbstractDynamicModelXmlTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/AbstractDynamicModelXmlTest.java index f8f909f3d..74a4f73a5 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/AbstractDynamicModelXmlTest.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/AbstractDynamicModelXmlTest.java @@ -7,7 +7,7 @@ */ package com.powsybl.dynawaltz.xml; -import com.powsybl.commons.test.AbstractConverterTest; +import com.powsybl.commons.test.AbstractSerDeTest; import com.powsybl.dynamicsimulation.Curve; import com.powsybl.dynamicsimulation.DynamicSimulationParameters; import com.powsybl.dynawaltz.DynaWaltzContext; @@ -37,7 +37,7 @@ /** * @author Laurent Issertial {@literal } */ -public abstract class AbstractDynamicModelXmlTest extends AbstractConverterTest { +public abstract class AbstractDynamicModelXmlTest extends AbstractSerDeTest { protected Network network; protected List dynamicModels = new ArrayList<>(); diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/AbstractParametrizedDynamicModelXmlTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/AbstractParametrizedDynamicModelXmlTest.java index 253fd2dc5..c0a138037 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/AbstractParametrizedDynamicModelXmlTest.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/AbstractParametrizedDynamicModelXmlTest.java @@ -7,7 +7,7 @@ */ package com.powsybl.dynawaltz.xml; -import com.powsybl.commons.test.AbstractConverterTest; +import com.powsybl.commons.test.AbstractSerDeTest; import com.powsybl.dynamicsimulation.Curve; import com.powsybl.dynamicsimulation.DynamicSimulationParameters; import com.powsybl.dynawaltz.DynaWaltzContext; @@ -35,7 +35,7 @@ /** * @author Laurent Issertial {@literal } */ -abstract class AbstractParametrizedDynamicModelXmlTest extends AbstractConverterTest { +abstract class AbstractParametrizedDynamicModelXmlTest extends AbstractSerDeTest { protected Network network; protected List dynamicModels = new ArrayList<>(); diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DynaWaltzTestUtil.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DynaWaltzTestUtil.java index 8dc9a2052..cc1f12c23 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DynaWaltzTestUtil.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DynaWaltzTestUtil.java @@ -6,7 +6,7 @@ */ package com.powsybl.dynawaltz.xml; -import com.powsybl.commons.test.AbstractConverterTest; +import com.powsybl.commons.test.AbstractSerDeTest; import com.powsybl.dynamicsimulation.Curve; import com.powsybl.dynawaltz.DynaWaltzCurve; import com.powsybl.dynawaltz.models.BlackBoxModel; @@ -43,7 +43,7 @@ /** * @author Marcos de Miguel {@literal } */ -public class DynaWaltzTestUtil extends AbstractConverterTest { +public class DynaWaltzTestUtil extends AbstractSerDeTest { protected Network network; protected List dynamicModels; diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/ParametersXmlTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/ParametersXmlTest.java index 8ee5e79bb..e71d57ba9 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/ParametersXmlTest.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/ParametersXmlTest.java @@ -13,7 +13,6 @@ import org.junit.jupiter.api.Test; import org.xml.sax.SAXException; -import javax.xml.stream.XMLStreamException; import java.io.IOException; /** @@ -22,7 +21,7 @@ class ParametersXmlTest extends DynaWaltzTestUtil { @Test - void writeOmegaRef() throws SAXException, IOException, XMLStreamException { + void writeOmegaRef() throws SAXException, IOException { DynamicSimulationParameters parameters = DynamicSimulationParameters.load(); DynaWaltzParameters dynawoParameters = DynaWaltzParameters.load(PlatformConfig.defaultConfig(), fileSystem); DynaWaltzContext context = new DynaWaltzContext(network, network.getVariantManager().getWorkingVariantId(), dynamicModels, eventModels, curves, parameters, dynawoParameters); diff --git a/dynawo-integration-tests/src/test/java/com/powsybl/dynawo/it/DynaWaltzTest.java b/dynawo-integration-tests/src/test/java/com/powsybl/dynawo/it/DynaWaltzTest.java index b60287a5c..09fce25bf 100644 --- a/dynawo-integration-tests/src/test/java/com/powsybl/dynawo/it/DynaWaltzTest.java +++ b/dynawo-integration-tests/src/test/java/com/powsybl/dynawo/it/DynaWaltzTest.java @@ -8,6 +8,7 @@ import com.powsybl.commons.datasource.ResourceDataSource; import com.powsybl.commons.datasource.ResourceSet; +import com.powsybl.commons.reporter.Reporter; import com.powsybl.dynamicsimulation.*; import com.powsybl.dynamicsimulation.groovy.*; import com.powsybl.dynawaltz.DumpFileParameters; @@ -81,7 +82,7 @@ void testIeee14() { .setDefaultDumpFileParameters(); DynamicSimulationResult result = provider.run(network, dynamicModelsSupplier, eventModelsSupplier, curvesSupplier, - VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters) + VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters, Reporter.NO_OP) .join(); assertTrue(result.isOk()); @@ -125,7 +126,7 @@ void testIeee14WithDump() throws IOException { .setDumpFileParameters(dumpFileParameters); DynamicSimulationResult result = provider.run(network, dynamicModelsSupplier, eventModelsSupplier, curvesSupplier, - VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters) + VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters, Reporter.NO_OP) .join(); assertTrue(result.isOk()); @@ -140,7 +141,7 @@ void testIeee14WithDump() throws IOException { dynaWaltzParameters.setDumpFileParameters(DumpFileParameters.createImportDumpFileParameters(dumpDir, dumpFile)); result = provider.run(network, dynamicModelsSupplier, eventModelsSupplier, curvesSupplier, - VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters) + VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters, Reporter.NO_OP) .join(); assertTrue(result.isOk()); @@ -165,7 +166,7 @@ void testSvc() { .setDefaultDumpFileParameters(); DynamicSimulationResult result = provider.run(network, dynamicModelsSupplier, EventModelsSupplier.empty(), CurvesSupplier.empty(), - VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters) + VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters, Reporter.NO_OP) .join(); assertTrue(result.isOk()); @@ -193,7 +194,7 @@ void testHvdc() { .setDefaultDumpFileParameters(); DynamicSimulationResult result = provider.run(network, dynamicModelsSupplier, EventModelsSupplier.empty(), CurvesSupplier.empty(), - VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters) + VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters, Reporter.NO_OP) .join(); assertTrue(result.isOk()); @@ -230,7 +231,7 @@ void testSmib() { .setDefaultDumpFileParameters(); DynamicSimulationResult result = provider.run(network, dynamicModelsSupplier, eventModelsSupplier, curvesSupplier, - VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters) + VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters, Reporter.NO_OP) .join(); assertTrue(result.isOk()); diff --git a/dynawo-integration-tests/src/test/resources/ieee14/disconnectline/eventModels.groovy b/dynawo-integration-tests/src/test/resources/ieee14/disconnectline/eventModels.groovy index 585e7a483..f15f829a7 100644 --- a/dynawo-integration-tests/src/test/resources/ieee14/disconnectline/eventModels.groovy +++ b/dynawo-integration-tests/src/test/resources/ieee14/disconnectline/eventModels.groovy @@ -5,10 +5,10 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import com.powsybl.iidm.network.Branch +import com.powsybl.iidm.network.TwoSides Disconnect { staticId "_BUS____1-BUS____5-1_AC" startTime 1 - disconnectOnly Branch.Side.TWO + disconnectOnly TwoSides.TWO } diff --git a/pom.xml b/pom.xml index ddfdb8c4c..ec3734768 100644 --- a/pom.xml +++ b/pom.xml @@ -56,7 +56,7 @@ 17 - 6.0.1 + 6.1.0-alpha-1 4.0.14 ../distribution/target/site/jacoco-aggregate/jacoco.xml,