[dwdunwetter] Improve server problem handling (#15405)

* Fix #14691
* Add country tag

---------

Signed-off-by: lsiepel <leosiepel@gmail.com>
Signed-off-by: Leo Siepel <leosiepel@gmail.com>
This commit is contained in:
lsiepel 2023-09-23 19:28:59 +02:00 committed by GitHub
parent 55789bd792
commit 3b30d5ab11
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 88 additions and 4 deletions

View 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);
}
}

View 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"));
}
}

View 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>

View File

@ -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;
}
}
}

View File

@ -169,7 +169,7 @@ public class DwdWarningsDataTest {
private String rawData = "";
@Override
public String getDataFromEndpoint(String cellId) {
public String getByURL(String url) {
return rawData;
}
}