From 8344c45905fd8abac46ca10db24251b2f3932bf9 Mon Sep 17 00:00:00 2001 From: Karel Goderis Date: Wed, 14 Jun 2023 17:22:20 +0200 Subject: [PATCH] Fix error handling + migrate to the injected JAX-RS ClientBuilder Signed-Off-By: Karel Goderis --- .../helios/internal/HeliosHandlerFactory.java | 18 +++++++++++++++- .../internal/handler/HeliosHandler221.java | 21 ++++++++++++------- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/bundles/org.openhab.binding.helios/src/main/java/org/openhab/binding/helios/internal/HeliosHandlerFactory.java b/bundles/org.openhab.binding.helios/src/main/java/org/openhab/binding/helios/internal/HeliosHandlerFactory.java index 03b448856b521..586b550cf277d 100644 --- a/bundles/org.openhab.binding.helios/src/main/java/org/openhab/binding/helios/internal/HeliosHandlerFactory.java +++ b/bundles/org.openhab.binding.helios/src/main/java/org/openhab/binding/helios/internal/HeliosHandlerFactory.java @@ -15,6 +15,9 @@ import static org.openhab.binding.helios.internal.HeliosBindingConstants.HELIOS_VARIO_IP_2_21_TYPE; import java.util.Set; +import java.util.concurrent.TimeUnit; + +import javax.ws.rs.client.ClientBuilder; import org.openhab.binding.helios.internal.handler.HeliosHandler221; import org.openhab.core.thing.Thing; @@ -22,7 +25,9 @@ import org.openhab.core.thing.binding.BaseThingHandlerFactory; import org.openhab.core.thing.binding.ThingHandler; import org.openhab.core.thing.binding.ThingHandlerFactory; +import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; /** * The {@link HeliosHandlerFactory} is responsible for creating things and thing @@ -33,8 +38,19 @@ @Component(service = ThingHandlerFactory.class, configurationPid = "binding.helios") public class HeliosHandlerFactory extends BaseThingHandlerFactory { + private static final int EVENT_STREAM_CONNECT_TIMEOUT = 3; + private static final int EVENT_STREAM_READ_TIMEOUT = 200; private static final Set SUPPORTED_THING_TYPES_UIDS = Set.of(HELIOS_VARIO_IP_2_21_TYPE); + private final ClientBuilder clientBuilder; + + @Activate + public HeliosHandlerFactory(@Reference ClientBuilder clientBuilder) { + this.clientBuilder = clientBuilder // + .connectTimeout(EVENT_STREAM_CONNECT_TIMEOUT, TimeUnit.SECONDS) + .readTimeout(EVENT_STREAM_READ_TIMEOUT, TimeUnit.SECONDS); + } + @Override public boolean supportsThingType(ThingTypeUID thingTypeUID) { return SUPPORTED_THING_TYPES_UIDS.contains(thingTypeUID); @@ -45,7 +61,7 @@ protected ThingHandler createHandler(Thing thing) { ThingTypeUID thingTypeUID = thing.getThingTypeUID(); if (thingTypeUID.equals(HELIOS_VARIO_IP_2_21_TYPE)) { - return new HeliosHandler221(thing); + return new HeliosHandler221(thing, clientBuilder); } return null; diff --git a/bundles/org.openhab.binding.helios/src/main/java/org/openhab/binding/helios/internal/handler/HeliosHandler221.java b/bundles/org.openhab.binding.helios/src/main/java/org/openhab/binding/helios/internal/handler/HeliosHandler221.java index b7f8c1f3ae815..9489a97d9005a 100644 --- a/bundles/org.openhab.binding.helios/src/main/java/org/openhab/binding/helios/internal/handler/HeliosHandler221.java +++ b/bundles/org.openhab.binding.helios/src/main/java/org/openhab/binding/helios/internal/handler/HeliosHandler221.java @@ -34,6 +34,7 @@ import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import javax.net.ssl.X509TrustManager; +import javax.ws.rs.ProcessingException; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.ClientRequestContext; @@ -122,6 +123,7 @@ public class HeliosHandler221 extends BaseThingHandler { // REST Client API variables private Client heliosClient; + private final ClientBuilder heliosClientBuilder; private WebTarget baseTarget; private WebTarget systemTarget; private WebTarget logTarget; @@ -139,8 +141,9 @@ public class HeliosHandler221 extends BaseThingHandler { private long logSubscriptionID = 0; - public HeliosHandler221(Thing thing) { + public HeliosHandler221(Thing thing, ClientBuilder heliosClientBuilder) { super(thing); + this.heliosClientBuilder = heliosClientBuilder; } @Override @@ -169,7 +172,7 @@ public void initialize() { logger.error("An exception occurred while initialising the SSL context : '{}'", e1.getMessage(), e1); } - heliosClient = ClientBuilder.newBuilder().sslContext(sslContext).hostnameVerifier(new HostnameVerifier() { + heliosClient = heliosClientBuilder.sslContext(sslContext).hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) { return true; @@ -177,19 +180,18 @@ public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) { }).build(); heliosClient.register(new Authenticator(username, password)); - baseTarget = heliosClient.target(BASE_URI); + baseTarget = heliosClient.target(BASE_URI.replace("{ip}", ipAddress)); systemTarget = baseTarget.path(SYSTEM_PATH); logTarget = baseTarget.path(LOG_PATH); switchTarget = baseTarget.path(SWITCH_PATH); Response response = null; try { - response = systemTarget.resolveTemplate("ip", ipAddress).resolveTemplate("cmd", INFO) - .request(MediaType.APPLICATION_JSON_TYPE).get(); - } catch (NullPointerException e) { + response = systemTarget.resolveTemplate("cmd", INFO).request(MediaType.APPLICATION_JSON_TYPE).get(); + } catch (ProcessingException e) { logger.debug("An exception occurred while fetching system info of the Helios IP Vario '{}' : '{}'", getThing().getUID().toString(), e.getMessage(), e); - updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR, e.getMessage()); + updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, e.getMessage()); scheduler.schedule(resetRunnable, RESET_INTERVAL, TimeUnit.SECONDS); return; } @@ -979,6 +981,11 @@ private List getPorts() { logger.trace("No events were retrieved"); } } + } catch (ProcessingException e) { + updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, e.getMessage()); + logger.warn("An underlying exception forced the Helios IP Vario to go offline : '{}'", + e.getMessage(), e); + scheduler.schedule(resetRunnable, RESET_INTERVAL, TimeUnit.SECONDS); } catch (Exception e) { logger.error("An exception occurred while processing an event : '{}'", e.getMessage(), e); }