package com.homesnap.webserver.servlet.house; /* * #%L * HomeSnapWebServer * %% * Copyright (C) 2011 - 2016 A. de Giuli * %% * This file is part of HomeSnap done by A. de Giuli (arnaud.degiuli(at)free.fr). * * MyDomo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * MyDomo is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MyDomo. If not, see <http://www.gnu.org/licenses/>. * #L% */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.homesnap.engine.house.House; import com.homesnap.webserver.rest.house.MissingParameterRestOperation; import com.homesnap.webserver.rest.house.RestOperationException; import com.homesnap.webserver.rest.house.UnsupportedRestOperation; import com.homesnap.webserver.rest.house.listener.MyDomoDeleteListener; import com.homesnap.webserver.rest.house.listener.MyDomoGetListener; import com.homesnap.webserver.rest.house.listener.MyDomoPostListener; import com.homesnap.webserver.rest.house.listener.MyDomoPutListener; import com.homesnap.webserver.rest.house.parser.ParseException; import com.homesnap.webserver.rest.house.parser.UriParser; public class HouseServlet extends HttpServlet { private static final long serialVersionUID = 1L; HouseServiceImpl service = new HouseServiceImpl(); public void init(ServletConfig config) throws ServletException { System.err.println("Initializing the HouseServlet"); } @Override protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String uri = getUri(req); System.err.println("DELETE :[" + uri + "]"); try { House house = service.readHouse(); MyDomoDeleteListener listener = new MyDomoDeleteListener(house, uri, req.getParameterMap()); UriParser.parse(uri, listener); service.saveHouse(house); if (listener.getResult() == null || listener.getResult() == "") { resp.setStatus(HttpServletResponse.SC_NO_CONTENT); } else { resp.setStatus(HttpServletResponse.SC_OK); } resp.getWriter().write(listener.getResult()); } catch (ParseException e) { e.printStackTrace(); resp.sendError(HttpServletResponse.SC_BAD_REQUEST); } catch (UnsupportedRestOperation e) { resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); } catch (RestOperationException e) { resp.sendError(HttpServletResponse.SC_NOT_ACCEPTABLE); } catch (MissingParameterRestOperation e) { resp.sendError(HttpServletResponse.SC_EXPECTATION_FAILED); } catch (Error e) { resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); System.out.print("Error on that URI: [" + uri + "]"); e.printStackTrace(); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String uri = getUri(req); System.err.println("POST :[" + uri + "]"); try { House house = service.readHouse(); BufferedReader b = new BufferedReader(new InputStreamReader(req.getInputStream())); StringBuilder sb = new StringBuilder(""); String str = b.readLine(); while (str != null) { sb.append(str); str = b.readLine(); } MyDomoPostListener listener = new MyDomoPostListener(house, uri, req.getParameterMap(), sb.toString()); resp.setContentType("application/json"); UriParser.parse(uri, listener); service.saveHouse(house); resp.setHeader("Location", uri); resp.setStatus(HttpServletResponse.SC_CREATED); resp.getWriter().write(listener.getResult()); } catch (ParseException e) { e.printStackTrace(); resp.sendError(HttpServletResponse.SC_BAD_REQUEST); } catch (UnsupportedRestOperation e) { resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); } catch (RestOperationException e) { resp.sendError(HttpServletResponse.SC_NOT_ACCEPTABLE); } catch (MissingParameterRestOperation e) { resp.sendError(HttpServletResponse.SC_EXPECTATION_FAILED); } catch (Error e) { resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); System.out.print("Error on that URI: [" + uri + "]"); e.printStackTrace(); } } protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String uri = getUri(req); System.err.println("GET :[" + uri + "]"); try { House house = service.readHouse(); MyDomoGetListener listener = new MyDomoGetListener(house, uri, req.getParameterMap()); resp.setContentType("application/json"); UriParser.parse(uri, listener); resp.getWriter().write(listener.getResult()); } catch (ParseException e) { e.printStackTrace(); resp.sendError(HttpServletResponse.SC_BAD_REQUEST); } catch (UnsupportedRestOperation e) { resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); } catch (RestOperationException e) { resp.sendError(HttpServletResponse.SC_NOT_ACCEPTABLE); } catch (MissingParameterRestOperation e) { resp.sendError(HttpServletResponse.SC_EXPECTATION_FAILED); } catch (Error e) { resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); System.out.print("Error on that URI: [" + uri + "]"); e.printStackTrace(); } } protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String uri = getUri(req); System.err.println("PUT :[" + uri + "]"); try { House house = service.readHouse(); BufferedReader b = new BufferedReader(new InputStreamReader(req.getInputStream())); StringBuilder sb = new StringBuilder(""); String str = b.readLine(); while (str != null) { sb.append(str); str = b.readLine(); } MyDomoPutListener listener = new MyDomoPutListener(house, uri, req.getParameterMap(), sb.toString()); resp.setContentType("application/json"); UriParser.parse(uri, listener); service.saveHouse(house); resp.getWriter().write(listener.getResult()); } catch (ParseException e) { e.printStackTrace(); resp.sendError(HttpServletResponse.SC_BAD_REQUEST); } catch (UnsupportedRestOperation e) { resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED); } catch (RestOperationException e) { resp.sendError(HttpServletResponse.SC_NOT_ACCEPTABLE); } catch (MissingParameterRestOperation e) { resp.sendError(HttpServletResponse.SC_EXPECTATION_FAILED); } catch (Error e) { resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); System.out.print("Error on that URI: [" + uri + "]"); e.printStackTrace(); } } protected String getUri(HttpServletRequest req) { return req.getQueryString() == null ? req.getRequestURI() : req.getRequestURI() +"?" + req.getQueryString(); // getQueryString()getPathInfo() == null ? "/house" : "/house" + req.getPathInfo(); } } /* CONTROLLER [/house/labels/labelId/where || /house/groups/groupId/where || /controllers/where] Light: /[on|off] || [?what=on||?what=off] Automation: /[up|down|stop] || [?what=up||?what=down||?what=stop] heating: /[heating_on||heating_off||...status]/dimension?value || [?what=heating_on||heating_off|| ...] => seule la premiere permet de régler les dimensions! HOUSE SERVLER /house GET/DELETE /house/labels GET/DELETE /house/labels/labelId || /house/labels/label?id=id GET/PUT/POST/DELETE /house/labels/labelId/where || /house/labels/labelId/controller?id=id GET/PUT/POST/DELETE /house/groups GET /house/groups/groupId || /house/groups/group?id=id GET /house/groups/groupId/where || /house/groups/groupId/controller?id=id GET GET /house /house/labels /house/labels/labelId || /house/labels/label?id=id /house/labels/labelId/where || /house/labels/labelId/controller?id=id /house/groups /house/groups/groupId /house/groups/groupId/where POST /house/labels/labelId (title=Titre) /house/labels/labelId/where (who=1) PUT /house/labels/labelId?title=Titre /house/labels/labelId/where?who=1 DELETE /house /house/labels /house/labels/labelId || /house/labels/label?id=id /house/labels/labelId/where || /house/labels/labelId/controller?id=id */