diff --git a/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/GeneratorField.java b/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/GeneratorField.java index 1ab073f6..9c8b2975 100644 --- a/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/GeneratorField.java +++ b/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/GeneratorField.java @@ -10,7 +10,6 @@ import com.powsybl.iidm.network.Generator; import com.powsybl.iidm.network.extensions.*; import com.powsybl.network.store.iidm.impl.extensions.CoordinatedReactiveControlAdderImpl; -import jakarta.validation.constraints.NotNull; import org.gridsuite.modification.dto.AttributeModification; import org.gridsuite.modification.dto.OperationType; import org.gridsuite.modification.utils.ModificationUtils; @@ -64,7 +63,7 @@ public static String getReferenceValue(Generator generator, String generatorFiel }; } - public static void setNewValue(Generator generator, String generatorField, @NotNull String newValue) { + public static void setNewValue(Generator generator, String generatorField, String newValue) { GeneratorField field = GeneratorField.valueOf(generatorField); String errorMessage = String.format(ERROR_MESSAGE, generator.getId()); switch (field) { @@ -82,7 +81,7 @@ public static void setNewValue(Generator generator, String generatorField, @NotN generator.setTargetP(Double.parseDouble(newValue)); } case RATED_NOMINAL_POWER -> { - Double ratedNominalPower = Double.parseDouble(newValue); + Double ratedNominalPower = newValue != null ? Double.parseDouble(newValue) : Double.NaN; checkIsNotNegativeValue(errorMessage, ratedNominalPower, MODIFY_GENERATOR_ERROR, "Rated apparent power"); modifyGeneratorActiveLimitsAttributes( null, null, new AttributeModification<>(ratedNominalPower, OperationType.SET), generator, null); @@ -114,10 +113,14 @@ public static void setNewValue(Generator generator, String generatorField, @NotN MODIFY_GENERATOR_ERROR, errorMessage); } case TRANSIENT_REACTANCE -> modifyGeneratorShortCircuitAttributes( - new AttributeModification<>(Double.parseDouble(newValue), OperationType.SET), + new AttributeModification<>(newValue != null ? Double.parseDouble(newValue) : Double.NaN, OperationType.SET), null, generator, null); case STEP_UP_TRANSFORMER_REACTANCE -> modifyGeneratorShortCircuitAttributes( - null, new AttributeModification<>(Double.parseDouble(newValue), OperationType.SET), generator, null); + null, + new AttributeModification<>(newValue != null ? Double.parseDouble(newValue) : Double.NaN, OperationType.SET), + generator, + null + ); case Q_PERCENT -> generator.newExtension(CoordinatedReactiveControlAdderImpl.class) .withQPercent(Double.parseDouble(newValue)) .add(); diff --git a/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/LineField.java b/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/LineField.java index 0da88ffc..643b6c86 100644 --- a/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/LineField.java +++ b/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/LineField.java @@ -54,7 +54,7 @@ public static void setNewValue(Line line, String lineField, @NotNull String newV } private static void setNewDoubleValue(Line line, LineField field, String newValue, String errorMessage) { - Double doubleValue = Double.parseDouble(newValue); + Double doubleValue = newValue != null ? Double.parseDouble(newValue) : Double.NaN; final AttributeModification attributeModification = new AttributeModification<>(doubleValue, OperationType.SET); switch (field) { case R -> { diff --git a/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/TwoWindingsTransformerField.java b/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/TwoWindingsTransformerField.java index ece0e7f3..610319cb 100644 --- a/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/TwoWindingsTransformerField.java +++ b/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/TwoWindingsTransformerField.java @@ -91,7 +91,7 @@ public static void setNewValue(TwoWindingsTransformer transformer, String twoWin private static void setNewDoubleValue(TwoWindingsTransformer transformer, TwoWindingsTransformerField field, String newValue, String errorMessage) { final PhaseTapChanger phaseTapChanger = transformer.getPhaseTapChanger(); final RatioTapChanger ratioTapChanger = transformer.getRatioTapChanger(); - final Double doubleValue = Double.valueOf(newValue); + final Double doubleValue = newValue != null ? Double.parseDouble(newValue) : Double.NaN; final AttributeModification attributeModification = new AttributeModification<>(doubleValue, OperationType.SET); switch (field) { case R -> { diff --git a/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/VoltageLevelField.java b/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/VoltageLevelField.java index e3d98a5b..7c6dc8e6 100644 --- a/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/VoltageLevelField.java +++ b/src/main/java/org/gridsuite/modification/dto/byfilter/equipmentfield/VoltageLevelField.java @@ -9,7 +9,6 @@ import com.powsybl.iidm.network.VoltageLevel; import com.powsybl.iidm.network.extensions.IdentifiableShortCircuit; -import jakarta.validation.constraints.NotNull; import org.gridsuite.modification.dto.AttributeModification; import org.gridsuite.modification.dto.OperationType; @@ -40,7 +39,7 @@ public static String getReferenceValue(VoltageLevel voltageLevel, String voltage }; } - public static void setNewValue(VoltageLevel voltageLevel, String voltageLevelField, @NotNull String newValue) { + public static void setNewValue(VoltageLevel voltageLevel, String voltageLevelField, String newValue) { VoltageLevelField field = VoltageLevelField.valueOf(voltageLevelField); final String errorMessage = String.format(ERROR_MESSAGE, voltageLevel.getId()); switch (field) { @@ -50,19 +49,21 @@ public static void setNewValue(VoltageLevel voltageLevel, String voltageLevelFie modifyNominalV(voltageLevel, new AttributeModification<>(nominalVoltage, OperationType.SET), null); } case LOW_VOLTAGE_LIMIT -> { - Double lowVoltageLimit = Double.valueOf(newValue); + Double lowVoltageLimit = newValue != null ? Double.parseDouble(newValue) : Double.NaN; checkIsNotNegativeValue(errorMessage, lowVoltageLimit, MODIFY_VOLTAGE_LEVEL_ERROR, "Low voltage limit"); modifLowVoltageLimit(voltageLevel, new AttributeModification<>(lowVoltageLimit, OperationType.SET), null); } case HIGH_VOLTAGE_LIMIT -> { - Double highVoltageLimit = Double.valueOf(newValue); + Double highVoltageLimit = newValue != null ? Double.parseDouble(newValue) : Double.NaN; checkIsNotNegativeValue(errorMessage, highVoltageLimit, MODIFY_VOLTAGE_LEVEL_ERROR, "High voltage limit"); - modifyHighVoltageLimit(voltageLevel, new AttributeModification<>(Double.parseDouble(newValue), OperationType.SET), null); + modifyHighVoltageLimit(voltageLevel, new AttributeModification<>(highVoltageLimit, OperationType.SET), null); } case LOW_SHORT_CIRCUIT_CURRENT_LIMIT -> modifyVoltageLevelShortCircuit( - new AttributeModification<>(Double.parseDouble(newValue), OperationType.SET), null, null, voltageLevel); + new AttributeModification<>(newValue != null ? Double.parseDouble(newValue) : Double.NaN, OperationType.SET), + null, null, voltageLevel); case HIGH_SHORT_CIRCUIT_CURRENT_LIMIT -> modifyVoltageLevelShortCircuit( - null, new AttributeModification<>(Double.parseDouble(newValue), OperationType.SET), null, voltageLevel); + null, new AttributeModification<>(newValue != null ? Double.parseDouble(newValue) : Double.NaN, OperationType.SET), + null, voltageLevel); } } } diff --git a/src/main/java/org/gridsuite/modification/modifications/AbstractBranchModification.java b/src/main/java/org/gridsuite/modification/modifications/AbstractBranchModification.java index 6c2fe162..3f6504cd 100644 --- a/src/main/java/org/gridsuite/modification/modifications/AbstractBranchModification.java +++ b/src/main/java/org/gridsuite/modification/modifications/AbstractBranchModification.java @@ -102,63 +102,78 @@ private void modifyOperationalLimitsGroups(Branch branch, List branch, List side1LimitsReports, List side2LimitsReports) { if (modificationInfos.getSelectedOperationalLimitsGroup1() != null) { - applySelectedOLGOnSide1(branch, side1LimitsReports); + modifySelectedOperationalLimitsGroup( + branch, + modificationInfos.getSelectedOperationalLimitsGroup1(), + TwoSides.ONE, + side1LimitsReports + ); } if (modificationInfos.getSelectedOperationalLimitsGroup2() != null) { - applySelectedOLGOnSide2(branch, side2LimitsReports); + modifySelectedOperationalLimitsGroup( + branch, + modificationInfos.getSelectedOperationalLimitsGroup2(), + TwoSides.TWO, + side2LimitsReports); } } - private void applySelectedOLGOnSide1(Branch branch, List reportNode) { - if (Objects.requireNonNull(modificationInfos.getSelectedOperationalLimitsGroup1().getOp()) == OperationType.UNSET) { + private static void applySelectedOLGOnSide1(Branch branch, AttributeModification modifOperationalLimitsGroup, List reportNode, String newSelectedOLG) { + if (!StringUtils.hasText(newSelectedOLG) || modifOperationalLimitsGroup.getOp() == OperationType.UNSET) { branch.cancelSelectedOperationalLimitsGroup1(); - reportNode.add(ReportNode.newRootReportNode() - .withMessageTemplate("network.modification.noLimitSetSelectedOnSide1") - .withSeverity(TypedValue.INFO_SEVERITY) - .build()); - } else if (modificationInfos.getSelectedOperationalLimitsGroup1().getOp() == OperationType.SET) { - String newSelectedOpLG1 = modificationInfos.getSelectedOperationalLimitsGroup1().getValue(); - if (StringUtils.hasText(newSelectedOpLG1) && branch.getOperationalLimitsGroup1(newSelectedOpLG1).isEmpty()) { + if (reportNode != null) { + reportNode.add(ReportNode.newRootReportNode() + .withMessageTemplate("network.modification.noLimitSetSelectedOnSide1") + .withSeverity(TypedValue.INFO_SEVERITY) + .build()); + } + } else { + if (StringUtils.hasText(newSelectedOLG) && branch.getOperationalLimitsGroup1(newSelectedOLG).isEmpty() && reportNode != null) { reportNode.add(ReportNode.newRootReportNode() .withMessageTemplate("network.modification.limitSetAbsentOnSide1") - .withUntypedValue("selectedOperationalLimitsGroup", newSelectedOpLG1) + .withUntypedValue("selectedOperationalLimitsGroup", newSelectedOLG) .withSeverity(TypedValue.WARN_SEVERITY) .build()); } else { - branch.setSelectedOperationalLimitsGroup1(newSelectedOpLG1); - reportNode.add(ReportNode.newRootReportNode() - .withMessageTemplate("network.modification.limitSetSelectedOnSide1") - .withUntypedValue("selectedOperationalLimitsGroup1", newSelectedOpLG1) - .withSeverity(TypedValue.INFO_SEVERITY) - .build()); + branch.setSelectedOperationalLimitsGroup1(newSelectedOLG); + if (reportNode != null) { + reportNode.add(ReportNode.newRootReportNode() + .withMessageTemplate("network.modification.limitSetSelectedOnSide1") + .withUntypedValue("selectedOperationalLimitsGroup1", newSelectedOLG) + .withSeverity(TypedValue.INFO_SEVERITY) + .build()); + } } } } - private void applySelectedOLGOnSide2(Branch branch, List reportNode) { - if (Objects.requireNonNull(modificationInfos.getSelectedOperationalLimitsGroup2().getOp()) == OperationType.UNSET) { - branch.setSelectedOperationalLimitsGroup2(""); - reportNode.add(ReportNode.newRootReportNode() - .withMessageTemplate("network.modification.noLimitSetSelectedOnSide2") - .withSeverity(TypedValue.INFO_SEVERITY) - .build()); - } else if (modificationInfos.getSelectedOperationalLimitsGroup2().getOp() == OperationType.SET) { - String newSelectedOpLG = modificationInfos.getSelectedOperationalLimitsGroup2().getValue(); - if (StringUtils.hasText(newSelectedOpLG) && branch.getOperationalLimitsGroup2(newSelectedOpLG).isEmpty()) { + private static void applySelectedOLGOnSide2(Branch branch, AttributeModification modifOperationalLimitsGroup, List reportNode, String newSelectedOLG) { + if (!StringUtils.hasText(newSelectedOLG) || modifOperationalLimitsGroup.getOp() == OperationType.UNSET) { + branch.cancelSelectedOperationalLimitsGroup2(); + if (reportNode != null) { + reportNode.add(ReportNode.newRootReportNode() + .withMessageTemplate("network.modification.noLimitSetSelectedOnSide2") + .withSeverity(TypedValue.INFO_SEVERITY) + .build()); + } + } else { + if (StringUtils.hasText(newSelectedOLG) && branch.getOperationalLimitsGroup2(newSelectedOLG).isEmpty() && reportNode != null) { reportNode.add(ReportNode.newRootReportNode() .withMessageTemplate("network.modification.limitSetAbsentOnSide2") - .withUntypedValue("selectedOperationalLimitsGroup2", newSelectedOpLG) + .withUntypedValue("selectedOperationalLimitsGroup", newSelectedOLG) .withSeverity(TypedValue.WARN_SEVERITY) .build()); } else { - branch.setSelectedOperationalLimitsGroup2(newSelectedOpLG); - reportNode.add(ReportNode.newRootReportNode() - .withMessageTemplate("network.modification.limitSetSelectedOnSide2") - .withUntypedValue("selectedOperationalLimitsGroup2", newSelectedOpLG) - .withSeverity(TypedValue.INFO_SEVERITY) - .build()); + branch.setSelectedOperationalLimitsGroup2(newSelectedOLG); + if (reportNode != null) { + reportNode.add(ReportNode.newRootReportNode() + .withMessageTemplate("network.modification.limitSetSelectedOnSide2") + .withUntypedValue("selectedOperationalLimitsGroup2", newSelectedOLG) + .withSeverity(TypedValue.INFO_SEVERITY) + .build()); + } } } } @@ -540,30 +555,18 @@ private void modifyBranchVoltageLevelBusOrBusBarSectionAttributesSide2(BranchMod ); } - public static void modifySelectedOperationalLimitsGroup(Branch branch, AttributeModification modifOperationalLimitsGroup, - TwoSides side, ReportNode reportNode) { + public static void modifySelectedOperationalLimitsGroup( + Branch branch, + AttributeModification modifOperationalLimitsGroup, + TwoSides side, + List reportNode) { Objects.requireNonNull(side); if (modifOperationalLimitsGroup != null) { - String value = modifOperationalLimitsGroup.getValue(); - String previousSelectedLimitsGroup = null; + String newSelectedOLG = modifOperationalLimitsGroup.getValue(); if (side == TwoSides.ONE) { - previousSelectedLimitsGroup = branch.getSelectedOperationalLimitsGroupId1().orElse(null); - if (!StringUtils.hasText(value)) { - branch.cancelSelectedOperationalLimitsGroup1(); - } else { - branch.setSelectedOperationalLimitsGroup1(value); - } + applySelectedOLGOnSide1(branch, modifOperationalLimitsGroup, reportNode, newSelectedOLG); } else if (side == TwoSides.TWO) { - previousSelectedLimitsGroup = branch.getSelectedOperationalLimitsGroupId2().orElse(null); - if (!StringUtils.hasText(value)) { - branch.cancelSelectedOperationalLimitsGroup2(); - } else { - branch.setSelectedOperationalLimitsGroup2(value); - } - } - if (reportNode != null) { - insertReportNode(reportNode, ModificationUtils.getInstance().buildModificationReport(previousSelectedLimitsGroup, - modifOperationalLimitsGroup.getValue(), "selected operational limits group side " + side.getNum())); + applySelectedOLGOnSide2(branch, modifOperationalLimitsGroup, reportNode, newSelectedOLG); } } } diff --git a/src/main/java/org/gridsuite/modification/modifications/GeneratorModification.java b/src/main/java/org/gridsuite/modification/modifications/GeneratorModification.java index 4d1de04c..b6c07271 100644 --- a/src/main/java/org/gridsuite/modification/modifications/GeneratorModification.java +++ b/src/main/java/org/gridsuite/modification/modifications/GeneratorModification.java @@ -125,22 +125,23 @@ public static void modifyGeneratorShortCircuitAttributes(AttributeModification reports = new ArrayList<>(); GeneratorShortCircuit generatorShortCircuit = generator.getExtension(GeneratorShortCircuit.class); - Double oldTransientReactance = generatorShortCircuit != null ? generatorShortCircuit.getDirectTransX() : Double.NaN; - Double oldStepUpTransformerReactance = generatorShortCircuit != null ? generatorShortCircuit.getStepUpTransformerX() : Double.NaN; + double oldTransientReactance = generatorShortCircuit != null ? generatorShortCircuit.getDirectTransX() : Double.NaN; + double oldStepUpTransformerReactance = generatorShortCircuit != null ? generatorShortCircuit.getStepUpTransformerX() : Double.NaN; // Either transient reactance or step-up transformer reactance are modified or // both + String stepUpTransformerXNewValue = stepUpTransformerX != null ? stepUpTransformerX.getValue().toString() : null; if (directTransX != null && stepUpTransformerX != null) { generator.newExtension(GeneratorShortCircuitAdder.class) - .withDirectTransX(directTransX.getValue()) - .withStepUpTransformerX(stepUpTransformerX.getValue()) - .add(); + .withDirectTransX(directTransX.getValue()) + .withStepUpTransformerX(stepUpTransformerX.getValue()) + .add(); reports.add(ModificationUtils.getInstance().buildModificationReport( oldTransientReactance, directTransX.getValue(), "Transient reactance")); reports.add(ModificationUtils.getInstance().buildModificationReport( oldStepUpTransformerReactance, - stepUpTransformerX.getValue(), + stepUpTransformerXNewValue, "Transformer reactance")); } else if (directTransX != null) { @@ -153,13 +154,20 @@ public static void modifyGeneratorShortCircuitAttributes(AttributeModification buildConnectivityReports( } public static void checkIsNotNegativeValue(String errorMessage, Double valueToCheck, NetworkModificationException.Type exceptionType, String valueName) throws NetworkModificationException { - if (valueToCheck != null && valueToCheck < 0) { + if (valueToCheck != null && !Double.isNaN(valueToCheck) && valueToCheck < 0) { throw new NetworkModificationException(exceptionType, errorMessage + "can not have a negative value for " + valueName); } } diff --git a/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/GeneratorModificationByAssignmentTest.java b/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/GeneratorModificationByAssignmentTest.java index 0009a2c8..b66c963b 100644 --- a/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/GeneratorModificationByAssignmentTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/byfilter/assignment/GeneratorModificationByAssignmentTest.java @@ -25,8 +25,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.gridsuite.modification.utils.NetworkUtil.createGenerator; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; @@ -47,7 +46,7 @@ class GeneratorModificationByAssignmentTest extends AbstractModificationByAssign private static final String GENERATOR_ID_10 = "gen10"; @Test - void testCreateWithWarning() throws Exception { + void testCreateWithWarning() { IdentifiableAttributes identifiableAttributes = new IdentifiableAttributes(GENERATOR_ID_1, getIdentifiableType(), 1.0); FilterEquipments filter = FilterEquipments.builder().filterId(FILTER_WITH_ONE_WRONG_ID) .identifiableAttributes(List.of(identifiableAttributes)) @@ -256,6 +255,18 @@ protected List> getAssignmentInfos() { .filters(List.of(filter1)) .build(); + DoubleAssignmentInfos assignmentInfos15 = DoubleAssignmentInfos.builder() + .editedField(GeneratorField.TRANSIENT_REACTANCE.name()) + .value(Double.NaN) + .filters(List.of(filter1)) + .build(); + + DoubleAssignmentInfos assignmentInfos16 = DoubleAssignmentInfos.builder() + .editedField(GeneratorField.STEP_UP_TRANSFORMER_REACTANCE.name()) + .value(Double.NaN) + .filters(List.of(filter1)) + .build(); + List> infosList = super.getAssignmentInfos(); infosList.addAll(List.of( assignmentInfos1, @@ -271,7 +282,9 @@ protected List> getAssignmentInfos() { assignmentInfos11, assignmentInfos12, assignmentInfos13, - assignmentInfos14 + assignmentInfos14, + assignmentInfos15, + assignmentInfos16 )); return infosList; @@ -290,7 +303,9 @@ protected void assertAfterNetworkModificationApplication() { assertEquals(10, generatorStartup1.getPlannedActivePowerSetpoint(), 0); assertEquals(50, generator1.getMaxP(), 0); assertEquals(2, generator1.getMinP(), 0); - assertEquals(true, generator1.isVoltageRegulatorOn()); + assertTrue(generator1.isVoltageRegulatorOn()); + ActivePowerControl activePowerControl1 = generator1.getExtension(ActivePowerControl.class); + assertNull(activePowerControl1); Generator generator2 = getNetwork().getGenerator(GENERATOR_ID_2); GeneratorStartup generatorStartup2 = generator2.getExtension(GeneratorStartup.class); @@ -323,13 +338,13 @@ protected void assertAfterNetworkModificationApplication() { assertEquals(2, generator4.getMinP(), 0); Generator generator5 = getNetwork().getGenerator(GENERATOR_ID_5); - ActivePowerControl activePowerControl5 = generator5.getExtension(ActivePowerControl.class); + ActivePowerControl activePowerControl5 = generator5.getExtension(ActivePowerControl.class); assertNotNull(activePowerControl5); assertEquals(50, generator5.getMaxP(), 0); assertEquals(2, activePowerControl5.getDroop(), 0); Generator generator6 = getNetwork().getGenerator(GENERATOR_ID_6); - ActivePowerControl activePowerControl6 = generator6.getExtension(ActivePowerControl.class); + ActivePowerControl activePowerControl6 = generator6.getExtension(ActivePowerControl.class); assertNotNull(activePowerControl6); assertEquals(50, generator6.getMaxP(), 0); assertEquals(2, activePowerControl6.getDroop(), 0);