]> git.basschouten.com Git - openhab-addons.git/blob
2a73cce8aae533c25fa072257bef5a5611ab6ed7
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 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 doGet(HttpServletRequest req, HttpServletResponse resp) {
62         logger.debug("Unhandled get request: {}?{}", req.getRequestURI(), req.getQueryString());
63     }
64
65     @Override
66     protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
67         logger.debug("Got POST: {}", req.getRequestURI());
68         handleDeviceCallback(req, resp);
69     }
70
71     @Override
72     protected void doPut(HttpServletRequest req, HttpServletResponse resp) {
73         logger.debug("Got PUT: {}", req.getRequestURI());
74         handleDeviceCallback(req, resp);
75     }
76
77     private void handleDeviceCallback(HttpServletRequest req, HttpServletResponse resp) {
78         try {
79             String data = inputStreamToString(req);
80
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);
87                 try {
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: {}",
92                             thingHandlerKey);
93                 }
94             }
95
96             setHeaders(resp);
97             resp.getWriter().write("");
98         } catch (IOException | JsonSyntaxException e) {
99             logger.debug("The response received from the module was not valid. {}", e.getMessage());
100         }
101     }
102
103     private String inputStreamToString(HttpServletRequest req) throws IOException {
104         Scanner scanner = new Scanner(req.getInputStream()).useDelimiter("\\A");
105         return scanner.hasNext() ? scanner.next() : null;
106     }
107
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");
115     }
116 }