]> git.basschouten.com Git - openhab-addons.git/commitdiff
[dwdunwetter] Improve server problem handling (#15405)
authorlsiepel <leosiepel@gmail.com>
Sat, 23 Sep 2023 17:28:59 +0000 (19:28 +0200)
committerGitHub <noreply@github.com>
Sat, 23 Sep 2023 17:28:59 +0000 (19:28 +0200)
* Fix #14691
* Add country tag

---------

Signed-off-by: lsiepel <leosiepel@gmail.com>
Signed-off-by: Leo Siepel <leosiepel@gmail.com>
bundles/org.openhab.binding.dwdunwetter/src/main/java/org/openhab/binding/dwdunwetter/internal/dto/DwdWarningDataAccess.java
bundles/org.openhab.binding.dwdunwetter/src/main/java/org/openhab/binding/dwdunwetter/internal/dto/DwdWarningsData.java
bundles/org.openhab.binding.dwdunwetter/src/main/resources/OH-INF/addon/addon.xml
bundles/org.openhab.binding.dwdunwetter/src/test/java/org/openhab/binding/dwdunwetter/internal/dto/DwdWarningsDataAccessTest.java [new file with mode: 0644]
bundles/org.openhab.binding.dwdunwetter/src/test/java/org/openhab/binding/dwdunwetter/internal/dto/DwdWarningsDataTest.java

index 3339fb3fe0aaf2771849b33cbfa115ee4070429c..749428d281c5e75a3968a0357956656321628b41 100644 (file)
@@ -51,10 +51,14 @@ public class DwdWarningDataAccess {
             stringBuilder.append("&CQL_FILTER=");
             stringBuilder.append(URLEncoder.encode("WARNCELLID LIKE '" + cellId + "'", StandardCharsets.UTF_8));
             logger.debug("Refreshing Data for cell {}", cellId);
-            String rawData = HttpUtil.executeUrl("GET", stringBuilder.toString(), 5000);
+            String rawData = getByURL(stringBuilder.toString());
             logger.trace("Raw request: {}", stringBuilder);
             logger.trace("Raw response: {}", rawData);
 
+            if (rawData == null || !rawData.startsWith("<?xml") || !rawData.contains("FeatureCollection")) {
+                logger.warn("Communication error occurred while getting data, response is not in expected XML-format");
+                return "";
+            }
             return rawData;
         } catch (IOException e) {
             logger.warn("Communication error occurred while getting data: {}", e.getMessage());
@@ -63,4 +67,8 @@ public class DwdWarningDataAccess {
 
         return "";
     }
+
+    public String getByURL(String url) throws IOException {
+        return HttpUtil.executeUrl("GET", url, 5000);
+    }
 }
index 80a39e606675b3e823073ccfa09a87443f7a232c..750102cb9be23cc396a72d4d7b2dadaf9139f1ae 100644 (file)
@@ -308,6 +308,6 @@ public class DwdWarningsData {
      */
     protected void setDataAccess(DwdWarningDataAccess dataAccess) {
         dataAccessCached = new ExpiringCache<>(Duration.ofMinutes(MIN_REFRESH_WAIT_MINUTES),
-                () -> dataAccess.getDataFromEndpoint(""));
+                () -> dataAccess.getDataFromEndpoint("TestCity"));
     }
 }
index 648a16c46d089ae83e091b589b74a6f3417c7062..39024c6ad4f9bb248d03cbb212a207ce8b695cf6 100644 (file)
@@ -7,5 +7,5 @@
        <name>DWD Unwetter Binding</name>
        <description>This is the binding for DWD Unwetter.</description>
        <connection>cloud</connection>
-
+       <countries>de</countries>
 </addon:addon>
diff --git a/bundles/org.openhab.binding.dwdunwetter/src/test/java/org/openhab/binding/dwdunwetter/internal/dto/DwdWarningsDataAccessTest.java b/bundles/org.openhab.binding.dwdunwetter/src/test/java/org/openhab/binding/dwdunwetter/internal/dto/DwdWarningsDataAccessTest.java
new file mode 100644 (file)
index 0000000..69092e0
--- /dev/null
@@ -0,0 +1,76 @@
+/**
+ * Copyright (c) 2010-2023 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.dwdunwetter.internal.dto;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.StringWriter;
+import java.nio.charset.StandardCharsets;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Tests for {@link org.openhab.binding.dwdunwetter.internal.dto.DwdWarningsDataAccess}
+ *
+ * @author Leo Siepel - Initial contribution
+ */
+public class DwdWarningsDataAccessTest {
+    private TestDataProvider testDataProvider = new TestDataProvider();
+
+    @BeforeEach
+    public void setUp() throws IOException {
+        this.testDataProvider = new TestDataProvider();
+        loadXmlFromFile();
+    }
+
+    @Test
+    public void testNullOrBlank() {
+        assertEquals(testDataProvider.getDataFromEndpoint(null), "");
+        assertEquals(testDataProvider.getDataFromEndpoint(""), "");
+    }
+
+    @Test
+    public void testInvalidResponse() {
+        TestDataProvider testDataProvider = new TestDataProvider();
+        testDataProvider.rawData = "Server is not returning xml";
+        assertEquals(testDataProvider.getDataFromEndpoint("TestCity"), "");
+    }
+
+    private void loadXmlFromFile() throws IOException {
+        InputStream stream = getClass().getResourceAsStream("warnings.xml");
+        BufferedReader reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8));
+        String line = null;
+
+        StringWriter stringWriter = new StringWriter();
+        while ((line = reader.readLine()) != null) {
+            stringWriter.write(line);
+        }
+        reader.close();
+        testDataProvider.rawData = stringWriter.toString();
+    }
+
+    private class TestDataProvider extends DwdWarningDataAccess {
+
+        private String rawData = "";
+
+        @Override
+        public String getByURL(String url) {
+            return rawData;
+        }
+    }
+}
index 003201627c67c1d2cba7b4a187cc0b69905d17e5..f103c5117aac6f3e0dd6997cc672762d16b3b02e 100644 (file)
@@ -169,7 +169,7 @@ public class DwdWarningsDataTest {
         private String rawData = "";
 
         @Override
-        public String getDataFromEndpoint(String cellId) {
+        public String getByURL(String url) {
             return rawData;
         }
     }