Skip to content

Commit ba01dfa

Browse files
committed
ReportNode implementation in CIM CRAC importer
Signed-off-by: Sébastien Murgey <sebastien.murgey@rte-france.com>
1 parent b4dc448 commit ba01dfa

13 files changed

Lines changed: 177 additions & 114 deletions

File tree

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.powsybl.openrao.data.craccreation.creator.cim;
2+
3+
import com.powsybl.commons.report.ReportNode;
4+
import com.powsybl.commons.report.TypedValue;
5+
6+
import static com.powsybl.openrao.commons.logs.OpenRaoLoggerProvider.BUSINESS_LOGS;
7+
import static com.powsybl.openrao.commons.logs.OpenRaoLoggerProvider.TECHNICAL_LOGS;
8+
9+
public final class Reports {
10+
private Reports() {
11+
}
12+
13+
public static ReportNode reportValidCimCrac(ReportNode reportNode, String filename) {
14+
ReportNode addedNode = reportNode.newReportNode()
15+
.withMessageTemplate("validCimCrac", "'${filename}' is a valid CIM CRAC document")
16+
.withUntypedValue("filename", filename)
17+
.withSeverity(TypedValue.INFO_SEVERITY)
18+
.add();
19+
BUSINESS_LOGS.info("CIM CRAC document is valid");
20+
return addedNode;
21+
}
22+
23+
public static ReportNode reportInvalidCimCrac(ReportNode reportNode, String filename, String reason) {
24+
ReportNode addedNode = reportNode.newReportNode()
25+
.withMessageTemplate("invalidCimCrac", "'${filename}' is NOT a valid CIM CRAC document. Reason: ${reason}")
26+
.withUntypedValue("filename", filename)
27+
.withUntypedValue("reason", reason)
28+
.withSeverity(TypedValue.TRACE_SEVERITY)
29+
.add();
30+
TECHNICAL_LOGS.debug("CIM CRAC document is NOT valid. Reason: {}", reason);
31+
return addedNode;
32+
}
33+
}

data/crac-creation/crac-creator-cim/src/main/java/com/powsybl/openrao/data/craccreation/creator/cim/craccreator/CimCracCreationContext.java

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,7 @@
1717
import com.powsybl.openrao.data.craccreation.creator.cim.craccreator.remedialaction.RemedialActionSeriesCreationContext;
1818

1919
import java.time.OffsetDateTime;
20-
import java.util.Collection;
21-
import java.util.HashSet;
22-
import java.util.Map;
23-
import java.util.Set;
20+
import java.util.*;
2421
import java.util.stream.Collectors;
2522

