/** * 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 gsn_devs * @author Sofiane Sarni * @author Mehdi Riahi * @author Ali Salehi * @author Timotee Maret */ 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.DataTypes; import org.openiot.gsn.beans.VSensorConfig; import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.util.StringTokenizer; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.openiot.gsn.http.ac.DataSource; import org.openiot.gsn.http.ac.User; import org.apache.log4j.Logger; //path="/WEB-INF/file_not_found.jpg" public class FieldDownloadServlet extends HttpServlet { private static transient Logger logger = Logger.getLogger( FieldDownloadServlet.class ); static final String prefix = "select * from "; static final String postfix = " where PK = ? "; public void doGet ( HttpServletRequest req , HttpServletResponse res ) throws ServletException , IOException { String vsName = req.getParameter( "vs" ); // HttpSession session = req.getSession(); User user = (User) session.getAttribute("user"); res.setHeader("Cache-Control","no-store"); res.setDateHeader("Expires", 0); res.setHeader("Pragma","no-cache"); if ( Main.getContainerConfig().isAcEnabled() && DataSource.isVSManaged(vsName)) { if(user == null || (! user.isAdmin() && ! user.hasReadAccessRight(vsName))) { res.sendError(WebConstants.ACCESS_DENIED, "Access Control failed for vsName:" + vsName + " and user: " + (user == null ? "not logged in" : user.getUserName())); return; } } // if ( vsName == null || (vsName =vsName.trim( ).toLowerCase()).length( ) == 0 ) { res.sendError( WebConstants.MISSING_VSNAME_ERROR , "The virtual sensor name is missing" ); return; } String primaryKey = req.getParameter( "pk" ); String colName = req.getParameter( "field" ); if ( primaryKey == null || colName == null || primaryKey.trim( ).length( ) == 0 || colName.trim( ).length( ) == 0 ) { res.sendError( res.SC_BAD_REQUEST , "The pk and/or field parameters are missing." ); return; } VSensorConfig sensorConfig = Mappings.getVSensorConfig( vsName ); if ( sensorConfig == null ) { res.sendError( WebConstants.ERROR_INVALID_VSNAME , "The specified virtual sensor doesn't exist." ); return; } primaryKey = primaryKey.trim( ); colName = colName.trim( ); // TODO : Check to see if the requested column exists. StringBuilder query = new StringBuilder( ).append( prefix ).append( vsName ).append( postfix ); Connection conn = null; try { conn = Main.getStorage(vsName).getConnection(); ResultSet rs = Main.getStorage(vsName).getBinaryFieldByQuery( query , colName , Long.parseLong( primaryKey ) ,conn); if ( !rs.next() ) { res.sendError( res.SC_NOT_FOUND , "The requested data is marked as obsolete and is not available." ); }else { boolean binary = false; for ( DataField df : sensorConfig.getOutputStructure( ) ) if ( df.getName( ).toLowerCase( ).equals( colName.trim( ).toLowerCase( ) ) ) if ( df.getDataTypeID( ) == DataTypes.BINARY ) { StringTokenizer st = new StringTokenizer( df.getType( ) , ":" ); binary = true; if ( st.countTokens( ) != 2 ) break; st.nextToken( );// Ignoring the first token. res.setContentType( st.nextToken( ) ); // if ( type.equalsIgnoreCase( "svg" ) ) res.setContentType( "" ); } if ( binary ) res.getOutputStream( ).write( rs.getBytes( colName ) ); else { res.setContentType( "text/xml" ); res.getWriter( ).write( rs.getString( colName ) ); } } } catch (NumberFormatException e1) { logger.error("ERROR IN EXECUTING, query: "+query+", colName:"+colName+",primaryKey:"+primaryKey); logger.error(e1.getMessage(),e1); logger.error("Query is from "+req.getRemoteAddr()+"- "+req.getRemoteHost()); } catch (SQLException e1) { logger.error("ERROR IN EXECUTING, query: "+query+", colName:"+colName+",primaryKey:"+primaryKey); logger.error(e1.getMessage(),e1); logger.error("Query is from "+req.getRemoteAddr()+"- "+req.getRemoteHost()); }finally{ Main.getStorage(vsName).close(conn); } } public void doPost ( HttpServletRequest request , HttpServletResponse response ) throws ServletException , IOException { doGet( request , response ); } }