2 * Copyright (c) 2010-2022 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.netatmo.internal.webhook;
15 import java.io.IOException;
16 import java.util.Objects;
17 import java.util.Scanner;
19 import javax.servlet.ServletException;
20 import javax.servlet.http.HttpServlet;
21 import javax.servlet.http.HttpServletRequest;
22 import javax.servlet.http.HttpServletResponse;
24 import org.eclipse.jdt.annotation.NonNullByDefault;
25 import org.eclipse.jdt.annotation.Nullable;
26 import org.openhab.binding.netatmo.internal.handler.NetatmoBridgeHandler;
27 import org.osgi.service.http.HttpService;
28 import org.osgi.service.http.NamespaceException;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
32 import com.google.gson.Gson;
35 * Main OSGi service and HTTP servlet for Netatmo Welcome Webhook.
37 * @author Gaƫl L'hopital - Initial contribution
40 public class WelcomeWebHookServlet extends HttpServlet {
41 private static final long serialVersionUID = 1288539782077957954L;
42 private static final String PATH = "/netatmo/%s/camera";
43 private static final String APPLICATION_JSON = "application/json";
44 private static final String CHARSET = "utf-8";
46 private final Gson gson = new Gson();
48 private final Logger logger = LoggerFactory.getLogger(WelcomeWebHookServlet.class);
50 private HttpService httpService;
51 private @Nullable NetatmoBridgeHandler bridgeHandler;
54 public WelcomeWebHookServlet(HttpService httpService, String id) {
55 this.httpService = httpService;
56 this.path = String.format(PATH, id);
60 * OSGi activation callback.
62 * @param config Service config.
64 public void activate(NetatmoBridgeHandler bridgeHandler) {
65 this.bridgeHandler = bridgeHandler;
67 httpService.registerServlet(path, this, null, httpService.createDefaultHttpContext());
68 logger.debug("Started Netatmo Webhook servlet at {}", path);
69 } catch (ServletException | NamespaceException e) {
70 logger.error("Could not start Netatmo Webhook servlet: {}", e.getMessage(), e);
75 * OSGi deactivation callback.
77 public void deactivate() {
78 httpService.unregister(path);
79 logger.debug("Netatmo webhook servlet stopped");
80 this.bridgeHandler = null;
84 protected void service(@Nullable HttpServletRequest req, @Nullable HttpServletResponse resp)
85 throws ServletException, IOException {
86 if (req == null || resp == null) {
90 String data = inputStreamToString(req);
91 NetatmoBridgeHandler handler = bridgeHandler;
92 if (!data.isEmpty() && handler != null) {
93 NAWebhookCameraEvent event = gson.fromJson(data, NAWebhookCameraEvent.class);
94 logger.debug("Event transmitted from restService");
95 handler.webHookEvent(Objects.requireNonNull(event));
99 resp.getWriter().write("");
102 private String inputStreamToString(HttpServletRequest req) throws IOException {
104 try (Scanner scanner = new Scanner(req.getInputStream())) {
105 scanner.useDelimiter("\\A");
106 value = scanner.hasNext() ? scanner.next() : "";
111 private void setHeaders(HttpServletResponse response) {
112 response.setCharacterEncoding(CHARSET);
113 response.setContentType(APPLICATION_JSON);
114 response.setHeader("Access-Control-Allow-Origin", "*");
115 response.setHeader("Access-Control-Allow-Methods", "POST");
116 response.setHeader("Access-Control-Max-Age", "3600");
117 response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
120 public String getPath() {