From 1c54a5dac20b3678427196c9b1f8591fca7ff047 Mon Sep 17 00:00:00 2001 From: Kai Kreuzer Date: Fri, 28 Jun 2019 21:34:13 +0200 Subject: [PATCH] [konnected] fixes servlet registration (#5764) Fixes #5749 Signed-off-by: Kai Kreuzer --- .../internal/KonnectedHandlerFactory.java | 33 ++++++++----- .../servlet/KonnectedHTTPServlet.java | 49 ++----------------- 2 files changed, 24 insertions(+), 58 deletions(-) diff --git a/bundles/org.openhab.binding.konnected/src/main/java/org/openhab/binding/konnected/internal/KonnectedHandlerFactory.java b/bundles/org.openhab.binding.konnected/src/main/java/org/openhab/binding/konnected/internal/KonnectedHandlerFactory.java index 4306699d187da..7b4cdc2d7da1c 100644 --- a/bundles/org.openhab.binding.konnected/src/main/java/org/openhab/binding/konnected/internal/KonnectedHandlerFactory.java +++ b/bundles/org.openhab.binding.konnected/src/main/java/org/openhab/binding/konnected/internal/KonnectedHandlerFactory.java @@ -18,6 +18,8 @@ import java.util.Dictionary; import java.util.Set; +import javax.servlet.ServletException; + import org.eclipse.jdt.annotation.Nullable; import org.eclipse.smarthome.core.net.HttpServiceUtil; import org.eclipse.smarthome.core.net.NetworkAddressService; @@ -33,6 +35,7 @@ import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; import org.osgi.service.http.HttpService; +import org.osgi.service.http.NamespaceException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,6 +49,8 @@ public class KonnectedHandlerFactory extends BaseThingHandlerFactory { private final Logger logger = LoggerFactory.getLogger(KonnectedHandlerFactory.class); private static final Set SUPPORTED_THING_TYPES_UIDS = Collections.singleton(THING_TYPE_MODULE); + private static final String alias = "/" + BINDING_ID; + private HttpService httpService; private String callbackUrl = null; private NetworkAddressService networkAddressService; @@ -61,25 +66,26 @@ protected void activate(ComponentContext componentContext) { super.activate(componentContext); Dictionary properties = componentContext.getProperties(); callbackUrl = (String) properties.get("callbackUrl"); - KonnectedHTTPServlet servlet = registerWebHookServlet(); - this.servlet = servlet; + try { + this.servlet = registerWebHookServlet(); + } catch (KonnectedWebHookFail e) { + logger.error("Failed registering Konnected servlet - binding is not functional!", e); + } } @Override protected void deactivate(ComponentContext componentContext) { super.deactivate(componentContext); - servlet.deactivate(); + httpService.unregister(alias); } @Override protected @Nullable ThingHandler createHandler(Thing thing) { KonnectedHandler thingHandler = new KonnectedHandler(thing, '/' + BINDING_ID, createCallbackUrl(), createCallbackPort()); - logger.debug("Adding thinghandler for thing {} to webhook.", thing.getUID().getId()); - try { + if (servlet != null) { + logger.debug("Adding thinghandler for thing {} to webhook.", thing.getUID().getId()); servlet.add(thingHandler); - } catch (KonnectedWebHookFail e) { - logger.trace("there was an error adding the thing handler to the servlet: {}", e.getMessage()); } return thingHandler; } @@ -94,11 +100,14 @@ protected void removeHandler(ThingHandler thingHandler) { super.removeHandler(thingHandler); } - private KonnectedHTTPServlet registerWebHookServlet() { - KonnectedHTTPServlet servlet = null; - String configCallBack = '/' + BINDING_ID; - servlet = new KonnectedHTTPServlet(httpService, configCallBack); - return servlet; + private KonnectedHTTPServlet registerWebHookServlet() throws KonnectedWebHookFail { + KonnectedHTTPServlet servlet = new KonnectedHTTPServlet(); + try { + httpService.registerServlet(alias, servlet, null, httpService.createDefaultHttpContext()); + return servlet; + } catch (ServletException | NamespaceException e) { + throw new KonnectedWebHookFail("Could not start Konnected Webhook servlet: " + e.getMessage(), e); + } } @Reference diff --git a/bundles/org.openhab.binding.konnected/src/main/java/org/openhab/binding/konnected/internal/servlet/KonnectedHTTPServlet.java b/bundles/org.openhab.binding.konnected/src/main/java/org/openhab/binding/konnected/internal/servlet/KonnectedHTTPServlet.java index a183d97c17b90..966cfc52a2cb3 100644 --- a/bundles/org.openhab.binding.konnected/src/main/java/org/openhab/binding/konnected/internal/servlet/KonnectedHTTPServlet.java +++ b/bundles/org.openhab.binding.konnected/src/main/java/org/openhab/binding/konnected/internal/servlet/KonnectedHTTPServlet.java @@ -16,15 +16,12 @@ import java.util.HashMap; import java.util.Scanner; -import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.openhab.binding.konnected.internal.gson.KonnectedModuleGson; import org.openhab.binding.konnected.internal.handler.KonnectedHandler; -import org.osgi.service.http.HttpService; -import org.osgi.service.http.NamespaceException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,57 +41,20 @@ public class KonnectedHTTPServlet extends HttpServlet { private static final String CHARSET = "utf-8"; private final Gson gson = new Gson(); - private final HttpService httpService; - - private final String path; private HashMap konnectedThingHandlers = new HashMap<>(); - public KonnectedHTTPServlet(HttpService httpService, String id) { - this.httpService = httpService; - this.path = id; + public KonnectedHTTPServlet() { } - public void add(KonnectedHandler thingHandler) throws KonnectedWebHookFail { + public void add(KonnectedHandler thingHandler) { logger.trace("Adding KonnectedHandler[{}] to KonnectedHTTPServlet.", thingHandler.getThing().getUID()); - - if (konnectedThingHandlers.size() == 0) { - this.activate(); - } - konnectedThingHandlers.put(thingHandler.getThing().getUID().getAsString(), thingHandler); } public void remove(KonnectedHandler thingHandler) { - logger.trace("Removing KonnectedHandler [{}] from KonnectedHTTP Servlet. ", thingHandler.getThing().getUID()); + logger.trace("Removing KonnectedHandler [{}] from KonnectedHTTPServlet. ", thingHandler.getThing().getUID()); konnectedThingHandlers.remove(thingHandler.getThing().getUID().getAsString()); - - if (konnectedThingHandlers.size() == 0) { - this.deactivate(); - } - } - - /** - * Activation callback. - * - * @param config Service config. - **/ - public void activate() throws KonnectedWebHookFail { - try { - logger.debug("Trying to Start Webhook at {}.", path); - httpService.registerServlet(path, this, null, httpService.createDefaultHttpContext()); - logger.debug("Started Konnected Webhook servlet at {}", path); - } catch (ServletException | NamespaceException e) { - throw new KonnectedWebHookFail("Could not start Konnected Webhook servlet: " + e.getMessage(), e); - } - } - - /** - * Webhook Deactivation callback. - */ - public void deactivate() { - httpService.unregister(path); - logger.debug("Konnected webhook servlet stopped"); } @Override @@ -140,7 +100,4 @@ private void setHeaders(HttpServletResponse response) { response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); } - public String getPath() { - return path; - } }