User: jules_gosnell Date: 02/05/28 15:25:36 Modified: jetty/src/main/org/mortbay/jetty/servlet Tag: Branch_3_0 AbstractSessionManager.java Dispatcher.java ServletHandler.java ServletHolder.java ServletHttpRequest.java ServletHttpResponse.java ServletSSL.java WebApplicationContext.java Log: merge from HEAD Revision Changes Path No revision No revision 1.6.2.1 +46 -33 contrib/jetty/src/main/org/mortbay/jetty/servlet/AbstractSessionManager.java Index: AbstractSessionManager.java =================================================================== RCS file: /cvsroot/jboss/contrib/jetty/src/main/org/mortbay/jetty/servlet/AbstractSessionManager.java,v retrieving revision 1.6 retrieving revision 1.6.2.1 diff -u -r1.6 -r1.6.2.1 --- AbstractSessionManager.java 30 Mar 2002 02:22:56 -0000 1.6 +++ AbstractSessionManager.java 28 May 2002 22:25:36 -0000 1.6.2.1 @@ -1,6 +1,6 @@ // =========================================================================== // Copyright (c) 1996 Mort Bay Consulting Pty. Ltd. All rights reserved. -// $Id: AbstractSessionManager.java,v 1.6 2002/03/30 02:22:56 olegnitz Exp $ +// $Id: AbstractSessionManager.java,v 1.6.2.1 2002/05/28 22:25:36 jules_gosnell Exp $ // --------------------------------------------------------------------------- package org.mortbay.jetty.servlet; @@ -40,7 +40,7 @@ * to return a specialized version of the Session inner class that * provides an attribute Map. * - * @version $Id: AbstractSessionManager.java,v 1.6 2002/03/30 02:22:56 olegnitz Exp $ + * @version $Id: AbstractSessionManager.java,v 1.6.2.1 2002/05/28 22:25:36 jules_gosnell Exp $ * @author Greg Wilkins (gregw) */ public abstract class AbstractSessionManager implements SessionManager @@ -237,48 +237,61 @@ */ private void scavenge() { - long now = System.currentTimeMillis(); - - // Since Hashtable enumeration is not safe over deletes, - // we build a list of stale sessions, then go back and invalidate them - LazyList stale=null; - - // For each session + Thread thread = Thread.currentThread(); + ClassLoader old_loader = thread.getContextClassLoader(); try { - for (Iterator i = _sessions.values().iterator(); i.hasNext(); ) + ClassLoader loader = _handler.getClassLoader(); + if (loader!=null) + thread.setContextClassLoader(loader); + + long now = System.currentTimeMillis(); + + // Since Hashtable enumeration is not safe over deletes, + // we build a list of stale sessions, then go back and invalidate them + LazyList stale=null; + + // For each session + try { - Session session = (Session)i.next(); - long idleTime = session._maxIdleMs; - if (idleTime > 0 && session._accessed + idleTime < now) { - // Found a stale session, add it to the list - stale=LazyList.add(stale,session); + for (Iterator i = _sessions.values().iterator(); i.hasNext(); ) + { + Session session = (Session)i.next(); + long idleTime = session._maxIdleMs; + if (idleTime > 0 && session._accessed + idleTime < now) { + // Found a stale session, add it to the list + stale=LazyList.add(stale,session); + } } } - } - catch(ConcurrentModificationException e) - { - Code.ignore(e); - // Oops something changed while we were looking. - // Lock the context and try again. - // Set our priority high while we have the sessions locked - int oldPriority = Thread.currentThread().getPriority(); - Thread.currentThread().setPriority(Thread.MAX_PRIORITY); - try + catch(ConcurrentModificationException e) { - synchronized(this) + Code.ignore(e); + // Oops something changed while we were looking. + // Lock the context and try again. + // Set our priority high while we have the sessions locked + int oldPriority = Thread.currentThread().getPriority(); + Thread.currentThread().setPriority(Thread.MAX_PRIORITY); + try { - stale=null; - scavenge(); + synchronized(this) + { + stale=null; + scavenge(); + } } + finally {Thread.currentThread().setPriority(oldPriority);} } - finally {Thread.currentThread().setPriority(oldPriority);} - } - // Remove the stale sessions - for (int i = LazyList.size(stale); i-->0;) + // Remove the stale sessions + for (int i = LazyList.size(stale); i-->0;) + { + ((Session)LazyList.get(stale,i)).invalidate(); + } + } + finally { - ((Session)LazyList.get(stale,i)).invalidate(); + thread.setContextClassLoader(old_loader); } } 1.7.2.1 +21 -12 contrib/jetty/src/main/org/mortbay/jetty/servlet/Dispatcher.java Index: Dispatcher.java =================================================================== RCS file: /cvsroot/jboss/contrib/jetty/src/main/org/mortbay/jetty/servlet/Dispatcher.java,v retrieving revision 1.7 retrieving revision 1.7.2.1 diff -u -r1.7 -r1.7.2.1 --- Dispatcher.java 30 Mar 2002 02:22:56 -0000 1.7 +++ Dispatcher.java 28 May 2002 22:25:36 -0000 1.7.2.1 @@ -1,6 +1,6 @@ // =========================================================================== // Copyright (c) 1996 Mort Bay Consulting Pty. Ltd. All rights reserved. -// $Id: Dispatcher.java,v 1.7 2002/03/30 02:22:56 olegnitz Exp $ +// $Id: Dispatcher.java,v 1.7.2.1 2002/05/28 22:25:36 jules_gosnell Exp $ // --------------------------------------------------------------------------- package org.mortbay.jetty.servlet; @@ -48,7 +48,7 @@ /* ------------------------------------------------------------ */ /** Servlet RequestDispatcher. * - * @version $Id: Dispatcher.java,v 1.7 2002/03/30 02:22:56 olegnitz Exp $ + * @version $Id: Dispatcher.java,v 1.7.2.1 2002/05/28 22:25:36 jules_gosnell Exp $ * @author Greg Wilkins (gregw) */ public class Dispatcher implements RequestDispatcher @@ -237,18 +237,14 @@ // merge query string String oldQ=httpServletRequest.getQueryString(); - if (oldQ!=null && oldQ.length()>0 && - parameters!=null) + if (oldQ!=null && oldQ.length()>0 && parameters!=null) { UrlEncoded encoded = new UrlEncoded(oldQ); - Iterator iter = parameters.entrySet().iterator(); - while(iter.hasNext()) - { - Map.Entry entry = (Map.Entry)iter.next(); - encoded.put(entry.getKey(),entry.getValue()); - } + encoded.putAll(parameters); query=encoded.encode(); } + else + query=oldQ; // Adjust servlet paths servletHttpRequest.setServletHandler(_servletHandler); @@ -257,12 +253,16 @@ request.setPathInfo(PathMap.pathInfo(_pathSpec,_path)); request.setQueryString(query); _holder.handle(request,response); + + if (forward) { response.flushBuffer(); response.close(); servletHttpResponse.setOutputState(ServletHttpResponse.DISABLED); } + else if (response.isFlushNeeded()) + response.flushBuffer(); } } finally @@ -503,6 +503,7 @@ private boolean _locked; private ServletOutputStream _out=null; private PrintWriter _writer=null; + private boolean _flushNeeded=false; /* ------------------------------------------------------------ */ DispatcherResponse(HttpServletResponse response) @@ -534,7 +535,8 @@ try {_out=super.getOutputStream();} catch(IllegalStateException e) { - if (Code.debug()) Code.warning(e); + Code.ignore(e); + _flushNeeded=true; _out=new ServletOut(new WriterOutputStream(super.getWriter())); } } @@ -554,12 +556,19 @@ try{_writer=super.getWriter();} catch(IllegalStateException e) { - Code.warning(e); + if (Code.debug()) Code.warning(e); + _flushNeeded=true; _writer = new ServletWriter(super.getOutputStream(), getCharacterEncoding()); } } return _writer; + } + + /* ------------------------------------------------------------ */ + boolean isFlushNeeded() + { + return _flushNeeded; } /* ------------------------------------------------------------ */ 1.7.2.1 +44 -25 contrib/jetty/src/main/org/mortbay/jetty/servlet/ServletHandler.java Index: ServletHandler.java =================================================================== RCS file: /cvsroot/jboss/contrib/jetty/src/main/org/mortbay/jetty/servlet/ServletHandler.java,v retrieving revision 1.7 retrieving revision 1.7.2.1 diff -u -r1.7 -r1.7.2.1 --- ServletHandler.java 30 Mar 2002 02:22:56 -0000 1.7 +++ ServletHandler.java 28 May 2002 22:25:36 -0000 1.7.2.1 @@ -1,6 +1,6 @@ // =========================================================================== // Copyright (c) 1996 Mort Bay Consulting Pty. Ltd. All rights reserved. -// $Id: ServletHandler.java,v 1.7 2002/03/30 02:22:56 olegnitz Exp $ +// $Id: ServletHandler.java,v 1.7.2.1 2002/05/28 22:25:36 jules_gosnell Exp $ // --------------------------------------------------------------------------- package org.mortbay.jetty.servlet; @@ -27,6 +27,7 @@ import javax.servlet.Servlet; import javax.servlet.ServletContext; import javax.servlet.ServletException; +import javax.servlet.ServletResponse; import javax.servlet.UnavailableException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -70,7 +71,7 @@ * initialized, then a HashSessionManager with a standard * java.util.Random generator is created. * - * @version $Id: ServletHandler.java,v 1.7 2002/03/30 02:22:56 olegnitz Exp $ + * @version $Id: ServletHandler.java,v 1.7.2.1 2002/05/28 22:25:36 jules_gosnell Exp $ * @author Greg Wilkins */ public class ServletHandler @@ -97,6 +98,8 @@ private LogSink _logSink; private SessionManager _sessionManager; private boolean _autoInitializeServlets=true; + private String _formLoginPage; + private String _formErrorPage; /* ------------------------------------------------------------ */ /** Constructor. @@ -121,6 +124,14 @@ } /* ------------------------------------------------------------ */ + public void formAuthInit(String formLoginPage, + String formErrorPage) + { + _formLoginPage=formLoginPage; + _formErrorPage=formErrorPage; + } + + /* ------------------------------------------------------------ */ public void setSessionManager(SessionManager sm) { _sessionManager=sm; @@ -592,13 +603,13 @@ if (holder!=null) { // service request + ServletResponse wrapper=response.getWrapper(); holder.handle(request.getWrapper(),response.getWrapper()); + response.flushBuffer(); // reset output response.setOutputState(ServletHttpResponse.NO_OUT); Code.debug("Handled by ",holder); - if (!httpResponse.isCommitted() && response.isWrapped()) - response.getWrapper().flushBuffer(); if (!httpResponse.isCommitted()) httpResponse.commit(); } @@ -752,15 +763,21 @@ /* ------------------------------------------------------------ */ + public String getAuthMethod() + { + return _formErrorPage!=null?"FORM":"BASIC"; + } + + /* ------------------------------------------------------------ */ /** Perform form authentication. * Called from SecurityHandler. - * @return true if authenticated. + * @return UserPrincipal if authenticated else null. */ - public boolean formAuthenticated(SecurityHandler shandler, - String pathInContext, - String pathParams, - HttpRequest httpRequest, - HttpResponse httpResponse) + public UserPrincipal authenticated(UserRealm realm, + String pathInContext, + String pathParams, + HttpRequest httpRequest, + HttpResponse httpResponse) throws IOException { HttpServletRequest request = getHttpServletRequest(pathInContext, @@ -771,7 +788,7 @@ // Handle paths String uri = pathInContext; - + // Setup session HttpSession session=request.getSession(true); @@ -782,19 +799,18 @@ String username = request.getParameter(__J_USERNAME); String password = request.getParameter(__J_PASSWORD); - UserPrincipal user = - shandler.getUserRealm().getUser(username); - if (user!=null && user.authenticate(password,httpRequest)) + UserPrincipal user = realm.authenticate(username,password,httpRequest); + if (user!=null) { Code.debug("Form authentication OK for ",username); httpRequest.setAttribute(HttpRequest.__AuthType,"FORM"); httpRequest.setAttribute(HttpRequest.__AuthUser,username); - httpRequest.setAttribute(UserPrincipal.__ATTR,user); + httpRequest.setUserPrincipal(user); session.setAttribute(__J_AUTHENTICATED,user); String nuri=(String)session.getAttribute(__J_URI); if (nuri==null) response.sendRedirect(URI.addPaths(request.getContextPath(), - shandler.getErrorPage())); + _formErrorPage)); else response.sendRedirect(nuri); } @@ -802,11 +818,11 @@ { Code.debug("Form authentication FAILED for ",username); response.sendRedirect(URI.addPaths(request.getContextPath(), - shandler.getErrorPage())); + _formErrorPage)); } // Security check is always false, only true after final redirection. - return false; + return null; } // Check if the session is already authenticated. @@ -818,18 +834,23 @@ Code.debug("FORM Authenticated for ",user.getName()); httpRequest.setAttribute(HttpRequest.__AuthType,"FORM"); httpRequest.setAttribute(HttpRequest.__AuthUser,user.getName()); - httpRequest.setAttribute(UserPrincipal.__ATTR,user); - return true; + httpRequest.setUserPrincipal(user); + return user; } } + // Don't authenticate authform or errorpage + if (pathInContext!=null && + pathInContext.equals(_formErrorPage) || pathInContext.equals(_formLoginPage)) + return null; + // redirect to login page if (httpRequest.getQuery()!=null) uri+="?"+httpRequest.getQuery(); session.setAttribute(__J_URI, URI.addPaths(request.getContextPath(),uri)); response.sendRedirect(URI.addPaths(request.getContextPath(), - shandler.getLoginPage())); - return false; + _formLoginPage)); + return null; } @@ -1066,9 +1087,7 @@ Resource resource = baseResource.addPath(path); File file = resource.getFile(); - return (file==null) - ?"null" - :(file.getAbsolutePath()); + return (file==null)?null:(file.getAbsolutePath()); } catch(IOException e) { 1.7.2.1 +57 -5 contrib/jetty/src/main/org/mortbay/jetty/servlet/ServletHolder.java Index: ServletHolder.java =================================================================== RCS file: /cvsroot/jboss/contrib/jetty/src/main/org/mortbay/jetty/servlet/ServletHolder.java,v retrieving revision 1.7 retrieving revision 1.7.2.1 diff -u -r1.7 -r1.7.2.1 --- ServletHolder.java 30 Mar 2002 02:22:56 -0000 1.7 +++ ServletHolder.java 28 May 2002 22:25:36 -0000 1.7.2.1 @@ -1,6 +1,6 @@ // =========================================================================== // Copyright (c) 1996 Mort Bay Consulting Pty. Ltd. All rights reserved. -// $Id: ServletHolder.java,v 1.7 2002/03/30 02:22:56 olegnitz Exp $ +// $Id: ServletHolder.java,v 1.7.2.1 2002/05/28 22:25:36 jules_gosnell Exp $ // --------------------------------------------------------------------------- package org.mortbay.jetty.servlet; @@ -18,9 +18,13 @@ import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; +import javax.servlet.UnavailableException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.servlet.UnavailableException; +import org.mortbay.http.HttpRequest; +import org.mortbay.http.UserPrincipal; +import org.mortbay.http.UserRealm; +import org.mortbay.http.handler.SecurityHandler; import org.mortbay.util.Code; import org.mortbay.util.URI; @@ -32,7 +36,7 @@ * This class will organise the loading of the servlet when needed or * requested. * - * @version $Id: ServletHolder.java,v 1.7 2002/03/30 02:22:56 olegnitz Exp $ + * @version $Id: ServletHolder.java,v 1.7.2.1 2002/05/28 22:25:36 jules_gosnell Exp $ * @author Greg Wilkins */ public class ServletHolder extends Holder @@ -50,6 +54,8 @@ private String _path; private long _unavailable; private UnavailableException _unavailableEx; + private String _run_as; + private UserRealm _realm; /* ---------------------------------------------------------------- */ /** Constructor. @@ -171,6 +177,22 @@ String link=(String)_roleMap.get(name); return (link==null)?name:link; } + + /* ------------------------------------------------------------ */ + /** + * @param role Role name that is added to UserPrincipal when this servlet + * is called. + */ + public void setRunAs(String role) + { + _run_as=role; + } + + /* ------------------------------------------------------------ */ + public String getRunAs() + { + return _run_as; + } /* ------------------------------------------------------------ */ public void start() @@ -213,7 +235,17 @@ else throw new ServletException(e); } - } + } + + if (_run_as!=null) + { + SecurityHandler security_handler = (SecurityHandler) + _servletHandler.getHttpContext(). + getHttpHandler(SecurityHandler.class); + + if (security_handler!=null) + _realm=security_handler.getUserRealm(); + } } /* ------------------------------------------------------------ */ @@ -313,6 +345,8 @@ // Service the request boolean servlet_error=true; + UserPrincipal user=null; + HttpRequest http_request=null; try { // Handle aliased path @@ -323,8 +357,18 @@ request.setAttribute("javax.servlet.include.servlet_path",_path); } + // Handle run as + if (_run_as!=null && _realm!=null) + { + ServletHttpRequest servletHttpRequest= + ServletHttpRequest.unwrap(request); + http_request=servletHttpRequest.getHttpRequest(); + + user=_realm.pushRole(http_request.getUserPrincipal(),_run_as); + http_request.setUserPrincipal(user); + } + servlet.service(request,response); - response.flushBuffer(); servlet_error=false; } catch(UnavailableException e) @@ -336,6 +380,14 @@ } finally { + // pop run-as role + if (_run_as!=null && _realm!=null && user!=null) + { + user=_realm.popRole(user); + http_request.setUserPrincipal(user); + } + + // Handle error params. if (servlet_error) request.setAttribute("javax.servlet.error.servlet_name",getName()); 1.7.2.1 +4 -4 contrib/jetty/src/main/org/mortbay/jetty/servlet/ServletHttpRequest.java Index: ServletHttpRequest.java =================================================================== RCS file: /cvsroot/jboss/contrib/jetty/src/main/org/mortbay/jetty/servlet/ServletHttpRequest.java,v retrieving revision 1.7 retrieving revision 1.7.2.1 diff -u -r1.7 -r1.7.2.1 --- ServletHttpRequest.java 30 Mar 2002 02:22:56 -0000 1.7 +++ ServletHttpRequest.java 28 May 2002 22:25:36 -0000 1.7.2.1 @@ -1,6 +1,6 @@ // ======================================================================== // Copyright (c) 2000 Mort Bay Consulting (Australia) Pty. Ltd. -// $Id: ServletHttpRequest.java,v 1.7 2002/03/30 02:22:56 olegnitz Exp $ +// $Id: ServletHttpRequest.java,v 1.7.2.1 2002/05/28 22:25:36 jules_gosnell Exp $ // ======================================================================== @@ -61,7 +61,7 @@ * be operated on by multiple threads, then higher level * synchronizations may be required. * - * @version $Id: ServletHttpRequest.java,v 1.7 2002/03/30 02:22:56 olegnitz Exp $ + * @version $Id: ServletHttpRequest.java,v 1.7.2.1 2002/05/28 22:25:36 jules_gosnell Exp $ * @author Greg Wilkins (gregw) */ public class ServletHttpRequest @@ -300,7 +300,7 @@ /* ------------------------------------------------------------ */ public boolean isSecure() { - return "https".equals(_httpRequest.getScheme()); + return "https".equalsIgnoreCase(_httpRequest.getScheme()); } /* ------------------------------------------------------------ */ @@ -782,7 +782,7 @@ * This facade allows the ServletHttpRequest to be treated as a * HttpMessage by HttpHandlers. */ - public class Facade implements HttpMessage + public class Facade implements HttpMessage.Request { public ServletHttpRequest getServletHttpRequest() {return ServletHttpRequest.this;} 1.7.2.1 +8 -3 contrib/jetty/src/main/org/mortbay/jetty/servlet/ServletHttpResponse.java Index: ServletHttpResponse.java =================================================================== RCS file: /cvsroot/jboss/contrib/jetty/src/main/org/mortbay/jetty/servlet/ServletHttpResponse.java,v retrieving revision 1.7 retrieving revision 1.7.2.1 diff -u -r1.7 -r1.7.2.1 --- ServletHttpResponse.java 30 Mar 2002 02:22:56 -0000 1.7 +++ ServletHttpResponse.java 28 May 2002 22:25:36 -0000 1.7.2.1 @@ -1,6 +1,6 @@ // ======================================================================== // Copyright (c) 2000 Mort Bay Consulting (Australia) Pty. Ltd. -// $Id: ServletHttpResponse.java,v 1.7 2002/03/30 02:22:56 olegnitz Exp $ +// $Id: ServletHttpResponse.java,v 1.7.2.1 2002/05/28 22:25:36 jules_gosnell Exp $ // ======================================================================== package org.mortbay.jetty.servlet; @@ -42,7 +42,7 @@ * be operated on by multiple threads, then higher level * synchronizations may be required. * - * @version $Id: ServletHttpResponse.java,v 1.7 2002/03/30 02:22:56 olegnitz Exp $ + * @version $Id: ServletHttpResponse.java,v 1.7.2.1 2002/05/28 22:25:36 jules_gosnell Exp $ * @author Greg Wilkins (gregw) */ public class ServletHttpResponse implements HttpServletResponse @@ -248,6 +248,7 @@ /* ------------------------------------------------------------ */ public void reset() { + resetBuffer(); _httpResponse.reset(); } @@ -596,7 +597,7 @@ * This facade allows the ServletHttpResponse to be treated as a * HttpMessage by HttpHandlers. */ - public class Facade implements HttpMessage + public class Facade implements HttpMessage.Response { public ServletHttpResponse getServletHttpResponse() {return ServletHttpResponse.this;} @@ -658,6 +659,10 @@ public Object setAttribute(String name, Object attribute){throw new UnsupportedOperationException();} public Enumeration getAttributeNames(){throw new UnsupportedOperationException();} public void removeAttribute(String name){throw new UnsupportedOperationException();} + public void sendError(int code) throws IOException + {((HttpServletResponse)getWrapper()).sendError(code);} + public void sendError(int code,String msg) throws IOException + {((HttpServletResponse)getWrapper()).sendError(code,msg);} } 1.7.2.1 +3 -3 contrib/jetty/src/main/org/mortbay/jetty/servlet/ServletSSL.java Index: ServletSSL.java =================================================================== RCS file: /cvsroot/jboss/contrib/jetty/src/main/org/mortbay/jetty/servlet/ServletSSL.java,v retrieving revision 1.7 retrieving revision 1.7.2.1 diff -u -r1.7 -r1.7.2.1 --- ServletSSL.java 30 Mar 2002 02:22:56 -0000 1.7 +++ ServletSSL.java 28 May 2002 22:25:36 -0000 1.7.2.1 @@ -1,6 +1,6 @@ // ======================================================================== // Copyright (c) 2001 Mort Bay Consulting (Australia) Pty. Ltd. -// $Id: ServletSSL.java,v 1.7 2002/03/30 02:22:56 olegnitz Exp $ +// $Id: ServletSSL.java,v 1.7.2.1 2002/05/28 22:25:36 jules_gosnell Exp $ // ======================================================================== package org.mortbay.jetty.servlet; @@ -12,7 +12,7 @@ * * <p> Used by the SSL listener classes. * - * @version $Id: ServletSSL.java,v 1.7 2002/03/30 02:22:56 olegnitz Exp $ + * @version $Id: ServletSSL.java,v 1.7.2.1 2002/05/28 22:25:36 jules_gosnell Exp $ * @author Brett Sealey */ public class ServletSSL @@ -53,7 +53,7 @@ return 128; else if (cipherSuite.indexOf("WITH_RC4_40_") >= 0) return 40; - else if (cipherSuite.indexOf("WITH_3DES_EDE_C_") >= 0) + else if (cipherSuite.indexOf("WITH_3DES_EDE_CBC_") >= 0) return 168; else if (cipherSuite.indexOf("WITH_IDEA_CBC_") >= 0) return 128; 1.8.2.1 +46 -17 contrib/jetty/src/main/org/mortbay/jetty/servlet/WebApplicationContext.java Index: WebApplicationContext.java =================================================================== RCS file: /cvsroot/jboss/contrib/jetty/src/main/org/mortbay/jetty/servlet/WebApplicationContext.java,v retrieving revision 1.8 retrieving revision 1.8.2.1 diff -u -r1.8 -r1.8.2.1 --- WebApplicationContext.java 3 Apr 2002 00:10:07 -0000 1.8 +++ WebApplicationContext.java 28 May 2002 22:25:36 -0000 1.8.2.1 @@ -1,6 +1,6 @@ // ======================================================================== // Copyright (c) 2000 Mort Bay Consulting (Australia) Pty. Ltd. -// $Id: WebApplicationContext.java,v 1.8 2002/04/03 00:10:07 jules_gosnell Exp $ +// $Id: WebApplicationContext.java,v 1.8.2.1 2002/05/28 22:25:36 jules_gosnell Exp $ // ======================================================================== package org.mortbay.jetty.servlet; @@ -73,7 +73,7 @@ * WEB-INF directory it is applied to the context using the * XmlConfiguration format. * - * @version $Id: WebApplicationContext.java,v 1.8 2002/04/03 00:10:07 jules_gosnell Exp $ + * @version $Id: WebApplicationContext.java,v 1.8.2.1 2002/05/28 22:25:36 jules_gosnell Exp $ * @author Greg Wilkins (gregw) */ public class WebApplicationContext extends ServletHttpContext @@ -118,11 +118,6 @@ } /* ------------------------------------------------------------ */ - private void extractWAR() - { - } - - /* ------------------------------------------------------------ */ private void resolveWebApp() throws IOException { @@ -204,6 +199,9 @@ public void start() throws Exception { + if (isStarted()) + return; + // Get parser XmlParser xmlParser=new XmlParser(); @@ -281,6 +279,11 @@ else removeHttpHandler(_notFoundHandler); addHttpHandler(_notFoundHandler); + + // Handle welcome redirection index + if (_filterHandler!=null && _resourceHandler!=null) + _resourceHandler.setWelcomeRedirectionIndex + (getHttpHandlerIndex(_filterHandler)+1); // Do the default configuration try @@ -395,9 +398,9 @@ } } -// // Don't init servlets -// if (_servletHandler!=null) -// _servletHandler.setAutoInitializeServlets(false); + // If we have servlets, don't init them yet + if (_servletHandler!=null) + _servletHandler.setAutoInitializeServlets(false); MultiException mex = new MultiException(); @@ -412,24 +415,40 @@ Log.event("PUT allowed in "+this); if (_resourceHandler.isDelAllowed()) Log.event("DEL allowed in "+this); - // Context listeners if (_contextListeners!=null && _servletHandler!=null) { + //Ensure classloader for context is used + Thread thread = Thread.currentThread(); + ClassLoader lastContextLoader=thread.getContextClassLoader(); + if (getClassLoader() != null) + thread.setContextClassLoader(getClassLoader()); + ServletContextEvent event = new ServletContextEvent(getServletContext()); for (int i=0;i<_contextListeners.size();i++) try{((ServletContextListener)_contextListeners.get(i)) .contextInitialized(event);} catch(Exception ex) { mex.add(ex); } + thread.setContextClassLoader(lastContextLoader); } - -// // Initialize servlets -// if (_servletHandler!=null) -// try{_servletHandler.initializeServlets();} -// catch(Exception ex) { mex.add(ex); } } - + + // OK to Initialize servlets now + if (_servletHandler!=null && _servletHandler.isStarted()) + { + Thread thread = Thread.currentThread(); + ClassLoader lastContextLoader=thread.getContextClassLoader(); + + try{ + if (getClassLoader()!=null) + thread.setContextClassLoader(getClassLoader()); + _servletHandler.initializeServlets(); + } + catch(Exception ex) { mex.add(ex); } + finally{thread.setContextClassLoader(lastContextLoader);} + } + mex.ifExceptionThrow(); } @@ -873,6 +892,16 @@ "=",defaultPath); _servletHandler.addServletHolder(defaultPath,holder); } + + XmlParser.Node run_as = node.get("run-as"); + if (run_as!=null) + { + String roleName=run_as.getString("role-name",false,true); + if (roleName!=null) + holder.setRunAs(roleName); + } + + } /* ------------------------------------------------------------ */ |