]> git.basschouten.com Git - openhab-addons.git/blob
398ab6c5f2363d03bf1fbe64a30ee1015269badf
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2021 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.konnected.internal.servlet;
14
15 import java.io.IOException;
16 import java.util.HashMap;
17 import java.util.Scanner;
18
19 import javax.servlet.http.HttpServlet;
20 import javax.servlet.http.HttpServletRequest;
21 import javax.servlet.http.HttpServletResponse;
22
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;
27
28 import com.google.gson.Gson;
29 import com.google.gson.JsonSyntaxException;
30
31 /**
32  * Main OSGi service and HTTP servlet for Konnected Webhook.
33  *
34  * @author Zachary Christiansen - Initial contribution
35  */
36 public class KonnectedHTTPServlet extends HttpServlet {
37     private final Logger logger = LoggerFactory.getLogger(KonnectedHTTPServlet.class);
38
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();
43
44     private HashMap<String, KonnectedHandler> konnectedThingHandlers = new HashMap<>();
45
46     public KonnectedHTTPServlet() {
47     }
48
49     public void add(KonnectedHandler thingHandler) {
50         logger.trace("Adding KonnectedHandler[{}] to KonnectedHTTPServlet.", thingHandler.getThing().getUID());
51         konnectedThingHandlers.put(thingHandler.getThing().getUID().getAsString(), thingHandler);
52     }
53
54     public void remove(KonnectedHandler thingHandler) {
55         logger.trace("Removing KonnectedHandler [{}] from KonnectedHTTPServlet. ", thingHandler.getThing().getUID());
56
57         konnectedThingHandlers.remove(thingHandler.getThing().getUID().getAsString());
58     }
59
60     @Override
61     protected void service(HttpServletRequest req, HttpServletResponse resp) {
62         try {
63             String data = inputStreamToString(req);
64
65             logger.debug("The raw json data is: {}", data);
66             if (data != null && !konnectedThingHandlers.isEmpty()) {
67                 KonnectedModuleGson event = gson.fromJson(data, KonnectedModuleGson.class);
68                 String authorizationHeader = req.getHeader("Authorization");
69                 String thingHandlerKey = authorizationHeader.substring("Bearer".length()).trim();
70                 logger.debug("The path of the response was: {}", req.getContextPath());
71                 logger.debug("The json received was: {}", event.toString());
72                 logger.debug("The thing handler to send the command to is the handler for thing: {}", thingHandlerKey);
73                 try {
74                     KonnectedHandler thingHandler = konnectedThingHandlers.get(thingHandlerKey);
75                     thingHandler.handleWebHookEvent(event);
76                 } catch (NullPointerException e) {
77                     logger.debug("There was not a handler registered on the servlet to handler commands for thing: {}",
78                             thingHandlerKey);
79                 }
80             }
81
82             setHeaders(resp);
83             resp.getWriter().write("");
84         } catch (IOException | JsonSyntaxException e) {
85             logger.debug("The response received from the module was not valid. {}", e.getMessage());
86         }
87     }
88
89     private String inputStreamToString(HttpServletRequest req) throws IOException {
90         Scanner scanner = new Scanner(req.getInputStream()).useDelimiter("\\A");
91         return scanner.hasNext() ? scanner.next() : "";
92     }
93
94     private void setHeaders(HttpServletResponse response) {
95         response.setCharacterEncoding(CHARSET);
96         response.setContentType(APPLICATION_JSON);
97         response.setHeader("Access-Control-Allow-Origin", "*");
98         response.setHeader("Access-Control-Allow-Methods", "PUT");
99         response.setHeader("Access-Control-Max-Age", "3600");
100         response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
101     }
102 }