Skip to content

Commit

Permalink
Force checking reading compatibility
Browse files Browse the repository at this point in the history
Signed-off-by: Florian Dupuy <[email protected]>
  • Loading branch information
flo-dup committed Mar 6, 2025
1 parent ce3249f commit 1cb9513
Show file tree
Hide file tree
Showing 10 changed files with 41 additions and 37 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
*/
package com.powsybl.commons.extensions;

import com.powsybl.commons.io.DeserializerContext;

import java.io.InputStream;
import java.util.Objects;
import java.util.Set;
Expand Down Expand Up @@ -93,4 +95,9 @@ public String getNamespacePrefix(String extensionVersion) {
public String getVersion(String namespaceUri) {
return this.namespaceUri.equals(namespaceUri) ? getVersion() : null;
}

@Override
public void checkReadingCompatibility(DeserializerContext context) {
// no need to check, there are no incompatibilities if not versionable
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -117,4 +117,6 @@ default boolean isSerializable(E extension) {
default Map<String, String> getArrayNameToSingleNameMap() {
return Collections.emptyMap();
}

void checkReadingCompatibility(DeserializerContext context);
}
Original file line number Diff line number Diff line change
Expand Up @@ -859,6 +859,7 @@ private static void readExtensions(Identifiable identifiable, NetworkDeserialize
String extensionName = extensionSerde != null ? extensionSerde.getExtensionName() : extensionSerializationName;
if (context.getOptions().withExtension(extensionName) || context.getOptions().withExtension(extensionSerializationName)) {
if (extensionSerde != null) {
extensionSerde.checkReadingCompatibility(context);
extensionSerde.read(identifiable, context);
extensionNamesImported.add(extensionName);
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,9 @@ protected V getExtensionVersionToExport(SerializerContext context) {
.orElseGet(() -> getVersion(networkSerializerContext.getVersion()));
}

protected void checkReadingCompatibility(NetworkDeserializerContext networkContext) {
@Override
public void checkReadingCompatibility(DeserializerContext context) {
NetworkDeserializerContext networkContext = convertContext(context);
IidmVersion iidmVersion = networkContext.getVersion();
checkCompatibilityNetworkVersion(iidmVersion);
if (versions.stream().filter(v -> v.supports(iidmVersion)).noneMatch(v -> networkContext.containsExtensionVersion(getExtensionName(), v.getVersionString()))) {
Expand Down Expand Up @@ -209,4 +211,24 @@ private V versionOf(String extensionVersion, boolean throwIfUnknown) {
return a.orElse(null);
}
}

/**
* Safe conversion of a XmlWriterContext to a NetworkXmlWriterContext
*/
protected static NetworkSerializerContext convertContext(SerializerContext context) {
if (context instanceof NetworkSerializerContext networkSerializerContext) {
return networkSerializerContext;
}
throw new IllegalArgumentException("context is not a NetworkXmlWriterContext");
}

/**
* Safe conversion of a XmlReaderContext to a NetworkXmlReaderContext
*/
protected static NetworkDeserializerContext convertContext(DeserializerContext context) {
if (context instanceof NetworkDeserializerContext networkDeserializerContext) {
return networkDeserializerContext;
}
throw new IllegalArgumentException("context is not a NetworkXmlReaderContext");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ private void writePosition(String connectableId, ConnectablePosition.Feeder feed

@Override
public void write(ConnectablePosition<C> connectablePosition, SerializerContext context) {
NetworkSerializerContext networkContext = (NetworkSerializerContext) context;
NetworkSerializerContext networkContext = convertContext(context);
String connectableId = connectablePosition.getExtendable().getId();
if (connectablePosition.getFeeder() != null) {
writePosition(connectableId, connectablePosition.getFeeder(), null, networkContext);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,12 +59,12 @@ public SlackTerminalSerDe() {

@Override
public void write(SlackTerminal slackTerminal, SerializerContext context) {
TerminalRefSerDe.writeTerminalRefAttribute(slackTerminal.getTerminal(), (NetworkSerializerContext) context);
TerminalRefSerDe.writeTerminalRefAttribute(slackTerminal.getTerminal(), convertContext(context));
}

@Override
public SlackTerminal read(VoltageLevel voltageLevel, DeserializerContext context) {
Terminal terminal = TerminalRefSerDe.readTerminal((NetworkDeserializerContext) context, voltageLevel.getNetwork());
Terminal terminal = TerminalRefSerDe.readTerminal(convertContext(context), voltageLevel.getNetwork());
return voltageLevel.newExtension(SlackTerminalAdder.class)
.withTerminal(terminal)
.add();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,17 +99,14 @@ public void write(VoltageRegulation voltageRegulation, SerializerContext context

@Override
public VoltageRegulation read(Battery battery, DeserializerContext context) {
NetworkDeserializerContext networkContext = convertContext(context);
checkReadingCompatibility(networkContext);

boolean voltageRegulatorOn = networkContext.getReader().readBooleanAttribute("voltageRegulatorOn");
double targetV = networkContext.getReader().readDoubleAttribute("targetV");
boolean voltageRegulatorOn = context.getReader().readBooleanAttribute("voltageRegulatorOn");
double targetV = context.getReader().readDoubleAttribute("targetV");

VoltageRegulation voltageRegulation = battery.newExtension(VoltageRegulationAdder.class).withVoltageRegulatorOn(voltageRegulatorOn).withTargetV(targetV).add();

networkContext.getReader().readChildNodes(elementName -> {
context.getReader().readChildNodes(elementName -> {
if (elementName.equals("terminalRef")) {
TerminalRefSerDe.readTerminalRef(networkContext, battery.getTerminal().getVoltageLevel().getNetwork(), voltageRegulation::setRegulatingTerminal);
TerminalRefSerDe.readTerminalRef(context, battery.getTerminal().getVoltageLevel().getNetwork(), voltageRegulation::setRegulatingTerminal);
} else {
throw new AssertionError("Unexpected element: " + elementName);
}
Expand All @@ -122,24 +119,4 @@ protected Version getDefaultVersion() {
// Default version is v1.1, the subsequent ones have been added without any change
return Version.V_1_1;
}

/**
* Safe conversion of a XmlWriterContext to a NetworkXmlWriterContext
*/
private static NetworkSerializerContext convertContext(SerializerContext context) {
if (context instanceof NetworkSerializerContext networkSerializerContext) {
return networkSerializerContext;
}
throw new IllegalArgumentException("context is not a NetworkXmlWriterContext");
}

/**
* Safe conversion of a XmlReaderContext to a NetworkXmlReaderContext
*/
private static NetworkDeserializerContext convertContext(DeserializerContext context) {
if (context instanceof NetworkDeserializerContext networkDeserializerContext) {
return networkDeserializerContext;
}
throw new IllegalArgumentException("context is not a NetworkXmlReaderContext");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ public void write(LoadMockExt extension, SerializerContext context) {

@Override
public LoadMockExt read(Load load, DeserializerContext context) {
checkReadingCompatibility((NetworkDeserializerContext) context);
context.getReader().readEndNode();
var loadMock = new LoadMockExt(load);
load.addExtension(LoadMockExt.class, loadMock);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ public void write(LoadQuxExt extension, SerializerContext context) {

@Override
public LoadQuxExt read(Load extendable, DeserializerContext context) {
checkReadingCompatibility((NetworkDeserializerContext) context);
return new LoadQuxExt(extendable);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -80,13 +80,10 @@ public void write(TerminalMockExt extension, SerializerContext context) {

@Override
public TerminalMockExt read(Load load, DeserializerContext context) {
NetworkDeserializerContext networkContext = (NetworkDeserializerContext) context;
checkReadingCompatibility(networkContext);

TerminalMockExt terminalMockExt = new TerminalMockExt(load);
context.getReader().readChildNodes(elementName -> {
if (elementName.equals("terminal")) {
TerminalRefSerDe.readTerminalRef(networkContext, load.getNetwork(), terminalMockExt::setTerminal);
TerminalRefSerDe.readTerminalRef(convertContext(context), load.getNetwork(), terminalMockExt::setTerminal);
} else {
throw new IllegalStateException("Unexpected element: " + elementName);
}
Expand Down

0 comments on commit 1cb9513

Please sign in to comment.