001 //$$Header: $$ 002 /*---------------------------------------------------------------------------- 003 This file is part of deegree, http://deegree.org/ 004 Copyright (C) 2001-2009 by: 005 Department of Geography, University of Bonn 006 and 007 lat/lon GmbH 008 009 This library is free software; you can redistribute it and/or modify it under 010 the terms of the GNU Lesser General Public License as published by the Free 011 Software Foundation; either version 2.1 of the License, or (at your option) 012 any later version. 013 This library is distributed in the hope that it will be useful, but WITHOUT 014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 016 details. 017 You should have received a copy of the GNU Lesser General Public License 018 along with this library; if not, write to the Free Software Foundation, Inc., 019 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 020 021 Contact information: 022 023 lat/lon GmbH 024 Aennchenstr. 19, 53177 Bonn 025 Germany 026 http://lat-lon.de/ 027 028 Department of Geography, University of Bonn 029 Prof. Dr. Klaus Greve 030 Postfach 1147, 53001 Bonn 031 Germany 032 http://www.geographie.uni-bonn.de/deegree/ 033 034 e-mail: info@deegree.org 035 ----------------------------------------------------------------------------*/ 036 037 package org.deegree.enterprise.servlet; 038 039 import java.io.File; 040 import java.io.IOException; 041 import java.io.Serializable; 042 import java.util.UUID; 043 044 import javax.servlet.ServletException; 045 import javax.servlet.http.HttpServlet; 046 import javax.servlet.http.HttpServletRequest; 047 import javax.servlet.http.HttpServletResponse; 048 import javax.servlet.http.HttpSession; 049 050 import org.deegree.framework.log.ILogger; 051 import org.deegree.framework.log.LoggerFactory; 052 import org.deegree.framework.util.StringTools; 053 import org.deegree.framework.xml.XMLFragment; 054 import org.deegree.framework.xml.XSLTDocument; 055 import org.deegree.portal.owswatch.Constants; 056 import org.deegree.portal.owswatch.JSPagesReference; 057 import org.deegree.portal.owswatch.Messages; 058 import org.deegree.portal.owswatch.ServiceConfiguration; 059 import org.deegree.portal.owswatch.ServiceWatcher; 060 import org.deegree.portal.owswatch.ServiceWatcherFactory; 061 062 /** 063 * Used to authenticate the user in order to view the Protocol file 064 * 065 * @author <a href="mailto:elmasry@lat-lon.de">Moataz Elmasry</a> 066 * @author last edited by: $Author: elmasry $ 067 * 068 * @version $Revision: 1.3 $, $Date: 2008-03-07 16:31:02 $ 069 */ 070 public class ProtocolServlet extends HttpServlet implements Serializable { 071 072 private static final ILogger LOG = LoggerFactory.getLogger( ProtocolServlet.class ); 073 074 private final String SESSIONID_KEY = Constants.SESSIONID_KEY; 075 076 private ServiceWatcher watcher = null; 077 078 private String webinfPath = null; 079 080 private String confFilePath = null; 081 082 private ServiceWatcherFactory factory = null; 083 084 /** 085 * 086 */ 087 private static final long serialVersionUID = -6509717095713986594L; 088 089 /* 090 * (non-Javadoc) 091 * 092 * @see javax.servlet.GenericServlet#init() 093 */ 094 @Override 095 public void init() 096 throws ServletException { 097 confFilePath = this.getServletContext().getRealPath( this.getInitParameter( "owsWatchConfiguration" ) ); 098 webinfPath = this.getServletContext().getRealPath( "WEB-INF/conf/owswatch" ); 099 if ( !webinfPath.endsWith( "/" ) ) { 100 webinfPath = webinfPath.concat( "/" ); 101 } 102 try { 103 factory = ServiceWatcherFactory.getInstance( confFilePath, webinfPath ); 104 watcher = factory.getServiceWatcherInstance(); 105 } catch ( Exception e ) { 106 LOG.logError( e.getLocalizedMessage() ); 107 return; 108 } 109 } 110 111 /* 112 * (non-Javadoc) 113 * 114 * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, 115 * javax.servlet.http.HttpServletResponse) 116 */ 117 @Override 118 protected void doGet( HttpServletRequest request, HttpServletResponse response ) 119 throws ServletException, IOException { 120 PerformAction( request, response ); 121 } 122 123 /* 124 * (non-Javadoc) 125 * 126 * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, 127 * javax.servlet.http.HttpServletResponse) 128 */ 129 @Override 130 protected void doPost( HttpServletRequest request, HttpServletResponse response ) 131 throws ServletException, IOException { 132 PerformAction( request, response ); 133 } 134 135 protected void PerformAction( HttpServletRequest request, HttpServletResponse response ) { 136 137 String action = request.getParameter( "action" ); 138 if ( action == null ) { 139 gotoErrorPage( request, response, "The action value is null", null, null ); 140 return; 141 } 142 if ( action.equals( "loginProtocol" ) ) { 143 handleLoginProtocol( request, response ); 144 } else if ( action.equals( "serviceProtocol" ) ) { 145 handleServiceProtocol( request, response ); 146 } else { 147 gotoErrorPage( request, response, StringTools.concat( 100, "action: ", action, 148 " is unknown to this servlet" ), null, null ); 149 } 150 } 151 152 /** 153 * Handle login for Protocol requests 154 * 155 * @param request 156 * @param response 157 */ 158 private boolean handleLoginProtocol( HttpServletRequest request, HttpServletResponse response ) { 159 160 String user = request.getParameter( "username" ); 161 String pwd = request.getParameter( "password" ); 162 try { 163 if ( factory.getConf().isAuthenticatedUser( user, pwd ) ) { 164 HttpSession session = request.getSession( true ); 165 // isLoggedin 166 String sessionId = UUID.randomUUID().toString(); 167 session.setAttribute( SESSIONID_KEY, sessionId ); 168 String serviceId = (String) session.getAttribute( "serviceId" ); 169 String nextpage = StringTools.concat( 200, "wprotocol?action=serviceProtocol&serviceId=", serviceId, 170 "&", SESSIONID_KEY, "=", sessionId ); 171 response.sendRedirect( nextpage ); 172 } else { 173 gotoErrorPage( request, response, Messages.getMessage( "INCORRECT_LOGIN" ), 174 Messages.getMessage( "MESSAGE_GOTO_MAIN" ), 175 JSPagesReference.getString( "OWSWatch.login" ) ); 176 } 177 } catch ( Exception e ) { 178 String errorMsg = StringTools.concat( 100, Messages.getMessage( "ERROR_LOGIN" ), "</br>", 179 e.getLocalizedMessage() ); 180 gotoErrorPage( request, response, errorMsg, Messages.getMessage( "MESSAGE_GOTO_MAIN" ), 181 JSPagesReference.getString( "OWSWatch.login" ) ); 182 return false; 183 } 184 return true; 185 } 186 187 /** 188 * forwards the Response to the error page 189 * 190 * @param request 191 * @param response 192 * @param error 193 * @param urlText 194 * @param url 195 */ 196 private void gotoErrorPage( HttpServletRequest request, HttpServletResponse response, String error, String urlText, 197 String url ) { 198 199 LOG.logError( error ); 200 HttpSession session = request.getSession( true ); 201 202 session.setAttribute( "message", StringTools.replace( error, "\n", "<br/>", true ) ); 203 if ( error == null ) { 204 error = "An unknown error has occured"; 205 } 206 if ( urlText == null ) { 207 urlText = ""; 208 } 209 session.setAttribute( "URLText", urlText ); 210 if ( url == null ) { 211 url = ""; 212 } 213 session.setAttribute( "URLAdd", url ); 214 try { 215 String nextpage = JSPagesReference.getString( "OWSWatch.error" ); 216 response.sendRedirect( nextpage ); 217 } catch ( Exception e ) { 218 LOG.logError( "The page could not be redirected to the error page" ); 219 } 220 } 221 222 /** 223 * sends the protocol of a serviceMonitor identified by its protIndex (got from request.getParameter()) object has 224 * as html file to the browser 225 * 226 */ 227 private boolean handleServiceProtocol( HttpServletRequest request, HttpServletResponse response ) { 228 229 if ( watcher == null || !isLoggedIn( request ) ) { 230 String serviceId = request.getParameter( "serviceId" ); 231 if ( serviceId == null ) { 232 return handleLogout( request, response ); 233 } 234 String sessionId = (String) request.getSession().getAttribute( SESSIONID_KEY ); 235 request.getSession().setAttribute( "serviceId", serviceId ); 236 if ( sessionId == null ) { 237 String next = JSPagesReference.getString( "OWSWatch.protocolLogin" ); 238 // If the user is not logged in, this is to check that the user didn't just logged 239 // in for another protocol, so that the user does not have to login everytime he 240 // clicks a protocol link 241 try { 242 response.sendRedirect( next ); 243 return true; 244 } catch ( IOException e ) { 245 gotoErrorPage( request, response, Messages.getMessage( "ERROR_PAGE_NOT_FOUND", next ), null, null ); 246 } 247 } 248 } 249 int serviceId = Integer.parseInt( request.getParameter( "serviceId" ) ); 250 251 ServiceConfiguration serviceConfiguration = watcher.getService( serviceId ); 252 if ( serviceConfiguration == null ) { 253 gotoErrorPage( request, response, Messages.getMessage( "ERROR_NULL_OBJ", "ServiceConfiguration" ), 254 Messages.getMessage( "MESSAGE_GOTO_MAIN" ), 255 JSPagesReference.getString( "OWSWatch.owswatchMonitorList" ) ); 256 return false; 257 } 258 259 String xmlURI = watcher.getServiceLogs().get( serviceConfiguration ).getProtocolURI(); 260 File xmlFile = new File( xmlURI ); 261 String xslURI = getProtocolURL().concat( JSPagesReference.getString( "OWSWatch.protocolXSLScript" ) ); 262 File xslFile = new File( xslURI ); 263 XSLTDocument sheet = new XSLTDocument(); 264 265 XMLFragment input = new XMLFragment(); 266 267 XMLFragment result = null; 268 269 try { 270 input.load( xmlFile.toURL() ); 271 sheet.load( xslFile.toURL() ); 272 result = sheet.transform( input ); 273 } catch ( Exception e ) { 274 gotoErrorPage( request, response, Messages.getMessage( "ERROR_LOADING_XML_FILE", "handleServiceProtocol()", 275 xmlFile.getAbsolutePath() ), 276 Messages.getMessage( "MESSAGE_GOTO_MAIN" ), 277 JSPagesReference.getString( "OWSWatch.owswatchMonitorList" ) ); 278 return false; 279 } 280 String s = result.getAsString(); 281 282 request.setAttribute( "TABLE", s ); 283 String idx = String.valueOf( serviceId ); 284 request.setAttribute( "newWinProtocol", idx ); 285 String next = null; 286 try { 287 next = JSPagesReference.getString( "OWSWatch.protocolJSP" ); 288 getServletConfig().getServletContext().getRequestDispatcher( next ).forward( request, response ); 289 } catch ( Exception e ) { 290 gotoErrorPage( request, response, Messages.getMessage( "ERROR_PAGE_NOT_FOUND", next ), 291 Messages.getMessage( "MESSAGE_GOTO_MAIN" ), 292 JSPagesReference.getString( "OWSWatch.owswatchMonitorList" ) ); 293 return false; 294 } 295 return true; 296 } 297 298 /** 299 * Logs the user out 300 * 301 * @return true if logout successfully, false otherwise 302 */ 303 private boolean handleLogout( HttpServletRequest request, HttpServletResponse response ) { 304 305 HttpSession session = request.getSession( true ); 306 session.setAttribute( "isLoggedin", false ); 307 session.removeAttribute( SESSIONID_KEY ); 308 309 String nextPage = JSPagesReference.getString( "OWSWatch.login" ); 310 try { 311 response.sendRedirect( nextPage ); 312 } catch ( Exception e ) { 313 gotoErrorPage( request, response, Messages.getMessage( "ERROR_PAGE_NOT_FOUND", nextPage ), null, null ); 314 return false; 315 } 316 317 return true; 318 } 319 320 /** 321 * Verifies that this user is loggedin through comparing the session ID from the request paarameter with that saved 322 * in the session 323 * 324 * @param request 325 * @return true if the user is loggedin, false otherwise 326 */ 327 protected boolean isLoggedIn( HttpServletRequest request ) { 328 HttpSession session = request.getSession( true ); 329 String requestSession = request.getParameter( SESSIONID_KEY ); 330 String sessionId = (String) session.getAttribute( SESSIONID_KEY ); 331 if ( requestSession == null || sessionId == null || !requestSession.equals( sessionId ) ) { 332 return false; 333 } 334 return true; 335 } 336 337 /** 338 * @return the Location of the protocol of this Service 339 */ 340 public String getProtocolURL() { 341 String protDirePath = factory.getProtDirPath(); 342 return protDirePath.endsWith( "/" ) ? protDirePath : protDirePath.concat( "/" ); 343 } 344 }