Skip to content

Commit adb6c8f

Browse files
committed
Merge branch 'main' into add-limits-and-properties-in-line-attached
Signed-off-by: Etienne LESOT <etienne.lesot@rte-france.com>
2 parents 378a386 + 239d61e commit adb6c8f

File tree

5 files changed

+55
-29
lines changed

5 files changed

+55
-29
lines changed

src/main/java/org/gridsuite/modification/dto/ModificationInfos.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@ public class ModificationInfos {
119119
@Builder.Default
120120
private Boolean activated = true;
121121

122+
@Schema(description = "User description")
123+
private String description;
124+
122125
@JsonIgnore
123126
public ReportNode createSubReportNode(ReportNode reportNode) {
124127
throw new UnsupportedOperationException("Method createSubReportNode must be implemented in subclass " + this.getClass().getSimpleName());

src/main/java/org/gridsuite/modification/modifications/LineCreation.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,12 @@ public void apply(Network network, ReportNode subReportNode) {
7676

7777
public static void addLimits(LineCreationInfos modificationInfos, ReportNode subReportNode, Line line) {
7878
// Set permanent and temporary current limits
79-
ReportNode limitsReporter = subReportNode.newReportNode().withMessageTemplate("network.modification.limitsCreated").add();
79+
ReportNode limitsReporter = null;
8080
List<OperationalLimitsGroupInfos> opLimitsGroupSide1 = ModificationUtils.getOperationalLimitsGroupsOnSide(modificationInfos.getOperationalLimitsGroups(), Applicability.SIDE1);
8181
List<OperationalLimitsGroupInfos> opLimitsGroupSide2 = ModificationUtils.getOperationalLimitsGroupsOnSide(modificationInfos.getOperationalLimitsGroups(), Applicability.SIDE2);
82-
ReportNode reportNode = null;
82+
ReportNode reportNode;
8383
if (!CollectionUtils.isEmpty(modificationInfos.getOperationalLimitsGroups())) {
84+
limitsReporter = subReportNode.newReportNode().withMessageTemplate("network.modification.limitsCreated").add();
8485
reportNode = addLimitSetReportNode(limitsReporter);
8586

8687
for (OperationalLimitsGroupInfos olgInfos : modificationInfos.getOperationalLimitsGroups()) {
@@ -134,6 +135,9 @@ public static void addLimits(LineCreationInfos modificationInfos, ReportNode sub
134135
}
135136

136137
if (!limitSetsOnSideReportNodes.isEmpty()) {
138+
if (limitsReporter == null) {
139+
limitsReporter = subReportNode.newReportNode().withMessageTemplate("network.modification.limitsCreated").add();
140+
}
137141
ModificationUtils.getInstance().reportModifications(limitsReporter, limitSetsOnSideReportNodes,
138142
"network.modification.ActiveLimitSets");
139143
}

src/main/java/org/gridsuite/modification/modifications/TwoWindingsTransformerCreation.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,12 +255,13 @@ private void completeTwoWindingsTransformerCreation(Network network,
255255
PropertiesUtils.applyProperties(twoWindingsTransformer, characteristicsReporter, modificationInfos.getProperties(), "network.modification.TwoWindingsTransformerProperties");
256256

257257
// Set permanent and temporary current limits
258-
ReportNode limitsReporter = subReportNode.newReportNode().withMessageTemplate("network.modification.limitsCreated").add();
258+
ReportNode limitsReporter = null;
259259
List<OperationalLimitsGroupInfos> operationalLimitsGroups1 = ModificationUtils.getOperationalLimitsGroupsOnSide(modificationInfos.getOperationalLimitsGroups(), SIDE1);
260260
List<OperationalLimitsGroupInfos> operationalLimitsGroups2 = ModificationUtils.getOperationalLimitsGroupsOnSide(modificationInfos.getOperationalLimitsGroups(), SIDE2);
261261

262262
List<ReportNode> limitSetsOnSideReportNodes = new ArrayList<>();
263263
if (!CollectionUtils.isEmpty(modificationInfos.getOperationalLimitsGroups())) {
264+
limitsReporter = subReportNode.newReportNode().withMessageTemplate("network.modification.limitsCreated").add();
264265
ReportNode reportNode = limitsReporter.newReportNode()
265266
.withSeverity(TypedValue.INFO_SEVERITY)
266267
.withMessageTemplate("network.modification.LimitSets")
@@ -316,6 +317,9 @@ private void completeTwoWindingsTransformerCreation(Network network,
316317
}
317318

318319
if (!limitSetsOnSideReportNodes.isEmpty()) {
320+
if (limitsReporter == null) {
321+
limitsReporter = subReportNode.newReportNode().withMessageTemplate("network.modification.limitsCreated").add();
322+
}
319323
ModificationUtils.getInstance().reportModifications(limitsReporter, limitSetsOnSideReportNodes,
320324
"network.modification.ActiveLimitSets");
321325
}

src/main/java/org/gridsuite/modification/modifications/olg/OperationalLimitsGroupsModification.java

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
import com.powsybl.commons.report.ReportNode;
1010
import com.powsybl.commons.report.TypedValue;
1111
import com.powsybl.iidm.network.*;
12+
import jakarta.validation.constraints.NotNull;
1213
import org.gridsuite.modification.dto.*;
1314

1415
import java.util.*;
16+
import java.util.stream.Stream;
1517

1618
import static org.gridsuite.modification.dto.OperationalLimitsGroupInfos.Applicability.*;
1719
import static org.gridsuite.modification.dto.OperationalLimitsGroupInfos.Applicability.EQUIPMENT;
@@ -42,8 +44,7 @@ public void modifyOperationalLimitsGroups(OperationalLimitsGroupsModificationTyp
4244
if (operationalLimitsGroupsModificationType == OperationalLimitsGroupsModificationType.REPLACE) {
4345
// because we are replacing all the limit sets we remove all the limit sets that are not specified in the network modification
4446
// the others may be modified instead of recreated so it is better to not delete them in order to have more precise logs
45-
deleteOlgsUnspecifiedInTheModification(SIDE1);
46-
deleteOlgsUnspecifiedInTheModification(SIDE2);
47+
deleteOlgsUnspecifiedInTheModification();
4748
}
4849

4950
for (OperationalLimitsGroupModificationInfos opLGModifInfos : olgModificationInfos) {
@@ -65,36 +66,49 @@ public void modifyOperationalLimitsGroups(OperationalLimitsGroupsModificationTyp
6566
}
6667
}
6768

68-
private void deleteOlgsUnspecifiedInTheModification(OperationalLimitsGroupInfos.Applicability applicability) {
69-
List<String> olgToBeDeleted = new ArrayList<>();
70-
Collection<OperationalLimitsGroup> operationalLimitsGroups = applicability == SIDE1 ?
71-
modifiedBranch.getOperationalLimitsGroups1() :
72-
modifiedBranch.getOperationalLimitsGroups2();
73-
operationalLimitsGroups.stream().filter(
74-
operationalLimitsGroup ->
75-
olgModificationInfos.stream().noneMatch(
76-
operationalLimitsGroupModificationInfos ->
77-
// we don't want to remove the limit sets specified in the network modification (operationalLimitsGroups) :
78-
Objects.equals(operationalLimitsGroupModificationInfos.getId(), operationalLimitsGroup.getId())
79-
&& (operationalLimitsGroupModificationInfos.getApplicability() == applicability
80-
|| operationalLimitsGroupModificationInfos.getApplicability() == EQUIPMENT)
81-
)
82-
).forEach(operationalLimitsGroup -> olgToBeDeleted.add(operationalLimitsGroup.getId()));
69+
private void deleteOlgsUnspecifiedInTheModification() {
70+
Map<String, OperationalLimitsGroupInfos.Applicability> olgsToBeDeleted = new HashMap<>();
71+
72+
// get the deletions on side 1
73+
getDeletableOperationalLimitsGroupStream(modifiedBranch.getOperationalLimitsGroups1(), SIDE1)
74+
.forEach(operationalLimitsGroup -> olgsToBeDeleted.put(operationalLimitsGroup.getId(), SIDE1));
75+
76+
// then get the deletions on side 2. And if there is already a deletion on side 1, change it to EQUIPMENT
77+
getDeletableOperationalLimitsGroupStream(modifiedBranch.getOperationalLimitsGroups2(), SIDE2)
78+
.forEach(operationalLimitsGroup -> {
79+
if (olgsToBeDeleted.containsKey(operationalLimitsGroup.getId())) {
80+
olgsToBeDeleted.put(operationalLimitsGroup.getId(), EQUIPMENT);
81+
} else {
82+
olgsToBeDeleted.put(operationalLimitsGroup.getId(), SIDE2);
83+
}
84+
});
8385

84-
Iterator<String> i = olgToBeDeleted.iterator();
85-
while (i.hasNext()) {
86-
String s = i.next();
86+
for (Map.Entry<String, OperationalLimitsGroupInfos.Applicability> deletedOlg : olgsToBeDeleted.entrySet()) {
8787
new OperationalLimitsGroupModification(
8888
modifiedBranch,
8989
OperationalLimitsGroupModificationInfos.builder()
90-
.id(s)
91-
.applicability(applicability)
90+
.id(deletedOlg.getKey())
91+
.applicability(deletedOlg.getValue())
9292
.build(),
9393
olgsReportNode
9494
).removeOlg();
9595
}
9696
}
9797

98+
@NotNull
99+
private Stream<OperationalLimitsGroup> getDeletableOperationalLimitsGroupStream(Collection<OperationalLimitsGroup> modifiedOlgs, OperationalLimitsGroupInfos.Applicability side) {
100+
return modifiedOlgs.stream().filter(
101+
operationalLimitsGroup ->
102+
olgModificationInfos.stream().noneMatch(
103+
operationalLimitsGroupModificationInfos ->
104+
// we don't want to remove the limit sets specified in the network modification (operationalLimitsGroups) :
105+
Objects.equals(operationalLimitsGroupModificationInfos.getId(), operationalLimitsGroup.getId())
106+
&& (operationalLimitsGroupModificationInfos.getApplicability() == side
107+
|| operationalLimitsGroupModificationInfos.getApplicability() == EQUIPMENT)
108+
)
109+
);
110+
}
111+
98112
private void logApplicabilityChange(List<ReportNode> olgReports, String groupId, OperationalLimitsGroupInfos.Applicability applicability) {
99113
olgReports.add(ReportNode.newRootReportNode().withMessageTemplate("network.modification.applicabilityChanged")
100114
.withUntypedValue(OPERATIONAL_LIMITS_GROUP_NAME, groupId)

src/test/java/org/gridsuite/modification/modifications/TwoWindingsTransformerCreationNodeBreakerTest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ protected void assertAfterNetworkModificationApplication() {
184184
}
185185

186186
@Test
187-
void testCreateTwoWindingsTransformerWithRatioTapChangerInNodeBreaker() throws Exception {
187+
void testCreateTwoWindingsTransformerWithRatioTapChangerInNodeBreaker() {
188188
// create new 2wt in voltage level with Node/breaker topology, having a RatioTapChanger
189189
RatioTapChangerCreationInfos ratioTapChangerCreationInfos = RatioTapChangerCreationInfos.builder()
190190
.lowTapPosition(0)
@@ -223,6 +223,7 @@ void testCreateTwoWindingsTransformerWithRatioTapChangerInNodeBreaker() throws E
223223
TwoWindingsTransformerCreationInfos twoWindingsTransformerCreationInfos2 = TwoWindingsTransformerCreationInfos.builder()
224224
.equipmentId("id2wt1WithRatioTapChanger2")
225225
.equipmentName("2wtName")
226+
.description("a dummy description")
226227
.voltageLevelId1("v1")
227228
.busOrBusbarSectionId1("1.1")
228229
.connected1(true)
@@ -241,7 +242,7 @@ void testCreateTwoWindingsTransformerWithRatioTapChangerInNodeBreaker() throws E
241242
.build();
242243
testCreateTwoWindingsTransformerInNodeBreaker(twoWindingsTransformerCreationInfos2);
243244
assertEquals(
244-
"TwoWindingsTransformerCreationInfos(super=BranchCreationInfos(super=EquipmentCreationInfos(super=EquipmentModificationInfos(super=ModificationInfos(uuid=null, type=TWO_WINDINGS_TRANSFORMER_CREATION, date=null, stashed=false, messageType=null, messageValues=null, activated=true), equipmentId=id2wt1WithRatioTapChanger2, properties=null), equipmentName=2wtName), r=400.0, x=300.0, voltageLevelId1=v1, voltageLevelId2=v4, busOrBusbarSectionId1=1.1, busOrBusbarSectionId2=1.A, operationalLimitsGroups=null, selectedOperationalLimitsGroupId1=null, selectedOperationalLimitsGroupId2=null, connectionName1=null, connectionDirection1=TOP, connectionName2=null, connectionDirection2=TOP, connectionPosition1=null, connectionPosition2=null, connected1=true, connected2=true), g=100.0, b=200.0, ratedU1=1000.0, ratedU2=1010.0, ratedS=null, ratioTapChanger=RatioTapChangerCreationInfos(super=TapChangerCreationInfos(lowTapPosition=0, tapPosition=1, regulating=true, targetDeadband=null, terminalRefConnectableId=v1load, terminalRefConnectableType=LOAD, terminalRefConnectableVlId=v1, steps=[TapChangerStepCreationInfos(index=0, rho=1.0, r=39.78473, x=39.784725, g=0.0, b=0.0, alpha=0.0), TapChangerStepCreationInfos(index=0, rho=1.0, r=39.78474, x=39.784726, g=0.0, b=0.0, alpha=0.0), TapChangerStepCreationInfos(index=0, rho=1.0, r=39.78475, x=39.784727, g=0.0, b=0.0, alpha=0.0)], loadTapChangingCapabilities=true), targetV=220.0), phaseTapChanger=null)",
245+
"TwoWindingsTransformerCreationInfos(super=BranchCreationInfos(super=EquipmentCreationInfos(super=EquipmentModificationInfos(super=ModificationInfos(uuid=null, type=TWO_WINDINGS_TRANSFORMER_CREATION, date=null, stashed=false, messageType=null, messageValues=null, activated=true, description=a dummy description), equipmentId=id2wt1WithRatioTapChanger2, properties=null), equipmentName=2wtName), r=400.0, x=300.0, voltageLevelId1=v1, voltageLevelId2=v4, busOrBusbarSectionId1=1.1, busOrBusbarSectionId2=1.A, operationalLimitsGroups=null, selectedOperationalLimitsGroupId1=null, selectedOperationalLimitsGroupId2=null, connectionName1=null, connectionDirection1=TOP, connectionName2=null, connectionDirection2=TOP, connectionPosition1=null, connectionPosition2=null, connected1=true, connected2=true), g=100.0, b=200.0, ratedU1=1000.0, ratedU2=1010.0, ratedS=null, ratioTapChanger=RatioTapChangerCreationInfos(super=TapChangerCreationInfos(lowTapPosition=0, tapPosition=1, regulating=true, targetDeadband=null, terminalRefConnectableId=v1load, terminalRefConnectableType=LOAD, terminalRefConnectableVlId=v1, steps=[TapChangerStepCreationInfos(index=0, rho=1.0, r=39.78473, x=39.784725, g=0.0, b=0.0, alpha=0.0), TapChangerStepCreationInfos(index=0, rho=1.0, r=39.78474, x=39.784726, g=0.0, b=0.0, alpha=0.0), TapChangerStepCreationInfos(index=0, rho=1.0, r=39.78475, x=39.784727, g=0.0, b=0.0, alpha=0.0)], loadTapChangingCapabilities=true), targetV=220.0), phaseTapChanger=null)",
245246
twoWindingsTransformerCreationInfos2.toString()
246247
);
247248

@@ -291,7 +292,7 @@ void testApplySelectedLimitsGroupsNotExist() {
291292
}
292293

293294
@Test
294-
void testCreateTwoWindingsTransformerWithPhaseTapChangerInNodeBreaker() throws Exception {
295+
void testCreateTwoWindingsTransformerWithPhaseTapChangerInNodeBreaker() {
295296
// create new 2wt in voltage level with Node/breaker topology, having a PhaseTapChanger with Load regulating
296297
PhaseTapChangerCreationInfos phaseTapChangerLoadRegulatingCreationInfos = PhaseTapChangerCreationInfos.builder()
297298
.lowTapPosition(0)
@@ -410,7 +411,7 @@ protected void checkModification() {
410411
assertEquals("TWO_WINDINGS_TRANSFORMER_ALREADY_EXISTS : trf1", exception.getMessage());
411412
}
412413

413-
private void testCreateTwoWindingsTransformerInNodeBreaker(TwoWindingsTransformerCreationInfos twoWindingsTransformerCreationInfos) throws Exception {
414+
private void testCreateTwoWindingsTransformerInNodeBreaker(TwoWindingsTransformerCreationInfos twoWindingsTransformerCreationInfos) {
414415
final String transformerId = twoWindingsTransformerCreationInfos.getEquipmentId();
415416
twoWindingsTransformerCreationInfos.toModification().apply(getNetwork());
416417
TwoWindingsTransformer twoWindingsTransformer = getNetwork().getTwoWindingsTransformer(transformerId);

0 commit comments

Comments
 (0)