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    }