/**
* Copyright (c) 2011-2014, OpenIoT
*
* This file is part of OpenIoT.
*
* OpenIoT is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* OpenIoT 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with OpenIoT. If not, see <http://www.gnu.org/licenses/>.
*
* Contact: OpenIoT mailto: info@openiot.eu
* @author Ivo Dimitrov
* @author Sofiane Sarni
* @author Milos Stojanovic
*/
package org.openiot.gsn.http.restapi;
import org.apache.log4j.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
public class RestServlet extends HttpServlet {
private static transient Logger logger = Logger.getLogger(RestServlet.class);
private static final int REQUEST_UNKNOWN = -1;
private static final int REQUEST_GET_ALL_SENSORS = 0;
private static final int REQUEST_GET_MEASUREMENTS_FOR_SENSOR = 1;
private static final int REQUEST_GET_MEASUREMENTS_FOR_SENSOR_FIELD = 2;
private static final int REQUEST_GET_GEO_DATA_FOR_SENSOR = 3;
private static final int REQUEST_GET_PREVIEW_MEASUREMENTS_FOR_SENSOR_FIELD = 4;
private static final int REQUEST_GET_GRID = 5;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
GetRequestHandler getRequestHandler = new GetRequestHandler();
//response.getWriter().write(debugRequest(request, response));
RestResponse restResponse;
String sensor = null;
String field = null;
String str_from = null;
String str_to = null;
String str_size = null;
String str_date = null;
switch (determineRequest(request.getRequestURI())) {
case REQUEST_GET_ALL_SENSORS:
restResponse = getRequestHandler.getSensors();
break;
case REQUEST_GET_MEASUREMENTS_FOR_SENSOR_FIELD:
sensor = parseURI(request.getRequestURI())[3];
field = parseURI(request.getRequestURI())[4];
str_from = request.getParameter("from");
str_to = request.getParameter("to");
restResponse = getRequestHandler.getMeasurementsForSensorField(sensor, field, str_from, str_to);
break;
case REQUEST_GET_PREVIEW_MEASUREMENTS_FOR_SENSOR_FIELD:
sensor = parseURI(request.getRequestURI())[3];
field = parseURI(request.getRequestURI())[4];
str_from = request.getParameter("from");
str_to = request.getParameter("to");
str_size = request.getParameter("size");
restResponse = getRequestHandler.getPreviewMeasurementsForSensorField(sensor, field, str_from, str_to, str_size);
break;
case REQUEST_GET_GRID:
sensor = parseURI(request.getRequestURI())[3];
str_date = request.getParameter("date");
restResponse = getRequestHandler.getGridData(sensor, str_date);
break;
default:
restResponse = RestResponse.CreateErrorResponse(RestResponse.HTTP_STATUS_BAD_REQUEST, "Cannot interpret request.");
break;
}
response.setContentType(restResponse.getType());
response.setStatus(restResponse.getHttpStatus());
response.getWriter().write(restResponse.getResponse());
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("REST POST" + "\n" + request.getRequestURI());
}
public void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("REST PUT" + "\n" + request.getRequestURI());
}
public void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("REST DELETE" + "\n" + request.getRequestURI());
}
public String formatURI(String URI) {
StringBuilder sb = new StringBuilder();
String[] parsedURI = parseURI(URI);
for (int i = 0; i < parsedURI.length; i++) {
for (int j = 1; j <= i; j++)
sb.append("..");
sb.append("'").append(parsedURI[i]).append("'").append("\n");
}
return sb.toString();
}
public String[] parseURI(String URI) {
return URI.split("/");
}
public int determineRequest(String URI) {
String[] parsedURI = parseURI(URI);
logger.warn(parsedURI.length);
logger.warn(parsedURI[1]);
if (parsedURI.length == 5 && parsedURI[2].equalsIgnoreCase("preview"))
return REQUEST_GET_PREVIEW_MEASUREMENTS_FOR_SENSOR_FIELD;
if (parsedURI.length == 3 && parsedURI[2].equalsIgnoreCase("sensors"))
return REQUEST_GET_ALL_SENSORS;
if (parsedURI.length == 5 && parsedURI[2].equalsIgnoreCase("sensors"))
return REQUEST_GET_MEASUREMENTS_FOR_SENSOR_FIELD;
if (parsedURI.length == 4 && parsedURI[2].equalsIgnoreCase("grid"))
return REQUEST_GET_GRID;
return REQUEST_UNKNOWN;
}
public String debugRequest(HttpServletRequest request, HttpServletResponse response) {
StringBuilder sb = new StringBuilder();
sb.append("REST GET"
+ "\n"
+ "URI : "
+ formatURI(request.getRequestURI())
+ "\n");
List<String> requestParameterNames = Collections.list((Enumeration<String>) request.getParameterNames());
for (String parameterName : requestParameterNames) {
sb.append(parameterName + " : ");
for (int i = 0; i < request.getParameterValues(parameterName).length; i++)
sb.append(request.getParameterValues(parameterName)[i] + "\n");
}
return sb.toString();
}
}