1414import com .powsybl .openrao .virtualhubs .MarketArea ;
1515import com .powsybl .openrao .virtualhubs .VirtualHub ;
1616import com .powsybl .openrao .virtualhubs .VirtualHubsConfiguration ;
17- import org .w3c .dom .Document ;
18- import org .w3c .dom .Element ;
19- import org .w3c .dom .NamedNodeMap ;
20- import org .w3c .dom .Node ;
21- import org .w3c .dom .NodeList ;
22- import org .xml .sax .SAXException ;
23-
24- import javax .xml .parsers .DocumentBuilder ;
25- import javax .xml .parsers .DocumentBuilderFactory ;
26- import javax .xml .parsers .ParserConfigurationException ;
27- import java .io .IOException ;
17+ import com .powsybl .openrao .virtualhubs .xml .xsd .BorderDirections ;
18+ import com .powsybl .openrao .virtualhubs .xml .xsd .Configuration ;
19+ import com .powsybl .openrao .virtualhubs .xml .xsd .ConverterListType ;
20+ import com .powsybl .openrao .virtualhubs .xml .xsd .HVDCType ;
21+ import com .powsybl .openrao .virtualhubs .xml .xsd .InternalHVDCs ;
22+ import com .powsybl .openrao .virtualhubs .xml .xsd .LineListType ;
23+ import com .powsybl .openrao .virtualhubs .xml .xsd .MarketAreas ;
24+ import com .powsybl .openrao .virtualhubs .xml .xsd .PoleType ;
25+ import com .powsybl .openrao .virtualhubs .xml .xsd .VirtualHubs ;
26+ import jakarta .xml .bind .JAXBContext ;
27+ import jakarta .xml .bind .JAXBElement ;
28+ import jakarta .xml .bind .JAXBException ;
29+ import jakarta .xml .bind .Unmarshaller ;
30+
2831import java .io .InputStream ;
32+ import java .io .Serializable ;
2933import java .util .ArrayList ;
34+ import java .util .Collection ;
3035import java .util .List ;
3136import java .util .Map ;
3237import java .util .Objects ;
3540
3641/**
3742 * @author Sebastien Murgey {@literal <sebastien.murgey at rte-france.com>}
43+ * @author Vincent Bochet {@literal <vincent.bochet at rte-france.com>}
3844 */
3945class VirtualHubsConfigurationImporter {
4046 public VirtualHubsConfiguration importConfiguration (InputStream inputStream ) {
4147 Objects .requireNonNull (inputStream , "Cannot import configuration from null input stream" );
48+
4249 try {
43- final DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance ();
44- factory .setFeature ("http://apache.org/xml/features/disallow-doctype-decl" , true );
45- final DocumentBuilder builder = factory .newDocumentBuilder ();
46- final Document document = builder .parse (inputStream );
47- final Element configurationEl = document .getDocumentElement ();
48- final NodeList marketAreas = configurationEl .getElementsByTagName ("MarketArea" );
49- final NodeList virtualHubs = configurationEl .getElementsByTagName ("VirtualHub" );
50- final NodeList borderDirections = configurationEl .getElementsByTagName ("BorderDirection" );
51- final NodeList internalHvdcs = configurationEl .getElementsByTagName ("HVDC" );
52- final Map <String , MarketArea > marketAreasMap = new TreeMap <>();
50+ final JAXBContext jaxbContext = JAXBContext .newInstance (Configuration .class );
51+ final Unmarshaller jaxbUnmarshaller = jaxbContext .createUnmarshaller ();
52+ final Configuration unmarshalled = (Configuration ) jaxbUnmarshaller .unmarshal (inputStream );
5353
54+ final Map <String , MarketArea > marketAreasMap = new TreeMap <>();
5455 final VirtualHubsConfiguration configuration = new VirtualHubsConfiguration ();
5556
56- importMarketAreas (marketAreas , marketAreasMap , configuration );
57- importVirtualHubs (virtualHubs , marketAreasMap , configuration );
58- importBorderDirections (borderDirections , configuration );
59- importInternalHvdcs (internalHvdcs , configuration );
57+ final MarketAreas marketAreas = unmarshalled .getMarketAreas ();
58+ if (marketAreas != null ) {
59+ importMarketAreas (marketAreas .getMarketArea (), marketAreasMap , configuration );
60+ }
61+
62+ final VirtualHubs virtualHubs = unmarshalled .getVirtualHubs ();
63+ if (virtualHubs != null ) {
64+ importVirtualHubs (virtualHubs .getVirtualHub (), marketAreasMap , configuration );
65+ }
66+
67+ final BorderDirections borderDirections = unmarshalled .getBorderDirections ();
68+ if (borderDirections != null ) {
69+ importBorderDirections (borderDirections .getBorderDirection (), configuration );
70+ }
71+
72+ final InternalHVDCs internalHvdcs = unmarshalled .getInternalHVDCs ();
73+ if (internalHvdcs != null ) {
74+ importInternalHvdcs (internalHvdcs .getHVDC (), configuration );
75+ }
6076
6177 return configuration ;
62- } catch (ParserConfigurationException | SAXException | IOException e ) {
78+ } catch (JAXBException e ) {
6379 throw new VirtualHubsConfigProcessingException (e );
6480 }
6581 }
6682
67- private static void importMarketAreas (final NodeList marketAreas , final Map <String , MarketArea > marketAreasMap , final VirtualHubsConfiguration configuration ) {
68- for (int marketAreaIndex = 0 ; marketAreaIndex < marketAreas .getLength (); marketAreaIndex ++) {
69- final Node node = marketAreas .item (marketAreaIndex );
70- final String code = node .getAttributes ().getNamedItem ("Code" ).getNodeValue ();
71- final String eic = node .getAttributes ().getNamedItem ("Eic" ).getNodeValue ();
72- final boolean isMcParticipant = Boolean .parseBoolean (node .getAttributes ().getNamedItem ("MCParticipant" ).getNodeValue ());
73- final boolean isAhc = getAhc (node );
83+ private static void importMarketAreas (final List <com .powsybl .openrao .virtualhubs .xml .xsd .MarketArea > rawMarketAreas , final Map <String , MarketArea > marketAreasMap , final VirtualHubsConfiguration configuration ) {
84+ for (com .powsybl .openrao .virtualhubs .xml .xsd .MarketArea rawMarketArea : rawMarketAreas ) {
85+ final String code = rawMarketArea .getCode ();
86+ final String eic = rawMarketArea .getEic ();
87+ final boolean isMcParticipant = rawMarketArea .isMCParticipant ();
88+ final boolean isAhc = Optional .ofNullable (rawMarketArea .isAHC ()).orElse (false );
7489 final MarketArea marketArea = new MarketArea (code , eic , isMcParticipant , isAhc );
7590 marketAreasMap .put (code , marketArea );
7691 configuration .addMarketArea (marketArea );
7792 }
7893 }
7994
80- private static void importVirtualHubs (final NodeList virtualHubs , final Map <String , MarketArea > marketAreasMap , final VirtualHubsConfiguration configuration ) {
81- for (int virtualHubIndex = 0 ; virtualHubIndex < virtualHubs .getLength (); virtualHubIndex ++) {
82- final Node node = virtualHubs .item (virtualHubIndex );
83- final String code = node .getAttributes ().getNamedItem ("Code" ).getNodeValue ();
84- final String eic = node .getAttributes ().getNamedItem ("Eic" ).getNodeValue ();
85- final boolean isMcParticipant = Boolean .parseBoolean (node .getAttributes ().getNamedItem ("MCParticipant" ).getNodeValue ());
86- final boolean isAhc = getAhc (node );
87- final Node nodeNameItem = node .getAttributes ().getNamedItem ("NodeName" );
88- final String nodeName = nodeNameItem != null ? nodeNameItem .getNodeValue () : null ;
89- final MarketArea marketArea = marketAreasMap .get (node .getAttributes ().getNamedItem ("RelatedMA" ).getNodeValue ());
90- final String oppositeHub = Optional .ofNullable (node .getAttributes ().getNamedItem ("OppositeHub" )).map (Node ::getNodeValue ).orElse (null );
95+ private static void importVirtualHubs (final List <com .powsybl .openrao .virtualhubs .xml .xsd .VirtualHub > rawVirtualHubs , final Map <String , MarketArea > marketAreasMap , final VirtualHubsConfiguration configuration ) {
96+ for (com .powsybl .openrao .virtualhubs .xml .xsd .VirtualHub rawVirtualHub : rawVirtualHubs ) {
97+ final String code = rawVirtualHub .getCode ();
98+ final String eic = rawVirtualHub .getEic ();
99+ final boolean isMcParticipant = rawVirtualHub .isMCParticipant ();
100+ final boolean isAhc = Optional .ofNullable (rawVirtualHub .isAHC ()).orElse (false );
101+ final String nodeName = rawVirtualHub .getNodeName ();
102+ final MarketArea marketArea = marketAreasMap .get (rawVirtualHub .getRelatedMA ());
103+ final String oppositeHub = rawVirtualHub .getOppositeHub ();
91104 configuration .addVirtualHub (new VirtualHub (code , eic , isMcParticipant , isAhc , nodeName , marketArea , oppositeHub ));
92105 }
93106 }
94107
95- private static void importBorderDirections (final NodeList borderDirections , final VirtualHubsConfiguration configuration ) {
96- for (int borderDirectionIndex = 0 ; borderDirectionIndex < borderDirections .getLength (); borderDirectionIndex ++) {
97- final Node node = borderDirections .item (borderDirectionIndex );
98- final String from = node .getAttributes ().getNamedItem ("From" ).getNodeValue ();
99- final String to = node .getAttributes ().getNamedItem ("To" ).getNodeValue ();
100- final boolean isAhc = getAhc (node );
108+ private static void importBorderDirections (final List <com .powsybl .openrao .virtualhubs .xml .xsd .BorderDirection > rawBorderDirections , final VirtualHubsConfiguration configuration ) {
109+ for (com .powsybl .openrao .virtualhubs .xml .xsd .BorderDirection rawBorderDirection : rawBorderDirections ) {
110+ final String from = rawBorderDirection .getFrom ();
111+ final String to = rawBorderDirection .getTo ();
112+ final boolean isAhc = Optional .ofNullable (rawBorderDirection .isAHC ()).orElse (false );
101113 configuration .addBorderDirection (new BorderDirection (from , to , isAhc ));
102114 }
103115 }
104116
105- private static void importInternalHvdcs (final NodeList internalHvdcs , final VirtualHubsConfiguration configuration ) {
106- for (int internalHvdcIndex = 0 ; internalHvdcIndex < internalHvdcs .getLength (); internalHvdcIndex ++) {
107- final Element hvdcNode = (Element ) internalHvdcs .item (internalHvdcIndex );
108- final NodeList poles = hvdcNode .getElementsByTagName ("pole" );
109- final Element pole1 = (Element ) poles .item (0 );
110- final Element pole2 = (Element ) poles .item (1 ); // null if there is no such element
111- importHvdcPoleConfiguration (pole1 , configuration );
112- importHvdcPoleConfiguration (pole2 , configuration );
113- }
117+ private static void importInternalHvdcs (final List <HVDCType > internalHvdcs , final VirtualHubsConfiguration configuration ) {
118+ internalHvdcs .stream ()
119+ .map (HVDCType ::getPole )
120+ .flatMap (Collection ::stream )
121+ .forEach (pole -> importHvdcPoleConfiguration (pole , configuration ));
114122 }
115123
116- private static void importHvdcPoleConfiguration (final Element pole , final VirtualHubsConfiguration configuration ) {
124+ private static void importHvdcPoleConfiguration (final PoleType pole , final VirtualHubsConfiguration configuration ) {
117125 if (pole == null ) {
118126 return ;
119127 }
@@ -122,26 +130,20 @@ private static void importHvdcPoleConfiguration(final Element pole, final Virtua
122130 final List <HvdcLine > hvdcLines = new ArrayList <>();
123131
124132 // HVDC -> pole -> converterList -> converter (node, station)
125- final NodeList converters = pole .getElementsByTagName ("converter" );
126- for (int converterIndex = 0 ; converterIndex < converters .getLength (); converterIndex ++) {
127- final NamedNodeMap hvdcConverterAttributes = converters .item (converterIndex ).getAttributes ();
128- hvdcConverters .add (new HvdcConverter (
129- hvdcConverterAttributes .getNamedItem ("node" ).getNodeValue (),
130- hvdcConverterAttributes .getNamedItem ("station" ).getNodeValue ()));
133+ final List <Serializable > converters = pole .getConverterList ().getContent ();
134+ for (Serializable serializableConverter : converters ) {
135+ if (serializableConverter instanceof JAXBElement <?> element && element .getValue () instanceof ConverterListType .Converter converter ) {
136+ hvdcConverters .add (new HvdcConverter (converter .getNode (), converter .getStation ()));
137+ }
131138 }
132139 // HVDC -> pole -> lineList -> line (from, to)
133- final NamedNodeMap hvdcLineAttributes = pole .getElementsByTagName ("line" ).item (0 ).getAttributes ();
134- hvdcLines .add (new HvdcLine (
135- hvdcLineAttributes .getNamedItem ("from" ).getNodeValue (),
136- hvdcLineAttributes .getNamedItem ("to" ).getNodeValue ()));
140+ final List <Serializable > lineLists = pole .getLineList ().getContent ();
141+ for (Serializable serializableConverter : lineLists ) {
142+ if (serializableConverter instanceof JAXBElement <?> element && element .getValue () instanceof LineListType .Line hvdcLine ) {
143+ hvdcLines .add (new HvdcLine (hvdcLine .getFrom (), hvdcLine .getTo ()));
144+ }
145+ }
137146
138147 configuration .addInternalHvdc (new InternalHvdc (hvdcConverters , hvdcLines ));
139148 }
140-
141- private static Boolean getAhc (Node node ) {
142- return Optional .ofNullable (node .getAttributes ().getNamedItem ("AHC" ))
143- .map (Node ::getNodeValue )
144- .map (Boolean ::parseBoolean )
145- .orElse (false );
146- }
147149}
0 commit comments