Skip to content

Commit

Permalink
[konnected] fixes servlet registration (openhab#5764)
Browse files Browse the repository at this point in the history
Fixes openhab#5749

Signed-off-by: Kai Kreuzer <kai@openhab.org>
  • Loading branch information
kaikreuzer authored and Pshatsillo committed Dec 8, 2019
1 parent 4c1657a commit 1c54a5d
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 58 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand All @@ -46,6 +49,8 @@
public class KonnectedHandlerFactory extends BaseThingHandlerFactory {
private final Logger logger = LoggerFactory.getLogger(KonnectedHandlerFactory.class);
private static final Set<ThingTypeUID> 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;
Expand All @@ -61,25 +66,26 @@ protected void activate(ComponentContext componentContext) {
super.activate(componentContext);
Dictionary<String, Object> 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;
}
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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<String, KonnectedHandler> 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
Expand Down Expand Up @@ -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;
}
}

0 comments on commit 1c54a5d

Please sign in to comment.