From 7a26cb9fb22dc6da6ae11af0b23b20c38be32a3a Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Thu, 5 Feb 2026 08:16:02 +0100 Subject: [PATCH 1/3] fix log message Signed-off-by: Etienne LESOT --- .../byfilter/AbstractModificationByAssignment.java | 2 +- .../modifications/byfilter/ByFormulaModification.java | 2 +- .../resources/org/gridsuite/modification/reports.properties | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/modifications/byfilter/AbstractModificationByAssignment.java b/src/main/java/org/gridsuite/modification/modifications/byfilter/AbstractModificationByAssignment.java index f7732a15..71cf5d15 100644 --- a/src/main/java/org/gridsuite/modification/modifications/byfilter/AbstractModificationByAssignment.java +++ b/src/main/java/org/gridsuite/modification/modifications/byfilter/AbstractModificationByAssignment.java @@ -56,7 +56,7 @@ public abstract class AbstractModificationByAssignment extends AbstractModificat public static final String VALUE_KEY_ARROW_NAME = "arrow"; public static final String VALUE_KEY_ARROW_VALUE = "→"; public static final String REPORT_KEY_EQUIPMENT_MODIFIED_ERROR_ZERO = "network.modification.equipmentModifiedError.zero"; - public static final String REPORT_KEY_EQUIPMENT_MODIFIED_ERROR_NULL = "network.modification.equipmentModifiedError.null"; + public static final String REPORT_KEY_EQUIPMENT_MODIFIED_ERROR_EMPTY = "network.modification.equipmentModifiedError.empty"; public static final String REPORT_KEY_BY_FILTER_MODIFICATION_SOME = "network.modification.byFilterModificationSome"; public static final String REPORT_KEY_BY_FILTER_MODIFICATION_FAILED = "network.modification.byFilterModificationFailed"; public static final String REPORT_KEY_BY_FILTER_MODIFICATION_SUCCESS = "network.modification.byFilterModificationSuccess"; diff --git a/src/main/java/org/gridsuite/modification/modifications/byfilter/ByFormulaModification.java b/src/main/java/org/gridsuite/modification/modifications/byfilter/ByFormulaModification.java index e0f69fd0..4c6c7fdc 100644 --- a/src/main/java/org/gridsuite/modification/modifications/byfilter/ByFormulaModification.java +++ b/src/main/java/org/gridsuite/modification/modifications/byfilter/ByFormulaModification.java @@ -73,7 +73,7 @@ protected boolean preCheckValue(Identifiable equipment, AbstractAssignmentInf notEditableEquipments.add(equipment.getId()); reports.add(ReportNode.newRootReportNode() .withResourceBundles(NetworkModificationReportResourceBundle.BASE_NAME) - .withMessageTemplate(REPORT_KEY_EQUIPMENT_MODIFIED_ERROR_NULL) + .withMessageTemplate(REPORT_KEY_EQUIPMENT_MODIFIED_ERROR_EMPTY) .withUntypedValue(VALUE_KEY_EQUIPMENT_NAME, equipment.getId()) .withSeverity(TypedValue.DETAIL_SEVERITY) .build()); diff --git a/src/main/resources/org/gridsuite/modification/reports.properties b/src/main/resources/org/gridsuite/modification/reports.properties index fc3f9203..5548afd1 100644 --- a/src/main/resources/org/gridsuite/modification/reports.properties +++ b/src/main/resources/org/gridsuite/modification/reports.properties @@ -145,7 +145,7 @@ network.modification.equipmentDeletion = Equipment deletion ${equipmentId} network.modification.equipmentDisconnect = Equipment with id=${id} disconnected network.modification.equipmentDisconnect.side = Equipment with id=${id} disconnected on side ${side} network.modification.equipmentDisconnected = Equipment with id=${id} disconnected -network.modification.equipmentModifiedError.null = Cannot modify equipment ${equipmentName} : At least one of the value or referenced field is null +network.modification.equipmentModifiedError.empty = Cannot modify equipment ${equipmentName} : At least one of the value or referenced field is empty network.modification.equipmentModifiedError.zero = Cannot modify equipment ${equipmentName} : The value or referenced field of the second operand in the division operator is zero network.modification.equipmentModifiedReport = ${equipmentType} id : ${equipmentName}, ${fieldName} : ${oldValue} ${arrow} ${newValue} network.modification.equipmentModifiedReportException = Cannot modify equipment ${equipmentName} : ${errorMessage} From c194e1d8bf9b557b95b13f01e6b538bac189a5e7 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Thu, 5 Feb 2026 14:04:26 +0100 Subject: [PATCH 2/3] refactor and add log message for nan Signed-off-by: Etienne LESOT --- .../AbstractModificationByAssignment.java | 1 + .../byfilter/ByFormulaModification.java | 38 +++++++++---------- .../gridsuite/modification/reports.properties | 1 + 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/modifications/byfilter/AbstractModificationByAssignment.java b/src/main/java/org/gridsuite/modification/modifications/byfilter/AbstractModificationByAssignment.java index 71cf5d15..3d4013cb 100644 --- a/src/main/java/org/gridsuite/modification/modifications/byfilter/AbstractModificationByAssignment.java +++ b/src/main/java/org/gridsuite/modification/modifications/byfilter/AbstractModificationByAssignment.java @@ -57,6 +57,7 @@ public abstract class AbstractModificationByAssignment extends AbstractModificat public static final String VALUE_KEY_ARROW_VALUE = "→"; public static final String REPORT_KEY_EQUIPMENT_MODIFIED_ERROR_ZERO = "network.modification.equipmentModifiedError.zero"; public static final String REPORT_KEY_EQUIPMENT_MODIFIED_ERROR_EMPTY = "network.modification.equipmentModifiedError.empty"; + public static final String REPORT_KEY_EQUIPMENT_MODIFIED_ERROR_NAN = "network.modification.equipmentModifiedError.nan"; public static final String REPORT_KEY_BY_FILTER_MODIFICATION_SOME = "network.modification.byFilterModificationSome"; public static final String REPORT_KEY_BY_FILTER_MODIFICATION_FAILED = "network.modification.byFilterModificationFailed"; public static final String REPORT_KEY_BY_FILTER_MODIFICATION_SUCCESS = "network.modification.byFilterModificationSuccess"; diff --git a/src/main/java/org/gridsuite/modification/modifications/byfilter/ByFormulaModification.java b/src/main/java/org/gridsuite/modification/modifications/byfilter/ByFormulaModification.java index 4c6c7fdc..57ed5b5b 100644 --- a/src/main/java/org/gridsuite/modification/modifications/byfilter/ByFormulaModification.java +++ b/src/main/java/org/gridsuite/modification/modifications/byfilter/ByFormulaModification.java @@ -68,32 +68,32 @@ protected boolean preCheckValue(Identifiable equipment, AbstractAssignmentInf FormulaInfos formulaInfos = (FormulaInfos) abstractAssignmentInfos; Double value1 = formulaInfos.getFieldOrValue1().getRefOrValue(equipment); Double value2 = formulaInfos.getFieldOrValue2().getRefOrValue(equipment); - if (value1 == null || Double.isNaN(value1) || value2 == null || Double.isNaN(value2)) { - equipmentNotModifiedCount += 1; - notEditableEquipments.add(equipment.getId()); - reports.add(ReportNode.newRootReportNode() - .withResourceBundles(NetworkModificationReportResourceBundle.BASE_NAME) - .withMessageTemplate(REPORT_KEY_EQUIPMENT_MODIFIED_ERROR_EMPTY) - .withUntypedValue(VALUE_KEY_EQUIPMENT_NAME, equipment.getId()) - .withSeverity(TypedValue.DETAIL_SEVERITY) - .build()); - return false; + if (value1 == null || value2 == null) { + return reportErrorOnEquipment(equipment, notEditableEquipments, REPORT_KEY_EQUIPMENT_MODIFIED_ERROR_EMPTY, reports); + } + + if (Double.isNaN(value1) || Double.isNaN(value2)) { + return reportErrorOnEquipment(equipment, notEditableEquipments, REPORT_KEY_EQUIPMENT_MODIFIED_ERROR_NAN, reports); } if (value2 == 0 && formulaInfos.getOperator() == Operator.DIVISION) { - equipmentNotModifiedCount += 1; - notEditableEquipments.add(equipment.getId()); - reports.add(ReportNode.newRootReportNode() - .withResourceBundles(NetworkModificationReportResourceBundle.BASE_NAME) - .withMessageTemplate(REPORT_KEY_EQUIPMENT_MODIFIED_ERROR_ZERO) - .withUntypedValue(VALUE_KEY_EQUIPMENT_NAME, equipment.getId()) - .withSeverity(TypedValue.DETAIL_SEVERITY) - .build()); - return false; + return reportErrorOnEquipment(equipment, notEditableEquipments, REPORT_KEY_EQUIPMENT_MODIFIED_ERROR_ZERO, reports); } return true; } + private boolean reportErrorOnEquipment(Identifiable equipment, List notEditableEquipments, String reportKey, List reports) { + equipmentNotModifiedCount += 1; + notEditableEquipments.add(equipment.getId()); + reports.add(ReportNode.newRootReportNode() + .withResourceBundles(NetworkModificationReportResourceBundle.BASE_NAME) + .withMessageTemplate(reportKey) + .withUntypedValue(VALUE_KEY_EQUIPMENT_NAME, equipment.getId()) + .withSeverity(TypedValue.DETAIL_SEVERITY) + .build()); + return false; + } + @Override protected String getNewValue(Identifiable equipment, AbstractAssignmentInfos abstractAssignmentInfos) { FormulaInfos formulaInfos = (FormulaInfos) abstractAssignmentInfos; diff --git a/src/main/resources/org/gridsuite/modification/reports.properties b/src/main/resources/org/gridsuite/modification/reports.properties index 5548afd1..845a8db5 100644 --- a/src/main/resources/org/gridsuite/modification/reports.properties +++ b/src/main/resources/org/gridsuite/modification/reports.properties @@ -146,6 +146,7 @@ network.modification.equipmentDisconnect = Equipment with id=${id} disconnected network.modification.equipmentDisconnect.side = Equipment with id=${id} disconnected on side ${side} network.modification.equipmentDisconnected = Equipment with id=${id} disconnected network.modification.equipmentModifiedError.empty = Cannot modify equipment ${equipmentName} : At least one of the value or referenced field is empty +network.modification.equipmentModifiedError.nan = Cannot modify equipment ${equipmentName} : At least one of the value or referenced field is not a number network.modification.equipmentModifiedError.zero = Cannot modify equipment ${equipmentName} : The value or referenced field of the second operand in the division operator is zero network.modification.equipmentModifiedReport = ${equipmentType} id : ${equipmentName}, ${fieldName} : ${oldValue} ${arrow} ${newValue} network.modification.equipmentModifiedReportException = Cannot modify equipment ${equipmentName} : ${errorMessage} From 508235f47383d6e5249f45d1732a6554a13ab1c3 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Thu, 5 Feb 2026 14:34:10 +0100 Subject: [PATCH 3/3] add tests on logs Signed-off-by: Etienne LESOT --- .../AbstractByFormulaModificationTest.java | 8 +++++++- .../VoltageLevelByFormulaModificationTest.java | 16 +++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/AbstractByFormulaModificationTest.java b/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/AbstractByFormulaModificationTest.java index 56469193..8625c599 100644 --- a/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/AbstractByFormulaModificationTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/AbstractByFormulaModificationTest.java @@ -6,6 +6,7 @@ */ package org.gridsuite.modification.modifications.byfilter.formula; +import com.powsybl.commons.report.ReportNode; import com.powsybl.iidm.network.IdentifiableType; import com.powsybl.iidm.network.Network; import org.gridsuite.filter.utils.EquipmentType; @@ -19,6 +20,7 @@ import org.gridsuite.modification.dto.byfilter.formula.ReferenceFieldOrValue; import org.gridsuite.modification.modifications.AbstractModification; import org.gridsuite.modification.modifications.AbstractNetworkModificationTest; +import org.gridsuite.modification.report.NetworkModificationReportResourceBundle; import org.gridsuite.modification.utils.NetworkCreation; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -52,6 +54,10 @@ abstract class AbstractByFormulaModificationTest extends AbstractNetworkModifica protected final FilterInfos filter6 = new FilterInfos(FILTER_ID_6, "filter6"); protected final FilterInfos filter7 = new FilterInfos(FILTER_ID_7, "filter7"); protected final FilterInfos filterWithOneWrongId = new FilterInfos(FILTER_WITH_ONE_WRONG_ID, "filterWithOneWrongId"); + protected final ReportNode reportNode = ReportNode.newRootReportNode() + .withResourceBundles(NetworkModificationReportResourceBundle.BASE_NAME) + .withMessageTemplate("test") + .build(); @Mock protected IFilterService filterService; @@ -70,7 +76,7 @@ public void testApply() throws Exception { when(filterService.getUuidFilterEquipmentsMap(any(), any())).thenReturn(getTestFilters()); AbstractModification modification = modificationInfo.toModification(); modification.initApplicationContext(filterService, null); - modification.apply(getNetwork()); + modification.apply(getNetwork(), reportNode); assertAfterNetworkModificationApplication(); } diff --git a/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/VoltageLevelByFormulaModificationTest.java b/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/VoltageLevelByFormulaModificationTest.java index 739065d1..a69c7bee 100644 --- a/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/VoltageLevelByFormulaModificationTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/byfilter/formula/VoltageLevelByFormulaModificationTest.java @@ -6,6 +6,7 @@ */ package org.gridsuite.modification.modifications.byfilter.formula; +import com.powsybl.commons.report.ReportNode; import com.powsybl.iidm.network.IdentifiableType; import com.powsybl.iidm.network.TopologyKind; import com.powsybl.iidm.network.VoltageLevel; @@ -194,8 +195,15 @@ protected List getFormulaInfos() { ReferenceFieldOrValue.builder().value(1000.).build(), ReferenceFieldOrValue.builder().value(3.).build()); + // test error divide by 0 + FormulaInfos formulaInfos12 = getFormulaInfo(VoltageLevelField.HIGH_VOLTAGE_LIMIT.name(), + List.of(filter7), + Operator.DIVISION, + ReferenceFieldOrValue.builder().value(1000.).build(), + ReferenceFieldOrValue.builder().value(0.).build()); + return List.of(formulaInfos1, formulaInfos2, formulaInfos3, formulaInfos4, formulaInfos5, - formulaInfos6, formulaInfos7, formulaInfos8, formulaInfos9, formulaInfos10, formulaInfos11); + formulaInfos6, formulaInfos7, formulaInfos8, formulaInfos9, formulaInfos10, formulaInfos11, formulaInfos12); } @Override @@ -241,5 +249,11 @@ protected void assertAfterNetworkModificationApplication() { //Precision tests assertEquals(110., getNetwork().getVoltageLevel(VOLTAGE_LEVEL_ID_8).getLowVoltageLimit(), 0.); assertEquals(333.3333333333, getNetwork().getVoltageLevel(VOLTAGE_LEVEL_ID_8).getHighVoltageLimit(), 0.); //scale is defined in byFormulaModifcation (10) + + // check logs + List allLogs = reportNode.getChildren().getFirst().getChildren().stream().flatMap(child -> child.getChildren().stream().map(ReportNode::getMessage)).toList(); + assertTrue(allLogs.contains("Cannot modify equipment v7 : At least one of the value or referenced field is not a number")); + assertTrue(allLogs.contains("Cannot modify equipment v8 : The value or referenced field of the second operand in the division operator is zero")); + } }