Skip to content

Commit c615aba

Browse files
PermanentLimit name SerDe
Signed-off-by: NathanDissoubray <nathan.dissoubray@rte-france.com>
1 parent aaca5af commit c615aba

26 files changed

Lines changed: 298 additions & 123 deletions

commons-test/src/main/java/com/powsybl/commons/test/AbstractSerDeTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ public abstract class AbstractSerDeTest {
3535
@BeforeEach
3636
public void setUp() throws IOException {
3737
fileSystem = Jimfs.newFileSystem(Configuration.unix());
38-
tmpDir = Files.createDirectory(fileSystem.getPath("tmp"));
38+
//tmpDir = Files.createDirectory(fileSystem.getPath("tmp"));
39+
tmpDir = Path.of("/tmp");
3940
}
4041

4142
@AfterEach

iidm/iidm-api/src/main/java/com/powsybl/iidm/network/LoadingLimitsAdder.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ interface TemporaryLimitAdder<A> extends BasePropertiesHolder {
3636

3737
}
3838

39+
A setPermanentLimitName(String limitName);
40+
3941
A setPermanentLimit(double limit);
4042

4143
TemporaryLimitAdder<A> beginTemporaryLimit();

iidm/iidm-api/src/test/java/com/powsybl/iidm/network/util/LoadingLimitsUtilTest.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,7 @@
1515
import org.junit.jupiter.params.provider.Arguments;
1616
import org.junit.jupiter.params.provider.MethodSource;
1717

18-
import java.util.ArrayList;
19-
import java.util.Collection;
20-
import java.util.List;
21-
import java.util.Optional;
18+
import java.util.*;
2219
import java.util.stream.Stream;
2320
import static java.lang.Integer.MAX_VALUE;
2421
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -115,6 +112,7 @@ private record TemporaryLimitToCreate(String name, int acceptableDuration, doubl
115112
private static class LimitsAdder<L extends LoadingLimits, A extends LimitsAdder<L, A>> extends AbstractBasePropertiesHolder implements LoadingLimitsAdder<L, A> {
116113
private final String ownerId;
117114
private final List<TemporaryLimitToCreate> temporaryLimitToCreateList;
115+
private String permanentLimitName = LoadingLimits.DEFAULT_PERMANENT_LIMIT_NAME;
118116
private double permanentLimit;
119117

120118
public LimitsAdder(String ownerId, double permanentLimit, List<TemporaryLimitToCreate> temporaryLimitToCreateList) {
@@ -127,6 +125,12 @@ public List<TemporaryLimitToCreate> getTemporaryLimitToCreateList() {
127125
return this.temporaryLimitToCreateList;
128126
}
129127

128+
@Override
129+
public A setPermanentLimitName(String limitName) {
130+
this.permanentLimitName = Objects.requireNonNull(permanentLimitName);
131+
return (A) this;
132+
}
133+
130134
@Override
131135
public A setPermanentLimit(double limit) {
132136
this.permanentLimit = limit;

iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/AbstractLoadingLimitsAdder.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ abstract class AbstractLoadingLimitsAdder<L extends LoadingLimits, A extends Loa
2626
protected final Validable validable;
2727
private final String ownerId;
2828

29+
protected String permanentLimitName = LoadingLimits.DEFAULT_PERMANENT_LIMIT_NAME;
2930
protected double permanentLimit = Double.NaN;
3031

3132
protected final TreeMap<Integer, LoadingLimits.TemporaryLimit> temporaryLimits = new TreeMap<>(LoadingLimitsUtil.ACCEPTABLE_DURATION_COMPARATOR);
@@ -127,6 +128,12 @@ private boolean nameExists(String name) {
127128
this.ownerId = ownerId;
128129
}
129130

131+
@Override
132+
public A setPermanentLimitName(String limitName) {
133+
this.permanentLimitName = Objects.requireNonNull(limitName);
134+
return (A) this;
135+
}
136+
130137
@Override
131138
public A setPermanentLimit(double permanentLimit) {
132139
this.permanentLimit = permanentLimit;

iidm/iidm-serde/src/main/java/com/powsybl/iidm/serde/ConnectableSerDeUtil.java

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public final class ConnectableSerDeUtil {
3030

3131
static final String TEMPORARY_LIMITS_ARRAY_ELEMENT_NAME = "temporaryLimits";
3232
static final String TEMPORARY_LIMITS_ROOT_ELEMENT_NAME = "temporaryLimit";
33+
static final String PERMANENT_LIMIT_ROOT_ELEMENT_NAME = "permanentLimit";
3334

3435
private ConnectableSerDeUtil() {
3536
}
@@ -248,32 +249,43 @@ private static <L extends LoadingLimits, A extends LoadingLimitsAdder<L, A>> voi
248249
IidmVersion iidmVersion = context.getVersion();
249250
ImportOptions options = context.getOptions();
250251
ValidationLevel minimalValidationLevel = options.getMinimalValidationLevel().orElse(context.getNetworkValidationLevel());
251-
double permanentLimit = reader.readDoubleAttribute("permanentLimit");
252-
if (Double.isNaN(permanentLimit) && iidmVersion.compareTo(IidmVersion.V_1_12) >= 0 && minimalValidationLevel == ValidationLevel.STEADY_STATE_HYPOTHESIS) {
253-
throw new PowsyblException("permanentLimit is absent in '" + type + "'");
254-
}
255-
adder.setPermanentLimit(permanentLimit);
256-
// Read and add the temporary limits
252+
//Read old permanent limit
253+
IidmSerDeUtil.runUntilMaximumVersion(IidmVersion.V_1_16, context, () -> {
254+
double permanentLimit = reader.readDoubleAttribute(PERMANENT_LIMIT_ROOT_ELEMENT_NAME);
255+
adder.setPermanentLimit(permanentLimit);
256+
});
257+
// Read and add the permanent and temporary limits
257258
reader.readChildNodes(elementName -> {
258-
if (TEMPORARY_LIMITS_ROOT_ELEMENT_NAME.equals(elementName)) {
259-
String name = reader.readStringAttribute("name");
260-
int acceptableDuration = reader.readIntAttribute("acceptableDuration", Integer.MAX_VALUE);
261-
double value = reader.readDoubleAttribute("value", Double.MAX_VALUE);
262-
boolean fictitious = reader.readBooleanAttribute("fictitious", false);
263-
LoadingLimitsAdder.TemporaryLimitAdder<A> tempLimitAdder = adder.beginTemporaryLimit();
264-
readProperties(context, tempLimitAdder);
265-
tempLimitAdder
259+
switch (elementName) {
260+
case TEMPORARY_LIMITS_ROOT_ELEMENT_NAME -> {
261+
String name = reader.readStringAttribute("name");
262+
int acceptableDuration = reader.readIntAttribute("acceptableDuration", Integer.MAX_VALUE);
263+
double value = reader.readDoubleAttribute("value", Double.MAX_VALUE);
264+
boolean fictitious = reader.readBooleanAttribute("fictitious", false);
265+
LoadingLimitsAdder.TemporaryLimitAdder<A> tempLimitAdder = adder.beginTemporaryLimit();
266+
readProperties(context, tempLimitAdder);
267+
tempLimitAdder
266268
.setName(name)
267269
.setAcceptableDuration(acceptableDuration)
268270
.setValue(value)
269271
.setFictitious(fictitious)
270272
.endTemporaryLimit();
271-
} else if (PropertiesSerDe.ROOT_ELEMENT_NAME.equals(elementName)) {
272-
PropertiesSerDe.read(adder, context);
273-
} else {
274-
throw new PowsyblException("Unknown element name '" + elementName + "' in '" + type + "'");
273+
}
274+
case PERMANENT_LIMIT_ROOT_ELEMENT_NAME -> {
275+
String name = reader.readStringAttribute("name");
276+
double value = reader.readDoubleAttribute("value", Double.MAX_VALUE);
277+
adder.setPermanentLimitName(name);
278+
adder.setPermanentLimit(value);
279+
reader.readEndNode();
280+
}
281+
case PropertiesSerDe.ROOT_ELEMENT_NAME -> PropertiesSerDe.read(adder, context);
282+
case null, default ->
283+
throw new PowsyblException("Unknown element name '" + elementName + "' in '" + type + "'");
275284
}
276285
});
286+
if (Double.isNaN(adder.getPermanentLimit()) && iidmVersion.compareTo(IidmVersion.V_1_12) >= 0 && minimalValidationLevel == ValidationLevel.STEADY_STATE_HYPOTHESIS) {
287+
throw new PowsyblException(PERMANENT_LIMIT_ROOT_ELEMENT_NAME + " is absent in '" + type + "'");
288+
}
277289
if (minimalValidationLevel == ValidationLevel.STEADY_STATE_HYPOTHESIS) {
278290
adder.fixLimits(options.getMissingPermanentLimitPercentage()).add();
279291
} else {
@@ -329,7 +341,7 @@ private static <L extends LoadingLimits> void writeLoadingLimits(Integer index,
329341
boolean valid, ExportOptions exportOptions, String type) {
330342
if (limits != null && (!Double.isNaN(limits.getPermanentLimit()) || !limits.getTemporaryLimits().isEmpty())) {
331343
writer.writeStartNode(nsUri, type + indexToString(index));
332-
writer.writeDoubleAttribute("permanentLimit", limits.getPermanentLimit());
344+
writePermanentLimit(limits, writer, version, valid);
333345
writer.writeStartNodes();
334346
IidmSerDeUtil.runFromMinimumVersion(IidmVersion.V_1_16, version, () -> PropertiesSerDe.write(limits, writer, nsUri, exportOptions));
335347
for (LoadingLimits.TemporaryLimit tl : IidmSerDeUtil.sortedTemporaryLimits(limits.getTemporaryLimits(), exportOptions)) {
@@ -346,6 +358,16 @@ private static <L extends LoadingLimits> void writeLoadingLimits(Integer index,
346358
}
347359
}
348360

361+
private static <L extends LoadingLimits> void writePermanentLimit(L limits, TreeDataWriter writer, IidmVersion version, boolean valid) {
362+
IidmSerDeUtil.runUntilMaximumVersion(IidmVersion.V_1_16, version, () -> writer.writeDoubleAttribute(PERMANENT_LIMIT_ROOT_ELEMENT_NAME, limits.getPermanentLimit()));
363+
IidmSerDeUtil.runFromMinimumVersion(IidmVersion.V_1_17, version, () -> {
364+
writer.writeStartNode(version.getNamespaceURI(valid), PERMANENT_LIMIT_ROOT_ELEMENT_NAME);
365+
writer.writeStringAttribute("name", limits.getPermanentLimitName());
366+
writer.writeDoubleAttribute("value", limits.getPermanentLimit());
367+
writer.writeEndNode();
368+
});
369+
}
370+
349371
static void writeSelectedGroupId(Integer index, String defaultId, TreeDataWriter writer) {
350372
String suffix = index == null ? "" : String.valueOf(index);
351373
writer.writeStringAttribute(SELECTED_GROUP_ID + suffix, defaultId);

iidm/iidm-serde/src/main/java/com/powsybl/iidm/serde/util/IidmSerDeUtil.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,15 @@ public static <C extends AbstractNetworkSerDeContext> void runUntilMaximumVersio
288288
}
289289
}
290290

291+
/**
292+
* Run a given runnable if the context's IIDM version equals or is older than a given maximum IIDM version.
293+
*/
294+
public static <C extends AbstractNetworkSerDeContext> void runUntilMaximumVersion(IidmVersion maxVersion, IidmVersion contextVersion, Runnable runnable) {
295+
if (contextVersion.compareTo(maxVersion) <= 0) {
296+
runnable.run();
297+
}
298+
}
299+
291300
/**
292301
* Run a given runnable if the context's IIDM versions is equals or is more recent that the minimum version given,
293302
* and is equal or older than a given maximum IIDM version

iidm/iidm-serde/src/main/resources/xsd/iidm_V1_17.xsd

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@
370370
<xs:complexType name="LoadingLimit">
371371
<xs:sequence>
372372
<xs:element name="property" type="iidm:Property" minOccurs="0" maxOccurs="unbounded" />
373+
<xs:element name="permanentLimit" type="iidm:permanentLimit"/>
373374
<xs:element name="temporaryLimit" minOccurs="0" maxOccurs="unbounded">
374375
<xs:complexType>
375376
<xs:sequence>
@@ -382,7 +383,10 @@
382383
</xs:complexType>
383384
</xs:element>
384385
</xs:sequence>
385-
<xs:attribute name="permanentLimit" use="optional" type="xs:double"/>
386+
</xs:complexType>
387+
<xs:complexType name="permanentLimit">
388+
<xs:attribute name="name" use="optional" type="xs:string"/>
389+
<xs:attribute name="value" use="required" type="xs:double"/>
386390
</xs:complexType>
387391
<xs:complexType name="OperationalLimitsGroup">
388392
<xs:sequence>

iidm/iidm-serde/src/main/resources/xsd/iidm_equipment_V1_17.xsd

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@
370370
<xs:complexType name="LoadingLimit">
371371
<xs:sequence>
372372
<xs:element name="property" type="iidm:Property" minOccurs="0" maxOccurs="unbounded" />
373+
<xs:element name="permanentLimit" type="iidm:permanentLimit"/>
373374
<xs:element name="temporaryLimit" minOccurs="0" maxOccurs="unbounded">
374375
<xs:complexType>
375376
<xs:sequence>
@@ -382,7 +383,10 @@
382383
</xs:complexType>
383384
</xs:element>
384385
</xs:sequence>
385-
<xs:attribute name="permanentLimit" use="optional" type="xs:double"/>
386+
</xs:complexType>
387+
<xs:complexType name="permanentLimit">
388+
<xs:attribute name="name" use="optional" type="xs:string"/>
389+
<xs:attribute name="value" use="optional" type="xs:double"/>
386390
</xs:complexType>
387391
<xs:complexType name="OperationalLimitsGroup">
388392
<xs:sequence>

iidm/iidm-serde/src/test/resources/V1_17/bl-loading-limits.xml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,18 @@
1515
<iidm:boundaryLine id="BL" p0="50.0" q0="30.0" r="10.0" x="1.0" g="1.0E-4" b="1.0E-5" bus="BUS"
1616
connectableBus="BUS" selectedOperationalLimitsGroupIds="DEFAULT">
1717
<iidm:operationalLimitsGroup id="DEFAULT">
18-
<iidm:activePowerLimits permanentLimit="350.0">
18+
<iidm:activePowerLimits>
19+
<iidm:permanentLimit name="permanent" value="350.0"/>
1920
<iidm:temporaryLimit name="20'" acceptableDuration="1200" value="370.0"/>
2021
<iidm:temporaryLimit name="10'" acceptableDuration="600" value="380.0"/>
2122
</iidm:activePowerLimits>
22-
<iidm:apparentPowerLimits permanentLimit="350.0">
23+
<iidm:apparentPowerLimits>
24+
<iidm:permanentLimit name="permanent" value="350.0"/>
2325
<iidm:temporaryLimit name="20'" acceptableDuration="1200" value="370.0"/>
2426
<iidm:temporaryLimit name="10'" acceptableDuration="600" value="380.0"/>
2527
</iidm:apparentPowerLimits>
26-
<iidm:currentLimits permanentLimit="350.0">
28+
<iidm:currentLimits>
29+
<iidm:permanentLimit name="permanent" value="350.0"/>
2730
<iidm:temporaryLimit name="20'" acceptableDuration="1200" value="370.0"/>
2831
<iidm:temporaryLimit name="10'" acceptableDuration="600" value="380.0"/>
2932
</iidm:currentLimits>

iidm/iidm-serde/src/test/resources/V1_17/boundaryLineWithGeneration.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
<iidm:point p="70.0" minQ="-54.55" maxQ="46.25"/>
2222
</iidm:reactiveCapabilityCurve>
2323
<iidm:operationalLimitsGroup id="DEFAULT">
24-
<iidm:currentLimits permanentLimit="100.0">
24+
<iidm:currentLimits>
25+
<iidm:permanentLimit name="permanent" value="100.0"/>
2526
<iidm:temporaryLimit name="20'" acceptableDuration="1200" value="120.0"/>
2627
<iidm:temporaryLimit name="10'" acceptableDuration="600" value="140.0"/>
2728
</iidm:currentLimits>

0 commit comments

Comments
 (0)