diff --git a/src/main/java/org/gridsuite/modification/server/modifications/BatteryModification.java b/src/main/java/org/gridsuite/modification/server/modifications/BatteryModification.java index be532862e..065f5354b 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/BatteryModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/BatteryModification.java @@ -22,7 +22,6 @@ import java.util.Collection; import java.util.List; -import static org.gridsuite.modification.server.NetworkModificationException.Type.BATTERY_NOT_FOUND; import static org.gridsuite.modification.server.NetworkModificationException.Type.MODIFY_BATTERY_ERROR; /** * @author Ghazwa Rehili @@ -41,10 +40,10 @@ public BatteryModification(BatteryModificationInfos modificationInfos) { @Override public void check(Network network) throws NetworkModificationException { - if (network.getBattery(modificationInfos.getEquipmentId()) == null) { - throw new NetworkModificationException(BATTERY_NOT_FOUND, modificationInfos.getEquipmentId()); + if (modificationInfos == null) { + throw new NetworkModificationException(MODIFY_BATTERY_ERROR, "Missing required attributes to modify the equipment"); } - Battery battery = network.getBattery(modificationInfos.getEquipmentId()); + Battery battery = ModificationUtils.getInstance().getBattery(network, modificationInfos.getEquipmentId()); String errorMessage = "Battery '" + modificationInfos.getEquipmentId() + "' : "; if (battery.getReactiveLimits().getKind() == ReactiveLimitsKind.MIN_MAX && (modificationInfos.getMinimumReactivePower() != null || modificationInfos.getMaximumReactivePower() != null)) { MinMaxReactiveLimits minMaxReactiveLimits = battery.getReactiveLimits(MinMaxReactiveLimits.class); @@ -74,9 +73,6 @@ private void checkActivePowerZeroOrBetweenMinAndMaxActivePowerBattery(BatteryMod @Override public void apply(Network network, Reporter subReporter) { - if (modificationInfos == null) { - throw new NetworkModificationException(MODIFY_BATTERY_ERROR, "Missing required attributes to modify the equipment"); - } Battery battery = ModificationUtils.getInstance().getBattery(network, modificationInfos.getEquipmentId()); // modify the battery in the network modifyBattery(battery, modificationInfos, subReporter); diff --git a/src/main/java/org/gridsuite/modification/server/modifications/BranchStatusModification.java b/src/main/java/org/gridsuite/modification/server/modifications/BranchStatusModification.java index c4ebc065b..a9b5f662e 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/BranchStatusModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/BranchStatusModification.java @@ -23,8 +23,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static org.gridsuite.modification.server.NetworkModificationException.Type.BRANCH_NOT_FOUND; import static org.gridsuite.modification.server.NetworkModificationException.Type.BRANCH_ACTION_ERROR; +import static org.gridsuite.modification.server.NetworkModificationException.Type.BRANCH_NOT_FOUND; import static org.gridsuite.modification.server.modifications.ModificationUtils.distinctByKey; /** @@ -40,12 +40,18 @@ public BranchStatusModification(BranchStatusModificationInfos modificationInfos) } @Override - public void apply(Network network, Reporter subReporter) { + public void check(Network network) throws NetworkModificationException { String branchId = modificationInfos.getEquipmentId(); Branch branch = network.getBranch(branchId); if (branch == null) { throw new NetworkModificationException(BRANCH_NOT_FOUND, branchId); } + } + + @Override + public void apply(Network network, Reporter subReporter) { + String branchId = modificationInfos.getEquipmentId(); + Branch branch = network.getBranch(branchId); String branchTypeName = branch.getType() == IdentifiableType.LINE ? "Line" : "2 windings transformer"; switch (modificationInfos.getAction()) { diff --git a/src/main/java/org/gridsuite/modification/server/modifications/EquipmentAttributeModification.java b/src/main/java/org/gridsuite/modification/server/modifications/EquipmentAttributeModification.java index d639a68a3..172cd3ee2 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/EquipmentAttributeModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/EquipmentAttributeModification.java @@ -30,7 +30,7 @@ public EquipmentAttributeModification(EquipmentAttributeModificationInfos modifi } @Override - public void apply(Network network, Reporter subReporter) { + public void check(Network network) throws NetworkModificationException { Identifiable identifiable = network.getIdentifiable(modificationInfos.getEquipmentId()); if (identifiable == null) { throw new NetworkModificationException(EQUIPMENT_NOT_FOUND, modificationInfos.getEquipmentId()); @@ -38,6 +38,11 @@ public void apply(Network network, Reporter subReporter) { if (identifiable.getType() != modificationInfos.getEquipmentType()) { throw new NetworkModificationException(WRONG_EQUIPMENT_TYPE, String.format("Type of '%s' is not %s but %s", modificationInfos.getEquipmentId(), modificationInfos.getEquipmentType(), identifiable.getType())); } + } + + @Override + public void apply(Network network, Reporter subReporter) { + Identifiable identifiable = network.getIdentifiable(modificationInfos.getEquipmentId()); if (identifiable instanceof Switch) { changeSwitchAttribute((Switch) identifiable, modificationInfos.getEquipmentAttributeName(), modificationInfos.getEquipmentAttributeValue(), subReporter); } else if (identifiable instanceof Injection) { diff --git a/src/main/java/org/gridsuite/modification/server/modifications/EquipmentDeletion.java b/src/main/java/org/gridsuite/modification/server/modifications/EquipmentDeletion.java index ead12eaa3..156e84e8f 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/EquipmentDeletion.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/EquipmentDeletion.java @@ -33,12 +33,16 @@ public EquipmentDeletion(EquipmentDeletionInfos modificationInfos) { } @Override - public void apply(Network network, Reporter subReporter) { + public void check(Network network) throws NetworkModificationException { Identifiable identifiable = ModificationUtils.getInstance().getEquipmentByIdentifiableType(network, modificationInfos.getEquipmentType(), modificationInfos.getEquipmentId()); if (identifiable == null) { throw new NetworkModificationException(EQUIPMENT_NOT_FOUND, "Equipment with id=" + modificationInfos.getEquipmentId() + " not found or of bad type"); } + } + @Override + public void apply(Network network, Reporter subReporter) { + Identifiable identifiable = ModificationUtils.getInstance().getEquipmentByIdentifiableType(network, modificationInfos.getEquipmentType(), modificationInfos.getEquipmentId()); if (identifiable instanceof Connectable) { new RemoveFeederBay(modificationInfos.getEquipmentId()).apply(network, true, subReporter); } else if (identifiable instanceof HvdcLine) { diff --git a/src/main/java/org/gridsuite/modification/server/modifications/GeneratorModification.java b/src/main/java/org/gridsuite/modification/server/modifications/GeneratorModification.java index 5be503c7a..2a34c1bfd 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/GeneratorModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/GeneratorModification.java @@ -24,7 +24,7 @@ import java.util.Collection; import java.util.List; -import static org.gridsuite.modification.server.NetworkModificationException.Type.MODIFY_GENERATOR_ERROR; +import static org.gridsuite.modification.server.NetworkModificationException.Type.*; /** * @author Ayoub Labidi @@ -43,32 +43,33 @@ public GeneratorModification(GeneratorModificationInfos modificationInfos) { @Override public void check(Network network) throws NetworkModificationException { - if (network.getGenerator(modificationInfos.getEquipmentId()) != null) { - Generator generator = ModificationUtils.getInstance().getGenerator(network, modificationInfos.getEquipmentId()); - // check min max reactive limits - String errorMessage = "Generator '" + modificationInfos.getEquipmentId() + "' : "; - if (generator.getReactiveLimits().getKind() == ReactiveLimitsKind.MIN_MAX && (modificationInfos.getMinimumReactivePower() != null || modificationInfos.getMaximumReactivePower() != null)) { - MinMaxReactiveLimits minMaxReactiveLimits = generator.getReactiveLimits(MinMaxReactiveLimits.class); - ModificationUtils.getInstance().checkMaxReactivePowerGreaterThanMinReactivePower(minMaxReactiveLimits, modificationInfos.getMinimumReactivePower(), modificationInfos.getMaximumReactivePower(), MODIFY_GENERATOR_ERROR, errorMessage); - } - // check reactive capability curve limits - Collection points = generator.getReactiveLimits().getKind() == ReactiveLimitsKind.CURVE ? generator.getReactiveLimits(ReactiveCapabilityCurve.class).getPoints() : List.of(); - List generatorPoints = new ArrayList<>(points); - List modificationPoints = modificationInfos.getReactiveCapabilityCurvePoints(); - if (!CollectionUtils.isEmpty(points) && modificationPoints != null) { - ModificationUtils.getInstance().checkMaxQGreaterThanMinQ(generatorPoints, modificationPoints, MODIFY_GENERATOR_ERROR, errorMessage); - } - // check regulated terminal - if (modificationInfos.getRegulatingTerminalId() != null && modificationInfos.getRegulatingTerminalType() != null && - modificationInfos.getRegulatingTerminalVlId() != null) { - VoltageLevel voltageLevel = ModificationUtils.getInstance().getVoltageLevel(network, modificationInfos.getRegulatingTerminalVlId().getValue()); - ModificationUtils.getInstance().getTerminalFromIdentifiable(voltageLevel.getNetwork(), - modificationInfos.getRegulatingTerminalId().getValue(), - modificationInfos.getRegulatingTerminalType().getValue(), - modificationInfos.getRegulatingTerminalVlId().getValue()); - } - checkActivePowerZeroOrBetweenMinAndMaxActivePowerGenerator(modificationInfos, generator, MODIFY_GENERATOR_ERROR, errorMessage); + if (modificationInfos == null) { + throw new NetworkModificationException(MODIFY_GENERATOR_ERROR, "Missing required attributes to modify the equipment"); } + Generator generator = ModificationUtils.getInstance().getGenerator(network, modificationInfos.getEquipmentId()); + // check min max reactive limits + String errorMessage = "Generator '" + modificationInfos.getEquipmentId() + "' : "; + if (generator.getReactiveLimits().getKind() == ReactiveLimitsKind.MIN_MAX && (modificationInfos.getMinimumReactivePower() != null || modificationInfos.getMaximumReactivePower() != null)) { + MinMaxReactiveLimits minMaxReactiveLimits = generator.getReactiveLimits(MinMaxReactiveLimits.class); + ModificationUtils.getInstance().checkMaxReactivePowerGreaterThanMinReactivePower(minMaxReactiveLimits, modificationInfos.getMinimumReactivePower(), modificationInfos.getMaximumReactivePower(), MODIFY_GENERATOR_ERROR, errorMessage); + } + // check reactive capability curve limits + Collection points = generator.getReactiveLimits().getKind() == ReactiveLimitsKind.CURVE ? generator.getReactiveLimits(ReactiveCapabilityCurve.class).getPoints() : List.of(); + List generatorPoints = new ArrayList<>(points); + List modificationPoints = modificationInfos.getReactiveCapabilityCurvePoints(); + if (!CollectionUtils.isEmpty(points) && modificationPoints != null) { + ModificationUtils.getInstance().checkMaxQGreaterThanMinQ(generatorPoints, modificationPoints, MODIFY_GENERATOR_ERROR, errorMessage); + } + // check regulated terminal + if (modificationInfos.getRegulatingTerminalId() != null && modificationInfos.getRegulatingTerminalType() != null && + modificationInfos.getRegulatingTerminalVlId() != null) { + VoltageLevel voltageLevel = ModificationUtils.getInstance().getVoltageLevel(network, modificationInfos.getRegulatingTerminalVlId().getValue()); + ModificationUtils.getInstance().getTerminalFromIdentifiable(voltageLevel.getNetwork(), + modificationInfos.getRegulatingTerminalId().getValue(), + modificationInfos.getRegulatingTerminalType().getValue(), + modificationInfos.getRegulatingTerminalVlId().getValue()); + } + checkActivePowerZeroOrBetweenMinAndMaxActivePowerGenerator(modificationInfos, generator, MODIFY_GENERATOR_ERROR, errorMessage); } private void checkActivePowerZeroOrBetweenMinAndMaxActivePowerGenerator(GeneratorModificationInfos modificationInfos, Generator generator, NetworkModificationException.Type exceptionType, String errorMessage) { @@ -86,9 +87,6 @@ private void checkActivePowerZeroOrBetweenMinAndMaxActivePowerGenerator(Generato @Override public void apply(Network network, Reporter subReporter) { - if (modificationInfos == null) { - throw new NetworkModificationException(MODIFY_GENERATOR_ERROR, "Missing required attributes to modify the equipment"); - } Generator generator = ModificationUtils.getInstance().getGenerator(network, modificationInfos.getEquipmentId()); // modify the generator in the network modifyGenerator(generator, modificationInfos, subReporter); diff --git a/src/main/java/org/gridsuite/modification/server/modifications/GroovyScript.java b/src/main/java/org/gridsuite/modification/server/modifications/GroovyScript.java index 10d73af77..7c0cbd8df 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/GroovyScript.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/GroovyScript.java @@ -32,10 +32,14 @@ public GroovyScript(GroovyScriptInfos modificationInfos) { } @Override - public void apply(Network network, Reporter subReporter) { + public void check(Network network) throws NetworkModificationException { if (StringUtils.isBlank(modificationInfos.getScript())) { throw new NetworkModificationException(GROOVY_SCRIPT_EMPTY); } + } + + @Override + public void apply(Network network, Reporter subReporter) { var conf = new CompilerConfiguration(); var binding = new Binding(); binding.setProperty("network", network); diff --git a/src/main/java/org/gridsuite/modification/server/modifications/LineModification.java b/src/main/java/org/gridsuite/modification/server/modifications/LineModification.java index 648e1c2f4..70a356b90 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/LineModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/LineModification.java @@ -28,12 +28,17 @@ public LineModification(LineModificationInfos modificationInfos) { } @Override - public void apply(Network network, Reporter subReporter) { + public void check(Network network) throws NetworkModificationException { Line line = network.getLine(modificationInfos.getEquipmentId()); if (line == null) { throw new NetworkModificationException(LINE_NOT_FOUND, "Line " + modificationInfos.getEquipmentId() + " does not exist in network"); } + } + + @Override + public void apply(Network network, Reporter subReporter) { + Line line = network.getLine(modificationInfos.getEquipmentId()); // modify the line in the network modifyLine(line, modificationInfos, subReporter); } diff --git a/src/main/java/org/gridsuite/modification/server/modifications/LoadModification.java b/src/main/java/org/gridsuite/modification/server/modifications/LoadModification.java index a8154f939..b486e3d09 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/LoadModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/LoadModification.java @@ -9,11 +9,13 @@ import com.powsybl.commons.reporter.Report; import com.powsybl.commons.reporter.Reporter; import com.powsybl.commons.reporter.TypedValue; -import com.powsybl.iidm.network.*; -import static org.gridsuite.modification.server.NetworkModificationException.Type.LOAD_NOT_FOUND; +import com.powsybl.iidm.network.Load; +import com.powsybl.iidm.network.Network; import org.gridsuite.modification.server.NetworkModificationException; import org.gridsuite.modification.server.dto.LoadModificationInfos; +import static org.gridsuite.modification.server.NetworkModificationException.Type.LOAD_NOT_FOUND; + /** * @author Ayoub Labidi */ @@ -26,12 +28,17 @@ public LoadModification(LoadModificationInfos modificationInfos) { } @Override - public void apply(Network network, Reporter subReporter) { + public void check(Network network) throws NetworkModificationException { Load load = network.getLoad(modificationInfos.getEquipmentId()); if (load == null) { throw new NetworkModificationException(LOAD_NOT_FOUND, "Load " + modificationInfos.getEquipmentId() + " does not exist in network"); } + } + + @Override + public void apply(Network network, Reporter subReporter) { + Load load = network.getLoad(modificationInfos.getEquipmentId()); // modify the load in the network modifyLoad(load, modificationInfos, subReporter); } diff --git a/src/main/java/org/gridsuite/modification/server/modifications/SubstationModification.java b/src/main/java/org/gridsuite/modification/server/modifications/SubstationModification.java index 32f72c668..d572acf36 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/SubstationModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/SubstationModification.java @@ -28,12 +28,17 @@ public SubstationModification(SubstationModificationInfos modificationInfos) { } @Override - public void apply(Network network, Reporter subReporter) { + public void check(Network network) throws NetworkModificationException { Substation station = network.getSubstation(modificationInfos.getEquipmentId()); if (station == null) { throw new NetworkModificationException(SUBSTATION_NOT_FOUND, "Substation " + modificationInfos.getEquipmentId() + " does not exist in network"); } + } + + @Override + public void apply(Network network, Reporter subReporter) { + Substation station = network.getSubstation(modificationInfos.getEquipmentId()); // modify the substation in the network subReporter.report(Report.builder() diff --git a/src/main/java/org/gridsuite/modification/server/modifications/TabularModification.java b/src/main/java/org/gridsuite/modification/server/modifications/TabularModification.java index d61123331..973ad3558 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/TabularModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/TabularModification.java @@ -45,13 +45,15 @@ public void check(Network network) throws NetworkModificationException { @Override public void apply(Network network, Reporter subReporter) { AtomicInteger applicationFailuresCount = new AtomicInteger(0); - modificationInfos.getModifications().forEach(modification -> { + modificationInfos.getModifications().forEach(modifInfos -> { try { - modification.toModification().apply(network); + AbstractModification modification = modifInfos.toModification(); + modification.check(network); + modification.apply(network); } catch (PowsyblException e) { applicationFailuresCount.incrementAndGet(); subReporter.report(Report.builder() - .withKey(modification.getType().name() + applicationFailuresCount.get()) + .withKey(modifInfos.getType().name() + applicationFailuresCount.get()) .withDefaultMessage(e.getMessage()) .withSeverity(TypedValue.WARN_SEVERITY) .build()); diff --git a/src/main/java/org/gridsuite/modification/server/modifications/VoltageLevelModification.java b/src/main/java/org/gridsuite/modification/server/modifications/VoltageLevelModification.java index a585f5aed..1d97f4fbb 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/VoltageLevelModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/VoltageLevelModification.java @@ -34,13 +34,17 @@ public VoltageLevelModification(VoltageLevelModificationInfos voltageLevelModifi } @Override - public void apply(Network network, Reporter subReporter) { + public void check(Network network) throws NetworkModificationException { VoltageLevel voltageLevel = network.getVoltageLevel(modificationInfos.getEquipmentId()); if (voltageLevel == null) { throw new NetworkModificationException(VOLTAGE_LEVEL_NOT_FOUND, String.format("Voltage level %s does not exist in network", modificationInfos.getEquipmentId())); } + } + @Override + public void apply(Network network, Reporter subReporter) { + VoltageLevel voltageLevel = network.getVoltageLevel(modificationInfos.getEquipmentId()); modifyVoltageLevel(subReporter, voltageLevel); }