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.ArrayList;
043 import java.util.Iterator;
044 import java.util.List;
045 import java.util.Map;
046 import java.util.UUID;
047
048 import javax.servlet.ServletException;
049 import javax.servlet.http.HttpServlet;
050 import javax.servlet.http.HttpServletRequest;
051 import javax.servlet.http.HttpServletResponse;
052 import javax.servlet.http.HttpSession;
053
054 import org.deegree.framework.log.ILogger;
055 import org.deegree.framework.log.LoggerFactory;
056 import org.deegree.framework.util.StringTools;
057 import org.deegree.framework.xml.XMLFragment;
058 import org.deegree.framework.xml.XSLTDocument;
059 import org.deegree.portal.owswatch.Constants;
060 import org.deegree.portal.owswatch.JSPagesReference;
061 import org.deegree.portal.owswatch.Messages;
062 import org.deegree.portal.owswatch.ServiceConfiguration;
063 import org.deegree.portal.owswatch.ServiceWatcher;
064 import org.deegree.portal.owswatch.ServiceWatcherFactory;
065 import org.deegree.portal.owswatch.configs.OwsWatchConfig;
066 import org.deegree.portal.owswatch.configs.User;
067
068 /**
069 * Used to authenticate the user in order to view the Protocol file
070 *
071 * @author <a href="mailto:elmasry@lat-lon.de">Moataz Elmasry</a>
072 * @author last edited by: $Author: elmasry $
073 *
074 * @version $Revision: 1.3 $, $Date: 2008-03-07 16:31:02 $
075 */
076 public class ProtocolServlet extends HttpServlet implements Serializable {
077
078 private static final ILogger LOG = LoggerFactory.getLogger( ProtocolServlet.class );
079
080 private final String SESSIONID_KEY = Constants.SESSIONID_KEY;
081
082 private ServiceWatcher watcher = null;
083
084 private String webinfPath = null;
085
086 private String confFilePath = null;
087
088 private ServiceWatcherFactory factory = null;
089
090 private OwsWatchConfig conf = null;
091
092 /**
093 *
094 */
095 private static final long serialVersionUID = -6509717095713986594L;
096
097 /*
098 * (non-Javadoc)
099 *
100 * @see javax.servlet.GenericServlet#init()
101 */
102 @Override
103 public void init()
104 throws ServletException {
105 confFilePath = this.getServletContext().getRealPath( this.getInitParameter( "owsWatchConfiguration" ) );
106 webinfPath = this.getServletContext().getRealPath( "WEB-INF/conf/owswatch" );
107 if ( !webinfPath.endsWith( "/" ) ) {
108 webinfPath = webinfPath.concat( "/" );
109 }
110 try {
111 factory = ServiceWatcherFactory.getInstance( confFilePath, webinfPath );
112 watcher = factory.getServiceWatcherInstance();
113 conf = factory.getConf();
114 } catch ( Exception e ) {
115 LOG.logError( e.getLocalizedMessage() );
116 return;
117 }
118 }
119
120 /*
121 * (non-Javadoc)
122 *
123 * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest,
124 * javax.servlet.http.HttpServletResponse)
125 */
126 @Override
127 protected void doGet( HttpServletRequest request, HttpServletResponse response )
128 throws ServletException, IOException {
129 PerformAction( request, response );
130 }
131
132 /*
133 * (non-Javadoc)
134 *
135 * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest,
136 * javax.servlet.http.HttpServletResponse)
137 */
138 @Override
139 protected void doPost( HttpServletRequest request, HttpServletResponse response )
140 throws ServletException, IOException {
141 PerformAction( request, response );
142 }
143
144 protected void PerformAction( HttpServletRequest request, HttpServletResponse response ) {
145
146 String action = request.getParameter( "action" );
147 if ( action == null ) {
148 gotoErrorPage( request, response, "The action value is null", null, null );
149 return;
150 }
151 if ( action.equals( "loginProtocol" ) ) {
152 handleLoginProtocol( request, response );
153 } else if ( action.equals( "serviceProtocol" ) ) {
154 handleServiceProtocol( request, response );
155 } else {
156 gotoErrorPage( request, response, StringTools.concat( 100, "action: ", action,
157 " is unknown to this servlet" ), null, null );
158 }
159 }
160
161 /**
162 * Handle login for Protocol requests
163 *
164 * @param request
165 * @param response
166 */
167 private boolean handleLoginProtocol( HttpServletRequest request, HttpServletResponse response ) {
168
169 String user = request.getParameter( "username" );
170 String pwd = request.getParameter( "password" );
171 try {
172 if ( factory.getConf().isAuthenticatedUser( user, pwd ) ) {
173 HttpSession session = request.getSession( true );
174 // isLoggedin
175 String sessionId = UUID.randomUUID().toString();
176 session.setAttribute( SESSIONID_KEY, sessionId );
177 String serviceId = (String) session.getAttribute( "serviceId" );
178 String nextpage = StringTools.concat( 200, "wprotocol?action=serviceProtocol&serviceId=", serviceId,
179 "&", SESSIONID_KEY, "=", sessionId );
180 response.sendRedirect( nextpage );
181 } else {
182 gotoErrorPage( request, response, Messages.getMessage( "INCORRECT_LOGIN" ),
183 Messages.getMessage( "MESSAGE_GOTO_MAIN" ),
184 JSPagesReference.getString( "OWSWatch.login" ) );
185 }
186 } catch ( Exception e ) {
187 String errorMsg = StringTools.concat( 100, Messages.getMessage( "ERROR_LOGIN" ), "</br>",
188 e.getLocalizedMessage() );
189 gotoErrorPage( request, response, errorMsg, Messages.getMessage( "MESSAGE_GOTO_MAIN" ),
190 JSPagesReference.getString( "OWSWatch.login" ) );
191 return false;
192 }
193 return true;
194 }
195
196 /**
197 * forwards the Response to the error page
198 *
199 * @param request
200 * @param response
201 * @param error
202 * @param urlText
203 * @param url
204 */
205 private void gotoErrorPage( HttpServletRequest request, HttpServletResponse response, String error, String urlText,
206 String url ) {
207
208 LOG.logError( error );
209 HttpSession session = request.getSession( true );
210
211 session.setAttribute( "message", StringTools.replace( error, "\n", "<br/>", true ) );
212 if ( error == null ) {
213 error = "An unknown error has occured";
214 }
215 if ( urlText == null ) {
216 urlText = "";
217 }
218 session.setAttribute( "URLText", urlText );
219 if ( url == null ) {
220 url = "";
221 }
222 session.setAttribute( "URLAdd", url );
223 try {
224 String nextpage = JSPagesReference.getString( "OWSWatch.error" );
225 response.sendRedirect( nextpage );
226 } catch ( Exception e ) {
227 LOG.logError( "The page could not be redirected to the error page" );
228 }
229 }
230
231 /**
232 * sends the protocol of a serviceMonitor identified by its protIndex (got from request.getParameter()) object has
233 * as html file to the browser
234 *
235 */
236 private boolean handleServiceProtocol( HttpServletRequest request, HttpServletResponse response ) {
237
238 if ( watcher == null || !isLoggedIn( request ) ) {
239 String serviceId = request.getParameter( "serviceId" );
240 if ( serviceId == null ) {
241 return handleLogout( request, response );
242 }
243 String sessionId = (String) request.getSession().getAttribute( SESSIONID_KEY );
244 request.getSession().setAttribute( "serviceId", serviceId );
245 if ( sessionId == null ) {
246 String next = JSPagesReference.getString( "OWSWatch.protocolLogin" );
247 // If the user is not logged in, this is to check that the user didn't just logged
248 // in for another protocol, so that the user does not have to login everytime he
249 // clicks a protocol link
250 try {
251 response.sendRedirect( next );
252 return true;
253 } catch ( IOException e ) {
254 gotoErrorPage( request, response, Messages.getMessage( "ERROR_PAGE_NOT_FOUND", next ), null, null );
255 }
256 }
257 }
258 int serviceId = Integer.parseInt( request.getParameter( "serviceId" ) );
259
260 ServiceConfiguration serviceConfiguration = watcher.getService( serviceId );
261 if ( serviceConfiguration == null ) {
262 gotoErrorPage( request, response, Messages.getMessage( "ERROR_NULL_OBJ", "ServiceConfiguration" ),
263 Messages.getMessage( "MESSAGE_GOTO_MAIN" ),
264 JSPagesReference.getString( "OWSWatch.owswatchMonitorList" ) );
265 return false;
266 }
267
268 String xmlURI = watcher.getServiceLogs().get( serviceConfiguration ).getProtocolURI();
269 File xmlFile = new File( xmlURI );
270 String xslURI = getProtocolURL().concat( JSPagesReference.getString( "OWSWatch.protocolXSLScript" ) );
271 File xslFile = new File( xslURI );
272 XSLTDocument sheet = new XSLTDocument();
273
274 XMLFragment input = new XMLFragment();
275
276 XMLFragment result = null;
277
278 try {
279 input.load( xmlFile.toURL() );
280 sheet.load( xslFile.toURL() );
281 result = sheet.transform( input );
282 } catch ( Exception e ) {
283 gotoErrorPage( request, response, Messages.getMessage( "ERROR_LOADING_XML_FILE", "handleServiceProtocol()",
284 xmlFile.getAbsolutePath() ),
285 Messages.getMessage( "MESSAGE_GOTO_MAIN" ),
286 JSPagesReference.getString( "OWSWatch.owswatchMonitorList" ) );
287 return false;
288 }
289 String s = result.getAsString();
290
291 request.setAttribute( "TABLE", s );
292 String idx = String.valueOf( serviceId );
293 request.setAttribute( "newWinProtocol", idx );
294 String next = null;
295 try {
296 next = JSPagesReference.getString( "OWSWatch.protocolJSP" );
297 getServletConfig().getServletContext().getRequestDispatcher( next ).forward( request, response );
298 } catch ( Exception e ) {
299 gotoErrorPage( request, response, Messages.getMessage( "ERROR_PAGE_NOT_FOUND", next ),
300 Messages.getMessage( "MESSAGE_GOTO_MAIN" ),
301 JSPagesReference.getString( "OWSWatch.owswatchMonitorList" ) );
302 return false;
303 }
304 return true;
305 }
306
307 /**
308 * Logs the user out
309 *
310 * @return true if logout successfully, false otherwise
311 */
312 private boolean handleLogout( HttpServletRequest request, HttpServletResponse response ) {
313
314 HttpSession session = request.getSession( true );
315 session.setAttribute( "isLoggedin", false );
316 session.removeAttribute( SESSIONID_KEY );
317
318 String nextPage = JSPagesReference.getString( "OWSWatch.login" );
319 try {
320 response.sendRedirect( nextPage );
321 } catch ( Exception e ) {
322 gotoErrorPage( request, response, Messages.getMessage( "ERROR_PAGE_NOT_FOUND", nextPage ), null, null );
323 return false;
324 }
325
326 return true;
327 }
328
329 /**
330 * Verifies that this user is loggedin through comparing the session ID from the request paarameter with that saved
331 * in the session
332 *
333 * @param request
334 * @return true if the user is loggedin, false otherwise
335 */
336 protected boolean isLoggedIn( HttpServletRequest request ) {
337 HttpSession session = request.getSession( true );
338 String requestSession = request.getParameter( SESSIONID_KEY );
339 String sessionId = (String) session.getAttribute( SESSIONID_KEY );
340 if ( requestSession == null || sessionId == null || !requestSession.equals( sessionId ) ) {
341 return false;
342 }
343 return true;
344 }
345
346 /**
347 * @return the Location of the protocol of this Service
348 */
349 public String getProtocolURL() {
350 String protDirePath = factory.getProtDirPath();
351 return protDirePath.endsWith( "/" ) ? protDirePath : protDirePath.concat( "/" );
352 }
353 }