diff --git a/pom.xml b/pom.xml
index 2a4e4aea4..e24c89782 100644
--- a/pom.xml
+++ b/pom.xml
@@ -49,7 +49,7 @@
5.0.0-alpha.14
org.gridsuite.modification.server
**/migration/**/*
- 0.7.0
+ 0.8.0
diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/BranchModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/BranchModificationEntity.java
index 4f1c4fdcd..b12ff7131 100644
--- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/BranchModificationEntity.java
+++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/BranchModificationEntity.java
@@ -136,6 +136,62 @@ public class BranchModificationEntity extends BasicEquipmentModificationEntity {
})
private BooleanModificationEmbedded terminal2Connected;
+ @Embedded
+ @AttributeOverrides(value = {
+ @AttributeOverride(name = "value", column = @Column(name = "p1MeasurementValue")),
+ @AttributeOverride(name = "opType", column = @Column(name = "p1MeasurementValueOp"))
+ })
+ private DoubleModificationEmbedded p1MeasurementValue;
+
+ @Embedded
+ @AttributeOverrides(value = {
+ @AttributeOverride(name = "value", column = @Column(name = "p1MeasurementValidity")),
+ @AttributeOverride(name = "opType", column = @Column(name = "p1MeasurementValidityOp"))
+ })
+ private BooleanModificationEmbedded p1MeasurementValidity;
+
+ @Embedded
+ @AttributeOverrides(value = {
+ @AttributeOverride(name = "value", column = @Column(name = "q1MeasurementValue")),
+ @AttributeOverride(name = "opType", column = @Column(name = "q1MeasurementValueOp"))
+ })
+ private DoubleModificationEmbedded q1MeasurementValue;
+
+ @Embedded
+ @AttributeOverrides(value = {
+ @AttributeOverride(name = "value", column = @Column(name = "q1MeasurementValidity")),
+ @AttributeOverride(name = "opType", column = @Column(name = "q1MeasurementValidityOp"))
+ })
+ private BooleanModificationEmbedded q1MeasurementValidity;
+
+ @Embedded
+ @AttributeOverrides(value = {
+ @AttributeOverride(name = "value", column = @Column(name = "p2MeasurementValue")),
+ @AttributeOverride(name = "opType", column = @Column(name = "p2MeasurementValueOp"))
+ })
+ private DoubleModificationEmbedded p2MeasurementValue;
+
+ @Embedded
+ @AttributeOverrides(value = {
+ @AttributeOverride(name = "value", column = @Column(name = "p2MeasurementValidity")),
+ @AttributeOverride(name = "opType", column = @Column(name = "p2MeasurementValidityOp"))
+ })
+ private BooleanModificationEmbedded p2MeasurementValidity;
+
+ @Embedded
+ @AttributeOverrides(value = {
+ @AttributeOverride(name = "value", column = @Column(name = "q2MeasurementValue")),
+ @AttributeOverride(name = "opType", column = @Column(name = "q2MeasurementValueOp"))
+ })
+ private DoubleModificationEmbedded q2MeasurementValue;
+
+ @Embedded
+ @AttributeOverrides(value = {
+ @AttributeOverride(name = "value", column = @Column(name = "q2MeasurementValidity")),
+ @AttributeOverride(name = "opType", column = @Column(name = "q2MeasurementValidityOp"))
+ })
+ private BooleanModificationEmbedded q2MeasurementValidity;
+
protected BranchModificationEntity(BranchModificationInfos branchModificationInfos) {
super(branchModificationInfos);
assignAttributes(branchModificationInfos);
@@ -173,5 +229,13 @@ private void assignAttributes(BranchModificationInfos branchModificationInfos) {
this.connectionPosition2 = branchModificationInfos.getConnectionPosition2() != null ? new IntegerModificationEmbedded(branchModificationInfos.getConnectionPosition2()) : null;
this.terminal1Connected = branchModificationInfos.getTerminal1Connected() != null ? new BooleanModificationEmbedded(branchModificationInfos.getTerminal1Connected()) : null;
this.terminal2Connected = branchModificationInfos.getTerminal2Connected() != null ? new BooleanModificationEmbedded(branchModificationInfos.getTerminal2Connected()) : null;
+ this.p1MeasurementValue = branchModificationInfos.getP1MeasurementValue() != null ? new DoubleModificationEmbedded(branchModificationInfos.getP1MeasurementValue()) : null;
+ this.p1MeasurementValidity = branchModificationInfos.getP1MeasurementValidity() != null ? new BooleanModificationEmbedded(branchModificationInfos.getP1MeasurementValidity()) : null;
+ this.q1MeasurementValue = branchModificationInfos.getQ1MeasurementValue() != null ? new DoubleModificationEmbedded(branchModificationInfos.getQ1MeasurementValue()) : null;
+ this.q1MeasurementValidity = branchModificationInfos.getQ1MeasurementValidity() != null ? new BooleanModificationEmbedded(branchModificationInfos.getQ1MeasurementValidity()) : null;
+ this.p2MeasurementValue = branchModificationInfos.getP2MeasurementValue() != null ? new DoubleModificationEmbedded(branchModificationInfos.getP2MeasurementValue()) : null;
+ this.p2MeasurementValidity = branchModificationInfos.getP2MeasurementValidity() != null ? new BooleanModificationEmbedded(branchModificationInfos.getP2MeasurementValidity()) : null;
+ this.q2MeasurementValue = branchModificationInfos.getQ2MeasurementValue() != null ? new DoubleModificationEmbedded(branchModificationInfos.getQ2MeasurementValue()) : null;
+ this.q2MeasurementValidity = branchModificationInfos.getQ2MeasurementValidity() != null ? new BooleanModificationEmbedded(branchModificationInfos.getQ2MeasurementValidity()) : null;
}
}
diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/LineModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/LineModificationEntity.java
index d42f734ec..2b7afe3e2 100644
--- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/LineModificationEntity.java
+++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/LineModificationEntity.java
@@ -106,6 +106,14 @@ public LineModificationInfos toModificationInfos() {
.b1(toAttributeModification(getB1()))
.g2(toAttributeModification(getG2()))
.b2(toAttributeModification(getB2()))
+ .p1MeasurementValue(toAttributeModification(getP1MeasurementValue()))
+ .p1MeasurementValidity(toAttributeModification(getP1MeasurementValidity()))
+ .q1MeasurementValue(toAttributeModification(getQ1MeasurementValue()))
+ .q1MeasurementValidity(toAttributeModification(getQ1MeasurementValidity()))
+ .p2MeasurementValue(toAttributeModification(getP2MeasurementValue()))
+ .p2MeasurementValidity(toAttributeModification(getP2MeasurementValidity()))
+ .q2MeasurementValue(toAttributeModification(getQ2MeasurementValue()))
+ .q2MeasurementValidity(toAttributeModification(getQ2MeasurementValidity()))
// properties
.properties(CollectionUtils.isEmpty(getProperties()) ? null :
getProperties().stream()
diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/TwoWindingsTransformerModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/TwoWindingsTransformerModificationEntity.java
index 07b5abb18..71d18cd4b 100644
--- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/TwoWindingsTransformerModificationEntity.java
+++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/TwoWindingsTransformerModificationEntity.java
@@ -374,6 +374,14 @@ public TwoWindingsTransformerModificationInfos toModificationInfos() {
.ratedU1(IAttributeModificationEmbeddable.toAttributeModification(getRatedU1()))
.ratedU2(IAttributeModificationEmbeddable.toAttributeModification(getRatedU2()))
.ratedS(IAttributeModificationEmbeddable.toAttributeModification(getRatedS()))
+ .p1MeasurementValue(toAttributeModification(getP1MeasurementValue()))
+ .p1MeasurementValidity(toAttributeModification(getP1MeasurementValidity()))
+ .q1MeasurementValue(toAttributeModification(getQ1MeasurementValue()))
+ .q1MeasurementValidity(toAttributeModification(getQ1MeasurementValidity()))
+ .p2MeasurementValue(toAttributeModification(getP2MeasurementValue()))
+ .p2MeasurementValidity(toAttributeModification(getP2MeasurementValidity()))
+ .q2MeasurementValue(toAttributeModification(getQ2MeasurementValue()))
+ .q2MeasurementValidity(toAttributeModification(getQ2MeasurementValidity()))
// properties
.properties(CollectionUtils.isEmpty(getProperties()) ? null :
getProperties().stream()
diff --git a/src/main/resources/db/changelog/changesets/changelog_20250212T095646Z.xml b/src/main/resources/db/changelog/changesets/changelog_20250212T095646Z.xml
new file mode 100644
index 000000000..2153574fc
--- /dev/null
+++ b/src/main/resources/db/changelog/changesets/changelog_20250212T095646Z.xml
@@ -0,0 +1,163 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml
index 92e1f0486..d5f644c40 100644
--- a/src/main/resources/db/changelog/db.changelog-master.yaml
+++ b/src/main/resources/db/changelog/db.changelog-master.yaml
@@ -336,3 +336,6 @@ databaseChangeLog:
- include:
file: changesets/changelog_20250116T103740Z.xml
relativeToChangelogFile: true
+ - include:
+ file: changesets/changelog_20250212T095646Z.xml
+ relativeToChangelogFile: true
diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java
index 0f6009e64..32181b486 100644
--- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java
+++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java
@@ -208,8 +208,7 @@ void testEquipmentIdNonNull() {
String errorMessage = "equipmentId is marked non-null but is null";
LoadCreationInfosBuilder, ?> loadCreationBuilder = LoadCreationInfos.builder();
assertEquals(errorMessage, assertThrows(NullPointerException.class, loadCreationBuilder::build).getMessage());
- LoadCreationInfosBuilder, ?> loadCreationBuilder1 = loadCreationBuilder.equipmentId(null);
- assertEquals(errorMessage, assertThrows(NullPointerException.class, loadCreationBuilder1::build).getMessage());
+ assertEquals(errorMessage, assertThrows(NullPointerException.class, () -> loadCreationBuilder.equipmentId(null)).getMessage());
LoadCreationInfos loadCreationInfos = LoadCreationInfos.builder().equipmentId("idLoad").build();
assertEquals(errorMessage, assertThrows(NullPointerException.class, () -> loadCreationInfos.setEquipmentId(null)).getMessage());
}
diff --git a/src/test/java/org/gridsuite/modification/server/modifications/LineModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/LineModificationTest.java
index 6884b125c..f97ba1951 100644
--- a/src/test/java/org/gridsuite/modification/server/modifications/LineModificationTest.java
+++ b/src/test/java/org/gridsuite/modification/server/modifications/LineModificationTest.java
@@ -12,6 +12,10 @@
import com.powsybl.iidm.network.Network;
import com.powsybl.iidm.network.extensions.ConnectablePosition;
import com.powsybl.iidm.network.extensions.ConnectablePositionAdder;
+import com.powsybl.iidm.network.extensions.Measurement;
+import com.powsybl.iidm.network.extensions.Measurements;
+import org.apache.commons.collections4.CollectionUtils;
+import org.assertj.core.api.Assertions;
import org.gridsuite.modification.NetworkModificationException;
import org.gridsuite.modification.dto.*;
import org.gridsuite.modification.server.utils.NetworkCreation;
@@ -19,6 +23,7 @@
import org.junit.jupiter.api.Test;
import org.springframework.http.MediaType;
+import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@@ -27,7 +32,10 @@
import static org.gridsuite.modification.server.utils.TestUtils.assertLogMessage;
import static org.gridsuite.modification.server.utils.assertions.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@@ -39,6 +47,10 @@ class LineModificationTest extends AbstractNetworkModificationTest {
private static final String PROPERTY_NAME = "property-name";
private static final String PROPERTY_VALUE = "property-value";
+ private static final Double MEASUREMENT_P_VALUE = 10.0;
+ private static final Double MEASUREMENT_Q_VALUE = -10.0;
+ private static final Boolean MEASUREMENT_P_VALID = true;
+ private static final Boolean MEASUREMENT_Q_VALID = false;
@Override
protected Network createNetwork(UUID networkUuid) {
@@ -61,6 +73,14 @@ protected ModificationInfos buildModification() {
.connectionDirection2(new AttributeModification<>(ConnectablePosition.Direction.TOP, OperationType.SET))
.connectionPosition1(new AttributeModification<>(1, OperationType.SET))
.connectionPosition2(new AttributeModification<>(1, OperationType.SET))
+ .p1MeasurementValue(new AttributeModification<>(MEASUREMENT_P_VALUE, OperationType.SET))
+ .p1MeasurementValidity(new AttributeModification<>(MEASUREMENT_P_VALID, OperationType.SET))
+ .p2MeasurementValue(new AttributeModification<>(MEASUREMENT_P_VALUE, OperationType.SET))
+ .p2MeasurementValidity(new AttributeModification<>(MEASUREMENT_P_VALID, OperationType.SET))
+ .q1MeasurementValue(new AttributeModification<>(MEASUREMENT_Q_VALUE, OperationType.SET))
+ .q1MeasurementValidity(new AttributeModification<>(MEASUREMENT_Q_VALID, OperationType.SET))
+ .q2MeasurementValue(new AttributeModification<>(MEASUREMENT_Q_VALUE, OperationType.SET))
+ .q2MeasurementValidity(new AttributeModification<>(MEASUREMENT_Q_VALID, OperationType.SET))
.currentLimits1(CurrentLimitsModificationInfos.builder()
.permanentLimit(12.0)
.temporaryLimits(List.of(CurrentTemporaryLimitModificationInfos.builder()
@@ -135,6 +155,19 @@ protected void assertAfterNetworkModificationCreation() {
assertEquals("name32", temporaryLimit.getName());
assertEquals(42.0, temporaryLimit.getValue());
assertEquals(PROPERTY_VALUE, modifiedLine.getProperty(PROPERTY_NAME));
+ assertMeasurements(modifiedLine); // measurements extension are added
+ }
+
+ private void assertMeasurements(Line line) {
+ Measurements> measurements = (Measurements>) line.getExtension(Measurements.class);
+ assertNotNull(measurements);
+ Collection activePowerMeasurements = measurements.getMeasurements(Measurement.Type.ACTIVE_POWER).stream().toList();
+ assertNotNull(activePowerMeasurements);
+ assertFalse(CollectionUtils.isEmpty(activePowerMeasurements));
+ Assertions.assertThat(activePowerMeasurements).allMatch(m -> m.getValue() == MEASUREMENT_P_VALUE && m.isValid() == MEASUREMENT_P_VALID);
+ Collection reactivePowerMeasurements = measurements.getMeasurements(Measurement.Type.REACTIVE_POWER).stream().toList();
+ assertFalse(CollectionUtils.isEmpty(reactivePowerMeasurements));
+ Assertions.assertThat(reactivePowerMeasurements).allMatch(m -> m.getValue() == MEASUREMENT_Q_VALUE && m.isValid() == MEASUREMENT_Q_VALID);
}
@Override
@@ -150,6 +183,9 @@ protected void assertAfterNetworkModificationDeletion() {
assertNull(line.getNullableCurrentLimits1());
assertNull(line.getNullableCurrentLimits2());
assertNull(line.getProperty(PROPERTY_NAME));
+ // no more measurements extension
+ Measurements> measurements = (Measurements>) line.getExtension(Measurements.class);
+ assertTrue(measurements == null || CollectionUtils.isEmpty(measurements.getMeasurements()));
}
@Test
diff --git a/src/test/java/org/gridsuite/modification/server/modifications/TwoWindingsTransformerModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/TwoWindingsTransformerModificationTest.java
index 97aebeb04..18bc6ec0c 100644
--- a/src/test/java/org/gridsuite/modification/server/modifications/TwoWindingsTransformerModificationTest.java
+++ b/src/test/java/org/gridsuite/modification/server/modifications/TwoWindingsTransformerModificationTest.java
@@ -305,7 +305,7 @@ void testCreateWithErrors() throws Exception {
.content(modificationInfosJson)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk());
- assertLogMessage(new NetworkModificationException(TWO_WINDINGS_TRANSFORMER_NOT_FOUND, "Two windings transformer with ID '2wt_not_existing' does not exist in the network").getMessage(),
+ assertLogMessage(new NetworkModificationException(TWO_WINDINGS_TRANSFORMER_NOT_FOUND, "Two windings transformer with ID '2wt_not_existing' : it does not exist in the network").getMessage(),
twoWindingsTransformerModificationInfos.getErrorType().name(), reportService);
}
@@ -589,7 +589,7 @@ private TwoWindingsTransformer createPhaseTapChanger(PhaseTapChanger.RegulationM
Terminal phaseTapChangerTerminal = ModificationUtils.getInstance().getTerminalFromIdentifiable(getNetwork(),
"v3load",
"LOAD",
- "V3");
+ "v3");
twt3.newPhaseTapChanger()
.setLowTapPosition(0)
.setTapPosition(1)
@@ -938,7 +938,7 @@ private void preparePhaseTapChangerAdder(PhaseTapChangerAdder phaseTapChangerAdd
Terminal phaseTapChangerTerminal = ModificationUtils.getInstance().getTerminalFromIdentifiable(getNetwork(),
"v3load",
"LOAD",
- "V3");
+ "v3");
phaseTapChangerAdder.setLowTapPosition(0)
.setTapPosition(1)
.setRegulationTerminal(phaseTapChangerTerminal)
@@ -982,7 +982,7 @@ void testPhaseTapChangerRegulationCreation() throws Exception {
.tapPosition(new AttributeModification<>(1, OperationType.SET))
.regulatingTerminalId(new AttributeModification<>("v3load", OperationType.SET))
.regulatingTerminalType(new AttributeModification<>("LOAD", OperationType.SET))
- .regulatingTerminalVlId(new AttributeModification<>("V3", OperationType.SET))
+ .regulatingTerminalVlId(new AttributeModification<>("v3", OperationType.SET))
.steps(List.of(TapChangerStepCreationInfos.builder()
.index(0)
.r(0)
@@ -1029,7 +1029,7 @@ void testPhaseTapChangerRegulationCreation() throws Exception {
.tapPosition(new AttributeModification<>(1, OperationType.SET))
.regulatingTerminalId(new AttributeModification<>("v3load", OperationType.SET))
.regulatingTerminalType(new AttributeModification<>("LOAD", OperationType.SET))
- .regulatingTerminalVlId(new AttributeModification<>("V3", OperationType.SET))
+ .regulatingTerminalVlId(new AttributeModification<>("v3", OperationType.SET))
.steps(List.of(TapChangerStepCreationInfos.builder()
.index(0)
.r(0)
diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java
index 174855e54..a6992d147 100644
--- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java
+++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java
@@ -68,7 +68,7 @@ protected TwoWindingsTransformerModificationInfos buildOneModification(String eq
protected void assertAfterNetworkModificationCreation() {
assertEquals(0.0, getNetwork().getTwoWindingsTransformer("trf1").getR(), 0.001);
assertEquals(1.0, getNetwork().getTwoWindingsTransformer("trf2").getR(), 0.001);
- assertLogMessage("TWO_WINDINGS_TRANSFORMER_NOT_FOUND : Two windings transformer with ID 'unknownTwt' does not exist in the network", ModificationType.TWO_WINDINGS_TRANSFORMER_MODIFICATION.name() + "1", reportService);
+ assertLogMessage("TWO_WINDINGS_TRANSFORMER_NOT_FOUND : Two windings transformer with ID 'unknownTwt' : it does not exist in the network", ModificationType.TWO_WINDINGS_TRANSFORMER_MODIFICATION.name() + "1", reportService);
}
@Override
diff --git a/src/test/java/org/gridsuite/modification/server/utils/NetworkCreation.java b/src/test/java/org/gridsuite/modification/server/utils/NetworkCreation.java
index 6886f233a..2097626f9 100644
--- a/src/test/java/org/gridsuite/modification/server/utils/NetworkCreation.java
+++ b/src/test/java/org/gridsuite/modification/server/utils/NetworkCreation.java
@@ -207,7 +207,7 @@ public static Network create(UUID uuid, boolean createHvdcLine, NetworkFactory n
Terminal phaseTapChangerTerminal = ModificationUtils.getInstance().getTerminalFromIdentifiable(network,
"v3load",
"LOAD",
- "V3");
+ "v3");
twt2.newPhaseTapChanger()
.setLowTapPosition(0)
.setTapPosition(1)