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] 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); + } }