2623
/**
@@ -42,19 +39,19 @@ public class CimCracCreationContext implements CracCreationContext {
4239
this.crac = crac;
4340
creationReport = new CracCreationReport();
4441
this.timeStamp = timeStamp;
45-
this.angleCnecCreationContexts = new HashSet<>();
46-
this.voltageCnecCreationContexts = new HashSet<>();
42+
this.angleCnecCreationContexts = new LinkedHashSet<>();
43+
this.voltageCnecCreationContexts = new LinkedHashSet<>();
4744
this.networkName = networkName;
4845
}
4946

5047
protected CimCracCreationContext(CimCracCreationContext toCopy) {
5148
this.crac = toCopy.crac;
5249
this.isCreationSuccessful = toCopy.isCreationSuccessful;
53-
this.contingencyCreationContexts = new HashSet<>(toCopy.contingencyCreationContexts);
50+
this.contingencyCreationContexts = new LinkedHashSet<>(toCopy.contingencyCreationContexts);
5451
this.monitoredSeriesCreationContexts = toCopy.monitoredSeriesCreationContexts;
55-
this.angleCnecCreationContexts = new HashSet<>(toCopy.angleCnecCreationContexts);
56-
this.voltageCnecCreationContexts = new HashSet<>(toCopy.voltageCnecCreationContexts);
57-
this.remedialActionSeriesCreationContexts = new HashSet<>(toCopy.remedialActionSeriesCreationContexts);
52+
this.angleCnecCreationContexts = new LinkedHashSet<>(toCopy.angleCnecCreationContexts);
53+
this.voltageCnecCreationContexts = new LinkedHashSet<>(toCopy.voltageCnecCreationContexts);
54+
this.remedialActionSeriesCreationContexts = new LinkedHashSet<>(toCopy.remedialActionSeriesCreationContexts);
5855
this.creationReport = toCopy.creationReport;
5956
this.timeStamp = toCopy.timeStamp;
6057
this.networkName = toCopy.networkName;
@@ -71,60 +68,60 @@ public Crac getCrac() {
7168
}
7269

7370
// Only contains contingency creation context report for the moment
74-
public void buildCreationReport() {
75-
addToReport(contingencyCreationContexts, "Contingency_Series");
76-
addToReport(angleCnecCreationContexts, "AdditionalConstraint_Series");
77-
addToReport(monitoredSeriesCreationContexts);
78-
addToReport(remedialActionSeriesCreationContexts, "RemedialAction_Series");
79-
addToReport(voltageCnecCreationContexts);
71+
public void buildCreationReport(ReportNode reportNode) {
72+
addToReport(contingencyCreationContexts, "Contingency_Series", reportNode);
73+
addToReport(angleCnecCreationContexts, "AdditionalConstraint_Series", reportNode);
74+
addToReport(monitoredSeriesCreationContexts, reportNode);
75+
addToReport(remedialActionSeriesCreationContexts, "RemedialAction_Series", reportNode);
76+
addToReport(voltageCnecCreationContexts, reportNode);
8077
}
8178

82-
private void addToReport(Collection<? extends ElementaryCreationContext> contexts, String nativeTypeIdentifier) {
79+
private void addToReport(Collection<? extends ElementaryCreationContext> contexts, String nativeTypeIdentifier, ReportNode reportNode) {
8380
contexts.stream().filter(ElementaryCreationContext::isAltered).forEach(context ->
84-
creationReport.altered(String.format("%s \"%s\" was modified: %s. ", nativeTypeIdentifier, context.getNativeId(), context.getImportStatusDetail()), ReportNode.NO_OP)
81+
creationReport.altered(String.format("%s \"%s\" was modified: %s. ", nativeTypeIdentifier, context.getNativeId(), context.getImportStatusDetail()), reportNode)
8582
);
8683
contexts.stream().filter(context -> !context.isImported()).forEach(context ->
87-
creationReport.removed(String.format("%s \"%s\" was not imported: %s. %s.", nativeTypeIdentifier, context.getNativeId(), context.getImportStatus(), context.getImportStatusDetail()), ReportNode.NO_OP)
84+
creationReport.removed(String.format("%s \"%s\" was not imported: %s. %s.", nativeTypeIdentifier, context.getNativeId(), context.getImportStatus(), context.getImportStatusDetail()), reportNode)
8885
);
8986
}
9087

91-
private void addToReport(Map<String, MonitoredSeriesCreationContext> monitoredSeriesCreationContexts) {
88+
private void addToReport(Map<String, MonitoredSeriesCreationContext> monitoredSeriesCreationContexts, ReportNode reportNode) {
9289
for (MonitoredSeriesCreationContext monitoredSeriesCreationContext : monitoredSeriesCreationContexts.values()) {
9390
if (!monitoredSeriesCreationContext.isImported()) {
9491
creationReport.removed(String.format("Monitored_Series \"%s\" was not imported: %s. %s.", monitoredSeriesCreationContext.getNativeId(),
95-
monitoredSeriesCreationContext.getImportStatus(), monitoredSeriesCreationContext.getImportStatusDetail()), ReportNode.NO_OP);
92+
monitoredSeriesCreationContext.getImportStatus(), monitoredSeriesCreationContext.getImportStatusDetail()), reportNode);
9693
} else {
9794
if (monitoredSeriesCreationContext.isAltered()) {
9895
creationReport.altered(String.format("Monitored_Series \"%s\" was altered : %s.", monitoredSeriesCreationContext.getNativeId(),
99-
monitoredSeriesCreationContext.getImportStatusDetail()), ReportNode.NO_OP);
96+
monitoredSeriesCreationContext.getImportStatusDetail()), reportNode);
10097
}
101-
addToReport(monitoredSeriesCreationContext.getMeasurementCreationContexts(), monitoredSeriesCreationContext.getNativeId());
98+
addToReport(monitoredSeriesCreationContext.getMeasurementCreationContexts(), monitoredSeriesCreationContext.getNativeId(), reportNode);
10299
}
103100
}
104101
}
105102

106-
private void addToReport(Set<MeasurementCreationContext> measurementCreationContexts, String monitoredSeriesNativeId) {
103+
private void addToReport(Set<MeasurementCreationContext> measurementCreationContexts, String monitoredSeriesNativeId, ReportNode reportNode) {
107104
for (MeasurementCreationContext measurementCreationContext : measurementCreationContexts) {
108105
if (!measurementCreationContext.isImported()) {
109106
creationReport.removed(String.format("A Measurement in Monitored_Series \"%s\" was not imported: %s. %s.", monitoredSeriesNativeId,
110-
measurementCreationContext.getImportStatus(), measurementCreationContext.getImportStatusDetail()), ReportNode.NO_OP);
107+
measurementCreationContext.getImportStatus(), measurementCreationContext.getImportStatusDetail()), reportNode);
111108
} else {
112109
for (CnecCreationContext cnecCreationContext : measurementCreationContext.getCnecCreationContexts().values()) {
113110
if (!cnecCreationContext.isImported()) {
114111
creationReport.removed(String.format("A Cnec in Monitored_Series \"%s\" was not imported: %s. %s.", monitoredSeriesNativeId,
115-
cnecCreationContext.getImportStatus(), cnecCreationContext.getImportStatusDetail()), ReportNode.NO_OP);
112+
cnecCreationContext.getImportStatus(), cnecCreationContext.getImportStatusDetail()), reportNode);
116113
}
117114
}
118115
}
119116
}
120117
}
121118

122-
private void addToReport(Set<VoltageCnecCreationContext> voltageCnecCreationContexts) {
119+
private void addToReport(Set<VoltageCnecCreationContext> voltageCnecCreationContexts, ReportNode reportNode) {
123120
voltageCnecCreationContexts.stream().filter(context -> !context.isImported()).forEach(context -> {
124121
String neId = context.getNativeNetworkElementId() != null ? context.getNativeNetworkElementId() : "all";
125122
String instant = context.getInstantId() != null ? context.getInstantId().toLowerCase() : "all";
126123
String coName = context.getNativeContingencyName() != null ? context.getNativeContingencyName() : "all";
127-
creationReport.removed(String.format("VoltageCnec with network element \"%s\", instant \"%s\" and contingency \"%s\" was not imported: %s. %s.", neId, instant, coName, context.getImportStatus(), context.getImportStatusDetail()), ReportNode.NO_OP);
124+
creationReport.removed(String.format("VoltageCnec with network element \"%s\", instant \"%s\" and contingency \"%s\" was not imported: %s. %s.", neId, instant, coName, context.getImportStatus(), context.getImportStatusDetail()), reportNode);
128125
}
129126
);
130127
}
@@ -149,7 +146,7 @@ public void addAngleCnecCreationContext(AngleCnecCreationContext angleCnecCreati
149146
}
150147

151148
public Set<AngleCnecCreationContext> getAngleCnecCreationContexts() {
152-
return new HashSet<>(angleCnecCreationContexts);
149+
return new LinkedHashSet<>(angleCnecCreationContexts);
153150
}
154151

155152
public AngleCnecCreationContext getAngleCnecCreationContext(String seriesId) {
@@ -161,7 +158,7 @@ public void addVoltageCnecCreationContext(VoltageCnecCreationContext voltageCnec
161158
}
162159

163160
public Set<VoltageCnecCreationContext> getVoltageCnecCreationContexts() {
164-
return new HashSet<>(voltageCnecCreationContexts);
161+
return new LinkedHashSet<>(voltageCnecCreationContexts);
165162
}
166163

167164
public VoltageCnecCreationContext getVoltageCnecCreationContext(String nativeNetworkElementId, String instantId, String nativeContingencyName) {
@@ -181,11 +178,11 @@ public Set<VoltageCnecCreationContext> getVoltageCnecCreationContextsForContinge
181178
}
182179

183180
public void setContingencyCreationContexts(Set<CimContingencyCreationContext> contingencyCreationContexts) {
184-
this.contingencyCreationContexts = new HashSet<>(contingencyCreationContexts);
181+
this.contingencyCreationContexts = new LinkedHashSet<>(contingencyCreationContexts);
185182
}
186183

187184
public Set<CimContingencyCreationContext> getContingencyCreationContexts() {
188-
return new HashSet<>(contingencyCreationContexts);
185+
return new LinkedHashSet<>(contingencyCreationContexts);
189186
}
190187

191188
public MonitoredSeriesCreationContext getMonitoredSeriesCreationContext(String seriesId) {
@@ -201,7 +198,7 @@ public void setMonitoredSeriesCreationContexts(Map<String, MonitoredSeriesCreati
201198
}
202199

203200
public void setRemedialActionSeriesCreationContexts(Set<RemedialActionSeriesCreationContext> remedialActionCreationContexts) {
204-
this.remedialActionSeriesCreationContexts = new HashSet<>(remedialActionCreationContexts);
201+
this.remedialActionSeriesCreationContexts = new LinkedHashSet<>(remedialActionCreationContexts);
205202
}
206203

207204
public Set<RemedialActionSeriesCreationContext> getRemedialActionSeriesCreationContexts() {

data/crac-creation/crac-creator-cim/src/main/java/com/powsybl/openrao/data/craccreation/creator/cim/craccreator/CimCracCreator.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,23 +68,23 @@ public CimCracCreationContext createCrac(CimCrac cimCrac, Network network, Offse
6868
}
6969

7070
if (offsetDateTime == null) {
71-
creationContext.getCreationReport().error("Timestamp is null for cim crac creator.", ReportNode.NO_OP);
71+
creationContext.getCreationReport().error("Timestamp is null for cim crac creator.", reportNode);
7272
return creationContext.creationFailure();
7373
} else {
7474
String cracTimePeriodStart = cimCrac.getCracDocument().getTimePeriodTimeInterval().getStart();
7575
String cracTimePeriodEnd = cimCrac.getCracDocument().getTimePeriodTimeInterval().getEnd();
7676
if (!isInTimeInterval(offsetDateTime, cracTimePeriodStart, cracTimePeriodEnd)) {
77-
creationContext.getCreationReport().error(String.format("Timestamp %s is not in time interval [%s %s].", offsetDateTime, cracTimePeriodStart, cracTimePeriodEnd), ReportNode.NO_OP);
77+
creationContext.getCreationReport().error(String.format("Timestamp %s is not in time interval [%s %s].", offsetDateTime, cracTimePeriodStart, cracTimePeriodEnd), reportNode);
7878
return creationContext.creationFailure();
7979
}
8080
}
8181

8282
createContingencies();
83-
createCnecs(parameters.getDefaultMonitoredSides());
84-
createRemedialActions(cimCracCreationParameters);
83+
createCnecs(parameters.getDefaultMonitoredSides(), reportNode);
84+
createRemedialActions(cimCracCreationParameters, reportNode);
8585
createVoltageCnecs(cimCracCreationParameters);
86-
creationContext.buildCreationReport();
87-
CracValidator.validateCrac(crac, network).forEach(addedReason -> creationContext.getCreationReport().added(addedReason, ReportNode.NO_OP));
86+
creationContext.buildCreationReport(reportNode);
87+
CracValidator.validateCrac(crac, network).forEach(addedReason -> creationContext.getCreationReport().added(addedReason, reportNode));
8888
return creationContext.creationSuccess(crac);
8989
}
9090

@@ -99,12 +99,12 @@ private void createContingencies() {
9999
new CimContingencyCreator(cimTimeSeries, crac, network, creationContext).createAndAddContingencies();
100100
}
101101

102-
private void createCnecs(Set<Side> defaultMonitoredSides) {
103-
new MonitoredSeriesCreator(cimTimeSeries, network, creationContext, defaultMonitoredSides).createAndAddMonitoredSeries();
102+
private void createCnecs(Set<Side> defaultMonitoredSides, ReportNode reportNode) {
103+
new MonitoredSeriesCreator(cimTimeSeries, network, creationContext, defaultMonitoredSides).createAndAddMonitoredSeries(reportNode);
104104
}
105105

106-
private void createRemedialActions(CimCracCreationParameters cimCracCreationParameters) {
107-
new RemedialActionSeriesCreator(cimTimeSeries, crac, network, creationContext, cimCracCreationParameters).createAndAddRemedialActionSeries();
106+
private void createRemedialActions(CimCracCreationParameters cimCracCreationParameters, ReportNode reportNode) {
107+
new RemedialActionSeriesCreator(cimTimeSeries, crac, network, creationContext, cimCracCreationParameters).createAndAddRemedialActionSeries(reportNode);
108108
}
109109

110110
private void createVoltageCnecs(CimCracCreationParameters cimCracCreationParameters) {

data/crac-creation/crac-creator-cim/src/main/java/com/powsybl/openrao/data/craccreation/creator/cim/craccreator/CimCracUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public static Contingency getContingencyFromCrac(ContingencySeries cimContingenc
4545
public static Set<FlowCnec> getFlowCnecsFromCrac(MonitoredSeries monitoredSeries, CimCracCreationContext cracCreationContext) {
4646
MonitoredSeriesCreationContext mscc = cracCreationContext.getMonitoredSeriesCreationContext(monitoredSeries.getMRID());
4747
if (mscc == null) {
48-
return new HashSet<>();
48+
return new LinkedHashSet<>();
4949
}
5050
return mscc.getCreatedCnecIds().stream().map(cnecId -> cracCreationContext.getCrac().getFlowCnec(cnecId)).collect(Collectors.toSet());
5151
}

0 commit comments

Comments
 (0)