Skip to content

Commit 7d5b85e

Browse files
authored
Add limits properties modification Infos and application (#112)
--------- Signed-off-by: basseche <[email protected]>
1 parent e588129 commit 7d5b85e

File tree

5 files changed

+320
-50
lines changed

5 files changed

+320
-50
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import lombok.ToString;
1414
import lombok.experimental.SuperBuilder;
1515

16+
import java.util.List;
17+
1618
/**
1719
* @author Hugo Marcellin <hugo.marcelin at rte-france.com>
1820
*/
@@ -36,6 +38,9 @@ public class OperationalLimitsGroupModificationInfos {
3638
@Schema(description = "temporary limits modification type")
3739
private TemporaryLimitModificationType temporaryLimitsModificationType;
3840

41+
@Schema(description = "limits properties")
42+
private List<LimitsPropertyInfos> limitsProperties;
43+
3944
@Schema(description = "application side")
4045
private OperationalLimitsGroupInfos.Applicability applicability;
4146
}

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

Lines changed: 174 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.gridsuite.modification.NetworkModificationException;
1616
import org.gridsuite.modification.dto.*;
1717
import org.gridsuite.modification.utils.ModificationUtils;
18+
import org.springframework.util.CollectionUtils;
1819
import org.springframework.util.StringUtils;
1920

2021
import java.util.*;
@@ -65,20 +66,24 @@ protected void modifyBranch(Branch<?> branch, BranchModificationInfos branchModi
6566
}
6667

6768
List<ReportNode> activeOLGReports = new ArrayList<>();
68-
List<ReportNode> olgReports = new ArrayList<>();
6969

70+
ReportNode limitsReportNode = null;
7071
boolean modifyOLG = branchModificationInfos.getEnableOLGModification() == null
71-
|| branchModificationInfos.getEnableOLGModification();
72-
if (modifyOLG && branchModificationInfos.getOperationalLimitsGroups() != null) {
73-
modifyOperationalLimitsGroups(branch, branchModificationInfos.getOperationalLimitsGroups(), olgReports);
72+
|| branchModificationInfos.getEnableOLGModification();
73+
74+
if (modifyOLG && !CollectionUtils.isEmpty(branchModificationInfos.getOperationalLimitsGroups())) {
75+
limitsReportNode = subReportNode.newReportNode().withMessageTemplate("network.modification.limits").add();
76+
ReportNode limitSetsReportNode = limitsReportNode.newReportNode().withMessageTemplate("network.modification.limitsSets").add();
77+
modifyOperationalLimitsGroups(branch, branchModificationInfos.getOperationalLimitsGroups(), limitSetsReportNode);
7478
}
7579

7680
applySelectedOLGs(branch, activeOLGReports);
7781

78-
if (!activeOLGReports.isEmpty() || !olgReports.isEmpty()) {
79-
ReportNode limitsReportNode = subReportNode.newReportNode().withMessageTemplate("network.modification.limits").add();
82+
if (!activeOLGReports.isEmpty()) {
83+
if (limitsReportNode == null) {
84+
limitsReportNode = subReportNode.newReportNode().withMessageTemplate("network.modification.limits").add();
85+
}
8086
ModificationUtils.getInstance().reportModifications(limitsReportNode, activeOLGReports, "network.modification.activeLimitsSets");
81-
ModificationUtils.getInstance().reportModifications(limitsReportNode, olgReports, "network.modification.limitsSets");
8287
}
8388
updateConnections(branch, branchModificationInfos);
8489
}
@@ -190,26 +195,33 @@ private void detectApplicabilityChange(Branch<?> branch, List<OperationalLimitsG
190195
}
191196
}
192197

193-
private void modifyOperationalLimitsGroups(Branch<?> branch, List<OperationalLimitsGroupModificationInfos> operationalLimitsInfos, List<ReportNode> olgReports) {
198+
private void modifyOperationalLimitsGroups(Branch<?> branch,
199+
List<OperationalLimitsGroupModificationInfos> operationalLimitsInfos,
200+
ReportNode limitSetsReportNode) {
201+
194202
for (OperationalLimitsGroupModificationInfos opLGModifInfos : operationalLimitsInfos) {
195203
if (opLGModifInfos.getModificationType() == null) {
196204
continue;
197205
}
206+
207+
ArrayList<ReportNode> olgSetReports = new ArrayList<>();
208+
198209
OperationalLimitsGroupInfos.Applicability applicability = opLGModifInfos.getApplicability();
199210
// here the modifications on an applicability EQUIPMENT are separated into two separate applications of both sides
200211
// because iidm has two separated sets of opLGs on the network object (and for better logs)
201212

202-
detectApplicabilityChange(branch, operationalLimitsInfos, opLGModifInfos, olgReports);
203-
213+
detectApplicabilityChange(branch, operationalLimitsInfos, opLGModifInfos, olgSetReports);
204214
if (applicability == SIDE1
205-
|| applicability == EQUIPMENT) {
215+
|| applicability == EQUIPMENT) {
206216
OperationalLimitsGroup operationalLimitsGroup1 = branch.getOperationalLimitsGroup1(opLGModifInfos.getId()).orElse(null);
207-
applyModificationToOperationalLimitsGroup(branch::newOperationalLimitsGroup1, opLGModifInfos, operationalLimitsGroup1, olgReports, SIDE1);
217+
applyModificationToOperationalLimitsGroup(branch::newOperationalLimitsGroup1, opLGModifInfos, operationalLimitsGroup1,
218+
SIDE1, limitSetsReportNode);
208219
}
209220
if (applicability == SIDE2
210-
|| applicability == EQUIPMENT) {
221+
|| applicability == EQUIPMENT) {
211222
OperationalLimitsGroup operationalLimitsGroup2 = branch.getOperationalLimitsGroup2(opLGModifInfos.getId()).orElse(null);
212-
applyModificationToOperationalLimitsGroup(branch::newOperationalLimitsGroup2, opLGModifInfos, operationalLimitsGroup2, olgReports, SIDE2);
223+
applyModificationToOperationalLimitsGroup(branch::newOperationalLimitsGroup2, opLGModifInfos, operationalLimitsGroup2,
224+
SIDE2, limitSetsReportNode);
213225
}
214226
}
215227
}
@@ -411,82 +423,200 @@ protected void applyModificationToOperationalLimitsGroup(
411423
Function<String, OperationalLimitsGroup> groupFactory,
412424
OperationalLimitsGroupModificationInfos opLGModificationInfos,
413425
OperationalLimitsGroup modifiedOperationalLimitsGroup,
414-
List<ReportNode> operationalLimitsGroupReports,
415-
OperationalLimitsGroupInfos.Applicability applicability
426+
OperationalLimitsGroupInfos.Applicability applicability,
427+
ReportNode limitsSetsReportNode
416428
) {
417429
switch (opLGModificationInfos.getModificationType()) {
418430
case OperationalLimitsGroupModificationType.MODIFY_OR_ADD: {
419431
if (modifiedOperationalLimitsGroup == null) {
420-
addOpLG(groupFactory, opLGModificationInfos, modifiedOperationalLimitsGroup, operationalLimitsGroupReports, applicability);
432+
addOpLG(groupFactory, opLGModificationInfos, modifiedOperationalLimitsGroup, applicability, limitsSetsReportNode);
421433
} else {
422-
modifyOLG(opLGModificationInfos, modifiedOperationalLimitsGroup, operationalLimitsGroupReports, applicability);
434+
modifyOLG(opLGModificationInfos, modifiedOperationalLimitsGroup, applicability, limitsSetsReportNode);
423435
}
424436
} break;
425437
case OperationalLimitsGroupModificationType.MODIFY: {
426438
if (modifiedOperationalLimitsGroup == null) {
427439
throw new PowsyblException("Cannot modify operational limit group " + opLGModificationInfos.getId() + " which has not been found in equipment given side");
428440
}
429-
modifyOLG(opLGModificationInfos, modifiedOperationalLimitsGroup, operationalLimitsGroupReports, applicability);
441+
modifyOLG(opLGModificationInfos, modifiedOperationalLimitsGroup, applicability, limitsSetsReportNode);
430442
} break;
431443
case OperationalLimitsGroupModificationType.ADD: {
432-
addOpLG(groupFactory, opLGModificationInfos, modifiedOperationalLimitsGroup, operationalLimitsGroupReports, applicability);
444+
addOpLG(groupFactory, opLGModificationInfos, modifiedOperationalLimitsGroup, applicability, limitsSetsReportNode);
433445
} break;
434446
case OperationalLimitsGroupModificationType.REPLACE: {
435-
replaceOpLG(groupFactory, opLGModificationInfos, modifiedOperationalLimitsGroup, operationalLimitsGroupReports, applicability);
447+
replaceOpLG(groupFactory, opLGModificationInfos, modifiedOperationalLimitsGroup, applicability, limitsSetsReportNode);
436448
} break;
449+
default: break;
437450
}
438451
}
439452

440-
private void replaceOpLG(Function<String, OperationalLimitsGroup> groupFactory, OperationalLimitsGroupModificationInfos opLGModificationInfos, OperationalLimitsGroup modifiedOperationalLimitsGroup, List<ReportNode> operationalLimitsGroupReports, OperationalLimitsGroupInfos.Applicability applicability) {
453+
private void replaceOpLG(Function<String, OperationalLimitsGroup> groupFactory,
454+
OperationalLimitsGroupModificationInfos opLGModificationInfos,
455+
OperationalLimitsGroup modifiedOperationalLimitsGroup,
456+
OperationalLimitsGroupInfos.Applicability applicability,
457+
ReportNode limitsSetsReportNode) {
458+
459+
List<ReportNode> limitSetReports = new ArrayList<>();
441460
if (modifiedOperationalLimitsGroup != null) {
442461
modifiedOperationalLimitsGroup.removeCurrentLimits();
462+
removeAllProperties(modifiedOperationalLimitsGroup, limitSetReports);
443463
}
464+
444465
OperationalLimitsGroup newOperationalLimitsGroup = groupFactory.apply(opLGModificationInfos.getId());
445-
operationalLimitsGroupReports.add(ReportNode.newRootReportNode()
446-
.withAllResourceBundlesFromClasspath()
466+
modifyCurrentLimits(opLGModificationInfos, newOperationalLimitsGroup.newCurrentLimits(), null, limitSetReports);
467+
addProperties(newOperationalLimitsGroup, opLGModificationInfos, limitSetReports);
468+
469+
if (!CollectionUtils.isEmpty(limitSetReports)) {
470+
ReportNode reportNode = limitsSetsReportNode.newReportNode()
447471
.withMessageTemplate("network.modification.operationalLimitsGroupReplaced")
448472
.withUntypedValue(OPERATIONAL_LIMITS_GROUP_NAME, opLGModificationInfos.getId())
449473
.withUntypedValue(SIDE, applicability.toString())
450474
.withSeverity(TypedValue.INFO_SEVERITY)
475+
.add();
476+
ModificationUtils.getInstance().reportModifications(reportNode, limitSetReports);
477+
}
478+
}
479+
480+
private void addProperties(OperationalLimitsGroup limitsGroup, OperationalLimitsGroupModificationInfos operationalLimitsGroupInfos, List<ReportNode> limitSetsReports) {
481+
if (limitsGroup == null || CollectionUtils.isEmpty(operationalLimitsGroupInfos.getLimitsProperties())) {
482+
return;
483+
}
484+
485+
operationalLimitsGroupInfos.getLimitsProperties().forEach((LimitsPropertyInfos property) -> {
486+
limitSetsReports.add(ReportNode.newRootReportNode()
487+
.withMessageTemplate("network.modification.propertyAdded")
488+
.withUntypedValue(NAME, property.name())
489+
.withUntypedValue(VALUE, property.value())
490+
.withSeverity(TypedValue.DETAIL_SEVERITY)
451491
.build());
452-
modifyCurrentLimits(opLGModificationInfos, newOperationalLimitsGroup.newCurrentLimits(), null, operationalLimitsGroupReports);
492+
limitsGroup.setProperty(property.name(), property.value());
493+
});
494+
}
495+
496+
private void removeAllProperties(OperationalLimitsGroup limitsGroup, List<ReportNode> limitSetsReports) {
497+
498+
if (limitsGroup == null) {
499+
return;
500+
}
501+
502+
Iterator<String> propertiesIt = limitsGroup.getPropertyNames().iterator();
503+
while (propertiesIt.hasNext()) {
504+
String propertyName = propertiesIt.next();
505+
limitsGroup.removeProperty(propertyName);
506+
limitSetsReports.add(ReportNode.newRootReportNode()
507+
.withMessageTemplate("network.modification.propertyDeleted")
508+
.withUntypedValue(NAME, propertyName)
509+
.withSeverity(TypedValue.DETAIL_SEVERITY).build());
510+
}
511+
}
512+
513+
private void modifyProperties(OperationalLimitsGroup limitsGroup,
514+
OperationalLimitsGroupModificationInfos operationalLimitsGroupInfos,
515+
List<ReportNode> limitSetsReports) {
516+
if (limitsGroup == null || operationalLimitsGroupInfos == null) {
517+
return;
518+
}
519+
520+
Set<String> currentProperties = limitsGroup.getPropertyNames();
521+
522+
List<LimitsPropertyInfos> propertiesToModify = new ArrayList<>();
523+
List<LimitsPropertyInfos> propertiesToAdd = new ArrayList<>();
524+
List<String> propertiesToRemove;
525+
526+
if (!CollectionUtils.isEmpty(operationalLimitsGroupInfos.getLimitsProperties())) {
527+
for (LimitsPropertyInfos propertyInfos : operationalLimitsGroupInfos.getLimitsProperties()) {
528+
if (currentProperties.contains(propertyInfos.name())) {
529+
propertiesToModify.add(propertyInfos);
530+
} else {
531+
propertiesToAdd.add(propertyInfos);
532+
}
533+
}
534+
535+
propertiesToRemove = currentProperties.stream().filter(
536+
(String propertyName) -> propertiesToModify.stream().filter(propertyInfos ->
537+
propertyInfos.name().equals(propertyName)).toList().isEmpty()).toList();
538+
} else {
539+
propertiesToRemove = new ArrayList<>(currentProperties);
540+
}
541+
542+
propertiesToRemove.forEach((String propertyName) -> {
543+
limitsGroup.removeProperty(propertyName);
544+
limitSetsReports.add(ReportNode.newRootReportNode()
545+
.withMessageTemplate("network.modification.propertyDeleted")
546+
.withUntypedValue(NAME, propertyName)
547+
.withSeverity(TypedValue.DETAIL_SEVERITY).build());
548+
});
549+
550+
propertiesToModify.forEach((LimitsPropertyInfos property) -> {
551+
// Skip changes when value does not change
552+
if (limitsGroup.getProperty(property.name()).equals(property.value())) {
553+
return;
554+
}
555+
limitSetsReports.add(ReportNode.newRootReportNode()
556+
.withMessageTemplate("network.modification.propertyChanged")
557+
.withUntypedValue(NAME, property.name())
558+
.withUntypedValue("to", property.value())
559+
.withUntypedValue("from", limitsGroup.getProperty(property.name()))
560+
.withSeverity(TypedValue.DETAIL_SEVERITY).build());
561+
limitsGroup.setProperty(property.name(), property.value());
562+
});
563+
564+
propertiesToAdd.forEach((LimitsPropertyInfos property) -> {
565+
limitSetsReports.add(ReportNode.newRootReportNode()
566+
.withMessageTemplate("network.modification.propertyAdded")
567+
.withUntypedValue(NAME, property.name())
568+
.withUntypedValue(VALUE, property.value())
569+
.withSeverity(TypedValue.DETAIL_SEVERITY)
570+
.build());
571+
limitsGroup.setProperty(property.name(), property.value());
572+
});
453573
}
454574

455575
private void modifyOLG(
456576
OperationalLimitsGroupModificationInfos operationalLimitsGroupInfos,
457577
OperationalLimitsGroup modifiedOperationalLimitsGroup,
458-
List<ReportNode> olgsReports,
459-
OperationalLimitsGroupInfos.Applicability applicability) {
578+
OperationalLimitsGroupInfos.Applicability applicability,
579+
ReportNode limitsSetsReportNode) {
580+
581+
List<ReportNode> limitSetsReports = new ArrayList<>();
582+
460583
modifiedOperationalLimitsGroup.getCurrentLimits().ifPresent(currentLimits -> {
461-
List<ReportNode> limitsReports = new ArrayList<>();
462-
modifyCurrentLimits(operationalLimitsGroupInfos, modifiedOperationalLimitsGroup.newCurrentLimits(), currentLimits, limitsReports);
463-
if (!limitsReports.isEmpty()) {
464-
// operational limits group is logged only if it contains at least a change of limit
465-
limitsReports.addFirst(ReportNode.newRootReportNode()
466-
.withAllResourceBundlesFromClasspath()
467-
.withMessageTemplate("network.modification.operationalLimitsGroupModified")
468-
.withUntypedValue(OPERATIONAL_LIMITS_GROUP_NAME, operationalLimitsGroupInfos.getId())
469-
.withUntypedValue(SIDE, applicability.toString())
470-
.withSeverity(TypedValue.INFO_SEVERITY)
471-
.build());
472-
olgsReports.addAll(limitsReports);
584+
modifyCurrentLimits(operationalLimitsGroupInfos, modifiedOperationalLimitsGroup.newCurrentLimits(), currentLimits, limitSetsReports);
585+
modifyProperties(modifiedOperationalLimitsGroup, operationalLimitsGroupInfos, limitSetsReports);
586+
587+
if (!limitSetsReports.isEmpty()) {
588+
ReportNode limitSetReport = limitsSetsReportNode.newReportNode()
589+
.withMessageTemplate("network.modification.operationalLimitsGroupModified")
590+
.withUntypedValue(OPERATIONAL_LIMITS_GROUP_NAME, operationalLimitsGroupInfos.getId())
591+
.withUntypedValue(SIDE, applicability.toString())
592+
.withSeverity(TypedValue.INFO_SEVERITY).add();
593+
ModificationUtils.getInstance().reportModifications(limitSetReport, limitSetsReports);
473594
}
474595
});
475596
}
476597

477-
private void addOpLG(Function<String, OperationalLimitsGroup> groupFactory, OperationalLimitsGroupModificationInfos operationalLimitsGroupInfos, OperationalLimitsGroup modifiedOperationalLimitsGroup, List<ReportNode> operationalLimitsGroupReports, OperationalLimitsGroupInfos.Applicability applicability) {
598+
private void addOpLG(Function<String, OperationalLimitsGroup> groupFactory, OperationalLimitsGroupModificationInfos operationalLimitsGroupInfos,
599+
OperationalLimitsGroup modifiedOperationalLimitsGroup,
600+
OperationalLimitsGroupInfos.Applicability applicability, ReportNode limitsSetsReportNode) {
601+
602+
List<ReportNode> limitSetReports = new ArrayList<>();
478603
if (modifiedOperationalLimitsGroup != null) {
479604
throw new PowsyblException("Cannot add " + modifiedOperationalLimitsGroup.getId() + " operational limit group, one with the given name already exists");
480605
}
481606
OperationalLimitsGroup newOperationalLimitsGroup = groupFactory.apply(operationalLimitsGroupInfos.getId());
482-
operationalLimitsGroupReports.add(ReportNode.newRootReportNode()
483-
.withAllResourceBundlesFromClasspath()
607+
modifyCurrentLimits(operationalLimitsGroupInfos, newOperationalLimitsGroup.newCurrentLimits(),
608+
newOperationalLimitsGroup.getCurrentLimits().orElse(null), limitSetReports);
609+
addProperties(newOperationalLimitsGroup, operationalLimitsGroupInfos, limitSetReports);
610+
611+
if (!CollectionUtils.isEmpty(limitSetReports)) {
612+
ReportNode limitSetNode = limitsSetsReportNode.newReportNode()
484613
.withMessageTemplate("network.modification.operationalLimitsGroupAdded")
485614
.withUntypedValue(OPERATIONAL_LIMITS_GROUP_NAME, operationalLimitsGroupInfos.getId())
486615
.withUntypedValue(SIDE, applicability.toString())
487616
.withSeverity(TypedValue.INFO_SEVERITY)
488-
.build());
489-
modifyCurrentLimits(operationalLimitsGroupInfos, newOperationalLimitsGroup.newCurrentLimits(), newOperationalLimitsGroup.getCurrentLimits().orElse(null), operationalLimitsGroupReports);
617+
.add();
618+
ModificationUtils.getInstance().reportModifications(limitSetNode, limitSetReports);
619+
}
490620
}
491621

492622
protected void modifyCurrentLimits(

0 commit comments

Comments
 (0)