Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 40 additions & 1 deletion data/virtual-hubs/virtual-hubs-xml/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,53 @@
<name>Virtual hubs XML converter</name>
<description>Conversion between XML data and virtual hubs</description>

<build>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb</groupId>
<artifactId>jaxb-maven-plugin</artifactId>
<configuration>
<extension>true</extension>
<args>
<arg>-Xinheritance</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb</groupId>
<artifactId>jaxb-plugins</artifactId>
<version>${maven.jvnet.jaxb.version}</version>
</plugin>
</plugins>
</configuration>
</plugin>
</plugins>
</build>

<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>open-rao-virtual-hubs-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
</dependency>

<!-- Runtime dependencies -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.jvnet.jaxb</groupId>
<artifactId>jaxb-plugins-runtime</artifactId>
<version>${maven.jvnet.jaxb.version}</version>
<scope>runtime</scope>
</dependency>

<!-- Test dependencies -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
Expand All @@ -37,5 +77,4 @@
<artifactId>assertj-core</artifactId>
</dependency>
</dependencies>

</project>
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,24 @@
import com.powsybl.openrao.virtualhubs.MarketArea;
import com.powsybl.openrao.virtualhubs.VirtualHub;
import com.powsybl.openrao.virtualhubs.VirtualHubsConfiguration;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import com.powsybl.openrao.virtualhubs.xml.xsd.BorderDirections;
import com.powsybl.openrao.virtualhubs.xml.xsd.Configuration;
import com.powsybl.openrao.virtualhubs.xml.xsd.ConverterListType;
import com.powsybl.openrao.virtualhubs.xml.xsd.HVDCType;
import com.powsybl.openrao.virtualhubs.xml.xsd.InternalHVDCs;
import com.powsybl.openrao.virtualhubs.xml.xsd.LineListType;
import com.powsybl.openrao.virtualhubs.xml.xsd.MarketAreas;
import com.powsybl.openrao.virtualhubs.xml.xsd.PoleType;
import com.powsybl.openrao.virtualhubs.xml.xsd.VirtualHubs;
import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.JAXBElement;
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Unmarshaller;

import java.io.InputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;
Expand All @@ -35,85 +40,88 @@

