org.openiot.gsn.http.ContainerInfoHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.openiot.gsn.http.ContainerInfoHandler.java

Source

/**
*    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;
    }
}