diff --git a/bundles/org.openhab.binding.entsoe/pom.xml b/bundles/org.openhab.binding.entsoe/pom.xml index cbbafb13f0..805a7c6c78 100644 --- a/bundles/org.openhab.binding.entsoe/pom.xml +++ b/bundles/org.openhab.binding.entsoe/pom.xml @@ -3,15 +3,11 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.openhab.addons.bundles org.openhab.addons.reactor.bundles 5.2.0-SNAPSHOT - org.openhab.binding.entsoe - openHAB Add-ons :: Bundles :: ENTSO-E Binding - diff --git a/bundles/org.openhab.binding.entsoe/src/main/java/org/openhab/binding/entsoe/internal/client/EntsoeDocumentParser.java b/bundles/org.openhab.binding.entsoe/src/main/java/org/openhab/binding/entsoe/internal/client/EntsoeDocumentParser.java index 55b8e561e2..ce7e0da7f5 100644 --- a/bundles/org.openhab.binding.entsoe/src/main/java/org/openhab/binding/entsoe/internal/client/EntsoeDocumentParser.java +++ b/bundles/org.openhab.binding.entsoe/src/main/java/org/openhab/binding/entsoe/internal/client/EntsoeDocumentParser.java @@ -36,14 +36,16 @@ import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; +import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; /** * @author Bernd Weymann - Initial contribution */ @NonNullByDefault -public class EntsoeDocumentParser { +public class EntsoeDocumentParser implements ErrorHandler { private final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); private final Logger logger = LoggerFactory.getLogger(EntsoeDocumentParser.class); private final TreeMap sequenceDurationMap = new TreeMap<>(); @@ -51,6 +53,10 @@ public class EntsoeDocumentParser { private @Nullable String failureReason; private @Nullable Document document; + public EntsoeDocumentParser() { + failureReason = "Parser not initialized with response"; + } + /** * Constructor. Parses the given XML response string. * Errors during parsing are captured and can be retrieved via {@link #isValid()} and {@link #getFailureReason()}. @@ -284,6 +290,7 @@ public class EntsoeDocumentParser { private @Nullable Document parseDocument(String response) throws ParserConfigurationException, SAXException, IOException { DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + documentBuilder.setErrorHandler(this); Document document = documentBuilder.parse(new InputSource(new StringReader(response))); document.getDocumentElement().normalize(); return document; @@ -301,4 +308,27 @@ public class EntsoeDocumentParser { Duration d = Duration.parse(resolution).multipliedBy(iteration); return start.plus(d); } + + @Override + public void warning(@Nullable SAXParseException exception) throws SAXException { + throwParserException("Unknown warning", exception); + } + + @Override + public void error(@Nullable SAXParseException exception) throws SAXException { + throwParserException("Unknown error", exception); + } + + @Override + public void fatalError(@Nullable SAXParseException exception) throws SAXException { + throwParserException("Unknown fatal error", exception); + } + + private void throwParserException(String message, @Nullable SAXParseException exception) throws SAXException { + if (exception != null) { + throw exception; + } else { + throw new SAXException(message); + } + } } diff --git a/bundles/org.openhab.binding.entsoe/src/main/java/org/openhab/binding/entsoe/internal/handler/EntsoeHandler.java b/bundles/org.openhab.binding.entsoe/src/main/java/org/openhab/binding/entsoe/internal/handler/EntsoeHandler.java index 21f772694b..c747bc7f88 100644 --- a/bundles/org.openhab.binding.entsoe/src/main/java/org/openhab/binding/entsoe/internal/handler/EntsoeHandler.java +++ b/bundles/org.openhab.binding.entsoe/src/main/java/org/openhab/binding/entsoe/internal/handler/EntsoeHandler.java @@ -67,7 +67,7 @@ public class EntsoeHandler extends BaseThingHandler { private final CronScheduler cron; private EntsoeConfiguration config = new EntsoeConfiguration(); - private EntsoeDocumentParser parser = new EntsoeDocumentParser(""); + private EntsoeDocumentParser parser = new EntsoeDocumentParser(); private TreeMap priceMap = new TreeMap<>(); private @Nullable ScheduledCompletableFuture cronDaily; private @Nullable ScheduledFuture retryJob; diff --git a/bundles/org.openhab.binding.entsoe/src/test/java/org/openhab/binding/entsoe/TestResponse.java b/bundles/org.openhab.binding.entsoe/src/test/java/org/openhab/binding/entsoe/TestResponse.java index e1915561b7..4275aa8e5a 100644 --- a/bundles/org.openhab.binding.entsoe/src/test/java/org/openhab/binding/entsoe/TestResponse.java +++ b/bundles/org.openhab.binding.entsoe/src/test/java/org/openhab/binding/entsoe/TestResponse.java @@ -232,6 +232,16 @@ public class TestResponse { } } + @Test + void testEmptyParser() { + EntsoeDocumentParser standardParser = new EntsoeDocumentParser(); + assertNotNull(standardParser); + assertNotNull(standardParser.getFailureReason()); + EntsoeDocumentParser emptyParser = new EntsoeDocumentParser(""); + assertNotNull(emptyParser); + assertNotNull(emptyParser.getFailureReason()); + } + private void verifySpotPrice(Map map, String timestamp, double expectedValue) { SpotPrice testPrice = map.get(Instant.parse(timestamp)); assertNotNull(testPrice, "No spot price at " + timestamp);