From 9c3e62301d3d3c83f37863622932825d5e491d89 Mon Sep 17 00:00:00 2001 From: Joris M <53527338+TheMaskedTurtle@users.noreply.github.com> Date: Mon, 22 Jan 2024 16:37:31 +0100 Subject: [PATCH 1/4] feat(properties): add on load creation/modification (#415) Signed-off-by: Joris Mancini Co-authored-by: dbraquart <107846716+dbraquart@users.noreply.github.com> --- .../equipment/creation/LoadCreationEntity.java | 9 ++++++++- .../modification/LoadModificationEntity.java | 8 +++++++- .../server/modifications/LoadCreation.java | 4 ++++ .../server/modifications/LoadModification.java | 17 ++++++++++------- .../LoadCreationInBusBreakerTest.java | 7 +++++++ .../LoadCreationInNodeBreakerTest.java | 6 ++++++ .../modifications/LoadModificationTest.java | 12 ++++++++---- .../service/ModificationRepositoryTest.java | 4 ---- 8 files changed, 50 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/creation/LoadCreationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/creation/LoadCreationEntity.java index 27709f740..f755dea85 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/equipment/creation/LoadCreationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/creation/LoadCreationEntity.java @@ -14,6 +14,8 @@ import org.gridsuite.modification.server.dto.ModificationInfos; import jakarta.persistence.*; +import org.gridsuite.modification.server.entities.equipment.modification.FreePropertyEntity; +import org.springframework.util.CollectionUtils; /** * @author Franck Lecuyer @@ -73,6 +75,11 @@ public LoadCreationInfos toModificationInfos() { // load .loadType(getLoadType()) .activePower(getActivePower()) - .reactivePower(getReactivePower()); + .reactivePower(getReactivePower()) + // properties + .properties(CollectionUtils.isEmpty(getProperties()) ? null : + getProperties().stream() + .map(FreePropertyEntity::toInfos) + .toList()); } } diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/LoadModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/LoadModificationEntity.java index 74a1ee81e..16bad1ba1 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/LoadModificationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/LoadModificationEntity.java @@ -16,6 +16,7 @@ import org.gridsuite.modification.server.dto.OperationType; import jakarta.persistence.*; +import org.springframework.util.CollectionUtils; /** * @author Nicolas Noir @@ -84,6 +85,11 @@ public LoadModificationInfos toModificationInfos() { .busOrBusbarSectionId(AttributeModification.toAttributeModification(getBusOrBusbarSectionIdValue(), getBusOrBusbarSectionIdOp())) .loadType(AttributeModification.toAttributeModification(getLoadTypeValue(), getLoadTypeOp())) .constantActivePower(AttributeModification.toAttributeModification(getActivePowerValue(), getActivePowerOp())) - .constantReactivePower(AttributeModification.toAttributeModification(getReactivePowerValue(), getReactivePowerOp())); + .constantReactivePower(AttributeModification.toAttributeModification(getReactivePowerValue(), getReactivePowerOp())) + // properties + .properties(CollectionUtils.isEmpty(getProperties()) ? null : + getProperties().stream() + .map(FreePropertyEntity::toInfos) + .toList()); } } diff --git a/src/main/java/org/gridsuite/modification/server/modifications/LoadCreation.java b/src/main/java/org/gridsuite/modification/server/modifications/LoadCreation.java index fb8dbf1a4..0958c10ad 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/LoadCreation.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/LoadCreation.java @@ -64,6 +64,10 @@ public void apply(Network network, Reporter subReporter) { } reportElementaryCreations(subReporter); ModificationUtils.getInstance().disconnectInjection(modificationInfos, network.getLoad(modificationInfos.getEquipmentId()), subReporter); + + // properties + Load load = network.getLoad(modificationInfos.getEquipmentId()); + PropertiesUtils.applyProperties(load, subReporter, modificationInfos.getProperties()); } private void reportElementaryCreations(Reporter 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 b486e3d09..d7323856d 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/LoadModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/LoadModification.java @@ -40,21 +40,24 @@ public void check(Network network) throws NetworkModificationException { public void apply(Network network, Reporter subReporter) { Load load = network.getLoad(modificationInfos.getEquipmentId()); // modify the load in the network - modifyLoad(load, modificationInfos, subReporter); + modifyLoad(load, subReporter); } - private void modifyLoad(Load load, LoadModificationInfos loadModificationInfos, Reporter subReporter) { + private void modifyLoad(Load load, Reporter subReporter) { subReporter.report(Report.builder() .withKey("loadModification") .withDefaultMessage("Load with id=${id} modified :") - .withValue("id", loadModificationInfos.getEquipmentId()) + .withValue("id", modificationInfos.getEquipmentId()) .withSeverity(TypedValue.INFO_SEVERITY) .build()); - ModificationUtils.getInstance().applyElementaryModifications(load::setName, () -> load.getOptionalName().orElse("No value"), loadModificationInfos.getEquipmentName(), subReporter, "Name"); - ModificationUtils.getInstance().applyElementaryModifications(load::setLoadType, load::getLoadType, loadModificationInfos.getLoadType(), subReporter, "Type"); - ModificationUtils.getInstance().applyElementaryModifications(load::setP0, load::getP0, loadModificationInfos.getConstantActivePower(), subReporter, "Constant active power"); - ModificationUtils.getInstance().applyElementaryModifications(load::setQ0, load::getQ0, loadModificationInfos.getConstantReactivePower(), subReporter, "Constant reactive power"); + ModificationUtils.getInstance().applyElementaryModifications(load::setName, () -> load.getOptionalName().orElse("No value"), modificationInfos.getEquipmentName(), subReporter, "Name"); + ModificationUtils.getInstance().applyElementaryModifications(load::setLoadType, load::getLoadType, modificationInfos.getLoadType(), subReporter, "Type"); + ModificationUtils.getInstance().applyElementaryModifications(load::setP0, load::getP0, modificationInfos.getConstantActivePower(), subReporter, "Constant active power"); + ModificationUtils.getInstance().applyElementaryModifications(load::setQ0, load::getQ0, modificationInfos.getConstantReactivePower(), subReporter, "Constant reactive power"); + + // properties + PropertiesUtils.applyProperties(load, subReporter, modificationInfos.getProperties()); // TODO connectivity modification } diff --git a/src/test/java/org/gridsuite/modification/server/modifications/LoadCreationInBusBreakerTest.java b/src/test/java/org/gridsuite/modification/server/modifications/LoadCreationInBusBreakerTest.java index 312b6a911..c1343fb65 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/LoadCreationInBusBreakerTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/LoadCreationInBusBreakerTest.java @@ -12,11 +12,13 @@ import com.powsybl.iidm.network.Network; import com.powsybl.iidm.network.extensions.ConnectablePosition; import lombok.SneakyThrows; +import org.gridsuite.modification.server.dto.FreePropertyInfos; import org.gridsuite.modification.server.dto.LoadCreationInfos; import org.gridsuite.modification.server.dto.ModificationInfos; import org.gridsuite.modification.server.utils.NetworkCreation; import org.junit.jupiter.api.Tag; +import java.util.List; import java.util.Map; import java.util.UUID; @@ -26,6 +28,9 @@ @Tag("IntegrationTest") public class LoadCreationInBusBreakerTest extends AbstractNetworkModificationTest { + private static String PROPERTY_NAME = "property-name"; + private static String PROPERTY_VALUE = "property-value"; + @Override protected Network createNetwork(UUID networkUuid) { return NetworkCreation.createBusBreaker(networkUuid); @@ -44,6 +49,7 @@ protected ModificationInfos buildModification() { .reactivePower(30.0) .connectionName("top") .connectionDirection(ConnectablePosition.Direction.TOP) + .properties(List.of(FreePropertyInfos.builder().name(PROPERTY_NAME).value(PROPERTY_VALUE).build())) .build(); } @@ -66,6 +72,7 @@ protected ModificationInfos buildModificationUpdate() { @Override protected void assertAfterNetworkModificationCreation() { assertNotNull(getNetwork().getLoad("idLoad1")); + assertEquals(PROPERTY_VALUE, getNetwork().getLoad("idLoad1").getProperty(PROPERTY_NAME)); } @Override diff --git a/src/test/java/org/gridsuite/modification/server/modifications/LoadCreationInNodeBreakerTest.java b/src/test/java/org/gridsuite/modification/server/modifications/LoadCreationInNodeBreakerTest.java index 4be54da58..ce65ccefa 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/LoadCreationInNodeBreakerTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/LoadCreationInNodeBreakerTest.java @@ -13,6 +13,7 @@ import com.powsybl.iidm.network.extensions.ConnectablePosition; import lombok.SneakyThrows; import org.gridsuite.modification.server.NetworkModificationException; +import org.gridsuite.modification.server.dto.FreePropertyInfos; import org.gridsuite.modification.server.dto.LoadCreationInfos; import org.gridsuite.modification.server.dto.ModificationInfos; import org.gridsuite.modification.server.dto.NetworkModificationResult; @@ -22,6 +23,7 @@ import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MvcResult; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.UUID; @@ -36,6 +38,8 @@ @Tag("IntegrationTest") public class LoadCreationInNodeBreakerTest extends AbstractNetworkModificationTest { + private static String PROPERTY_NAME = "property-name"; + private static String PROPERTY_VALUE = "property-value"; @Test public void testCreateWithErrors() throws Exception { @@ -113,6 +117,7 @@ protected ModificationInfos buildModification() { .reactivePower(60.0) .connectionDirection(ConnectablePosition.Direction.TOP) .connectionName("top") + .properties(List.of(FreePropertyInfos.builder().name(PROPERTY_NAME).value(PROPERTY_VALUE).build())) .build(); } @@ -135,6 +140,7 @@ protected ModificationInfos buildModificationUpdate() { @Override protected void assertAfterNetworkModificationCreation() { assertNotNull(getNetwork().getLoad("idLoad1")); + assertEquals(PROPERTY_VALUE, getNetwork().getLoad("idLoad1").getProperty(PROPERTY_NAME)); } @Override diff --git a/src/test/java/org/gridsuite/modification/server/modifications/LoadModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/LoadModificationTest.java index c23b37581..ece174850 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/LoadModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/LoadModificationTest.java @@ -12,26 +12,27 @@ import com.powsybl.iidm.network.LoadType; import com.powsybl.iidm.network.Network; import lombok.SneakyThrows; -import org.gridsuite.modification.server.dto.AttributeModification; -import org.gridsuite.modification.server.dto.LoadModificationInfos; -import org.gridsuite.modification.server.dto.ModificationInfos; -import org.gridsuite.modification.server.dto.OperationType; +import org.gridsuite.modification.server.dto.*; import org.gridsuite.modification.server.utils.NetworkCreation; import org.junit.Test; import org.junit.jupiter.api.Tag; import org.springframework.http.MediaType; +import java.util.List; import java.util.Map; import java.util.UUID; import static org.gridsuite.modification.server.utils.TestUtils.assertLogMessage; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @Tag("IntegrationTest") public class LoadModificationTest extends AbstractNetworkModificationTest { + private static String PROPERTY_NAME = "property-name"; + private static String PROPERTY_VALUE = "property-value"; @Override protected Network createNetwork(UUID networkUuid) { @@ -47,6 +48,7 @@ protected ModificationInfos buildModification() { .loadType(new AttributeModification<>(LoadType.FICTITIOUS, OperationType.SET)) .constantActivePower(new AttributeModification<>(200.0, OperationType.SET)) .constantReactivePower(new AttributeModification<>(30.0, OperationType.SET)) + .properties(List.of(FreePropertyInfos.builder().name(PROPERTY_NAME).value(PROPERTY_VALUE).build())) .build(); } @@ -70,6 +72,7 @@ protected void assertAfterNetworkModificationCreation() { assertEquals(200.0, modifiedLoad.getP0(), 0.0); assertEquals(30.0, modifiedLoad.getQ0(), 0.0); assertEquals("nameLoad1", modifiedLoad.getNameOrId()); + assertEquals(PROPERTY_VALUE, modifiedLoad.getProperty(PROPERTY_NAME)); } @Override @@ -80,6 +83,7 @@ protected void assertAfterNetworkModificationDeletion() { assertEquals(0.0, modifiedLoad.getP0(), 0.0); assertEquals(0.0, modifiedLoad.getQ0(), 0.0); assertEquals("v1load", modifiedLoad.getNameOrId()); + assertNull(modifiedLoad.getProperty(PROPERTY_NAME)); } @Test diff --git a/src/test/java/org/gridsuite/modification/server/service/ModificationRepositoryTest.java b/src/test/java/org/gridsuite/modification/server/service/ModificationRepositoryTest.java index 33978b9df..caaa4fa1f 100644 --- a/src/test/java/org/gridsuite/modification/server/service/ModificationRepositoryTest.java +++ b/src/test/java/org/gridsuite/modification/server/service/ModificationRepositoryTest.java @@ -89,10 +89,6 @@ private SubstationCreationInfos getSubstationCreationModification(UUID modificat return (SubstationCreationInfos) networkModificationRepository.getModificationInfo(modificationUuid); } - private SubstationModificationInfos getSubstationModificationInfos(UUID modificationUuid) { - return (SubstationModificationInfos) networkModificationRepository.getModificationInfo(modificationUuid); - } - private VoltageLevelCreationInfos getVoltageLevelCreationModification(UUID modificationUuid) { return (VoltageLevelCreationInfos) networkModificationRepository.getModificationInfo(modificationUuid); } From c41d2d188dff73ac127364da7561eec49ac91b70 Mon Sep 17 00:00:00 2001 From: souissimai <133104748+souissimai@users.noreply.github.com> Date: Wed, 24 Jan 2024 16:28:07 +0100 Subject: [PATCH 2/4] Homogenize load attributes (#417) * homogenize load attributes --------- Signed-off-by: Maissa SOUISSI --- .../server/dto/LoadCreationInfos.java | 4 +- .../server/dto/LoadModificationInfos.java | 4 +- .../creation/LoadCreationEntity.java | 16 ++++---- .../modification/LoadModificationEntity.java | 28 ++++++------- .../server/modifications/LoadCreation.java | 12 +++--- .../modifications/LoadModification.java | 4 +- .../changesets/changelog_20240112T134559Z.xml | 39 +++++++++++++++++++ .../db/changelog/db.changelog-master.yaml | 4 +- .../server/ModificationControllerTest.java | 4 +- .../LoadCreationInBusBreakerTest.java | 8 ++-- .../LoadCreationInNodeBreakerTest.java | 10 ++--- .../modifications/LoadModificationTest.java | 8 ++-- .../TabularLoadModificationsTest.java | 12 +++--- .../server/service/BuildTest.java | 16 ++++---- .../service/ModificationRepositoryTest.java | 6 +-- .../server/utils/ModificationCreation.java | 8 ++-- 16 files changed, 112 insertions(+), 71 deletions(-) create mode 100644 src/main/resources/db/changelog/changesets/changelog_20240112T134559Z.xml diff --git a/src/main/java/org/gridsuite/modification/server/dto/LoadCreationInfos.java b/src/main/java/org/gridsuite/modification/server/dto/LoadCreationInfos.java index 3bfd67c95..28f0530b6 100644 --- a/src/main/java/org/gridsuite/modification/server/dto/LoadCreationInfos.java +++ b/src/main/java/org/gridsuite/modification/server/dto/LoadCreationInfos.java @@ -38,10 +38,10 @@ public class LoadCreationInfos extends InjectionCreationInfos { private LoadType loadType; @Schema(description = "Active power") - private double activePower; + private double p0; @Schema(description = "Reactive power") - private double reactivePower; + private double q0; @Override public LoadCreationEntity toEntity() { diff --git a/src/main/java/org/gridsuite/modification/server/dto/LoadModificationInfos.java b/src/main/java/org/gridsuite/modification/server/dto/LoadModificationInfos.java index c40a1343d..91250d4cf 100644 --- a/src/main/java/org/gridsuite/modification/server/dto/LoadModificationInfos.java +++ b/src/main/java/org/gridsuite/modification/server/dto/LoadModificationInfos.java @@ -36,10 +36,10 @@ public class LoadModificationInfos extends InjectionModificationInfos { private AttributeModification loadType; @Schema(description = "Active power modification") - private AttributeModification constantActivePower; + private AttributeModification p0; @Schema(description = "Reactive power modification") - private AttributeModification constantReactivePower; + private AttributeModification q0; @Override public LoadModificationEntity toEntity() { diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/creation/LoadCreationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/creation/LoadCreationEntity.java index f755dea85..ec3e5cedd 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/equipment/creation/LoadCreationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/creation/LoadCreationEntity.java @@ -29,11 +29,11 @@ public class LoadCreationEntity extends InjectionCreationEntity { @Column(name = "loadType") private LoadType loadType; - @Column(name = "activePower") - private double activePower; + @Column(name = "p0") + private double p0; - @Column(name = "reactivePower") - private double reactivePower; + @Column(name = "q0") + private double q0; public LoadCreationEntity(@NonNull LoadCreationInfos loadCreationInfos) { super(loadCreationInfos); @@ -48,8 +48,8 @@ public void update(@NonNull ModificationInfos modificationInfos) { private void assignAttributes(LoadCreationInfos loadCreationInfos) { loadType = loadCreationInfos.getLoadType(); - activePower = loadCreationInfos.getActivePower(); - reactivePower = loadCreationInfos.getReactivePower(); + p0 = loadCreationInfos.getP0(); + q0 = loadCreationInfos.getQ0(); } @Override @@ -74,8 +74,8 @@ public LoadCreationInfos toModificationInfos() { .connected(isConnected()) // load .loadType(getLoadType()) - .activePower(getActivePower()) - .reactivePower(getReactivePower()) + .p0(getP0()) + .q0(getQ0()) // properties .properties(CollectionUtils.isEmpty(getProperties()) ? null : getProperties().stream() diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/LoadModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/LoadModificationEntity.java index 16bad1ba1..0688410aa 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/LoadModificationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/LoadModificationEntity.java @@ -34,19 +34,19 @@ public class LoadModificationEntity extends InjectionModificationEntity { @Enumerated(EnumType.STRING) private OperationType loadTypeOp; - @Column(name = "activePowerValue") - private Double activePowerValue; + @Column(name = "p0_value") + private Double p0Value; - @Column(name = "activePowerOp") + @Column(name = "p0_op") @Enumerated(EnumType.STRING) - private OperationType activePowerOp; + private OperationType p0Op; - @Column(name = "reactivePowerValue") - private Double reactivePowerValue; + @Column(name = "q0_value") + private Double q0Value; - @Column(name = "reactivePowerOp") + @Column(name = "q0_Op") @Enumerated(EnumType.STRING) - private OperationType reactivePowerOp; + private OperationType q0Op; public LoadModificationEntity(@NonNull LoadModificationInfos loadModificationInfos) { super(loadModificationInfos); @@ -62,10 +62,10 @@ public void update(@NonNull ModificationInfos modificationInfos) { private void assignAttributes(LoadModificationInfos loadModificationInfos) { this.loadTypeValue = loadModificationInfos.getLoadType() != null ? loadModificationInfos.getLoadType().getValue() : null; this.loadTypeOp = loadModificationInfos.getLoadType() != null ? loadModificationInfos.getLoadType().getOp() : null; - this.activePowerValue = loadModificationInfos.getConstantActivePower() != null ? loadModificationInfos.getConstantActivePower().getValue() : null; - this.activePowerOp = loadModificationInfos.getConstantActivePower() != null ? loadModificationInfos.getConstantActivePower().getOp() : null; - this.reactivePowerValue = loadModificationInfos.getConstantReactivePower() != null ? loadModificationInfos.getConstantReactivePower().getValue() : null; - this.reactivePowerOp = loadModificationInfos.getConstantReactivePower() != null ? loadModificationInfos.getConstantReactivePower().getOp() : null; + this.p0Value = loadModificationInfos.getP0() != null ? loadModificationInfos.getP0().getValue() : null; + this.p0Op = loadModificationInfos.getP0() != null ? loadModificationInfos.getP0().getOp() : null; + this.q0Value = loadModificationInfos.getQ0() != null ? loadModificationInfos.getQ0().getValue() : null; + this.q0Op = loadModificationInfos.getQ0() != null ? loadModificationInfos.getQ0().getOp() : null; } @Override @@ -84,8 +84,8 @@ public LoadModificationInfos toModificationInfos() { .voltageLevelId(AttributeModification.toAttributeModification(getVoltageLevelIdValue(), getVoltageLevelIdOp())) .busOrBusbarSectionId(AttributeModification.toAttributeModification(getBusOrBusbarSectionIdValue(), getBusOrBusbarSectionIdOp())) .loadType(AttributeModification.toAttributeModification(getLoadTypeValue(), getLoadTypeOp())) - .constantActivePower(AttributeModification.toAttributeModification(getActivePowerValue(), getActivePowerOp())) - .constantReactivePower(AttributeModification.toAttributeModification(getReactivePowerValue(), getReactivePowerOp())) + .p0(AttributeModification.toAttributeModification(getP0Value(), getP0Op())) + .q0(AttributeModification.toAttributeModification(getQ0Value(), getQ0Op())) // properties .properties(CollectionUtils.isEmpty(getProperties()) ? null : getProperties().stream() diff --git a/src/main/java/org/gridsuite/modification/server/modifications/LoadCreation.java b/src/main/java/org/gridsuite/modification/server/modifications/LoadCreation.java index 0958c10ad..f0580ed16 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/LoadCreation.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/LoadCreation.java @@ -82,10 +82,10 @@ private void reportElementaryCreations(Reporter subReporter) { } ModificationUtils.getInstance() - .reportElementaryCreation(subReporter, modificationInfos.getActivePower(), "Active power"); + .reportElementaryCreation(subReporter, modificationInfos.getP0(), "Active power"); ModificationUtils.getInstance() - .reportElementaryCreation(subReporter, modificationInfos.getReactivePower(), "Reactive power"); + .reportElementaryCreation(subReporter, modificationInfos.getQ0(), "Reactive power"); } private LoadAdder createLoadAdderInNodeBreaker(VoltageLevel voltageLevel, LoadCreationInfos loadCreationInfos) { @@ -94,8 +94,8 @@ private LoadAdder createLoadAdderInNodeBreaker(VoltageLevel voltageLevel, LoadCr .setId(loadCreationInfos.getEquipmentId()) .setName(loadCreationInfos.getEquipmentName()) .setLoadType(loadCreationInfos.getLoadType()) - .setP0(loadCreationInfos.getActivePower()) - .setQ0(loadCreationInfos.getReactivePower()); + .setP0(loadCreationInfos.getP0()) + .setQ0(loadCreationInfos.getQ0()); } private Load createLoadInBusBreaker(VoltageLevel voltageLevel, LoadCreationInfos loadCreationInfos) { @@ -108,7 +108,7 @@ private Load createLoadInBusBreaker(VoltageLevel voltageLevel, LoadCreationInfos .setLoadType(loadCreationInfos.getLoadType()) .setBus(bus.getId()) .setConnectableBus(bus.getId()) - .setP0(loadCreationInfos.getActivePower()) - .setQ0(loadCreationInfos.getReactivePower()).add(); + .setP0(loadCreationInfos.getP0()) + .setQ0(loadCreationInfos.getQ0()).add(); } } 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 d7323856d..ce4ff9875 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/LoadModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/LoadModification.java @@ -53,8 +53,8 @@ private void modifyLoad(Load load, Reporter subReporter) { ModificationUtils.getInstance().applyElementaryModifications(load::setName, () -> load.getOptionalName().orElse("No value"), modificationInfos.getEquipmentName(), subReporter, "Name"); ModificationUtils.getInstance().applyElementaryModifications(load::setLoadType, load::getLoadType, modificationInfos.getLoadType(), subReporter, "Type"); - ModificationUtils.getInstance().applyElementaryModifications(load::setP0, load::getP0, modificationInfos.getConstantActivePower(), subReporter, "Constant active power"); - ModificationUtils.getInstance().applyElementaryModifications(load::setQ0, load::getQ0, modificationInfos.getConstantReactivePower(), subReporter, "Constant reactive power"); + ModificationUtils.getInstance().applyElementaryModifications(load::setP0, load::getP0, modificationInfos.getP0(), subReporter, "Constant active power"); + ModificationUtils.getInstance().applyElementaryModifications(load::setQ0, load::getQ0, modificationInfos.getQ0(), subReporter, "Constant reactive power"); // properties PropertiesUtils.applyProperties(load, subReporter, modificationInfos.getProperties()); diff --git a/src/main/resources/db/changelog/changesets/changelog_20240112T134559Z.xml b/src/main/resources/db/changelog/changesets/changelog_20240112T134559Z.xml new file mode 100644 index 000000000..d6b52f02f --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20240112T134559Z.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 6ef01f63d..9721825be 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -234,7 +234,9 @@ databaseChangeLog: - include: file: changesets/changelog_20231228T142443Z.xml relativeToChangelogFile: true - - include: file: changesets/changelog_20231228T111008Z.xml relativeToChangelogFile: true + - include: + file: changesets/changelog_20240112T134559Z.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 e42864762..5ad988a2a 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -838,8 +838,8 @@ public void testGroupDuplication() throws Exception { .voltageLevelId("v2") .busOrBusbarSectionId("1B") .loadType(LoadType.AUXILIARY) - .activePower(100.0) - .reactivePower(60.0) + .p0(100.0) + .q0(60.0) .connectionDirection(ConnectablePosition.Direction.BOTTOM) .connectionName("bottom") .build(); diff --git a/src/test/java/org/gridsuite/modification/server/modifications/LoadCreationInBusBreakerTest.java b/src/test/java/org/gridsuite/modification/server/modifications/LoadCreationInBusBreakerTest.java index c1343fb65..dde3890f9 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/LoadCreationInBusBreakerTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/LoadCreationInBusBreakerTest.java @@ -45,8 +45,8 @@ protected ModificationInfos buildModification() { .voltageLevelId("v1") .busOrBusbarSectionId("bus1") .loadType(LoadType.FICTITIOUS) - .activePower(200.0) - .reactivePower(30.0) + .p0(200.0) + .q0(30.0) .connectionName("top") .connectionDirection(ConnectablePosition.Direction.TOP) .properties(List.of(FreePropertyInfos.builder().name(PROPERTY_NAME).value(PROPERTY_VALUE).build())) @@ -62,8 +62,8 @@ protected ModificationInfos buildModificationUpdate() { .voltageLevelId("v1Edited") .busOrBusbarSectionId("bus1Edited") .loadType(LoadType.FICTITIOUS) - .activePower(300.0) - .reactivePower(50.0) + .p0(300.0) + .q0(50.0) .connectionName("bottom") .connectionDirection(ConnectablePosition.Direction.BOTTOM) .build(); diff --git a/src/test/java/org/gridsuite/modification/server/modifications/LoadCreationInNodeBreakerTest.java b/src/test/java/org/gridsuite/modification/server/modifications/LoadCreationInNodeBreakerTest.java index ce65ccefa..b31e4b790 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/LoadCreationInNodeBreakerTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/LoadCreationInNodeBreakerTest.java @@ -82,7 +82,7 @@ public void testCreateWithErrors() throws Exception { testNetworkModificationsCount(getGroupId(), 4); loadCreationInfos.setBusOrBusbarSectionId("1B"); - loadCreationInfos.setActivePower(Double.NaN); + loadCreationInfos.setP0(Double.NaN); loadCreationInfosJson = mapper.writeValueAsString(loadCreationInfos); mockMvc.perform(post(getNetworkModificationUri()).content(loadCreationInfosJson).contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()); @@ -113,8 +113,8 @@ protected ModificationInfos buildModification() { .voltageLevelId("v2") .busOrBusbarSectionId("1B") .loadType(LoadType.AUXILIARY) - .activePower(100.0) - .reactivePower(60.0) + .p0(100.0) + .q0(60.0) .connectionDirection(ConnectablePosition.Direction.TOP) .connectionName("top") .properties(List.of(FreePropertyInfos.builder().name(PROPERTY_NAME).value(PROPERTY_VALUE).build())) @@ -130,8 +130,8 @@ protected ModificationInfos buildModificationUpdate() { .voltageLevelId("v2Edited") .busOrBusbarSectionId("1BEdited") .loadType(LoadType.AUXILIARY) - .activePower(200.0) - .reactivePower(90.0) + .p0(200.0) + .q0(90.0) .connectionDirection(ConnectablePosition.Direction.BOTTOM) .connectionName("topEdited") .build(); diff --git a/src/test/java/org/gridsuite/modification/server/modifications/LoadModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/LoadModificationTest.java index ece174850..5cfe08e50 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/LoadModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/LoadModificationTest.java @@ -46,8 +46,8 @@ protected ModificationInfos buildModification() { .equipmentId("v1load") .equipmentName(new AttributeModification<>("nameLoad1", OperationType.SET)) .loadType(new AttributeModification<>(LoadType.FICTITIOUS, OperationType.SET)) - .constantActivePower(new AttributeModification<>(200.0, OperationType.SET)) - .constantReactivePower(new AttributeModification<>(30.0, OperationType.SET)) + .p0(new AttributeModification<>(200.0, OperationType.SET)) + .q0(new AttributeModification<>(30.0, OperationType.SET)) .properties(List.of(FreePropertyInfos.builder().name(PROPERTY_NAME).value(PROPERTY_VALUE).build())) .build(); } @@ -59,8 +59,8 @@ protected ModificationInfos buildModificationUpdate() { .stashed(false) .equipmentName(new AttributeModification<>("nameLoadEdited1", OperationType.SET)) .loadType(new AttributeModification<>(LoadType.AUXILIARY, OperationType.SET)) - .constantActivePower(new AttributeModification<>(300.0, OperationType.SET)) - .constantReactivePower(new AttributeModification<>(50.0, OperationType.SET)) + .p0(new AttributeModification<>(300.0, OperationType.SET)) + .q0(new AttributeModification<>(50.0, OperationType.SET)) .build(); } diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularLoadModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularLoadModificationsTest.java index d93978f34..850c72cef 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularLoadModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularLoadModificationsTest.java @@ -36,9 +36,9 @@ protected Network createNetwork(UUID networkUuid) { @Override protected ModificationInfos buildModification() { List modifications = List.of( - LoadModificationInfos.builder().equipmentId("v1load").constantReactivePower(new AttributeModification<>(300., OperationType.SET)).build(), - LoadModificationInfos.builder().equipmentId("v2load").constantReactivePower(new AttributeModification<>(300., OperationType.SET)).build(), - LoadModificationInfos.builder().equipmentId("v3load").constantReactivePower(new AttributeModification<>(300., OperationType.SET)).build() + LoadModificationInfos.builder().equipmentId("v1load").q0(new AttributeModification<>(300., OperationType.SET)).build(), + LoadModificationInfos.builder().equipmentId("v2load").q0(new AttributeModification<>(300., OperationType.SET)).build(), + LoadModificationInfos.builder().equipmentId("v3load").q0(new AttributeModification<>(300., OperationType.SET)).build() ); return TabularModificationInfos.builder() .modificationType(ModificationType.LOAD_MODIFICATION) @@ -50,9 +50,9 @@ protected ModificationInfos buildModification() { @Override protected ModificationInfos buildModificationUpdate() { List modifications = List.of( - LoadModificationInfos.builder().equipmentId("v1load").constantReactivePower(new AttributeModification<>(500., OperationType.SET)).build(), - LoadModificationInfos.builder().equipmentId("v2load").constantReactivePower(new AttributeModification<>(500., OperationType.SET)).build(), - LoadModificationInfos.builder().equipmentId("v3load").constantReactivePower(new AttributeModification<>(500., OperationType.SET)).build() + LoadModificationInfos.builder().equipmentId("v1load").q0(new AttributeModification<>(500., OperationType.SET)).build(), + LoadModificationInfos.builder().equipmentId("v2load").q0(new AttributeModification<>(500., OperationType.SET)).build(), + LoadModificationInfos.builder().equipmentId("v3load").q0(new AttributeModification<>(500., OperationType.SET)).build() ); return TabularModificationInfos.builder() .modificationType(ModificationType.LOAD_MODIFICATION) diff --git a/src/test/java/org/gridsuite/modification/server/service/BuildTest.java b/src/test/java/org/gridsuite/modification/server/service/BuildTest.java index 713b03a8e..a55c663d9 100644 --- a/src/test/java/org/gridsuite/modification/server/service/BuildTest.java +++ b/src/test/java/org/gridsuite/modification/server/service/BuildTest.java @@ -375,8 +375,8 @@ public void testIndexationAfterBuild() throws Exception { .loadType(LoadType.AUXILIARY) .voltageLevelId("vl1") .busOrBusbarSectionId("1.1") - .activePower(10.) - .reactivePower(20.) + .p0(10.) + .q0(20.) .connectionName("vn") .connectionDirection(ConnectablePosition.Direction.TOP) .build().toEntity()); @@ -512,10 +512,10 @@ public void runBuildTest() throws Exception { entities1.add(EquipmentAttributeModificationInfos.builder().equipmentId("trf1").equipmentAttributeName("ratioTapChanger.tapPosition").equipmentAttributeValue(2).equipmentType(IdentifiableType.TWO_WINDINGS_TRANSFORMER).build().toEntity()); entities1.add(EquipmentAttributeModificationInfos.builder().equipmentId("trf6").equipmentAttributeName("phaseTapChanger1.tapPosition").equipmentAttributeValue(0).equipmentType(IdentifiableType.THREE_WINDINGS_TRANSFORMER).build().toEntity()); - entities1.add(LoadCreationInfos.builder().equipmentId("newLoad").equipmentName("newLoad").loadType(LoadType.AUXILIARY).voltageLevelId("v1").busOrBusbarSectionId("1.1").activePower(10.).reactivePower(20.).connectionName("vn").connectionDirection(ConnectablePosition.Direction.TOP).connected(true).build().toEntity()); - entities1.add(LoadCreationInfos.builder().equipmentId("newLoad1").equipmentName("newLoad1").loadType(LoadType.AUXILIARY).voltageLevelId("v1").busOrBusbarSectionId("1.1").activePower(10.).reactivePower(20.).connectionName("cn1").connectionDirection(ConnectablePosition.Direction.BOTTOM).connected(true).build().toEntity()); - entities1.add(LoadCreationInfos.builder().equipmentId("newLoad2").equipmentName("newLoad2").loadType(LoadType.AUXILIARY).voltageLevelId("v1").busOrBusbarSectionId("1.1").activePower(10.).reactivePower(20.).connectionName("cn2").connectionDirection(ConnectablePosition.Direction.UNDEFINED).connected(true).build().toEntity()); - entities1.add(LoadCreationInfos.builder().equipmentId("newLoad3").equipmentName("newLoad3").loadType(LoadType.AUXILIARY).voltageLevelId("v1").busOrBusbarSectionId("1.1").activePower(10.).reactivePower(20.).connectionName(null).connectionDirection(ConnectablePosition.Direction.UNDEFINED).connected(true).build().toEntity()); + entities1.add(LoadCreationInfos.builder().equipmentId("newLoad").equipmentName("newLoad").loadType(LoadType.AUXILIARY).voltageLevelId("v1").busOrBusbarSectionId("1.1").p0(10.).q0(20.).connectionName("vn").connectionDirection(ConnectablePosition.Direction.TOP).connected(true).build().toEntity()); + entities1.add(LoadCreationInfos.builder().equipmentId("newLoad1").equipmentName("newLoad1").loadType(LoadType.AUXILIARY).voltageLevelId("v1").busOrBusbarSectionId("1.1").p0(10.).q0(20.).connectionName("cn1").connectionDirection(ConnectablePosition.Direction.BOTTOM).connected(true).build().toEntity()); + entities1.add(LoadCreationInfos.builder().equipmentId("newLoad2").equipmentName("newLoad2").loadType(LoadType.AUXILIARY).voltageLevelId("v1").busOrBusbarSectionId("1.1").p0(10.).q0(20.).connectionName("cn2").connectionDirection(ConnectablePosition.Direction.UNDEFINED).connected(true).build().toEntity()); + entities1.add(LoadCreationInfos.builder().equipmentId("newLoad3").equipmentName("newLoad3").loadType(LoadType.AUXILIARY).voltageLevelId("v1").busOrBusbarSectionId("1.1").p0(10.).q0(20.).connectionName(null).connectionDirection(ConnectablePosition.Direction.UNDEFINED).connected(true).build().toEntity()); List properties = List.of(FreePropertyInfos.builder().name("DEMO").value("Demo1").build()); entities1.add(SubstationCreationInfos.builder() @@ -690,7 +690,7 @@ public void runBuildTest() throws Exception { .build().toEntity() ); entities2.add(LoadModificationInfos.builder().equipmentId("newLoad") - .equipmentName(new AttributeModification<>("newLoadName", OperationType.SET)).constantActivePower(null).build().toEntity()); + .equipmentName(new AttributeModification<>("newLoadName", OperationType.SET)).p0(null).build().toEntity()); entities2.add(GeneratorModificationInfos.builder() .equipmentId("newGenerator") .equipmentName(new AttributeModification<>("newGeneratorName", OperationType.SET)) @@ -907,7 +907,7 @@ public void runBuildWithStashedModificationsTest() throws Exception { // create modification entities in the database List entities1 = new ArrayList<>(); entities1.add(EquipmentAttributeModificationInfos.builder().equipmentId("v1d1").equipmentAttributeName("open").equipmentAttributeValue(true).equipmentType(IdentifiableType.SWITCH).build().toEntity()); - entities1.add(LoadCreationInfos.builder().equipmentId("willBeStashedLoad").equipmentName("willBeStashedLoad").loadType(LoadType.AUXILIARY).voltageLevelId("v1").busOrBusbarSectionId("1.1").activePower(10.).reactivePower(20.).connectionName("vn").connectionDirection(ConnectablePosition.Direction.TOP).connected(true).stashed(true).build().toEntity()); + entities1.add(LoadCreationInfos.builder().equipmentId("willBeStashedLoad").equipmentName("willBeStashedLoad").loadType(LoadType.AUXILIARY).voltageLevelId("v1").busOrBusbarSectionId("1.1").p0(10.).q0(20.).connectionName("vn").connectionDirection(ConnectablePosition.Direction.TOP).connected(true).stashed(true).build().toEntity()); modificationRepository.saveModifications(TEST_GROUP_ID, entities1); diff --git a/src/test/java/org/gridsuite/modification/server/service/ModificationRepositoryTest.java b/src/test/java/org/gridsuite/modification/server/service/ModificationRepositoryTest.java index caaa4fa1f..c1b6c4a37 100644 --- a/src/test/java/org/gridsuite/modification/server/service/ModificationRepositoryTest.java +++ b/src/test/java/org/gridsuite/modification/server/service/ModificationRepositoryTest.java @@ -236,9 +236,9 @@ public void testDeleteModificationQueryCount() { @Test public void testLoadCreation() { - var createLoadEntity1 = LoadCreationInfos.builder().equipmentId("idLoad1").equipmentName("nameLoad1").loadType(LoadType.AUXILIARY).voltageLevelId("vlId1").busOrBusbarSectionId("busId1").activePower(100.).reactivePower(20.).connectionName("top1").connectionDirection(ConnectablePosition.Direction.TOP).connectionPosition(11).build().toEntity(); - var createLoadEntity2 = LoadCreationInfos.builder().equipmentId("idLoad2").equipmentName("nameLoad2").loadType(LoadType.FICTITIOUS).voltageLevelId("vlId2").busOrBusbarSectionId("busId2").activePower(80.).reactivePower(30.).connectionName("bottom1").connectionDirection(ConnectablePosition.Direction.BOTTOM).connectionPosition(11).build().toEntity(); - var createLoadEntity3 = LoadCreationInfos.builder().equipmentId("idLoad3").equipmentName("nameLoad3").loadType(LoadType.FICTITIOUS).voltageLevelId("vlId3").busOrBusbarSectionId("busId3").activePower(50.).reactivePower(90.).connectionName("top2").connectionDirection(ConnectablePosition.Direction.TOP).connectionPosition(12).build().toEntity(); + var createLoadEntity1 = LoadCreationInfos.builder().equipmentId("idLoad1").equipmentName("nameLoad1").loadType(LoadType.AUXILIARY).voltageLevelId("vlId1").busOrBusbarSectionId("busId1").p0(100.).q0(20.).connectionName("top1").connectionDirection(ConnectablePosition.Direction.TOP).connectionPosition(11).build().toEntity(); + var createLoadEntity2 = LoadCreationInfos.builder().equipmentId("idLoad2").equipmentName("nameLoad2").loadType(LoadType.FICTITIOUS).voltageLevelId("vlId2").busOrBusbarSectionId("busId2").p0(80.).q0(30.).connectionName("bottom1").connectionDirection(ConnectablePosition.Direction.BOTTOM).connectionPosition(11).build().toEntity(); + var createLoadEntity3 = LoadCreationInfos.builder().equipmentId("idLoad3").equipmentName("nameLoad3").loadType(LoadType.FICTITIOUS).voltageLevelId("vlId3").busOrBusbarSectionId("busId3").p0(50.).q0(90.).connectionName("top2").connectionDirection(ConnectablePosition.Direction.TOP).connectionPosition(12).build().toEntity(); networkModificationRepository.saveModifications(TEST_GROUP_ID, List.of(createLoadEntity1, createLoadEntity2, createLoadEntity3)); assertRequestsCount(1, 3, 1, 0); diff --git a/src/test/java/org/gridsuite/modification/server/utils/ModificationCreation.java b/src/test/java/org/gridsuite/modification/server/utils/ModificationCreation.java index 7b5561c14..3ec03e635 100644 --- a/src/test/java/org/gridsuite/modification/server/utils/ModificationCreation.java +++ b/src/test/java/org/gridsuite/modification/server/utils/ModificationCreation.java @@ -104,8 +104,8 @@ public static LoadCreationInfos getCreationLoad(String vlId, String loadId, Stri .voltageLevelId(vlId) .busOrBusbarSectionId(busOrBusBarSectionId) .loadType(loadType) - .activePower(100.0) - .reactivePower(20.0) + .p0(100.0) + .q0(20.0) .connectionName("top") .connectionDirection(ConnectablePosition.Direction.TOP) .build(); @@ -133,11 +133,11 @@ public static LoadModificationInfos getModificationLoad(String loadId, String vl } if (activePower != null) { - builder.constantActivePower(AttributeModification.toAttributeModification(activePower, OperationType.SET)); + builder.p0(AttributeModification.toAttributeModification(activePower, OperationType.SET)); } if (reactivePower != null) { - builder.constantReactivePower(AttributeModification.toAttributeModification(reactivePower, OperationType.SET)); + builder.q0(AttributeModification.toAttributeModification(reactivePower, OperationType.SET)); } return builder.build(); From dd8abc1b41837ce73fd26ca8a3a73f1ff61ea338 Mon Sep 17 00:00:00 2001 From: YenguiSeddik <101111441+YenguiSeddik@users.noreply.github.com> Date: Fri, 26 Jan 2024 16:02:10 +0100 Subject: [PATCH 3/4] fix by formula modification report (#418) Signed-off-by:Seddik Yengui --- .../modifications/ByFormulaModification.java | 38 +++++++++++++--- .../AbstractByFormulaModificationTest.java | 44 +++++++++++++++++-- .../BatteryByFormulaModificationTest.java | 13 ------ .../GeneratorByFormulaModificationTest.java | 12 +++-- ...tCompensatorByFormulaModificationTest.java | 13 ------ ...sTransformerByFormulaModificationTest.java | 31 ++++++++----- 6 files changed, 101 insertions(+), 50 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/modifications/ByFormulaModification.java b/src/main/java/org/gridsuite/modification/server/modifications/ByFormulaModification.java index aaa5ed341..b6813beb2 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/ByFormulaModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/ByFormulaModification.java @@ -32,6 +32,7 @@ import static org.gridsuite.modification.server.modifications.ModificationUtils.distinctByKey; public class ByFormulaModification extends AbstractModification { + public static final String EQUIPMENT_MODIFIED_REPORT_ERROR = "EquipmentModifiedReportError_"; private final ByFormulaModificationInfos modificationInfos; protected FilterService filterService; private int equipmentNotModifiedCount; @@ -140,7 +141,7 @@ private void applyFormulaOnFilterEquipments(Network network, .stream() .map(attributes -> network.getIdentifiable(attributes.getId())) .filter(identifiable -> { - boolean isEditableEquipment = isEquipmentEditable(identifiable, formulaInfos); + boolean isEditableEquipment = isEquipmentEditable(identifiable, formulaInfos, equipmentsReport); if (!isEditableEquipment) { notEditableEquipments.add(identifiable.getId()); equipmentNotModifiedCount += 1; @@ -181,7 +182,7 @@ private void createFormulaReports(List formulaReports, FormulaInfos form if (!CollectionUtils.isEmpty(notEditableEquipments)) { formulaReports.add(Report.builder() .withKey("NotEditedEquipmentsFilter_" + formulaReports.size()) - .withDefaultMessage(String.format(" The following equipment were not modified : %s", String.join(", ", notEditableEquipments))) + .withDefaultMessage(String.format(" %s equipment(s) were not modified", notEditableEquipments.size())) .withSeverity(TypedValue.WARN_SEVERITY) .build()); } @@ -205,7 +206,8 @@ private void createFormulaReports(List formulaReports, FormulaInfos form } private boolean isEquipmentEditable(Identifiable identifiable, - FormulaInfos formulaInfos) { + FormulaInfos formulaInfos, + List equipmentsReport) { if (formulaInfos.getEditedField() == null) { return false; } @@ -214,8 +216,32 @@ private boolean isEquipmentEditable(Identifiable identifiable, TwoWindingsTransformerField editedField = TwoWindingsTransformerField.valueOf(formulaInfos.getEditedField()); TwoWindingsTransformer twoWindingsTransformer = (TwoWindingsTransformer) identifiable; return switch (editedField) { - case TARGET_V, RATIO_LOW_TAP_POSITION, RATIO_TAP_POSITION, RATIO_TARGET_DEADBAND -> twoWindingsTransformer.getRatioTapChanger() != null; - case REGULATION_VALUE, PHASE_LOW_TAP_POSITION, PHASE_TAP_POSITION, PHASE_TARGET_DEADBAND -> twoWindingsTransformer.getPhaseTapChanger() != null; + case TARGET_V, RATIO_LOW_TAP_POSITION, RATIO_TAP_POSITION, RATIO_TARGET_DEADBAND -> { + boolean isEditable = twoWindingsTransformer.getRatioTapChanger() != null; + if (!isEditable) { + equipmentsReport.add(Report.builder() + .withKey(EQUIPMENT_MODIFIED_REPORT_ERROR + equipmentsReport.size()) + .withDefaultMessage(String.format(" Cannot modify field %s of equipment %s : Ratio tab changer is null", + editedField, + identifiable.getId())) + .withSeverity(TypedValue.TRACE_SEVERITY) + .build()); + } + yield isEditable; + } + case REGULATION_VALUE, PHASE_LOW_TAP_POSITION, PHASE_TAP_POSITION, PHASE_TARGET_DEADBAND -> { + boolean isEditable = twoWindingsTransformer.getPhaseTapChanger() != null; + if (!isEditable) { + equipmentsReport.add(Report.builder() + .withKey(EQUIPMENT_MODIFIED_REPORT_ERROR + equipmentsReport.size()) + .withDefaultMessage(String.format(" Cannot modify field %s of equipment %s : Phase tab changer is null", + editedField, + identifiable.getId())) + .withSeverity(TypedValue.TRACE_SEVERITY) + .build()); + } + yield isEditable; + } default -> true; }; } @@ -232,7 +258,7 @@ private void applyFormula(Identifiable identifiable, equipmentNotModifiedCount += 1; notEditableEquipments.add(identifiable.getId()); reports.add(Report.builder() - .withKey("EquipmentModifiedReportError_" + reports.size()) + .withKey(EQUIPMENT_MODIFIED_REPORT_ERROR + reports.size()) .withDefaultMessage(String.format(" Cannot modify equipment %s : At least one of the value or referenced field is null", identifiable.getId())) .withSeverity(TypedValue.TRACE_SEVERITY) diff --git a/src/test/java/org/gridsuite/modification/server/modifications/AbstractByFormulaModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/AbstractByFormulaModificationTest.java index e08660a8b..801061080 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/AbstractByFormulaModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/AbstractByFormulaModificationTest.java @@ -72,18 +72,27 @@ public void specificSetUp() { @Test public void testByModificationError() throws Exception { + //Test with modification = null + mockMvc.perform(post(getNetworkModificationUri()).content(mapper.writeValueAsString(null)).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()); + // Test with empty list of formulas checkCreationApplicationStatus(ByFormulaModificationInfos.builder().identifiableType(getIdentifiableType()).formulaInfosList(List.of()).build(), NetworkModificationResult.ApplicationStatus.WITH_ERRORS); // Test with empty list of filters in formula - FormulaInfos formulaInfos = FormulaInfos.builder() + List formulaInfosWithNoFilters = getFormulaInfos().stream().peek(formula -> formula.setFilters(List.of())).toList(); + checkCreationApplicationStatus(ByFormulaModificationInfos.builder().identifiableType(getIdentifiableType()).formulaInfosList(formulaInfosWithNoFilters).build(), + NetworkModificationResult.ApplicationStatus.WITH_ERRORS); + + // Test with editedField = null + FormulaInfos formulaInfosWithNoEditedField = FormulaInfos.builder() .fieldOrValue1(ReferenceFieldOrValue.builder().value(50.).build()) .fieldOrValue2(ReferenceFieldOrValue.builder().value(50.).build()) .operator(Operator.ADDITION) .filters(List.of()) .build(); - checkCreationApplicationStatus(ByFormulaModificationInfos.builder().identifiableType(getIdentifiableType()).formulaInfosList(List.of(formulaInfos)).build(), + checkCreationApplicationStatus(ByFormulaModificationInfos.builder().identifiableType(getIdentifiableType()).formulaInfosList(List.of(formulaInfosWithNoEditedField)).build(), NetworkModificationResult.ApplicationStatus.WITH_ERRORS); } @@ -105,9 +114,38 @@ protected void checkCreateWithWarning(List formulaInfos, List formulaInfos) throws Exception { + protected void checkCreateWithError(List formulaInfos, List filterEquipments) throws Exception { + String filterIds = filterEquipments.stream() + .map(FilterEquipments::getFilterId) + .map(UUID::toString) + .collect(Collectors.joining(",")); + + UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching("/v1/filters/export\\?networkUuid=" + getNetworkUuid() + "&variantId=variant_1&ids=" + filterIds)) + .willReturn(WireMock.ok() + .withBody(mapper.writeValueAsString(filterEquipments)) + .withHeader("Content-Type", "application/json"))).getId(); + + ByFormulaModificationInfos byFormulaModificationInfos = ByFormulaModificationInfos.builder() + .formulaInfosList(formulaInfos) + .identifiableType(getIdentifiableType()) + .build(); + + checkCreationApplicationStatus(byFormulaModificationInfos, NetworkModificationResult.ApplicationStatus.WITH_ERRORS); + + wireMockUtils.verifyGetRequest(stubId, + PATH, + handleQueryParams(getNetworkUuid(), filterEquipments.stream().map(FilterEquipments::getFilterId).collect(Collectors.toList())), + false); + } + + @Test + public void testModificationWithAllWrongEquipmentIds() throws Exception { FilterEquipments filter = getFilterEquipments(FILTER_WITH_ALL_WRONG_IDS, "filterWithWrongId", List.of(), List.of("wrongId1", "wrongId2")); + List formulaInfos = getFormulaInfos().stream() + .peek(formula -> formula.setFilters(List.of(new FilterInfos(FILTER_WITH_ALL_WRONG_IDS, "filterWithWrongId")))) + .toList(); + UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching("/v1/filters/export\\?networkUuid=" + getNetworkUuid() + "&variantId=variant_1&ids=" + FILTER_WITH_ALL_WRONG_IDS)) .willReturn(WireMock.ok() .withBody(mapper.writeValueAsString(List.of(filter))) diff --git a/src/test/java/org/gridsuite/modification/server/modifications/BatteryByFormulaModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/BatteryByFormulaModificationTest.java index d23eb7425..f75e99041 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/BatteryByFormulaModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/BatteryByFormulaModificationTest.java @@ -52,19 +52,6 @@ public void testCreateWithWarning() throws Exception { assertEquals(75, getNetwork().getBattery(BATTERY_ID_1).getTargetP(), 0); } - @Test - public void testCreateWithError() throws Exception { - FormulaInfos formulaInfos = FormulaInfos.builder() - .filters(List.of(filterWithAllWrongId)) - .editedField(BatteryField.ACTIVE_POWER_SET_POINT.name()) - .fieldOrValue1(ReferenceFieldOrValue.builder().value(55.).build()) - .operator(Operator.ADDITION) - .fieldOrValue2(ReferenceFieldOrValue.builder().value(20.).build()) - .build(); - - checkCreateWithError(List.of(formulaInfos)); - } - @Override protected void createEquipments() { getNetwork().getBattery(BATTERY_ID_1).setTargetP(100).setMaxP(500).setMinP(0).setTargetQ(80); diff --git a/src/test/java/org/gridsuite/modification/server/modifications/GeneratorByFormulaModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/GeneratorByFormulaModificationTest.java index c47b0cede..da18e9b9b 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/GeneratorByFormulaModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/GeneratorByFormulaModificationTest.java @@ -19,6 +19,7 @@ import com.powsybl.iidm.network.extensions.GeneratorStartup; import com.powsybl.iidm.network.extensions.GeneratorStartupAdder; import org.gridsuite.modification.server.dto.FilterEquipments; +import org.gridsuite.modification.server.dto.FilterInfos; import org.gridsuite.modification.server.dto.IdentifiableAttributes; import org.gridsuite.modification.server.dto.formula.FormulaInfos; import org.gridsuite.modification.server.dto.formula.Operator; @@ -67,16 +68,19 @@ public void testCreateWithWarning() throws Exception { } @Test - public void testCreateWithError() throws Exception { + public void testWithNullReferenceFieldOrValue() throws Exception { + IdentifiableAttributes identifiableAttributes = getIdentifiableAttributes(GENERATOR_ID_1, 1.0); + FilterEquipments filterEquipments = getFilterEquipments(FILTER_ID_1, "filter1", List.of(identifiableAttributes), List.of()); + FormulaInfos formulaInfos = FormulaInfos.builder() - .filters(List.of(filterWithAllWrongId)) + .filters(List.of(new FilterInfos(FILTER_ID_1, "filter1"))) .editedField(GeneratorField.ACTIVE_POWER_SET_POINT.name()) .fieldOrValue1(ReferenceFieldOrValue.builder().value(55.).build()) .operator(Operator.ADDITION) - .fieldOrValue2(ReferenceFieldOrValue.builder().value(20.).build()) + .fieldOrValue2(ReferenceFieldOrValue.builder().build()) .build(); - checkCreateWithError(List.of(formulaInfos)); + checkCreateWithError(List.of(formulaInfos), List.of(filterEquipments)); } protected void createEquipments() { diff --git a/src/test/java/org/gridsuite/modification/server/modifications/ShuntCompensatorByFormulaModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/ShuntCompensatorByFormulaModificationTest.java index 643efaaaa..e553dd1eb 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/ShuntCompensatorByFormulaModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/ShuntCompensatorByFormulaModificationTest.java @@ -48,19 +48,6 @@ public void testCreateWithWarning() throws Exception { assertEquals(5, getNetwork().getShuntCompensator(SHUNT_COMPENSATOR_ID_1).getMaximumSectionCount(), 0); } - @Test - public void testCreateWithError() throws Exception { - FormulaInfos formulaInfos = FormulaInfos.builder() - .filters(List.of(filterWithAllWrongId)) - .editedField(ShuntCompensatorField.MAXIMUM_SECTION_COUNT.name()) - .fieldOrValue1(ReferenceFieldOrValue.builder().value(2.).build()) - .operator(Operator.ADDITION) - .fieldOrValue2(ReferenceFieldOrValue.builder().value(3.).build()) - .build(); - - checkCreateWithError(List.of(formulaInfos)); - } - @Override protected void createEquipments() { createShuntCompensator(getNetwork().getVoltageLevel("v1"), SHUNT_COMPENSATOR_ID_1, "v1shunt", 8, 225., 10, true, 4, 2, 3, 2, "cn11", 22, ConnectablePosition.Direction.BOTTOM); diff --git a/src/test/java/org/gridsuite/modification/server/modifications/TwoWindingsTransformerByFormulaModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/TwoWindingsTransformerByFormulaModificationTest.java index b3d78c507..a02f7add4 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/TwoWindingsTransformerByFormulaModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/TwoWindingsTransformerByFormulaModificationTest.java @@ -37,14 +37,10 @@ public class TwoWindingsTransformerByFormulaModificationTest extends AbstractByF @Test public void testModifyTwtWithError() throws Exception { + // Test modifying ratio tab changer field when ratio tab changer is null IdentifiableAttributes identifiableAttributes1 = getIdentifiableAttributes(TWT_ID_4, 1.); IdentifiableAttributes identifiableAttributes2 = getIdentifiableAttributes(TWT_ID_6, 1.); FilterEquipments filter = getFilterEquipments(FILTER_ID_4, "filter4", List.of(identifiableAttributes1, identifiableAttributes2), List.of()); - - UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching("/v1/filters/export\\?networkUuid=" + getNetworkUuid() + "&variantId=variant_1&ids=" + FILTER_ID_4)) - .willReturn(WireMock.ok() - .withBody(mapper.writeValueAsString(List.of(filter))) - .withHeader("Content-Type", "application/json"))).getId(); FormulaInfos formulaInfos = FormulaInfos.builder() .filters(List.of(filter4)) .fieldOrValue2(ReferenceFieldOrValue.builder().equipmentField(TwoWindingsTransformerField.RATIO_TAP_POSITION.name()).build()) @@ -52,16 +48,28 @@ public void testModifyTwtWithError() throws Exception { .editedField(TwoWindingsTransformerField.RATIO_TAP_POSITION.name()) .operator(Operator.ADDITION) .build(); - checkCreationApplicationStatus(ByFormulaModificationInfos.builder() - .identifiableType(getIdentifiableType()) - .formulaInfosList(List.of(formulaInfos)) - .build(), - NetworkModificationResult.ApplicationStatus.WITH_ERRORS); + + checkCreateWithError(List.of(formulaInfos), List.of(filter)); assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_4).getRatioTapChanger()); assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_6).getRatioTapChanger()); - wireMockUtils.verifyGetRequest(stubId, PATH, handleQueryParams(getNetworkUuid(), List.of(FILTER_ID_4)), false); + // Test modifying phase tab changer field when phase tab changer is null + IdentifiableAttributes identifiableAttributes3 = getIdentifiableAttributes(TWT_ID_1, 1.); + IdentifiableAttributes identifiableAttributes4 = getIdentifiableAttributes(TWT_ID_2, 1.); + FilterEquipments filter2 = getFilterEquipments(FILTER_ID_1, "filter1", List.of(identifiableAttributes3, identifiableAttributes4), List.of()); + FormulaInfos formulaInfos2 = FormulaInfos.builder() + .filters(List.of(filter1)) + .fieldOrValue2(ReferenceFieldOrValue.builder().equipmentField(TwoWindingsTransformerField.PHASE_TAP_POSITION.name()).build()) + .fieldOrValue1(ReferenceFieldOrValue.builder().value(1.).build()) + .editedField(TwoWindingsTransformerField.PHASE_TAP_POSITION.name()) + .operator(Operator.ADDITION) + .build(); + + checkCreateWithError(List.of(formulaInfos2), List.of(filter2)); + + assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_1).getPhaseTapChanger()); + assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_2).getPhaseTapChanger()); } @Test @@ -81,6 +89,7 @@ public void testDivisionByZero() throws Exception { .fieldOrValue2(ReferenceFieldOrValue.builder().value(0.).build()) .operator(Operator.DIVISION) .filters(List.of(filter4)) + .editedField(TwoWindingsTransformerField.SERIES_RESISTANCE.name()) .build(); checkCreationApplicationStatus(ByFormulaModificationInfos.builder().identifiableType(getIdentifiableType()).formulaInfosList(List.of(formulaInfos2)).build(), From 2d7600ce0d120e011b28dd1e267a892f8fa05de9 Mon Sep 17 00:00:00 2001 From: dbraquart <107846716+dbraquart@users.noreply.github.com> Date: Mon, 29 Jan 2024 16:58:45 +0100 Subject: [PATCH 4/4] Add connected flag in injection and branch modification modifications (#419) Signed-off-by: David BRAQUART --- .../server/dto/BranchModificationInfos.java | 5 ++ .../dto/InjectionModificationInfos.java | 3 + .../ShuntCompensatorModificationInfos.java | 2 +- .../BatteryModificationEntity.java | 1 + .../BranchModificationEntity.java | 17 +++++ .../GeneratorModificationEntity.java | 1 + .../InjectionModificationEntity.java | 21 +++++-- .../modification/LineModificationEntity.java | 2 + .../modification/LoadModificationEntity.java | 3 + .../ShuntCompensatorModificationEntity.java | 7 ++- ...WindingsTransformerModificationEntity.java | 4 ++ .../AbstractBranchModification.java | 14 +++++ .../modifications/BatteryModification.java | 1 + .../modifications/GeneratorModification.java | 2 + .../server/modifications/LoadCreation.java | 2 +- .../modifications/LoadModification.java | 2 +- .../modifications/ModificationUtils.java | 12 +++- .../ShuntCompensatorCreation.java | 2 +- .../ShuntCompensatorModification.java | 2 + .../changesets/changelog_20240118T141843Z.xml | 63 +++++++++++++++++++ .../changesets/changelog_20240119T151936Z.xml | 43 +++++++++++++ .../db/changelog/db.changelog-master.yaml | 6 ++ .../AbstractInjectionModificationTest.java | 54 ++++++++++++++++ .../BatteryModificationTest.java | 12 +++- .../GeneratorModificationTest.java | 12 +++- .../modifications/LineModificationTest.java | 47 ++++++++++++++ .../modifications/LoadModificationTest.java | 12 +++- .../ShuntCompensatorModificationTest.java | 22 ++++++- 28 files changed, 359 insertions(+), 15 deletions(-) create mode 100644 src/main/resources/db/changelog/changesets/changelog_20240118T141843Z.xml create mode 100644 src/main/resources/db/changelog/changesets/changelog_20240119T151936Z.xml create mode 100644 src/test/java/org/gridsuite/modification/server/modifications/AbstractInjectionModificationTest.java diff --git a/src/main/java/org/gridsuite/modification/server/dto/BranchModificationInfos.java b/src/main/java/org/gridsuite/modification/server/dto/BranchModificationInfos.java index 35a5e1244..9aa22922d 100644 --- a/src/main/java/org/gridsuite/modification/server/dto/BranchModificationInfos.java +++ b/src/main/java/org/gridsuite/modification/server/dto/BranchModificationInfos.java @@ -35,4 +35,9 @@ public class BranchModificationInfos extends BasicEquipmentModificationInfos { @Schema(description = "Current limits Side 2") private CurrentLimitsModificationInfos currentLimits2; + @Schema(description = "Connected 1") + private AttributeModification connected1; + + @Schema(description = "Connected 2") + private AttributeModification connected2; } diff --git a/src/main/java/org/gridsuite/modification/server/dto/InjectionModificationInfos.java b/src/main/java/org/gridsuite/modification/server/dto/InjectionModificationInfos.java index 57fe83649..0073c473c 100644 --- a/src/main/java/org/gridsuite/modification/server/dto/InjectionModificationInfos.java +++ b/src/main/java/org/gridsuite/modification/server/dto/InjectionModificationInfos.java @@ -28,4 +28,7 @@ public class InjectionModificationInfos extends BasicEquipmentModificationInfos @Schema(description = "Bus id modification") private AttributeModification busOrBusbarSectionId; + + @Schema(description = "Connected") + private AttributeModification connected; } diff --git a/src/main/java/org/gridsuite/modification/server/dto/ShuntCompensatorModificationInfos.java b/src/main/java/org/gridsuite/modification/server/dto/ShuntCompensatorModificationInfos.java index 640a51c4f..5d59075f6 100644 --- a/src/main/java/org/gridsuite/modification/server/dto/ShuntCompensatorModificationInfos.java +++ b/src/main/java/org/gridsuite/modification/server/dto/ShuntCompensatorModificationInfos.java @@ -33,7 +33,7 @@ @Schema(description = "Shunt compensator modification") @JsonTypeName("SHUNT_COMPENSATOR_MODIFICATION") @ModificationErrorTypeName("MODIFY_SHUNT_COMPENSATOR_ERROR") -public class ShuntCompensatorModificationInfos extends BasicEquipmentModificationInfos { +public class ShuntCompensatorModificationInfos extends InjectionModificationInfos { @Schema(description = "Maximum number of sections") private AttributeModification maximumSectionCount; diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/BatteryModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/BatteryModificationEntity.java index 5d9791d9d..7eaf21f2a 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/BatteryModificationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/BatteryModificationEntity.java @@ -137,6 +137,7 @@ public BatteryModificationInfos toModificationInfos() { .equipmentName(AttributeModification.toAttributeModification(getEquipmentNameValue(), getEquipmentNameOp())) .voltageLevelId(AttributeModification.toAttributeModification(getVoltageLevelIdValue(), getVoltageLevelIdOp())) .busOrBusbarSectionId(AttributeModification.toAttributeModification(getBusOrBusbarSectionIdValue(), getBusOrBusbarSectionIdOp())) + .connected(toAttributeModification(getConnected())) .activePowerSetpoint(toAttributeModification(getActivePowerSetpoint())) .maxActivePower(toAttributeModification(getMaxActivePower())) .minActivePower(toAttributeModification(getMinActivePower())) 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 7a5409d4f..20f1ef3f8 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 @@ -10,6 +10,7 @@ import lombok.NoArgsConstructor; import org.gridsuite.modification.server.dto.BranchModificationInfos; import org.gridsuite.modification.server.dto.ModificationInfos; +import org.gridsuite.modification.server.entities.equipment.modification.attribute.BooleanModificationEmbedded; import org.gridsuite.modification.server.entities.equipment.modification.attribute.DoubleModificationEmbedded; import jakarta.persistence.*; @@ -52,6 +53,20 @@ public class BranchModificationEntity extends BasicEquipmentModificationEntity { ), nullable = true) private CurrentLimitsModificationEntity currentLimits2; + @Embedded + @AttributeOverrides(value = { + @AttributeOverride(name = "value", column = @Column(name = "connected1")), + @AttributeOverride(name = "opType", column = @Column(name = "connected1Op")) + }) + private BooleanModificationEmbedded connected1; + + @Embedded + @AttributeOverrides(value = { + @AttributeOverride(name = "value", column = @Column(name = "connected2")), + @AttributeOverride(name = "opType", column = @Column(name = "connected2Op")) + }) + private BooleanModificationEmbedded connected2; + protected BranchModificationEntity(BranchModificationInfos branchModificationInfos) { super(branchModificationInfos); assignAttributes(branchModificationInfos); @@ -77,5 +92,7 @@ private void assignAttributes(BranchModificationInfos branchModificationInfos) { } else { currentLimits2 = branchModificationInfos.getCurrentLimits2().toEntity(); } + this.connected1 = branchModificationInfos.getConnected1() != null ? new BooleanModificationEmbedded(branchModificationInfos.getConnected1()) : null; + this.connected2 = branchModificationInfos.getConnected2() != null ? new BooleanModificationEmbedded(branchModificationInfos.getConnected2()) : null; } } diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/GeneratorModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/GeneratorModificationEntity.java index 1a0318aff..a9a4695e8 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/GeneratorModificationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/GeneratorModificationEntity.java @@ -275,6 +275,7 @@ public GeneratorModificationInfos toModificationInfos() { .equipmentName(AttributeModification.toAttributeModification(getEquipmentNameValue(), getEquipmentNameOp())) .voltageLevelId(AttributeModification.toAttributeModification(getVoltageLevelIdValue(), getVoltageLevelIdOp())) .busOrBusbarSectionId(AttributeModification.toAttributeModification(getBusOrBusbarSectionIdValue(), getBusOrBusbarSectionIdOp())) + .connected(toAttributeModification(getConnected())) .energySource(toAttributeModification(getEnergySource())) .activePowerSetpoint(toAttributeModification(getActivePowerSetpoint())) .maxActivePower(toAttributeModification(getMaxActivePower())) diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/InjectionModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/InjectionModificationEntity.java index 01e51ed87..4ad4b5324 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/InjectionModificationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/InjectionModificationEntity.java @@ -6,16 +6,19 @@ */ package org.gridsuite.modification.server.entities.equipment.modification; +import jakarta.persistence.AttributeOverride; +import jakarta.persistence.AttributeOverrides; +import jakarta.persistence.Column; +import jakarta.persistence.Embedded; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.MappedSuperclass; import lombok.Getter; import lombok.NoArgsConstructor; import org.gridsuite.modification.server.dto.InjectionModificationInfos; import org.gridsuite.modification.server.dto.ModificationInfos; import org.gridsuite.modification.server.dto.OperationType; - -import jakarta.persistence.Column; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.MappedSuperclass; +import org.gridsuite.modification.server.entities.equipment.modification.attribute.BooleanModificationEmbedded; /** * @author Nicolas Noir @@ -38,6 +41,13 @@ public class InjectionModificationEntity extends BasicEquipmentModificationEntit @Enumerated(EnumType.STRING) private OperationType busOrBusbarSectionIdOp; + @Embedded + @AttributeOverrides(value = { + @AttributeOverride(name = "value", column = @Column(name = "connected")), + @AttributeOverride(name = "opType", column = @Column(name = "connectedOp")) + }) + private BooleanModificationEmbedded connected; + protected InjectionModificationEntity(InjectionModificationInfos modificationInfos) { super(modificationInfos); assignAttributes(modificationInfos); @@ -54,5 +64,6 @@ private void assignAttributes(InjectionModificationInfos modificationInfos) { this.voltageLevelIdOp = modificationInfos.getVoltageLevelId() != null ? modificationInfos.getVoltageLevelId().getOp() : null; this.busOrBusbarSectionIdValue = modificationInfos.getBusOrBusbarSectionId() != null ? modificationInfos.getBusOrBusbarSectionId().getValue() : null; this.busOrBusbarSectionIdOp = modificationInfos.getBusOrBusbarSectionId() != null ? modificationInfos.getBusOrBusbarSectionId().getOp() : null; + this.connected = modificationInfos.getConnected() != null ? new BooleanModificationEmbedded(modificationInfos.getConnected()) : 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 efa6cc936..8bab49711 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 @@ -86,6 +86,8 @@ public LineModificationInfos toModificationInfos() { .stashed(getStashed()) .equipmentId(getEquipmentId()) .equipmentName(AttributeModification.toAttributeModification(getEquipmentNameValue(), getEquipmentNameOp())) + .connected1(toAttributeModification(getConnected1())) + .connected2(toAttributeModification(getConnected2())) .seriesResistance(toAttributeModification(getSeriesResistance())) .seriesReactance(toAttributeModification(getSeriesReactance())) .shuntConductance1(toAttributeModification(getShuntConductance1())) diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/LoadModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/LoadModificationEntity.java index 0688410aa..112c50139 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/LoadModificationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/LoadModificationEntity.java @@ -18,6 +18,8 @@ import jakarta.persistence.*; import org.springframework.util.CollectionUtils; +import static org.gridsuite.modification.server.entities.equipment.modification.attribute.IAttributeModificationEmbeddable.toAttributeModification; + /** * @author Nicolas Noir */ @@ -83,6 +85,7 @@ public LoadModificationInfos toModificationInfos() { .equipmentName(AttributeModification.toAttributeModification(getEquipmentNameValue(), getEquipmentNameOp())) .voltageLevelId(AttributeModification.toAttributeModification(getVoltageLevelIdValue(), getVoltageLevelIdOp())) .busOrBusbarSectionId(AttributeModification.toAttributeModification(getBusOrBusbarSectionIdValue(), getBusOrBusbarSectionIdOp())) + .connected(toAttributeModification(getConnected())) .loadType(AttributeModification.toAttributeModification(getLoadTypeValue(), getLoadTypeOp())) .p0(AttributeModification.toAttributeModification(getP0Value(), getP0Op())) .q0(AttributeModification.toAttributeModification(getQ0Value(), getQ0Op())) diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/ShuntCompensatorModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/ShuntCompensatorModificationEntity.java index 088e2163a..c40961a52 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/ShuntCompensatorModificationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/ShuntCompensatorModificationEntity.java @@ -10,11 +10,13 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.NonNull; +import org.gridsuite.modification.server.dto.AttributeModification; import org.gridsuite.modification.server.dto.ModificationInfos; import org.gridsuite.modification.server.dto.ShuntCompensatorModificationInfos; import org.gridsuite.modification.server.dto.ShuntCompensatorType; import org.gridsuite.modification.server.entities.equipment.modification.attribute.DoubleModificationEmbedded; import org.gridsuite.modification.server.entities.equipment.modification.attribute.EnumModificationEmbedded; +import org.gridsuite.modification.server.entities.equipment.modification.attribute.IAttributeModificationEmbeddable; import org.gridsuite.modification.server.entities.equipment.modification.attribute.IntegerModificationEmbedded; import jakarta.persistence.AttributeOverride; @@ -34,7 +36,7 @@ @Getter @Entity @Table(name = "shuntCompensatorModification") -public class ShuntCompensatorModificationEntity extends BasicEquipmentModificationEntity { +public class ShuntCompensatorModificationEntity extends InjectionModificationEntity { @Embedded @AttributeOverrides(value = { @@ -103,6 +105,9 @@ public ShuntCompensatorModificationInfos toModificationInfos() { .stashed(getStashed()) .equipmentId(getEquipmentId()) .equipmentName(toAttributeModification(getEquipmentNameValue(), getEquipmentNameOp())) + .voltageLevelId(AttributeModification.toAttributeModification(getVoltageLevelIdValue(), getVoltageLevelIdOp())) + .busOrBusbarSectionId(AttributeModification.toAttributeModification(getBusOrBusbarSectionIdValue(), getBusOrBusbarSectionIdOp())) + .connected(IAttributeModificationEmbeddable.toAttributeModification(getConnected())) .shuntCompensatorType(toAttributeModification(getShuntCompensatorType())) .maxQAtNominalV(toAttributeModification(getMaxQAtNominalV())) .maxSusceptance(toAttributeModification(getMaxSusceptance())) 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 16849d9e1..f323afb77 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 @@ -24,6 +24,8 @@ import jakarta.persistence.*; +import static org.gridsuite.modification.server.entities.equipment.modification.attribute.IAttributeModificationEmbeddable.toAttributeModification; + /** * @author Florent MILLOT */ @@ -351,6 +353,8 @@ public TwoWindingsTransformerModificationInfos toModificationInfos() { .stashed(getStashed()) .equipmentId(getEquipmentId()) .equipmentName(AttributeModification.toAttributeModification(getEquipmentNameValue(), getEquipmentNameOp())) + .connected1(toAttributeModification(getConnected1())) + .connected2(toAttributeModification(getConnected2())) .seriesResistance(AttributeModification.toAttributeModification(getSeriesResistance())) .seriesReactance(AttributeModification.toAttributeModification(getSeriesReactance())) .magnetizingConductance(AttributeModification.toAttributeModification(getMagnetizingConductance())) diff --git a/src/main/java/org/gridsuite/modification/server/modifications/AbstractBranchModification.java b/src/main/java/org/gridsuite/modification/server/modifications/AbstractBranchModification.java index 857c0ba05..8c3e3a09b 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/AbstractBranchModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/AbstractBranchModification.java @@ -76,6 +76,20 @@ protected void modifyBranch(Branch branch, BranchModificationInfos branchModi ModificationUtils.getInstance().reportModifications(limitsReporter, side2LimitsReports, "side2LimitsModification", " Side 2"); } + if (branchModificationInfos.getConnected1() != null) { + updateConnection(branch, Branch.Side.ONE, modificationInfos.getConnected1().getValue()); + } + if (branchModificationInfos.getConnected2() != null) { + updateConnection(branch, Branch.Side.TWO, modificationInfos.getConnected2().getValue()); + } + } + + private void updateConnection(Branch branch, Branch.Side side, Boolean connectionChange) { + if (branch.getTerminal(side).isConnected() && Boolean.FALSE.equals(connectionChange)) { + branch.getTerminal(side).disconnect(); + } else if (!branch.getTerminal(side).isConnected() && Boolean.TRUE.equals(connectionChange)) { + branch.getTerminal(side).connect(); + } } protected void modifyCurrentLimits(CurrentLimitsModificationInfos currentLimitsInfos, CurrentLimitsAdder limitsAdder, CurrentLimits currentLimits, List limitsReports) { 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 065f5354b..04f68b605 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/BatteryModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/BatteryModification.java @@ -92,6 +92,7 @@ private void modifyBattery(Battery battery, BatteryModificationInfos modificatio modifyBatteryLimitsAttributes(modificationInfos, battery, subReporter); modifyBatterySetpointsAttributes(modificationInfos, battery, subReporter); + ModificationUtils.getInstance().modifyInjectionConnection(modificationInfos, battery); } private void modifyBatterySetpointsAttributes(BatteryModificationInfos modificationInfos, 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 2a34c1bfd..d2acdab42 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/GeneratorModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/GeneratorModification.java @@ -109,6 +109,8 @@ private void modifyGenerator(Generator generator, GeneratorModificationInfos mod modifyGeneratorSetpointsAttributes(modificationInfos, generator, subReporter); modifyGeneratorShortCircuitAttributes(modificationInfos, generator, subReporter); modifyGeneratorStartUpAttributes(modificationInfos, generator, subReporter); + + ModificationUtils.getInstance().modifyInjectionConnection(modificationInfos, generator); } private void modifyGeneratorShortCircuitAttributes(GeneratorModificationInfos modificationInfos, diff --git a/src/main/java/org/gridsuite/modification/server/modifications/LoadCreation.java b/src/main/java/org/gridsuite/modification/server/modifications/LoadCreation.java index f0580ed16..57ed0c35b 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/LoadCreation.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/LoadCreation.java @@ -63,7 +63,7 @@ public void apply(Network network, Reporter subReporter) { .build()); } reportElementaryCreations(subReporter); - ModificationUtils.getInstance().disconnectInjection(modificationInfos, network.getLoad(modificationInfos.getEquipmentId()), subReporter); + ModificationUtils.getInstance().disconnectCreatedInjection(modificationInfos, network.getLoad(modificationInfos.getEquipmentId()), subReporter); // properties Load load = network.getLoad(modificationInfos.getEquipmentId()); 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 ce4ff9875..1268a51d2 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/LoadModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/LoadModification.java @@ -59,6 +59,6 @@ private void modifyLoad(Load load, Reporter subReporter) { // properties PropertiesUtils.applyProperties(load, subReporter, modificationInfos.getProperties()); - // TODO connectivity modification + ModificationUtils.getInstance().modifyInjectionConnection(modificationInfos, load); } } diff --git a/src/main/java/org/gridsuite/modification/server/modifications/ModificationUtils.java b/src/main/java/org/gridsuite/modification/server/modifications/ModificationUtils.java index 53bdc9410..dbf2124e9 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/ModificationUtils.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/ModificationUtils.java @@ -527,7 +527,7 @@ public Terminal getTerminalFromIdentifiable(Network network, String equipmentId, return null; } - public void disconnectInjection(InjectionCreationInfos modificationInfos, Injection injection, Reporter subReporter) { + public void disconnectCreatedInjection(InjectionCreationInfos modificationInfos, Injection injection, Reporter subReporter) { // A newly created injection is connected by default, unless we choose not to do if (!modificationInfos.isConnected()) { injection.getTerminal().disconnect(); @@ -540,6 +540,16 @@ public void disconnectInjection(InjectionCreationInfos modificationInfos, Inject } } + public void modifyInjectionConnection(InjectionModificationInfos modificationInfos, Injection injection) { + if (modificationInfos.getConnected() != null) { + if (injection.getTerminal().isConnected() && Boolean.FALSE.equals(modificationInfos.getConnected().getValue())) { + injection.getTerminal().disconnect(); + } else if (!injection.getTerminal().isConnected() && Boolean.TRUE.equals(modificationInfos.getConnected().getValue())) { + injection.getTerminal().connect(); + } + } + } + public void disconnectBranch(BranchCreationInfos modificationInfos, Branch branch, Reporter subReporter) { // A newly created branch is connected by default on both sides, unless we choose not to do if (!modificationInfos.isConnected1()) { diff --git a/src/main/java/org/gridsuite/modification/server/modifications/ShuntCompensatorCreation.java b/src/main/java/org/gridsuite/modification/server/modifications/ShuntCompensatorCreation.java index 1ff37e7ae..922eb782a 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/ShuntCompensatorCreation.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/ShuntCompensatorCreation.java @@ -80,7 +80,7 @@ public void apply(Network network, Reporter subReporter) { .withSeverity(TypedValue.INFO_SEVERITY) .build()); } - ModificationUtils.getInstance().disconnectInjection(modificationInfos, network.getShuntCompensator(modificationInfos.getEquipmentId()), subReporter); + ModificationUtils.getInstance().disconnectCreatedInjection(modificationInfos, network.getShuntCompensator(modificationInfos.getEquipmentId()), subReporter); } private ShuntCompensatorAdder createShuntAdderInNodeBreaker(VoltageLevel voltageLevel, ShuntCompensatorCreationInfos shuntCompensatorInfos) { diff --git a/src/main/java/org/gridsuite/modification/server/modifications/ShuntCompensatorModification.java b/src/main/java/org/gridsuite/modification/server/modifications/ShuntCompensatorModification.java index 1282f4058..1c1b63102 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/ShuntCompensatorModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/ShuntCompensatorModification.java @@ -80,6 +80,8 @@ public void apply(Network network, Reporter subReporter) { if (shuntCompensator.getModelType() == ShuntCompensatorModelType.LINEAR) { applyModificationOnLinearModel(subReporter, shuntCompensator, voltageLevel); } + + ModificationUtils.getInstance().modifyInjectionConnection(modificationInfos, shuntCompensator); } private void modifyMaximumSectionCount(List reports, ShuntCompensator shuntCompensator, ShuntCompensatorLinearModel model) { diff --git a/src/main/resources/db/changelog/changesets/changelog_20240118T141843Z.xml b/src/main/resources/db/changelog/changesets/changelog_20240118T141843Z.xml new file mode 100644 index 000000000..65e78ce1a --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20240118T141843Z.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog/changesets/changelog_20240119T151936Z.xml b/src/main/resources/db/changelog/changesets/changelog_20240119T151936Z.xml new file mode 100644 index 000000000..d83e98c22 --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20240119T151936Z.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 9721825be..860ce33b8 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -240,3 +240,9 @@ databaseChangeLog: - include: file: changesets/changelog_20240112T134559Z.xml relativeToChangelogFile: true + - include: + file: changesets/changelog_20240118T141843Z.xml + relativeToChangelogFile: true + - include: + file: changesets/changelog_20240119T151936Z.xml + relativeToChangelogFile: true \ No newline at end of file diff --git a/src/test/java/org/gridsuite/modification/server/modifications/AbstractInjectionModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/AbstractInjectionModificationTest.java new file mode 100644 index 000000000..f4121db9c --- /dev/null +++ b/src/test/java/org/gridsuite/modification/server/modifications/AbstractInjectionModificationTest.java @@ -0,0 +1,54 @@ +/** + * 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/. + */ + +package org.gridsuite.modification.server.modifications; + +import com.powsybl.iidm.network.Injection; +import org.gridsuite.modification.server.dto.*; +import org.junit.jupiter.api.Tag; +import org.springframework.http.MediaType; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +/** + * @author David Braquart + */ + +@Tag("IntegrationTest") +public abstract class AbstractInjectionModificationTest extends AbstractNetworkModificationTest { + void assertChangeConnectionState(Injection existingEquipment, boolean expectedState) throws Exception { + assertChangeConnectionState(existingEquipment, (InjectionModificationInfos) buildModification(), expectedState); + } + + void assertChangeConnectionState(Injection existingEquipment, InjectionModificationInfos modificationInfos, boolean expectedState) throws Exception { + modificationInfos.setConnected(new AttributeModification<>(expectedState, OperationType.SET)); + + if (expectedState) { + if (existingEquipment.getTerminal().isConnected()) { + existingEquipment.getTerminal().disconnect(); + } + } else { + if (!existingEquipment.getTerminal().isConnected()) { + existingEquipment.getTerminal().connect(); + } + } + assertThat(existingEquipment.getTerminal().isConnected()).isNotEqualTo(expectedState); + + String modificationInfosJson = mapper.writeValueAsString(modificationInfos); + mockMvc.perform(post(getNetworkModificationUri()).content(modificationInfosJson).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + // connection state has changed as expected + assertThat(existingEquipment.getTerminal().isConnected()).isEqualTo(expectedState); + + // try to modify again => no change on connection state + mockMvc.perform(post(getNetworkModificationUri()).content(modificationInfosJson).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + assertThat(existingEquipment.getTerminal().isConnected()).isEqualTo(expectedState); + } +} diff --git a/src/test/java/org/gridsuite/modification/server/modifications/BatteryModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/BatteryModificationTest.java index dab5e3372..e4cf07f93 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/BatteryModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/BatteryModificationTest.java @@ -30,7 +30,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @Tag("IntegrationTest") -public class BatteryModificationTest extends AbstractNetworkModificationTest { +public class BatteryModificationTest extends AbstractInjectionModificationTest { @Override protected Network createNetwork(UUID networkUuid) { return NetworkCreation.create(networkUuid, true); @@ -332,4 +332,14 @@ protected void testUpdateModificationMessage(ModificationInfos modificationInfos Map updatedValues = mapper.readValue(modificationInfos.getMessageValues(), new TypeReference<>() { }); assertEquals("idBatteryEdited", updatedValues.get("equipmentId")); } + + @Test + public void testDisconnection() throws Exception { + assertChangeConnectionState(getNetwork().getBattery("v3Battery"), false); + } + + @Test + public void testConnection() throws Exception { + assertChangeConnectionState(getNetwork().getBattery("v3Battery"), true); + } } diff --git a/src/test/java/org/gridsuite/modification/server/modifications/GeneratorModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/GeneratorModificationTest.java index 32eed149c..becf22a5e 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/GeneratorModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/GeneratorModificationTest.java @@ -31,7 +31,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @Tag("IntegrationTest") -public class GeneratorModificationTest extends AbstractNetworkModificationTest { +public class GeneratorModificationTest extends AbstractInjectionModificationTest { @Override protected Network createNetwork(UUID networkUuid) { return NetworkCreation.create(networkUuid, true); @@ -451,4 +451,14 @@ protected void testUpdateModificationMessage(ModificationInfos modificationInfos Map createdValues = mapper.readValue(modificationInfos.getMessageValues(), new TypeReference<>() { }); assertEquals("idGeneratorEdited", createdValues.get("equipmentId")); } + + @Test + public void testDisconnection() throws Exception { + assertChangeConnectionState(getNetwork().getGenerator("idGenerator"), false); + } + + @Test + public void testConnection() throws Exception { + assertChangeConnectionState(getNetwork().getGenerator("idGenerator"), true); + } } 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 342ab928c..368738dcb 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/LineModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/LineModificationTest.java @@ -357,4 +357,51 @@ protected void testUpdateModificationMessage(ModificationInfos modificationInfos Map updatedValues = mapper.readValue(modificationInfos.getMessageValues(), new TypeReference<>() { }); assertEquals("line1", updatedValues.get("equipmentId")); } + + @Test + public void testDisconnection() throws Exception { + changeLineConnectionState(getNetwork().getLine("line1"), false); + } + + @Test + public void testConnection() throws Exception { + changeLineConnectionState(getNetwork().getLine("line1"), true); + } + + private void changeLineConnectionState(Line existingEquipment, boolean expectedState) throws Exception { + LineModificationInfos modificationInfos = (LineModificationInfos) buildModification(); + modificationInfos.setConnected1(new AttributeModification<>(expectedState, OperationType.SET)); + modificationInfos.setConnected2(new AttributeModification<>(expectedState, OperationType.SET)); + + if (expectedState) { + if (existingEquipment.getTerminal1().isConnected()) { + existingEquipment.getTerminal1().disconnect(); + } + if (existingEquipment.getTerminal2().isConnected()) { + existingEquipment.getTerminal2().disconnect(); + } + } else { + if (!existingEquipment.getTerminal1().isConnected()) { + existingEquipment.getTerminal1().connect(); + } + if (!existingEquipment.getTerminal2().isConnected()) { + existingEquipment.getTerminal2().connect(); + } + } + assertThat(existingEquipment.getTerminal1().isConnected()).isNotEqualTo(expectedState); + assertThat(existingEquipment.getTerminal2().isConnected()).isNotEqualTo(expectedState); + + String modificationInfosJson = mapper.writeValueAsString(modificationInfos); + mockMvc.perform(post(getNetworkModificationUri()).content(modificationInfosJson).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + // connection state has changed as expected + assertThat(existingEquipment.getTerminal1().isConnected()).isEqualTo(expectedState); + assertThat(existingEquipment.getTerminal2().isConnected()).isEqualTo(expectedState); + + // try to modify again => no change on connection state + mockMvc.perform(post(getNetworkModificationUri()).content(modificationInfosJson).contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + assertThat(existingEquipment.getTerminal1().isConnected()).isEqualTo(expectedState); + assertThat(existingEquipment.getTerminal2().isConnected()).isEqualTo(expectedState); + } } diff --git a/src/test/java/org/gridsuite/modification/server/modifications/LoadModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/LoadModificationTest.java index 5cfe08e50..401f5e034 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/LoadModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/LoadModificationTest.java @@ -30,7 +30,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @Tag("IntegrationTest") -public class LoadModificationTest extends AbstractNetworkModificationTest { +public class LoadModificationTest extends AbstractInjectionModificationTest { private static String PROPERTY_NAME = "property-name"; private static String PROPERTY_VALUE = "property-value"; @@ -114,4 +114,14 @@ protected void testUpdateModificationMessage(ModificationInfos modificationInfos Map updatedValues = mapper.readValue(modificationInfos.getMessageValues(), new TypeReference<>() { }); assertEquals("v1loadEdited", updatedValues.get("equipmentId")); } + + @Test + public void testDisconnection() throws Exception { + assertChangeConnectionState(getNetwork().getLoad("v1load"), false); + } + + @Test + public void testConnection() throws Exception { + assertChangeConnectionState(getNetwork().getLoad("v1load"), true); + } } diff --git a/src/test/java/org/gridsuite/modification/server/modifications/ShuntCompensatorModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/ShuntCompensatorModificationTest.java index a3b7ddcd6..6b3c2c834 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/ShuntCompensatorModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/ShuntCompensatorModificationTest.java @@ -36,7 +36,7 @@ * @author Seddik Yengui */ -public class ShuntCompensatorModificationTest extends AbstractNetworkModificationTest { +public class ShuntCompensatorModificationTest extends AbstractInjectionModificationTest { @Override protected Network createNetwork(UUID networkUuid) { return NetworkCreation.create(networkUuid, true); @@ -310,4 +310,24 @@ protected void testUpdateModificationMessage(ModificationInfos modificationInfos Map updatedValues = mapper.readValue(modificationInfos.getMessageValues(), new TypeReference<>() { }); assertEquals("v2shunt", updatedValues.get("equipmentId")); } + + @Test + public void testDisconnection() throws Exception { + ShuntCompensatorModificationInfos shuntModificationInfos = + ShuntCompensatorModificationInfos.builder() + .stashed(false) + .equipmentId("v2shunt") + .build(); + assertChangeConnectionState(getNetwork().getShuntCompensator("v2shunt"), shuntModificationInfos, false); + } + + @Test + public void testConnection() throws Exception { + ShuntCompensatorModificationInfos shuntModificationInfos = + ShuntCompensatorModificationInfos.builder() + .stashed(false) + .equipmentId("v2shunt") + .build(); + assertChangeConnectionState(getNetwork().getShuntCompensator("v2shunt"), shuntModificationInfos, true); + } }