Java tutorial
/** * 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 Ali Salehi * @author Behnaz Bostanipour * @author Timotee Maret * @author Ivo Dimitrov * @author Milos Stojanovic */ package org.openiot.gsn.http; import org.openiot.gsn.Main; import org.openiot.gsn.Mappings; import org.openiot.gsn.beans.DataField; import org.openiot.gsn.beans.StreamElement; import org.openiot.gsn.beans.VSensorConfig; import org.openiot.gsn.beans.WebInput; //import org.openiot.gsn.http.accesscontrol.User; import org.openiot.gsn.http.ac.DataSource; import org.openiot.gsn.http.ac.User; import org.openiot.gsn.storage.DataEnumerator; import java.io.File; import java.io.IOException; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.collections.KeyValue; import org.apache.commons.lang.StringEscapeUtils; import org.apache.log4j.Logger; public class ContainerInfoHandler implements RequestHandler { private static transient Logger logger = Logger.getLogger(ContainerInfoHandler.class); public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setStatus(HttpServletResponse.SC_OK); String reqName = request.getParameter("name"); //Added by Behnaz HttpSession session = request.getSession(); User user = (User) session.getAttribute("user"); response.setHeader("Cache-Control", "no-store"); response.setDateHeader("Expires", 0); response.setHeader("Pragma", "no-cache"); response.getWriter().write(buildOutput(reqName, user)); } //return only the requested sensor if specified (otherwise use null) //Added by Behnaz. New parameter User user to method buildOutput. public String buildOutput(String reqName, User user) { SimpleDateFormat sdf = new SimpleDateFormat(Main.getContainerConfig().getTimeFormat()); StringBuilder sb = new StringBuilder("<gsn "); sb.append("name=\"").append(StringEscapeUtils.escapeXml(Main.getContainerConfig().getWebName())) .append("\" "); sb.append("author=\"").append(StringEscapeUtils.escapeXml(Main.getContainerConfig().getWebAuthor())) .append("\" "); sb.append("email=\"").append(StringEscapeUtils.escapeXml(Main.getContainerConfig().getWebEmail())) .append("\" "); sb.append("description=\"") .append(StringEscapeUtils.escapeXml(Main.getContainerConfig().getWebDescription())).append("\">\n"); Iterator<VSensorConfig> vsIterator = Mappings.getAllVSensorConfigs(); while (vsIterator.hasNext()) { VSensorConfig sensorConfig = vsIterator.next(); if (Main.getContainerConfig().isAcEnabled()) { if (user != null) { if ((reqName != null && !sensorConfig.getName().equals(reqName)) || (user.hasReadAccessRight(sensorConfig.getName()) == false && user.isAdmin() == false)) continue; } else if ((reqName != null && !sensorConfig.getName().equals(reqName)) || DataSource.isVSManaged(sensorConfig.getName())) { continue; } } else { if ((reqName != null && !sensorConfig.getName().equals(reqName))) continue; } sb.append("<virtual-sensor"); sb.append(" name=\"").append(sensorConfig.getName()).append("\""); sb.append(" last-modified=\"").append(new File(sensorConfig.getFileName()).lastModified()).append("\""); if (sensorConfig.getDescription() != null) { sb.append(" description=\"").append(StringEscapeUtils.escapeXml(sensorConfig.getDescription())) .append("\""); } sb.append(">\n"); ArrayList<StreamElement> ses = getMostRecentValueFor(sensorConfig.getName()); int counter = 1; if (ses != null) { for (StreamElement se : ses) { for (DataField df : sensorConfig.getOutputStructure()) { sb.append("\t<field"); sb.append(" name=\"").append(df.getName().toLowerCase()).append("\""); sb.append(" type=\"").append(df.getType()).append("\""); if (df.getDescription() != null && df.getDescription().trim().length() != 0) sb.append(" description=\"").append(StringEscapeUtils.escapeXml(df.getDescription())) .append("\""); sb.append(">"); if (se != null) if (df.getType().toLowerCase().trim().indexOf("binary") > 0) sb.append(se.getData(df.getName())); else sb.append(se.getData(StringEscapeUtils.escapeXml(df.getName()))); sb.append("</field>\n"); } SimpleDateFormat fsdf = sensorConfig.getSDF() != null ? sensorConfig.getSDF() : sdf; sb.append( "\t<field name=\"timed\" type=\"string\" description=\"The timestamp associated with the stream element\">") .append(se == null ? "" : fsdf.format(new Date(se.getTimeStamp()))) .append("</field>\n"); for (KeyValue df : sensorConfig.getAddressing()) { sb.append("\t<field"); sb.append(" name=\"") .append(StringEscapeUtils.escapeXml(df.getKey().toString().toLowerCase())) .append("\""); sb.append(" category=\"predicate\">"); sb.append(StringEscapeUtils.escapeXml(df.getValue().toString())); sb.append("</field>\n"); } if (sensorConfig.getWebinput() != null) { for (WebInput wi : sensorConfig.getWebinput()) { for (DataField df : wi.getParameters()) { sb.append("\t<field"); sb.append(" command=\"").append(wi.getName()).append("\""); sb.append(" name=\"").append(df.getName().toLowerCase()).append("\""); sb.append(" category=\"input\""); sb.append(" type=\"").append(df.getType()).append("\""); if (df.getDescription() != null && df.getDescription().trim().length() != 0) sb.append(" description=\"") .append(StringEscapeUtils.escapeXml(df.getDescription())).append("\""); sb.append("></field>\n"); } } } counter++; } } sb.append("</virtual-sensor>\n"); } sb.append("</gsn>\n"); return sb.toString(); } public boolean isValid(HttpServletRequest request, HttpServletResponse response) throws IOException { return true; } /** * returns null if there is an error. * * @param virtual_sensor_name * @return */ public static ArrayList<StreamElement> getMostRecentValueFor(String virtual_sensor_name) { StringBuilder query = new StringBuilder("select * from ").append(virtual_sensor_name) .append(" where timed = (select max(timed) from ").append(virtual_sensor_name).append(")"); ArrayList<StreamElement> toReturn = new ArrayList<StreamElement>(); try { DataEnumerator result = Main.getStorage(virtual_sensor_name).executeQuery(query, true); while (result.hasMoreElements()) toReturn.add(result.nextElement()); } catch (SQLException e) { logger.error("ERROR IN EXECUTING, query: " + query); logger.error(e.getMessage(), e); return null; } return toReturn; } }