From f281783beba73a64d05eab1a1199a99d6eed2942 Mon Sep 17 00:00:00 2001 From: Lisrte Date: Wed, 21 Feb 2024 15:13:47 +0100 Subject: [PATCH] Builder list setter (#330) Signed-off-by: lisrte --- ...ynaWaltzDynamicModelGroovyExtension.groovy | 1 + .../dsl/DynamicModelsSupplierTest.java | 10 +- .../dynamicModels/tapChangerBlocking.groovy | 4 +- .../tapChangerBlockingBusBar.groovy | 3 +- .../warnings/tapChangerCompatible.groovy | 3 +- .../warnings/tapChangerMissingBusList.groovy | 4 +- .../builders/BuilderEquipmentsList.java | 86 ++++++++++++++++++ .../builders/BuilderIdListEquipmentList.java | 39 ++++++++ .../dynawaltz/builders/BuildersUtil.java | 3 + .../powsybl/dynawaltz/builders/Reporters.java | 12 ++- .../TapChangerBlockingAutomaton.java | 23 ++--- .../TapChangerBlockingAutomatonBuilder.java | 91 +++++++------------ 12 files changed, 193 insertions(+), 86 deletions(-) create mode 100644 dynawaltz/src/main/java/com/powsybl/dynawaltz/builders/BuilderEquipmentsList.java create mode 100644 dynawaltz/src/main/java/com/powsybl/dynawaltz/builders/BuilderIdListEquipmentList.java diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/DynaWaltzDynamicModelGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/DynaWaltzDynamicModelGroovyExtension.groovy index 2380df6e7..9d34b6e22 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/DynaWaltzDynamicModelGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/DynaWaltzDynamicModelGroovyExtension.groovy @@ -40,6 +40,7 @@ class DynaWaltzDynamicModelGroovyExtension implements DynamicModelGroovyExtensio builderConfigs.stream().flatMap { it -> it.libs}.toList() as List } + @Override void load(Binding binding, Consumer consumer, Reporter reporter) { builderConfigs.forEach {conf -> 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 7d23dba53..baecef3ef 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 @@ -264,9 +264,8 @@ private static Stream provideWarningsModel() { + DSL tests + Groovy Dynamic Models Supplier + DSL model builder for TapChangerBlockingAutomaton - 'uMeasurements' field value 'LOAD' not found for equipment type(s) BUS/BUSBAR_SECTION - 'uMeasurements' field value 'Wrong_ID' not found for equipment type(s) BUS/BUSBAR_SECTION - 'uMeasurements' field value 'NGEN_NHV1' not found for equipment type(s) BUS/BUSBAR_SECTION + 'uMeasurements' field value '[LOAD, Wrong_ID]' not found for equipment type(s) BUS/BUSBAR_SECTION + 'uMeasurements' field value '[NGEN_NHV1]' not found for equipment type(s) BUS/BUSBAR_SECTION 'uMeasurements' list is empty Model ZAB cannot be instantiated """), @@ -275,8 +274,9 @@ private static Stream provideWarningsModel() { + 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 + 'transformers' field value 'GEN' not found for equipment type(s) TWO_WINDINGS_TRANSFORMER/LOAD, id will be used as pure dynamic model id + 'uMeasurements' field value 'GEN' not found for equipment type(s) BUS/BUSBAR_SECTION + 'uMeasurements' list is empty Model ZAB cannot be instantiated """), Arguments.of("/warnings/hvdcVscWrongStaticType.groovy", HvdcTestNetwork.createLcc(), diff --git a/dynawaltz-dsl/src/test/resources/dynamicModels/tapChangerBlocking.groovy b/dynawaltz-dsl/src/test/resources/dynamicModels/tapChangerBlocking.groovy index d11424d4b..5d41fb5f0 100644 --- a/dynawaltz-dsl/src/test/resources/dynamicModels/tapChangerBlocking.groovy +++ b/dynawaltz-dsl/src/test/resources/dynamicModels/tapChangerBlocking.groovy @@ -8,9 +8,11 @@ package dynamicModels +List[] measurements = [["OldId", "NGEN", "NHV1"], ["NHV1", "OldId"], ["NHV2"]] + TapChangerBlockingAutomaton { dynamicModelId "ZAB" parameterSetId "ZAB" - uMeasurements ["OldId", "NGEN", "NHV1"], ["NHV1", "OldId"], ["NHV2"] + uMeasurements measurements transformers "NGEN_NHV1", "NHV2_NLOAD", "LOAD" } diff --git a/dynawaltz-dsl/src/test/resources/dynamicModels/tapChangerBlockingBusBar.groovy b/dynawaltz-dsl/src/test/resources/dynamicModels/tapChangerBlockingBusBar.groovy index 3372d8f88..1a3274b70 100644 --- a/dynawaltz-dsl/src/test/resources/dynamicModels/tapChangerBlockingBusBar.groovy +++ b/dynawaltz-dsl/src/test/resources/dynamicModels/tapChangerBlockingBusBar.groovy @@ -8,10 +8,11 @@ package dynamicModels +def measurements = ["S1VL2_BBS1", "OldId", "S3VL1_BBS"] TapChangerBlockingAutomaton { dynamicModelId "ZAB" parameterSetId "ZAB" - uMeasurements "S1VL2_BBS1", "OldId", "S3VL1_BBS" + uMeasurements measurements transformers "TWT", "LD1" } diff --git a/dynawaltz-dsl/src/test/resources/warnings/tapChangerCompatible.groovy b/dynawaltz-dsl/src/test/resources/warnings/tapChangerCompatible.groovy index fadc96fe4..dedb879b9 100644 --- a/dynawaltz-dsl/src/test/resources/warnings/tapChangerCompatible.groovy +++ b/dynawaltz-dsl/src/test/resources/warnings/tapChangerCompatible.groovy @@ -5,13 +5,12 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. * SPDX-License-Identifier: MPL-2.0 */ - package warnings TapChangerBlockingAutomaton { dynamicModelId "ZAB" parameterSetId "ZAB" - uMeasurements "NGEN" + uMeasurements "GEN" transformers "GEN" } diff --git a/dynawaltz-dsl/src/test/resources/warnings/tapChangerMissingBusList.groovy b/dynawaltz-dsl/src/test/resources/warnings/tapChangerMissingBusList.groovy index 036e8aa03..739eb6d00 100644 --- a/dynawaltz-dsl/src/test/resources/warnings/tapChangerMissingBusList.groovy +++ b/dynawaltz-dsl/src/test/resources/warnings/tapChangerMissingBusList.groovy @@ -5,13 +5,13 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. * SPDX-License-Identifier: MPL-2.0 */ - package warnings +List[] measurementPoints = [["LOAD", "Wrong_ID"], ["NGEN_NHV1"]] TapChangerBlockingAutomaton { dynamicModelId "ZAB" parameterSetId "ZAB" - uMeasurements ["LOAD", "Wrong_ID"], ["NGEN_NHV1"] + uMeasurements measurementPoints transformers "NGEN_NHV1", "NHV2_NLOAD", "LOAD" } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/builders/BuilderEquipmentsList.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/builders/BuilderEquipmentsList.java new file mode 100644 index 000000000..f69cbbe6d --- /dev/null +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/builders/BuilderEquipmentsList.java @@ -0,0 +1,86 @@ +/** + * Copyright (c) 2024, 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.builders; + +import com.powsybl.commons.reporter.Reporter; +import com.powsybl.iidm.network.Identifiable; +import com.powsybl.iidm.network.IdentifiableType; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.function.Function; + +/** + * @author Laurent Issertial {@literal } + */ +public class BuilderEquipmentsList> { + + private final String equipmentType; + private final String fieldName; + // when set to true equipment ids not found in the network are seen as dynamic ids for automatons and reported as such + private final boolean missingIdsHasDynamicIds; + protected List missingEquipmentIds = new ArrayList<>(); + protected final List equipments = new ArrayList<>(); + + public BuilderEquipmentsList(IdentifiableType identifiableType, String fieldName) { + this(identifiableType.toString(), fieldName, false); + } + + public BuilderEquipmentsList(String equipmentType, String fieldName) { + this(equipmentType, fieldName, false); + } + + public BuilderEquipmentsList(String equipmentType, String fieldName, boolean missingIdsHasDynamicIds) { + this.equipmentType = equipmentType; + this.fieldName = fieldName; + this.missingIdsHasDynamicIds = missingIdsHasDynamicIds; + } + + public void addEquipments(String[] staticIds, Function equipmentsSupplier) { + addEquipments(() -> Arrays.stream(staticIds).iterator(), equipmentsSupplier); + } + + public void addEquipments(Iterable staticIds, Function equipmentsSupplier) { + staticIds.forEach(id -> { + T equipment = equipmentsSupplier.apply(id); + if (equipment != null) { + equipments.add(equipment); + } else { + missingEquipmentIds.add(id); + } + }); + } + + public boolean checkEquipmentData(Reporter reporter) { + boolean emptyList = equipments.isEmpty(); + if (missingEquipmentIds.isEmpty() && emptyList) { + Reporters.reportFieldNotSet(reporter, fieldName); + return false; + } else if (!missingIdsHasDynamicIds) { + missingEquipmentIds.forEach(missingId -> + Reporters.reportStaticIdUnknown(reporter, fieldName, missingId, equipmentType)); + if (emptyList) { + Reporters.reportEmptyList(reporter, fieldName); + } + return !emptyList; + } else { + missingEquipmentIds.forEach(missingId -> + Reporters.reportUnknownStaticIdHandling(reporter, fieldName, missingId, equipmentType)); + return true; + } + } + + public List getEquipments() { + return equipments; + } + + public List getMissingEquipmentIds() { + return missingEquipmentIds; + } +} diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/builders/BuilderIdListEquipmentList.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/builders/BuilderIdListEquipmentList.java new file mode 100644 index 000000000..01071cbb1 --- /dev/null +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/builders/BuilderIdListEquipmentList.java @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2024, 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.builders; + +import com.powsybl.iidm.network.Identifiable; + +import java.util.Collection; +import java.util.Objects; +import java.util.function.Function; + +/** + * @author Laurent Issertial {@literal } + */ +public class BuilderIdListEquipmentList> extends BuilderEquipmentsList { + + public BuilderIdListEquipmentList(String equipmentType, String fieldName) { + super(equipmentType, fieldName); + } + + public void addEquipments(Collection[] staticIdsArray, Function equipmentSupplier) { + for (Collection staticIds : staticIdsArray) { + addEquipment(staticIds, equipmentSupplier); + } + } + + private void addEquipment(Collection staticIds, Function equipmentSupplier) { + staticIds.stream() + .map(equipmentSupplier) + .filter(Objects::nonNull) + .findFirst() + .ifPresentOrElse(equipments::add, + () -> missingEquipmentIds.add(staticIds.toString())); + } +} diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/builders/BuildersUtil.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/builders/BuildersUtil.java index f10c4bf1a..b6acfaf13 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/builders/BuildersUtil.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/builders/BuildersUtil.java @@ -8,6 +8,7 @@ package com.powsybl.dynawaltz.builders; import com.powsybl.iidm.network.Identifiable; +import com.powsybl.iidm.network.IdentifiableType; import com.powsybl.iidm.network.Network; /** @@ -15,6 +16,8 @@ */ public final class BuildersUtil { + public static final String MEASUREMENT_POINT_TYPE = IdentifiableType.BUS + "/" + IdentifiableType.BUSBAR_SECTION; + private BuildersUtil() { } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/builders/Reporters.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/builders/Reporters.java index e1f761b06..3e8ac3941 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/builders/Reporters.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/builders/Reporters.java @@ -72,7 +72,7 @@ public static void reportFieldNotSet(Reporter reporter, String fieldName) { public static void reportStaticIdUnknown(Reporter reporter, String fieldName, String staticId, String equipmentType) { reporter.report(Report.builder() - .withKey("staticIdUnknown") + .withKey("unknownStaticIdToDynamic") .withDefaultMessage("'${fieldName}' field value '${staticId}' not found for equipment type(s) ${equipmentType}") .withValue("equipmentType", equipmentType) .withValue(FIELD_NAME, fieldName) @@ -92,6 +92,16 @@ public static void reportDifferentNetwork(Reporter reporter, String fieldName, S .build()); } + public static void reportUnknownStaticIdHandling(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}, id will be used as pure dynamic model id") + .withValue("equipmentType", equipmentType) + .withValue(FIELD_NAME, fieldName).withValue("staticId", staticId) + .withSeverity(TypedValue.INFO_SEVERITY) + .build()); + } + public static void reportCrossThreshold(Reporter reporter, String fieldName, double fieldValue, String threshold) { reporter.report(Report.builder() .withKey("crossThreshold") 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 9427d67c0..69b844943 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 @@ -18,8 +18,6 @@ import com.powsybl.dynawaltz.models.transformers.TapChangerModel; import com.powsybl.iidm.network.Identifiable; import com.powsybl.iidm.network.IdentifiableType; -import com.powsybl.iidm.network.Load; -import com.powsybl.iidm.network.TwoWindingsTransformer; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; @@ -33,19 +31,17 @@ public class TapChangerBlockingAutomaton extends AbstractPureDynamicBlackBoxMode private static final Set COMPATIBLE_EQUIPMENTS = EnumSet.of(IdentifiableType.LOAD, IdentifiableType.TWO_WINDINGS_TRANSFORMER); private static final int MAX_MEASUREMENTS = 5; - private final List transformers; - private final List loadsWithTransformer; + private final List> tapChangerEquipments; private final List tapChangerAutomatonIds; private final List> uMeasurements; private boolean isConnected = true; - protected TapChangerBlockingAutomaton(String dynamicModelId, String parameterSetId, List transformers, List loadsWithTransformer, List tapChangerAutomatonIds, List> uMeasurements, String lib) { + protected TapChangerBlockingAutomaton(String dynamicModelId, String parameterSetId, List> tapChangerEquipments, List tapChangerAutomatonIds, List> uMeasurements, String lib) { super(dynamicModelId, parameterSetId, lib); - this.transformers = Objects.requireNonNull(transformers); - this.loadsWithTransformer = Objects.requireNonNull(loadsWithTransformer); + this.tapChangerEquipments = Objects.requireNonNull(tapChangerEquipments); this.tapChangerAutomatonIds = Objects.requireNonNull(tapChangerAutomatonIds); this.uMeasurements = Objects.requireNonNull(uMeasurements); - if (transformers.isEmpty() && loadsWithTransformer.isEmpty() && tapChangerAutomatonIds.isEmpty()) { + if (tapChangerEquipments.isEmpty() && tapChangerAutomatonIds.isEmpty()) { throw new PowsyblException("No Tap changers to monitor"); } if (uMeasurements.isEmpty()) { @@ -72,13 +68,9 @@ public String getLib() { @Override public void createMacroConnections(MacroConnectionsAdder adder) { - for (TwoWindingsTransformer transformer : transformers) { - adder.createMacroConnections(this, transformer, TapChangerModel.class, this::getVarConnectionsWith); - } int skippedTapChangers = 0; - for (Load load : loadsWithTransformer) { - boolean isSkipped = adder.createMacroConnectionsOrSkip(this, load, TapChangerModel.class, this::getVarConnectionsWith); - if (isSkipped) { + for (Identifiable tc : tapChangerEquipments) { + if (adder.createMacroConnectionsOrSkip(this, tc, TapChangerModel.class, this::getVarConnectionsWith)) { skippedTapChangers++; } } @@ -87,7 +79,7 @@ public void createMacroConnections(MacroConnectionsAdder adder) { skippedTapChangers++; } } - if (!transformers.isEmpty() || skippedTapChangers < (loadsWithTransformer.size() + tapChangerAutomatonIds.size())) { + if (skippedTapChangers < (tapChangerEquipments.size() + tapChangerAutomatonIds.size())) { int i = 1; for (Identifiable measurement : uMeasurements) { adder.createMacroConnections(this, measurement, ActionConnectionPoint.class, this::getVarConnectionsWith, MeasurementPointSuffix.of(i)); @@ -104,7 +96,6 @@ private List getVarConnectionsWith(TapChangerModel connected) { } private List getVarConnectionsWith(ActionConnectionPoint connected, String suffix) { - return connected.getUImpinVarName() .map(uImpinVarName -> List.of(new VarConnection("tapChangerBlocking_UMonitored" + suffix, uImpinVarName))) .orElse(Collections.emptyList()); diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/TapChangerBlockingAutomatonBuilder.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/TapChangerBlockingAutomatonBuilder.java index acaa7aeed..82cc0b9c7 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/TapChangerBlockingAutomatonBuilder.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/TapChangerBlockingAutomatonBuilder.java @@ -8,17 +8,13 @@ package com.powsybl.dynawaltz.models.automatons; import com.powsybl.commons.reporter.Reporter; -import com.powsybl.dynawaltz.builders.BuildersUtil; -import com.powsybl.dynawaltz.builders.ModelConfig; -import com.powsybl.dynawaltz.builders.ModelConfigs; -import com.powsybl.dynawaltz.builders.Reporters; -import com.powsybl.iidm.network.Identifiable; -import com.powsybl.iidm.network.Load; -import com.powsybl.iidm.network.Network; -import com.powsybl.iidm.network.TwoWindingsTransformer; +import com.powsybl.dynawaltz.builders.*; +import com.powsybl.iidm.network.*; import java.util.*; +import static com.powsybl.dynawaltz.builders.BuildersUtil.MEASUREMENT_POINT_TYPE; + /** * @author Laurent Issertial {@literal } */ @@ -26,12 +22,12 @@ public class TapChangerBlockingAutomatonBuilder extends AbstractAutomatonModelBu private static final String CATEGORY = "tcbs"; private static final Map LIBS = ModelConfigs.getInstance().getModelConfigs(CATEGORY); + private static final String TAP_CHANGER_TYPE = IdentifiableType.TWO_WINDINGS_TRANSFORMER + "/" + IdentifiableType.LOAD; private static final String U_MEASUREMENTS_FIELD = "uMeasurements"; + private static final String TRANSFORMER_FIELD = "transformers"; - private final List loads = new ArrayList<>(); - private final List transformers = new ArrayList<>(); - private final List tapChangerAutomatonIds = new ArrayList<>(); - private List> uMeasurements; + private final BuilderEquipmentsList> tapChangerEquipments; + private final BuilderIdListEquipmentList> uMeasurementPoints; public static TapChangerBlockingAutomatonBuilder of(Network network) { return of(network, Reporter.NO_OP); @@ -60,71 +56,50 @@ public static Set getSupportedLibs() { protected TapChangerBlockingAutomatonBuilder(Network network, ModelConfig modelConfig, Reporter reporter) { super(network, modelConfig, reporter); + tapChangerEquipments = new BuilderEquipmentsList<>(TAP_CHANGER_TYPE, TRANSFORMER_FIELD, true); + uMeasurementPoints = new BuilderIdListEquipmentList<>(MEASUREMENT_POINT_TYPE, U_MEASUREMENTS_FIELD); } public TapChangerBlockingAutomatonBuilder transformers(String... staticIds) { - Arrays.stream(staticIds).forEach(id -> { - Identifiable equipment = network.getIdentifiable(id); - if (equipment == null) { - tapChangerAutomatonIds.add(id); - } else { - switch (equipment.getType()) { - case LOAD -> loads.add((Load) equipment); - case TWO_WINDINGS_TRANSFORMER -> transformers.add((TwoWindingsTransformer) equipment); - default -> Reporters.reportStaticIdUnknown(reporter, U_MEASUREMENTS_FIELD, id, "LOAD/TWO_WINDINGS_TRANSFORMER"); - } - } - }); + tapChangerEquipments.addEquipments(staticIds, id -> this.getTapChangerEquipment(network, id)); + return self(); + } + + public TapChangerBlockingAutomatonBuilder transformers(Collection staticIds) { + tapChangerEquipments.addEquipments(staticIds, id -> this.getTapChangerEquipment(network, id)); return self(); } + private Identifiable getTapChangerEquipment(Network network, String staticId) { + Identifiable tapChangerEquipment = network.getTwoWindingsTransformer(staticId); + return tapChangerEquipment != null ? tapChangerEquipment : network.getLoad(staticId); + } + public TapChangerBlockingAutomatonBuilder uMeasurements(String... staticIds) { - uMeasurements = new ArrayList<>(); - for (String staticId : staticIds) { - Identifiable measurementPoint = BuildersUtil.getActionConnectionPoint(network, staticId); - if (measurementPoint == null) { - Reporters.reportStaticIdUnknown(reporter, U_MEASUREMENTS_FIELD, staticId, "BUS/BUSBAR_SECTION"); - } else { - uMeasurements.add(measurementPoint); - } - } + uMeasurementPoints.addEquipments(staticIds, id -> BuildersUtil.getActionConnectionPoint(network, id)); return self(); } - public TapChangerBlockingAutomatonBuilder uMeasurements(List[] staticIdsArray) { - uMeasurements = new ArrayList<>(); - for (List staticIds : staticIdsArray) { - for (String staticId : staticIds) { - Identifiable measurementPoint = BuildersUtil.getActionConnectionPoint(network, staticId); - if (measurementPoint == null) { - Reporters.reportStaticIdUnknown(reporter, U_MEASUREMENTS_FIELD, staticId, "BUS/BUSBAR_SECTION"); - } else { - uMeasurements.add(measurementPoint); - break; - } - } - } + public TapChangerBlockingAutomatonBuilder uMeasurements(Collection staticIds) { + uMeasurementPoints.addEquipments(staticIds, id -> BuildersUtil.getActionConnectionPoint(network, id)); + return self(); + } + + public TapChangerBlockingAutomatonBuilder uMeasurements(Collection[] staticIdsArray) { + uMeasurementPoints.addEquipments(staticIdsArray, id -> BuildersUtil.getActionConnectionPoint(network, id)); return self(); } @Override protected void checkData() { - if (uMeasurements == null) { - Reporters.reportFieldNotSet(reporter, U_MEASUREMENTS_FIELD); - isInstantiable = false; - } else if (uMeasurements.isEmpty()) { - Reporters.reportEmptyList(reporter, U_MEASUREMENTS_FIELD); - isInstantiable = false; - } - if (loads.isEmpty() && transformers.isEmpty() && tapChangerAutomatonIds.isEmpty()) { - Reporters.reportEmptyList(reporter, "transformers"); - isInstantiable = false; - } + super.checkData(); + isInstantiable &= tapChangerEquipments.checkEquipmentData(reporter); + isInstantiable &= uMeasurementPoints.checkEquipmentData(reporter); } @Override public TapChangerBlockingAutomaton build() { - return isInstantiable() ? new TapChangerBlockingAutomaton(dynamicModelId, parameterSetId, transformers, loads, tapChangerAutomatonIds, uMeasurements, getLib()) : null; + return isInstantiable() ? new TapChangerBlockingAutomaton(dynamicModelId, parameterSetId, tapChangerEquipments.getEquipments(), tapChangerEquipments.getMissingEquipmentIds(), uMeasurementPoints.getEquipments(), getLib()) : null; } @Override