2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.konnected.internal.servlet;
15 import java.io.IOException;
16 import java.util.HashMap;
17 import java.util.Scanner;
19 import javax.servlet.http.HttpServlet;
20 import javax.servlet.http.HttpServletRequest;
21 import javax.servlet.http.HttpServletResponse;
23 import org.openhab.binding.konnected.internal.gson.KonnectedModuleGson;
24 import org.openhab.binding.konnected.internal.handler.KonnectedHandler;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
28 import com.google.gson.Gson;
29 import com.google.gson.JsonSyntaxException;
32 * Main OSGi service and HTTP servlet for Konnected Webhook.
34 * @author Zachary Christiansen - Initial contribution
36 public class KonnectedHTTPServlet extends HttpServlet {
37 private final Logger logger = LoggerFactory.getLogger(KonnectedHTTPServlet.class);
39 private static final long serialVersionUID = 1288539782077957954L;
40 private static final String APPLICATION_JSON = "application/json";
41 private static final String CHARSET = "utf-8";
42 private final Gson gson = new Gson();
44 private HashMap<String, KonnectedHandler> konnectedThingHandlers = new HashMap<>();
46 public KonnectedHTTPServlet() {
49 public void add(KonnectedHandler thingHandler) {
50 logger.trace("Adding KonnectedHandler[{}] to KonnectedHTTPServlet.", thingHandler.getThing().getUID());
51 konnectedThingHandlers.put(thingHandler.getThing().getUID().getAsString(), thingHandler);
54 public void remove(KonnectedHandler thingHandler) {
55 logger.trace("Removing KonnectedHandler [{}] from KonnectedHTTPServlet. ", thingHandler.getThing().getUID());
57 konnectedThingHandlers.remove(thingHandler.getThing().getUID().getAsString());
61 protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
62 logger.debug("Unhandled get request: {}?{}", req.getRequestURI(), req.getQueryString());
66 protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
67 logger.debug("Got POST: {}", req.getRequestURI());
68 handleDeviceCallback(req, resp);
72 protected void doPut(HttpServletRequest req, HttpServletResponse resp) {
73 logger.debug("Got PUT: {}", req.getRequestURI());
74 handleDeviceCallback(req, resp);
77 private void handleDeviceCallback(HttpServletRequest req, HttpServletResponse resp) {
79 String data = inputStreamToString(req);
81 logger.debug("The raw json data is: {}", data);
82 if (data != null && !konnectedThingHandlers.isEmpty()) {
83 KonnectedModuleGson event = gson.fromJson(data, KonnectedModuleGson.class);
84 String authorizationHeader = req.getHeader("Authorization");
85 String thingHandlerKey = authorizationHeader.substring("Bearer".length()).trim();
86 logger.debug("The thing handler to send the command to is the handler for thing: {}", thingHandlerKey);
88 KonnectedHandler thingHandler = konnectedThingHandlers.get(thingHandlerKey);
89 thingHandler.handleWebHookEvent(event);
90 } catch (NullPointerException e) {
91 logger.debug("There was not a handler registered on the servlet to handler commands for thing: {}",
97 resp.getWriter().write("");
98 } catch (IOException | JsonSyntaxException e) {
99 logger.debug("The response received from the module was not valid. {}", e.getMessage());
103 private String inputStreamToString(HttpServletRequest req) throws IOException {
104 Scanner scanner = new Scanner(req.getInputStream()).useDelimiter("\\A");
105 return scanner.hasNext() ? scanner.next() : null;
108 private void setHeaders(HttpServletResponse response) {
109 response.setCharacterEncoding(CHARSET);
110 response.setContentType(APPLICATION_JSON);
111 response.setHeader("Access-Control-Allow-Origin", "*");
112 response.setHeader("Access-Control-Allow-Methods", "PUT");
113 response.setHeader("Access-Control-Max-Age", "3600");
114 response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");