/**
* @author Sebastien Murgey {@literal <sebastien.murgey at rte-france.com>}
* @author Vincent Bochet {@literal <vincent.bochet at rte-france.com>}
*/
class VirtualHubsConfigurationImporter {
public VirtualHubsConfiguration importConfiguration(InputStream inputStream) {
Objects.requireNonNull(inputStream, "Cannot import configuration from null input stream");

try {
final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
final DocumentBuilder builder = factory.newDocumentBuilder();
final Document document = builder.parse(inputStream);
final Element configurationEl = document.getDocumentElement();
final NodeList marketAreas = configurationEl.getElementsByTagName("MarketArea");
final NodeList virtualHubs = configurationEl.getElementsByTagName("VirtualHub");
final NodeList borderDirections = configurationEl.getElementsByTagName("BorderDirection");
final NodeList internalHvdcs = configurationEl.getElementsByTagName("HVDC");
final Map<String, MarketArea> marketAreasMap = new TreeMap<>();
final JAXBContext jaxbContext = JAXBContext.newInstance(Configuration.class);
final Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
final Configuration unmarshalled = (Configuration) jaxbUnmarshaller.unmarshal(inputStream);

final Map<String, MarketArea> marketAreasMap = new TreeMap<>();
final VirtualHubsConfiguration configuration = new VirtualHubsConfiguration();

importMarketAreas(marketAreas, marketAreasMap, configuration);
importVirtualHubs(virtualHubs, marketAreasMap, configuration);
importBorderDirections(borderDirections, configuration);
importInternalHvdcs(internalHvdcs, configuration);
final MarketAreas marketAreas = unmarshalled.getMarketAreas();
if (marketAreas != null) {
importMarketAreas(marketAreas.getMarketArea(), marketAreasMap, configuration);
}

final VirtualHubs virtualHubs = unmarshalled.getVirtualHubs();
if (virtualHubs != null) {
importVirtualHubs(virtualHubs.getVirtualHub(), marketAreasMap, configuration);
}

final BorderDirections borderDirections = unmarshalled.getBorderDirections();
if (borderDirections != null) {
importBorderDirections(borderDirections.getBorderDirection(), configuration);
}

final InternalHVDCs internalHvdcs = unmarshalled.getInternalHVDCs();
if (internalHvdcs != null) {
importInternalHvdcs(internalHvdcs.getHVDC(), configuration);
}

return configuration;
} catch (ParserConfigurationException | SAXException | IOException e) {
} catch (JAXBException e) {
throw new VirtualHubsConfigProcessingException(e);
}
}

private static void importMarketAreas(final NodeList marketAreas, final Map<String, MarketArea> marketAreasMap, final VirtualHubsConfiguration configuration) {
for (int marketAreaIndex = 0; marketAreaIndex < marketAreas.getLength(); marketAreaIndex++) {
final Node node = marketAreas.item(marketAreaIndex);
final String code = node.getAttributes().getNamedItem("Code").getNodeValue();
final String eic = node.getAttributes().getNamedItem("Eic").getNodeValue();
final boolean isMcParticipant = Boolean.parseBoolean(node.getAttributes().getNamedItem("MCParticipant").getNodeValue());
final boolean isAhc = getAhc(node);
private static void importMarketAreas(final List<com.powsybl.openrao.virtualhubs.xml.xsd.MarketArea> rawMarketAreas, final Map<String, MarketArea> marketAreasMap, final VirtualHubsConfiguration configuration) {
for (com.powsybl.openrao.virtualhubs.xml.xsd.MarketArea rawMarketArea : rawMarketAreas) {
final String code = rawMarketArea.getCode();
final String eic = rawMarketArea.getEic();
final boolean isMcParticipant = rawMarketArea.isMCParticipant();
final boolean isAhc = Optional.ofNullable(rawMarketArea.isAHC()).orElse(false);
final MarketArea marketArea = new MarketArea(code, eic, isMcParticipant, isAhc);
marketAreasMap.put(code, marketArea);
configuration.addMarketArea(marketArea);
}
}

private static void importVirtualHubs(final NodeList virtualHubs, final Map<String, MarketArea> marketAreasMap, final VirtualHubsConfiguration configuration) {
for (int virtualHubIndex = 0; virtualHubIndex < virtualHubs.getLength(); virtualHubIndex++) {
final Node node = virtualHubs.item(virtualHubIndex);
final String code = node.getAttributes().getNamedItem("Code").getNodeValue();
final String eic = node.getAttributes().getNamedItem("Eic").getNodeValue();
final boolean isMcParticipant = Boolean.parseBoolean(node.getAttributes().getNamedItem("MCParticipant").getNodeValue());
final boolean isAhc = getAhc(node);
final Node nodeNameItem = node.getAttributes().getNamedItem("NodeName");
final String nodeName = nodeNameItem != null ? nodeNameItem.getNodeValue() : null;
final MarketArea marketArea = marketAreasMap.get(node.getAttributes().getNamedItem("RelatedMA").getNodeValue());
final String oppositeHub = Optional.ofNullable(node.getAttributes().getNamedItem("OppositeHub")).map(Node::getNodeValue).orElse(null);
private static void importVirtualHubs(final List<com.powsybl.openrao.virtualhubs.xml.xsd.VirtualHub> rawVirtualHubs, final Map<String, MarketArea> marketAreasMap, final VirtualHubsConfiguration configuration) {
for (com.powsybl.openrao.virtualhubs.xml.xsd.VirtualHub rawVirtualHub : rawVirtualHubs) {
final String code = rawVirtualHub.getCode();
final String eic = rawVirtualHub.getEic();
final boolean isMcParticipant = rawVirtualHub.isMCParticipant();
final boolean isAhc = Optional.ofNullable(rawVirtualHub.isAHC()).orElse(false);
final String nodeName = rawVirtualHub.getNodeName();
final MarketArea marketArea = marketAreasMap.get(rawVirtualHub.getRelatedMA());
final String oppositeHub = rawVirtualHub.getOppositeHub();
configuration.addVirtualHub(new VirtualHub(code, eic, isMcParticipant, isAhc, nodeName, marketArea, oppositeHub));
}
}

private static void importBorderDirections(final NodeList borderDirections, final VirtualHubsConfiguration configuration) {
for (int borderDirectionIndex = 0; borderDirectionIndex < borderDirections.getLength(); borderDirectionIndex++) {
final Node node = borderDirections.item(borderDirectionIndex);
final String from = node.getAttributes().getNamedItem("From").getNodeValue();
final String to = node.getAttributes().getNamedItem("To").getNodeValue();
final boolean isAhc = getAhc(node);
private static void importBorderDirections(final List<com.powsybl.openrao.virtualhubs.xml.xsd.BorderDirection> rawBorderDirections, final VirtualHubsConfiguration configuration) {
for (com.powsybl.openrao.virtualhubs.xml.xsd.BorderDirection rawBorderDirection : rawBorderDirections) {
final String from = rawBorderDirection.getFrom();
final String to = rawBorderDirection.getTo();
final boolean isAhc = Optional.ofNullable(rawBorderDirection.isAHC()).orElse(false);
configuration.addBorderDirection(new BorderDirection(from, to, isAhc));
}
}

private static void importInternalHvdcs(final NodeList internalHvdcs, final VirtualHubsConfiguration configuration) {
for (int internalHvdcIndex = 0; internalHvdcIndex < internalHvdcs.getLength(); internalHvdcIndex++) {
final Element hvdcNode = (Element) internalHvdcs.item(internalHvdcIndex);
final NodeList poles = hvdcNode.getElementsByTagName("pole");
final Element pole1 = (Element) poles.item(0);
final Element pole2 = (Element) poles.item(1); // null if there is no such element
importHvdcPoleConfiguration(pole1, configuration);
importHvdcPoleConfiguration(pole2, configuration);
}
private static void importInternalHvdcs(final List<HVDCType> internalHvdcs, final VirtualHubsConfiguration configuration) {
internalHvdcs.stream()
.map(HVDCType::getPole)
.flatMap(Collection::stream)
.forEach(pole -> importHvdcPoleConfiguration(pole, configuration));
}

private static void importHvdcPoleConfiguration(final Element pole, final VirtualHubsConfiguration configuration) {
private static void importHvdcPoleConfiguration(final PoleType pole, final VirtualHubsConfiguration configuration) {
if (pole == null) {
return;
}
Expand All @@ -122,26 +130,20 @@ private static void importHvdcPoleConfiguration(final Element pole, final Virtua
final List<HvdcLine> hvdcLines = new ArrayList<>();

// HVDC -> pole -> converterList -> converter (node, station)
final NodeList converters = pole.getElementsByTagName("converter");
for (int converterIndex = 0; converterIndex < converters.getLength(); converterIndex++) {
final NamedNodeMap hvdcConverterAttributes = converters.item(converterIndex).getAttributes();
hvdcConverters.add(new HvdcConverter(
hvdcConverterAttributes.getNamedItem("node").getNodeValue(),
hvdcConverterAttributes.getNamedItem("station").getNodeValue()));
final List<Serializable> converters = pole.getConverterList().getContent();
for (Serializable serializableConverter : converters) {
if (serializableConverter instanceof JAXBElement<?> element && element.getValue() instanceof ConverterListType.Converter converter) {
hvdcConverters.add(new HvdcConverter(converter.getNode(), converter.getStation()));
}
}
// HVDC -> pole -> lineList -> line (from, to)
final NamedNodeMap hvdcLineAttributes = pole.getElementsByTagName("line").item(0).getAttributes();
hvdcLines.add(new HvdcLine(
hvdcLineAttributes.getNamedItem("from").getNodeValue(),
hvdcLineAttributes.getNamedItem("to").getNodeValue()));
final List<Serializable> lineLists = pole.getLineList().getContent();
for (Serializable serializableConverter : lineLists) {
if (serializableConverter instanceof JAXBElement<?> element && element.getValue() instanceof LineListType.Line hvdcLine) {
hvdcLines.add(new HvdcLine(hvdcLine.getFrom(), hvdcLine.getTo()));
}
}

configuration.addInternalHvdc(new InternalHvdc(hvdcConverters, hvdcLines));
}

private static Boolean getAhc(Node node) {
return Optional.ofNullable(node.getAttributes().getNamedItem("AHC"))
.map(Node::getNodeValue)
.map(Boolean::parseBoolean)
.orElse(false);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings version="3.0"
xmlns:jxb="https://jakarta.ee/xml/ns/jaxb"
xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:bindings schemaLocation="../xsd/configuration-25.xsd">
<jxb:schemaBindings>
<jxb:package name="com.powsybl.openrao.virtualhubs.xml.xsd" />
</jxb:schemaBindings>
</jxb:bindings>
</jxb:bindings>
Loading
Loading