You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by co...@locus.apache.org on 2000/01/07 20:14:17 UTC

cvs commit: jakarta-tomcat/src/share/org/apache/tomcat/service Ajp22ConnectionHandler.java

costin      00/01/07 11:14:16

  Modified:    src/share/org/apache/tomcat/core ApplicationSession.java
                        Container.java Context.java ContextManager.java
                        HttpServletRequestFacade.java Request.java
                        RequestDispatcherImpl.java
                        ServerSessionManager.java ServletContextFacade.java
                        ServletWrapper.java
               src/share/org/apache/tomcat/server ConnectionHandler.java
               src/share/org/apache/tomcat/service
                        Ajp22ConnectionHandler.java
  Added:       src/share/org/apache/tomcat/core RequestInterceptor.java
               src/share/org/apache/tomcat/request ContextInterceptor.java
                        MapperInterceptor.java SessionInterceptor.java
  Removed:     src/share/org/apache/tomcat/core RequestMapper.java
  Log:
  Probably the most dangerous patch, a lot of deep changes.
  
  - Removed RequestMapper and most of the parsing code from ContextManager,
  use request/xxxInterceptor.
  - made all the changes to glue back everything
  - use HttpSession instead of ServerSession in Request ( so Craig can put
  it's own implementation - next patch probably will move session out )
  - few cosmetic changes for code readability
  - made some methods public - need to sync with Craig's interfaces ( after
  everything is stable again ).
  
  Notes:
  - Interceptors are hardcoded in, configuration is a bit later.
  - I moved the request parsing outside of core to make both more readable,
  and to allow other to commit new parsers without worry about core.
  Same will happen with sessions.
  - it passes the tests ( incl. watchdog), but it's certain something is
  broken :-)
  
  Revision  Changes    Path
  1.2       +7 -3      jakarta-tomcat/src/share/org/apache/tomcat/core/ApplicationSession.java
  
  Index: ApplicationSession.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ApplicationSession.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ApplicationSession.java	1999/10/09 00:29:58	1.1
  +++ ApplicationSession.java	2000/01/07 19:14:10	1.2
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ApplicationSession.java,v 1.1 1999/10/09 00:29:58 duncan Exp $
  - * $Revision: 1.1 $
  - * $Date: 1999/10/09 00:29:58 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ApplicationSession.java,v 1.2 2000/01/07 19:14:10 costin Exp $
  + * $Revision: 1.2 $
  + * $Date: 2000/01/07 19:14:10 $
    *
    * ====================================================================
    * 
  @@ -104,6 +104,10 @@
           if (this.inactiveInterval != -1) {
               this.inactiveInterval *= 60;
           }
  +    }
  +
  +    ServerSession getServerSession() {
  +	return serverSession;
       }
   
       /**
  
  
  
  1.8       +69 -72    jakarta-tomcat/src/share/org/apache/tomcat/core/Container.java
  
  Index: Container.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Container.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- Container.java	2000/01/07 18:48:34	1.7
  +++ Container.java	2000/01/07 19:14:10	1.8
  @@ -203,8 +203,7 @@
       void removeServletByName(String servletName) {
   	ServletWrapper wrapper=(ServletWrapper)servlets.get(servletName);
   	if( wrapper != null ) {
  -	    ServletWrapper wa[]={wrapper};
  -	    removeServlets( wa );
  +	    removeServlet( wrapper );
   	}
       }
   
  @@ -216,7 +215,17 @@
       }
   
       void removeJSP(String path) {
  -        removeServlets(getServletsByPath(path));
  +	Enumeration enum = servlets.keys();
  +
  +	while (enum.hasMoreElements()) {
  +	    String key = (String)enum.nextElement();
  +	    ServletWrapper sw = (ServletWrapper)servlets.get(key);
  +
  +	    if (sw.getPath() != null &&
  +	        sw.getPath().equals(path)) {
  +	        removeServlet( sw );
  +	    }
  +	}
       }
   
       public void setServletInitParams(String name, Hashtable initParams) {
  @@ -274,6 +283,22 @@
   	}
       }
   
  +    public ServletWrapper getDefaultServlet() {
  +	return defaultServlet;
  +    }
  +    
  +    public Hashtable getPathMap() {
  +	return pathMappedServlets;
  +    }
  +
  +    public Hashtable getPrefixMap() {
  +	return prefixMappedServlets;
  +    }
  +
  +    public Hashtable getExtensionMap() {
  +	return extensionMappedServlets;
  +    }
  +    
       boolean containsMapping(String mapping) {
           mapping = mapping.trim();
   
  @@ -290,38 +315,6 @@
   	pathMappedServlets.remove(mapping);
       }
   
  -    Request lookupServlet(String lookupPath) {
  -        RequestMapper requestMapper = new RequestMapper(this);
  -
  -	requestMapper.setPathMaps(pathMappedServlets);
  -	requestMapper.setPrefixMaps(prefixMappedServlets);
  -	requestMapper.setExtensionMaps(extensionMappedServlets);
  -
  -	Request lookupResult =
  -	    requestMapper.lookupServlet(lookupPath);
  -
  -        if (lookupResult == null) {
  -	    ServletWrapper wrapper = null;
  -
  -	    if (defaultServlet != null) {
  -	        wrapper = defaultServlet;
  -	    } else {
  -	        wrapper = (ServletWrapper)servlets.get(
  -		    Constants.Servlet.Default.Name);
  -	    }
  -
  -	    String servletPath = Constants.Servlet.Default.Map;
  -            String pathInfo = lookupPath;
  -
  -	    lookupResult = new Request();
  -	    lookupResult.setWrapper( wrapper );
  -	    lookupResult.setServletPath( servletPath );
  -	    lookupResult.setPathInfo( pathInfo );
  -	}
  -
  -	return lookupResult;
  -    }
  -
       Request lookupServletByName(String servletName) {
           Request lookupResult = null;
   
  @@ -336,7 +329,7 @@
           return lookupResult;
       }
   
  -    ServletWrapper getServletByName(String servletName) {
  +    public ServletWrapper getServletByName(String servletName) {
   	return (ServletWrapper)servlets.get(servletName);
       }
   
  @@ -394,46 +387,50 @@
   	servlets.put(name, wrapper);
       }
   
  -    private void removeServlets(ServletWrapper[] sw) {
  -	if (sw != null) {
  -	    for (int i = 0; i < sw.length; i++) {
  -	        if (prefixMappedServlets.contains(sw[i])) {
  -		    Enumeration enum = prefixMappedServlets.keys();
  -
  -		    while (enum.hasMoreElements()) {
  -		        String key = (String)enum.nextElement();
  -
  -			if (prefixMappedServlets.get(key).equals(sw[i])) {
  -			    prefixMappedServlets.remove(key);
  -			}
  -		    }
  +    private void removeServlet(ServletWrapper sw) {
  +	if (prefixMappedServlets.contains(sw)) {
  +	    Enumeration enum = prefixMappedServlets.keys();
  +	    
  +	    while (enum.hasMoreElements()) {
  +		String key = (String)enum.nextElement();
  +		
  +		if (prefixMappedServlets.get(key).equals(sw)) {
  +		    prefixMappedServlets.remove(key);
   		}
  -
  -		if (extensionMappedServlets.contains(sw[i])) {
  -		    Enumeration enum = extensionMappedServlets.keys();
  -
  -		    while (enum.hasMoreElements()) {
  -		        String key = (String)enum.nextElement();
  +	    }
  +	}
  +	
  +	if (extensionMappedServlets.contains(sw)) {
  +	    Enumeration enum = extensionMappedServlets.keys();
  +	    
  +	    while (enum.hasMoreElements()) {
  +		String key = (String)enum.nextElement();
   
  -			if (extensionMappedServlets.get(key).equals(sw[i])) {
  -			    extensionMappedServlets.remove(key);
  -			}
  -		    }
  +		if (extensionMappedServlets.get(key).equals(sw)) {
  +		    extensionMappedServlets.remove(key);
   		}
  -
  -		if (pathMappedServlets.contains(sw[i])) {
  -		    Enumeration enum = pathMappedServlets.keys();
  -
  -		    while (enum.hasMoreElements()) {
  -		        String key = (String)enum.nextElement();
  +	    }
  +	}
  +	
  +	if (pathMappedServlets.contains(sw)) {
  +	    Enumeration enum = pathMappedServlets.keys();
  +	    
  +	    while (enum.hasMoreElements()) {
  +		String key = (String)enum.nextElement();
   
  -			if (pathMappedServlets.get(key).equals(sw[i])) {
  -			    pathMappedServlets.remove(key);
  -			}
  -		    }
  +		if (pathMappedServlets.get(key).equals(sw)) {
  +		    pathMappedServlets.remove(key);
   		}
  -
  -	        servlets.remove(sw[i].getServletName());
  +	    }
  +	}
  +	
  +	servlets.remove(sw.getServletName());
  +    }
  +    
  +    private void removeServlets(ServletWrapper[] sw) {
  +	if (sw != null) {
  +	    for (int i = 0; i < sw.length; i++) {
  +		removeServlet( sw[i] );
   	    }
   	}
       }
  @@ -466,7 +463,7 @@
       // XXX
       // made package protected so that RequestMapper can have access
   
  -    ServletWrapper[] getServletsByPath(String path) {
  +    public ServletWrapper[] getServletsByPath(String path) {
           Vector servletWrappers = new Vector();
   	Enumeration enum = servlets.keys();
   
  
  
  
  1.13      +7 -60     jakarta-tomcat/src/share/org/apache/tomcat/core/Context.java
  
  Index: Context.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Context.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- Context.java	2000/01/07 18:48:34	1.12
  +++ Context.java	2000/01/07 19:14:10	1.13
  @@ -86,7 +86,7 @@
       private StringManager sm =
           StringManager.getManager(Constants.Package);
       private boolean initialized = false;
  -    private Server server;
  +    private ContextManager server;
       private String description = null;
       private boolean isDistributable = false;
       private String engineHeader = null;
  @@ -120,11 +120,11 @@
       private Vector destroyInterceptors = new Vector();
       private RequestSecurityProvider rsProvider =
           DefaultRequestSecurityProvider.getInstance();
  -
  +    
       public Context() {
       }
   	
  -    public Context(Server server, String path) {
  +    public Context(ContextManager server, String path) {
           this.server = server;
   	this.path = path;
   
  @@ -155,6 +155,10 @@
       public String getEngineHeader() {
           return engineHeader;
       }
  +
  +    public ContextManager getContextManager() {
  +	return server;
  +    }
       
       public String getPath() {
   	return path;
  @@ -597,63 +601,6 @@
   
       ServletContextFacade getFacade() {
           return contextFacade;
  -    }
  -
  -    public void handleRequest(Request request, Response response)
  -    throws IOException {
  -	// XXX
  -	// make sure we are init'd or throw an illegal state exception
  -
  -	request.setContext(this);
  -	request.setResponse(response);
  -	
  -	// look for session id -- cookies only right now
  -
  -	ServerSession session =
  -	    sessionManager.getServerSession(request, response, false);
  -
  -	if (session != null) {
  -	    session.accessed();
  -
  -	    ApplicationSession appSession =
  -	        session.getApplicationSession(this, false);
  -
  -	    if (appSession != null) {
  -	        appSession.accessed();
  -	    }
  -	}
  -
  -	request.setServerSession(session);  // may be null
  -
  -	// XXX XXX XXX lookupServlet should operate on the original
  -	// request, it will change when we introduce the interceptors.
  -	Request result =
  -	    container.lookupServlet(request.getLookupPath());
  -	
  -	request.setServletPath(result.getServletPath());
  -	request.setPathInfo(result.getPathInfo());
  -
  -        if (result.getResolvedServlet() != null) {
  -            request.setAttribute(Constants.Attribute.RESOLVED_SERVLET,
  -                result.getResolvedServlet());
  -        } else if (result.getMappedPath() != null) {
  -            request.setAttribute(Constants.Attribute.RESOLVED_SERVLET,
  -                result.getMappedPath());
  -        } else {
  -            request.removeAttribute(Constants.Attribute.RESOLVED_SERVLET);
  -        }
  -
  -	result.getWrapper().handleRequest(request.getFacade(),
  -            response.getFacade());
  -
  -	//ServletWrapper wrap = container.resolveServlet(request);
  -	
  -	// XXX
  -	// we want to be sure to handle any IOExceptions here
  -	// and log 'em -- also an UnavailableExceptions would be
  -	// trapped here.
  -	
  -	//wrap.handleRequest(request.getFacade(), response.getFacade());
       }
   
       private Properties getProperties(String propertyFileName) {
  
  
  
  1.5       +38 -57    jakarta-tomcat/src/share/org/apache/tomcat/core/ContextManager.java
  
  Index: ContextManager.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ContextManager.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ContextManager.java	1999/10/28 05:15:24	1.4
  +++ ContextManager.java	2000/01/07 19:14:11	1.5
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ContextManager.java,v 1.4 1999/10/28 05:15:24 costin Exp $
  - * $Revision: 1.4 $
  - * $Date: 1999/10/28 05:15:24 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ContextManager.java,v 1.5 2000/01/07 19:14:11 costin Exp $
  + * $Revision: 1.5 $
  + * $Date: 2000/01/07 19:14:11 $
    *
    * ====================================================================
    *
  @@ -66,6 +66,7 @@
   
   import org.apache.tomcat.core.*;
   import org.apache.tomcat.net.*;
  +import org.apache.tomcat.request.*;
   import org.apache.tomcat.util.*;
   import java.io.*;
   import java.net.*;
  @@ -94,7 +95,11 @@
       private StringManager sm =
           StringManager.getManager(Constants.Package);
   
  -
  +    ContextInterceptor contextInterceptor=new ContextInterceptor( this );
  +    SessionInterceptor sessionInterceptor=new SessionInterceptor();
  +    MapperInterceptor mapperInterceptor=new MapperInterceptor();
  +    
  +    
       /**
        * The default Context used to process paths not associated with
        * any other Context.
  @@ -235,49 +240,11 @@
       public Context getContext(String name) {
   	return (Context)contexts.get(name);
       }
  -
  -
  -    /**
  -     * Gets the context that is responsible for requests for a
  -     * particular path.  If no specifically assigned Context can be
  -     * identified, returns the default Context.
  -     *
  -     * @param path The path for which a Context is requested
  -     */
  -    
  -    public Context getContextByPath(String path) {
  -	String realPath = path;
  -	Context ctx = null;
  -
  -	// XXX
  -	// needs help ... this needs to be optimized out.
  -
  -        lookup:
  -	do {
  -	    ctx = (Context)contextMaps.get(path);
  -	    if (ctx == null) {
  -	        int i = path.lastIndexOf('/');
  -		if (i > -1 && path.length() > 1) {
  -		    path = path.substring(0, i);
  -		    if (path.length() == 0) {
  -		        path = "/";
  -		    }
  -		} else {
  -		    // path too short
  -		    break lookup;
  -		}
  -	    } else {
  -	    }
  -	} while (ctx == null);
  -
  -	if (ctx == null) {
  -	    ctx = defaultContext;
  -	}
   
  -	return ctx;
  +    public Context getMappedContext( String path ) {
  +	return  (Context)contextMaps.get(path);
       }
   
  -
       /**
        * Adds a new Context to the set managed by this ContextManager.
        * XXX Why is there no context name argument?
  @@ -419,25 +386,24 @@
   		return;
   	    }
   
  -	    // resolve the server that we are for
  -	    String path = rrequest.getRequestURI();
  -	    
  -	    Context ctx= this.getContextByPath(path);
  -	    
  -	    // final fix on response & request
  -	    //		rresponse.setServerHeader(server.getServerHeader());
  -	    
  -	    String ctxPath = ctx.getPath();
  -	    String pathInfo =path.substring(ctxPath.length(),
  -					    path.length());
   	    //    don't do headers if request protocol is http/0.9
   	    if (rrequest.getProtocol() == null) {
   		rresponse.setOmitHeaders(true);
   	    }
  +
  +	    // XXX Hardcoded - it will be changed in the next step.( costin )
  +
  +	    // will set the Context
  +	    contextInterceptor.handleRequest( rrequest );
  +	    // will set Session 
  +	    sessionInterceptor.handleRequest( rrequest );
   	    
  +	    // will set all other fields and ServletWrapper
  +	    mapperInterceptor.handleRequest( rrequest );
  +
   	    // do it
  -	    //		System.out.println( request + " " + rresponse );
  -	    ctx.handleRequest(rrequest, rresponse);
  +	    rrequest.getWrapper().handleRequest(rrequest.getFacade(),
  +					       rresponse.getFacade());
   	    
   	    // finish and clean up
   	    rresponse.finish();
  @@ -453,5 +419,20 @@
   	}
       }
   
  +    // XXX need to be changed to use a full sub-request model (costin)
  +    
  +    /** Will find the ServletWrapper for a servlet, assuming we already have
  +     *  the Context. This is used by Dispatcher and getResource - where the Context
  +     *  is already known.
  +     */
  +    int internalRequestParsing( Request req ) {
  +	return mapperInterceptor.handleRequest( req );
  +    }
  +    
  +    public Context getContextByPath(String path ) {
  +	// XXX XXX XXX need to create a sub-request !!!!
  +	// 
  +	return contextInterceptor.getContextByPath( path );      
  +    }
       
   }
  
  
  
  1.4       +8 -7      jakarta-tomcat/src/share/org/apache/tomcat/core/HttpServletRequestFacade.java
  
  Index: HttpServletRequestFacade.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/HttpServletRequestFacade.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- HttpServletRequestFacade.java	1999/11/08 03:58:41	1.3
  +++ HttpServletRequestFacade.java	2000/01/07 19:14:11	1.4
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/HttpServletRequestFacade.java,v 1.3 1999/11/08 03:58:41 akv Exp $
  - * $Revision: 1.3 $
  - * $Date: 1999/11/08 03:58:41 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/HttpServletRequestFacade.java,v 1.4 2000/01/07 19:14:11 costin Exp $
  + * $Revision: 1.4 $
  + * $Date: 2000/01/07 19:14:11 $
    *
    * ====================================================================
    *
  @@ -259,16 +259,17 @@
       }
   
       public HttpSession getSession() {
  -        return request.getSession();
  +        return request.getSession(true);
       }
       
       public HttpSession getSession(boolean create) {
           return request.getSession(create);
       }
   
  -    public ServerSession getServerSession(boolean create) {
  -        return request.getServerSession(create);
  -    }
  +    // XXX XXX is it used ?? (costin)
  +    //     public ServerSession getServerSession(boolean create) {
  +    //         return request.getServerSession(create);
  +    //     }
   
       public BufferedReader getReader() throws IOException {
   	if (usingStream) {
  
  
  
  1.12      +66 -35    jakarta-tomcat/src/share/org/apache/tomcat/core/Request.java
  
  Index: Request.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Request.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- Request.java	2000/01/07 18:48:34	1.11
  +++ Request.java	2000/01/07 19:14:11	1.12
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Request.java,v 1.11 2000/01/07 18:48:34 costin Exp $
  - * $Revision: 1.11 $
  - * $Date: 2000/01/07 18:48:34 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Request.java,v 1.12 2000/01/07 19:14:11 costin Exp $
  + * $Revision: 1.12 $
  + * $Date: 2000/01/07 19:14:11 $
    *
    * ====================================================================
    *
  @@ -109,7 +109,7 @@
       protected HttpServletRequestFacade requestFacade;
       protected Context context;
       protected Hashtable attributes = new Hashtable();
  -    protected ServerSession serverSession;
  +    protected HttpSession serverSession;
   
       protected boolean didReadFormData;
       protected boolean didParameters;
  @@ -121,6 +121,7 @@
       ServletWrapper wrapper = null;
       String mappedPath = null;
       String resolvedServlet = null;
  +    String resouceName=null;
   
       protected StringManager sm =
           StringManager.getManager(Constants.Package);
  @@ -208,6 +209,9 @@
   	return lookupPath;
       }
   
  +    public void setLookupPath( String l ) {
  +	lookupPath=l;
  +    }
   
       public String[] getParameterValues(String name) {
   	if(!didParameters) {
  @@ -318,14 +322,24 @@
   	this.response = response;
       }
   
  -    // Called after a Context is found, adjust all other paths.
  -    // XXX XXX XXX
  +    public Response getResponse() {
  +	return response;
  +    }
  +    
       public void setContext(Context context) {
   	this.context = context;
  +    }
  +
  +    // Called after a Context is found, adjust all other paths.
  +    // XXX XXX XXX
  +    public void updatePaths() {
   	contextPath = context.getPath();
   	String requestURI = getRequestURI();
  -	lookupPath = requestURI.substring(contextPath.length(),
  -            requestURI.length());
  +	// do not set it if it is already set or we have no
  +	// URI - the case of a sub-request generated internally
  +	if( requestURI!=null && lookupPath==null ) 
  +	    lookupPath = requestURI.substring(contextPath.length(),
  +					      requestURI.length());
   
   	// check for ? string on lookuppath
   	int qindex = lookupPath.indexOf("?");
  @@ -360,36 +374,45 @@
       }
   
   
  -    public ApplicationSession getSession() {
  -        return getSession(true);
  -    }
  +//     // XXX XXX XXX
  +//     public ServerSession getServerSession(boolean create) {
  +// 	if (context == null) {
  +// 	    System.out.println("CONTEXT WAS NEVER SET");
  +// 	    return null;
  +// 	}
  +
  +// 	if (serverSession == null && create) {
  +//             serverSession =
  +// 		ServerSessionManager.getManager()
  +// 		    .getServerSession(this, response, create);
  +//             serverSession.accessed();
  +// 	}
   
  -    // XXX XXX XXX
  -    public ServerSession getServerSession(boolean create) {
  -	if (context == null) {
  -	    System.out.println("CONTEXT WAS NEVER SET");
  -	    return null;
  -	}
  +// 	return serverSession;
  +//     }
   
  -	if (serverSession == null && create) {
  -            serverSession =
  -		ServerSessionManager.getManager()
  -		    .getServerSession(this, response, create);
  -            serverSession.accessed();
  +    public HttpSession getSession(boolean create) {
  +	if( serverSession==null ) {
  +	    if( ! create )
  +		return null;
  +	    else {
  +// 		serverSession =
  +// 		    ServerSessionManager.getManager()
  +// 		    .getServerSession(this, response, create);
  +// 		serverSession.accessed();
  +		serverSession =ServerSessionManager.getManager()
  + 		    .getSession(this, response, create);
  + 		
  +	    }
   	}
   
  +	// assert serverSession!=null
  +// 	ApplicationSession appSession = null;
  +// 	return  serverSession.getApplicationSession(context, create);
   	return serverSession;
  -    }
  -
  -    public ApplicationSession getSession(boolean create) {
  -	getServerSession(create);
  -	ApplicationSession appSession = null;
  -	if (serverSession != null) {
  -	    appSession = serverSession.getApplicationSession(context, create);
  -	}
   
  -	return appSession;
   
  +	
   	//  if (reqSessionId != null) {
   //  	    //Session session = context.getSession(reqSessionId);
   //  	    //if (session == null) {
  @@ -408,30 +431,38 @@
       }
   
       // -------------------- LookupResult 
  -    String getResolvedServlet() {
  +    public String getResolvedServlet() {
   	return resolvedServlet;
       }
   
  -    void setResolvedServlet(String rs ) {
  +    public void setResolvedServlet(String rs ) {
   	resolvedServlet=rs;
       }
   
  -    ServletWrapper getWrapper() {
  +    public ServletWrapper getWrapper() {
   	return wrapper;
       }
       
  -    void setWrapper(ServletWrapper wrapper) {
  +    public void setWrapper(ServletWrapper wrapper) {
   	this.wrapper=wrapper;
       }
   
  -    String getMappedPath() {
  +    public String getMappedPath() {
   	return mappedPath;
       }
   
  -    void setMappedPath( String m ) {
  +    public void setMappedPath( String m ) {
   	mappedPath=m;
       }
   
  +    public String getResourceName() {
  +	return resouceName;
  +    }
  +
  +    public void setResourceName( String m ) {
  +	resouceName=m;
  +    }
  +
       // -------------------- Setters
   //     public void setURI(String requestURI) {
   //         this.requestURI = requestURI;
  @@ -566,7 +597,7 @@
   	this.reqSessionId = reqSessionId;
       }
   
  -    public void setServerSession(ServerSession serverSession) {
  +    public void setSession(HttpSession serverSession) {
   	this.serverSession = serverSession;
       }
   
  
  
  
  1.5       +5 -6      jakarta-tomcat/src/share/org/apache/tomcat/core/RequestDispatcherImpl.java
  
  Index: RequestDispatcherImpl.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/RequestDispatcherImpl.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- RequestDispatcherImpl.java	2000/01/07 18:48:34	1.4
  +++ RequestDispatcherImpl.java	2000/01/07 19:14:11	1.5
  @@ -1,8 +1,4 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/RequestDispatcherImpl.java,v 1.4 2000/01/07 18:48:34 costin Exp $
  - * $Revision: 1.4 $
  - * $Date: 2000/01/07 18:48:34 $
  - *
    * ====================================================================
    *
    * The Apache Software License, Version 1.1
  @@ -252,8 +248,11 @@
   	}
   
   	this.urlPath = urlPath;
  -	this.lookupResult =
  -	    context.getContainer().lookupServlet(this.urlPath);
  +
  +	this.lookupResult = new Request();
  +	lookupResult.setLookupPath( this.urlPath );
  +	lookupResult.setContext( context );
  +	context.getContextManager().internalRequestParsing(lookupResult);
       }
   
       boolean isValid() {
  
  
  
  1.5       +23 -4     jakarta-tomcat/src/share/org/apache/tomcat/core/ServerSessionManager.java
  
  Index: ServerSessionManager.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ServerSessionManager.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ServerSessionManager.java	1999/11/01 20:50:47	1.4
  +++ ServerSessionManager.java	2000/01/07 19:14:11	1.5
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ServerSessionManager.java,v 1.4 1999/11/01 20:50:47 costin Exp $
  - * $Revision: 1.4 $
  - * $Date: 1999/11/01 20:50:47 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ServerSessionManager.java,v 1.5 2000/01/07 19:14:11 costin Exp $
  + * $Revision: 1.5 $
  + * $Date: 2000/01/07 19:14:11 $
    *
    * ====================================================================
    *
  @@ -87,7 +87,7 @@
   	manager = new ServerSessionManager();
       }
       
  -    static ServerSessionManager getManager() {
  +    public static ServerSessionManager getManager() {
   	return manager;
       }
   
  @@ -100,6 +100,25 @@
   	reaper.start();
       }
   
  +    /** Called from Request.getSession to create a new session 
  +     */
  +    public HttpSession getSession(Request request, Response response,
  +        boolean create) {
  +	ServerSession sSession=getServerSession( request, response, create);
  +	if( sSession!=null ) sSession.accessed();
  +	if( sSession ==null) return null;
  +	
  +	return sSession.getApplicationSession(request.getContext(), create);
  +    }
  +
  +    public void accessed( HttpSession session ) {
  +	ApplicationSession apS=(ApplicationSession)session;
  +	ServerSession servS=apS.getServerSession();
  +	servS.accessed();
  +	apS.accessed();
  +	
  +    }
  +    
       ServerSession getServerSession(Request request, Response response,
           boolean create) {
   	// Look for session id -- cookies only right now
  
  
  
  1.7       +8 -6      jakarta-tomcat/src/share/org/apache/tomcat/core/ServletContextFacade.java
  
  Index: ServletContextFacade.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ServletContextFacade.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- ServletContextFacade.java	2000/01/07 18:48:34	1.6
  +++ ServletContextFacade.java	2000/01/07 19:14:12	1.7
  @@ -1,8 +1,4 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ServletContextFacade.java,v 1.6 2000/01/07 18:48:34 costin Exp $
  - * $Revision: 1.6 $
  - * $Date: 2000/01/07 18:48:34 $
  - *
    * ====================================================================
    *
    * The Apache Software License, Version 1.1
  @@ -249,9 +245,15 @@
   	// XXX
   	// this could use a once over - after war perhaps
   
  +
  +	
           URL docBase = context.getDocumentBase();
  -	Request lr =
  -	    getRealContext().getContainer().lookupServlet(path);
  +
  +	Request lr = new Request();
  +	lr.setLookupPath( path );
  +	lr.setContext( getRealContext() );
  +	getRealContext().getContextManager().internalRequestParsing(lr);
  +
   	String mappedPath = path;
   
   	if (lr != null &&
  
  
  
  1.6       +10 -9     jakarta-tomcat/src/share/org/apache/tomcat/core/ServletWrapper.java
  
  Index: ServletWrapper.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ServletWrapper.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- ServletWrapper.java	1999/11/01 20:50:48	1.5
  +++ ServletWrapper.java	2000/01/07 19:14:12	1.6
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ServletWrapper.java,v 1.5 1999/11/01 20:50:48 costin Exp $
  - * $Revision: 1.5 $
  - * $Date: 1999/11/01 20:50:48 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ServletWrapper.java,v 1.6 2000/01/07 19:14:12 costin Exp $
  + * $Revision: 1.6 $
  + * $Date: 2000/01/07 19:14:12 $
    *
    * ====================================================================
    *
  @@ -83,7 +83,7 @@
   // WARNING: Some of the APIs in this class are used by J2EE. 
   // Please talk to harishp@eng.sun.com before making any changes.
   //
  -class ServletWrapper {
  +public class ServletWrapper {
   
       private StringManager sm =
           StringManager.getManager(Constants.Package);
  @@ -110,7 +110,7 @@
   	isReloadable = reloadable;
       }
   
  -    String getServletName() {
  +    public String getServletName() {
           return config.getServletName();
       }
   
  @@ -126,11 +126,11 @@
           this.description = description;
       }
   
  -    String getPath() {
  +    public String getPath() {
           return this.path;
       }
   
  -    void setPath(String path) {
  +    public void setPath(String path) {
           this.path = path;
       }
   
  @@ -141,11 +141,11 @@
   	config.setServletClassName(this.servletClassFile.getName());
       }
   
  -    String getServletClass() {
  +    public String getServletClass() {
           return this.servletClassName;
       }
   
  -    void setServletClass(String servletClassName) {
  +    public void setServletClass(String servletClassName) {
           this.servletClassName = servletClassName;
   
   	config.setServletClassName(servletClassName);
  @@ -233,6 +233,7 @@
   				 Constants.JSP.Directive.Compile.Value );
   
               request.setContext(getContext());
  +	    request.updatePaths();
               request.getSession(true);
   
               RequestDispatcher rd =
  
  
  
  1.1                  jakarta-tomcat/src/share/org/apache/tomcat/core/RequestInterceptor.java
  
  Index: RequestInterceptor.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/RequestInterceptor.java,v 1.1 2000/01/07 19:14:11 costin Exp $
   * $Revision: 1.1 $
   * $Date: 2000/01/07 19:14:11 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:  
   *       "This product includes software developed by the 
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * [Additional notices, if required by prior licensing conditions]
   *
   */ 
  
  
  package org.apache.tomcat.core;
  import javax.servlet.Servlet;
  
  /**
   * For request processing - before calling service() ( or any LifecycleInterceptors )
   *
   * @author costin@dnt.ro
   */
  public interface RequestInterceptor {
      public static final int OK=0;
      
      public int handleRequest(Request request);
  }
  
  
  
  1.1                  jakarta-tomcat/src/share/org/apache/tomcat/request/ContextInterceptor.java
  
  Index: ContextInterceptor.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/request/ContextInterceptor.java,v 1.1 2000/01/07 19:14:15 costin Exp $
   * $Revision: 1.1 $
   * $Date: 2000/01/07 19:14:15 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:  
   *       "This product includes software developed by the 
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * [Additional notices, if required by prior licensing conditions]
   *
   */ 
  
  
  package org.apache.tomcat.request;
  
  import org.apache.tomcat.core.*;
  import org.apache.tomcat.net.*;
  import org.apache.tomcat.util.*;
  import java.io.*;
  import java.net.*;
  import java.util.*;
  
  
  public class ContextInterceptor implements RequestInterceptor {
      ContextManager cm;
      
      public ContextInterceptor(ContextManager cm) {
  	this.cm=cm;
      }
  
      public int handleRequest( Request rrequest ) {
  	// resolve the server that we are for
  	String path = rrequest.getRequestURI();
  	
  	Context ctx= this.getContextByPath(path);
  	
  	// final fix on response & request
  	//		rresponse.setServerHeader(server.getServerHeader());
  	
  	String ctxPath = ctx.getPath();
  	String pathInfo =path.substring(ctxPath.length(),
  					    path.length());
  	rrequest.setContext(ctx);
  	rrequest.updatePaths();
  	return OK;
      }
  
  
      // XXX XXX XXX need to fix this - it is used by getContext(String path) (costin)
      
      /**
       * Gets the context that is responsible for requests for a
       * particular path.  If no specifically assigned Context can be
       * identified, returns the default Context.
       *
       * @param path The path for which a Context is requested
       */
      public Context getContextByPath(String path) {
  	String realPath = path;
  	Context ctx = null;
  
  	// XXX
  	// needs help ... this needs to be optimized out.
  
          lookup:
  	do {
  	    ctx = cm.getMappedContext(path);
  	    if (ctx == null) {
  	        int i = path.lastIndexOf('/');
  		if (i > -1 && path.length() > 1) {
  		    path = path.substring(0, i);
  		    if (path.length() == 0) {
  		        path = "/";
  		    }
  		} else {
  		    // path too short
  		    break lookup;
  		}
  	    } else {
  	    }
  	} while (ctx == null);
  
  	if (ctx == null) {
  	    ctx = cm.getDefaultContext();
  	}
  
  	return ctx;
      }
  
      
  }
  
  
  
  1.1                  jakarta-tomcat/src/share/org/apache/tomcat/request/MapperInterceptor.java
  
  Index: MapperInterceptor.java
  ===================================================================
  /*
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:  
   *       "This product includes software developed by the 
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * [Additional notices, if required by prior licensing conditions]
   *
   */ 
  
  
  package org.apache.tomcat.request;
  
  import org.apache.tomcat.core.*;
  import org.apache.tomcat.core.Constants;
  import org.apache.tomcat.util.*;
  import java.util.Hashtable;
  
  // Based on RequestMapper.
  
  /**
   * Process the URI, find the Wrapper ( the Servlet that will handle the request) 
   * and set all Paths.
   * 
   * This is the original parser from Tomcat - please don't change it, but
   * create new interceptors ( we need to split it in more specialized
   * modules - and better parsers )
   *
   */
  public class MapperInterceptor  implements  RequestInterceptor {
  
      public MapperInterceptor() {
      }
  
      // no configuration 
      
      public int handleRequest(Request req) {
  	Container container=req.getContext().getContainer();
  	String path=req.getLookupPath();
          ServletWrapper wrapper = null;
  
  	wrapper = getMatch(container, path, req);
  
  	if (wrapper == null) {
  	    wrapper = container.getDefaultServlet();
  	    if (wrapper == null) {
  	        wrapper = container.getServletByName(Constants.Servlet.Default.Name);
  	    }
  
  	    String servletPath = Constants.Servlet.Default.Map;
              String pathInfo = path;
  
  	    req.setWrapper( wrapper );
  	    req.setServletPath( servletPath );
  	    req.setPathInfo( pathInfo );
  	} else {
  	    getMapPath(wrapper, req);
  	    String resolvedServlet = getResolvedServlet(container, req.getMappedPath());
  	    
  	    req.setWrapper( wrapper );
  	    req.setResolvedServlet( resolvedServlet );
  	}
  	
  	if (req.getResolvedServlet() != null) {
  	    req.setAttribute(Constants.Attribute.RESOLVED_SERVLET,
  				 req.getResolvedServlet());
  	} else if (req.getMappedPath() != null) {
  	    req.setAttribute(Constants.Attribute.RESOLVED_SERVLET,
  				 req.getMappedPath());
  	} else {
  	    req.removeAttribute(Constants.Attribute.RESOLVED_SERVLET);
  	}
  
  	return OK;
      }
  
      private ServletWrapper getMatch(Container container, String path, Request req) {
          ServletWrapper wrapper = null;
  	// try an exact match
  
          wrapper = getPathMatch(container, path, req);
  
  	// try a prefix match
  
  	if (wrapper == null) {
  	    wrapper = getPrefixMatch(container, path, req);
  	}
  
  	// try an extension match
  
  	if (wrapper == null) {
  	    wrapper = getExtensionMatch(container, path, req);
  	}
  
  	// lookup real servlet if what we're actually
  	// dealing with a jsp file
  
          wrapper = getServletForJsp(container, wrapper, req);
  
  	return wrapper;
      }
  
      private ServletWrapper getPathMatch(Container container, String path, Request req) {
          ServletWrapper wrapper = null;
  
  	wrapper = (ServletWrapper)container.getPathMap().get(path);
  
  	if (wrapper != null) {
  	    req.setServletPath( path );
  	    // this.servletPath = path;
  	}
  
          return wrapper;
      }
  
      private ServletWrapper getPrefixMatch(Container container, String path, Request req) {
  	ServletWrapper wrapper = null;
          String s = path;
  
  	while (s.length() > 0) {
  	    String suffix = (s.endsWith("/")) ? "*" : "/*";
   
  	    wrapper = (ServletWrapper)container.getPrefixMap().get(s + suffix);
  
  	    if (wrapper != null) {
  	        if (s.endsWith("/")) {
                      String t = s.substring(0, s.length() - 1);
  
  		    req.setServletPath( (t.trim().length() == 0) ? null : t );
  		    t = s.substring(s.length() - 1);
  		    req.setPathInfo(  (t.trim().length() == 0) ? null : t);
  		} else {
                      String t = s;
  
  		    req.setServletPath(  (t.trim().length() == 0) ? null : t);
                      t = path.substring(s.length(), path.length());
  		    req.setPathInfo((t.trim().length() == 0) ? null : t);
  		}
  
  		s = "";
  	    } else {
  	        int i = s.lastIndexOf("/");
  
                  if (i > 0) {
  		    s = s.substring(0, i);
                  } else if (i == 0 &&
                      ! s.equals("/")) {
                      s = "/";
                  } else {
                      s = "";
                  }
              }
  	}
  
  	return wrapper;
      }
  
      private ServletWrapper getExtensionMatch(Container container, String path, Request req) {
          ServletWrapper wrapper = null;
          int i = path.lastIndexOf(".");
  	int j = path.lastIndexOf("/");
  
  	if (i > -1) {
  	    String extension = path.substring(i);
  
  
  	    if (j > i) {
  	        int k = extension.indexOf("/");
  
  		extension = extension.substring(0, k);
  	    }
  
  	    wrapper = (ServletWrapper)container.getExtensionMap().get(
  	        "*" + extension);
  
  	    if (wrapper != null) {
  	        req.setServletPath( path );
  
  		if (j > i) {
  		    int k = i + path.substring(i).indexOf("/");
                      String s = path.substring(0, k);
  
  		    req.setServletPath( (s.trim().length() == 0) ? null : s );
                      s = path.substring(k);
  		    req.setPathInfo( (s.trim().length() == 0) ? null : s );
  		}
  	    }
  	}
  
  	return wrapper;
      }
  
      // XXX XXX XXX eliminate recursivity (costin )
      private ServletWrapper getServletForJsp(Container container, ServletWrapper wrapper, Request req) {
          if (wrapper != null) {
              String servletPath = req.getServletPath();
              String pathInfo = req.getPathInfo();
              req.setResourceName( req.getServletPath());
  
              boolean stillSearching = true;
              int counter = 0;
  
  
              while (stillSearching) {
                  if (wrapper != null &&
                      wrapper.getPath() != null &&
                      wrapper.getServletClass() == null) {
                          req.setResourceName( wrapper.getPath() );
                          wrapper = getMatch(container,
  					   wrapper.getPath() + (pathInfo == null ? "" : pathInfo),
  					   req);
                          req.setMappedPath(  req.getServletPath() );
  
                          if (stillSearching &&
                              ++counter > Constants.RequestURIMatchRecursion) {
                              stillSearching = false;
                          }
                  } else {
                      stillSearching = false;
                  }
              }
  
              req.setServletPath( servletPath);
              req.setPathInfo(pathInfo);
          }
  
          return wrapper;
      }
  
      private void getMapPath(ServletWrapper wrapper, Request req) {
          String mapPath = req.getMappedPath();
  
          // XXX
          // this is added to make available the destination
          // resource be it a servlet or jsp file - could be
          // cleaned up a bit (wobbly)
          if (req.getServletPath().equals(Constants.Servlet.Invoker.Map) &&
              req.getPathInfo() != null) {
              String s = req.getPathInfo();
  
              if (req.getPathInfo().startsWith("/")) {
                  s = req.getPathInfo().substring(1);
              }
  
              int i = s.indexOf("/");
  
              if (i > -1) {
                  s = s.substring(0, i);
              }
  
              mapPath = "/" + s;
          } else if (mapPath == null &&
              req.getResourceName() != null) {
              mapPath = req.getResourceName();
          }
  
          req.setMappedPath( mapPath );
      }
  
      private String getResolvedServlet(Container container, String path) {
          String resolvedServlet = null;
          ServletWrapper[] sw = container.getServletsByPath(path);
  
          if (sw.length > 0) {
              // assume one
              resolvedServlet = sw[0].getServletName();
          }
  
          return resolvedServlet;
      }
  }
  
  
  
  1.1                  jakarta-tomcat/src/share/org/apache/tomcat/request/SessionInterceptor.java
  
  Index: SessionInterceptor.java
  ===================================================================
  /*
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:  
   *       "This product includes software developed by the 
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * [Additional notices, if required by prior licensing conditions]
   *
   */ 
  
  
  package org.apache.tomcat.request;
  
  import org.apache.tomcat.core.*;
  import org.apache.tomcat.util.*;
  import org.apache.tomcat.deployment.*;
  import java.io.*;
  import java.net.*;
  import java.util.*;
  import javax.servlet.http.*;
  
  /**
   * 
   */
  public class SessionInterceptor implements RequestInterceptor {
      
      private ServerSessionManager sessionManager = ServerSessionManager.getManager();
  
      public SessionInterceptor() {
      }
  	
      public int handleRequest(Request request ) {
  	// look for session id -- cookies only right now
  
  	HttpSession session= sessionManager.getSession(request, request.getResponse(), false);
  
  	// ServerSession session =
  	// 	    sessionManager.getServerSession(request, request.getResponse(), false);
  
  	if (session != null) {
  	    sessionManager.accessed( session );
  	}
  
  	request.setSession(session);  // may be null
  	return 0;
      }
  }
  
  
  
  1.7       +5 -17     jakarta-tomcat/src/share/org/apache/tomcat/server/ConnectionHandler.java
  
  Index: ConnectionHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/server/ConnectionHandler.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- ConnectionHandler.java	1999/10/31 19:28:06	1.6
  +++ ConnectionHandler.java	2000/01/07 19:14:15	1.7
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/server/ConnectionHandler.java,v 1.6 1999/10/31 19:28:06 costin Exp $
  - * $Revision: 1.6 $
  - * $Date: 1999/10/31 19:28:06 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/server/ConnectionHandler.java,v 1.7 2000/01/07 19:14:15 costin Exp $
  + * $Revision: 1.7 $
  + * $Date: 2000/01/07 19:14:15 $
    *
    * ====================================================================
    *
  @@ -194,22 +194,10 @@
   		}
   
   		HttpServer server = manager.resolveServer(endpoint,hostHeader);
  -		String path = request.getRequestURI();
  -		int index = path.indexOf("?");
  -
   		response.setServerHeader(server.getServerHeader());
  -
  -		if (index > 0 ) {
  -		    path = path.substring(0, index);
  -		}
   
  -		Context ctx = server.getContextByPath(path);
  -		String ctxPath = ctx.getPath();
  -		String pathInfo =
  -		    path.substring(ctxPath.length(), path.length());
  -		
  -		ctx.handleRequest(request, response);
  -		response.finish();
  +		ContextManager cm=server.getContextManager();
  +		cm.service( request, response );
   
   		request.recycle();
   		response.recycle();
  
  
  
  1.7       +4 -36     jakarta-tomcat/src/share/org/apache/tomcat/service/Ajp22ConnectionHandler.java
  
  Index: Ajp22ConnectionHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/service/Ajp22ConnectionHandler.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- Ajp22ConnectionHandler.java	1999/11/02 17:37:20	1.6
  +++ Ajp22ConnectionHandler.java	2000/01/07 19:14:16	1.7
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/service/Ajp22ConnectionHandler.java,v 1.6 1999/11/02 17:37:20 costin Exp $
  - * $Revision: 1.6 $
  - * $Date: 1999/11/02 17:37:20 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/service/Ajp22ConnectionHandler.java,v 1.7 2000/01/07 19:14:16 costin Exp $
  + * $Revision: 1.7 $
  + * $Date: 2000/01/07 19:14:16 $
    *
    * ====================================================================
    *
  @@ -130,39 +130,7 @@
   		    break;
   		}
   
  -		// XXX
  -                //    return if an error was detected in processing the
  -                //    request line
  -		if (rresponse.getStatus() >= 400) {
  -		    rresponse.finish();
  -		    rrequest.recycle();
  -		    rresponse.recycle();
  -		    break;
  -		}
  -
  -		
  -		// resolve the server that we are for
  -		String path = rrequest.getRequestURI();
  -	
  -		Context ctx= contextM.getContextByPath(path);
  -
  -		// final fix on response & request
  -		//		rresponse.setServerHeader(server.getServerHeader());
  -
  -                //    don't do headers if request protocol is http/0.9
  -		if (rrequest.getProtocol() == null) {
  -		    rresponse.setOmitHeaders(true);
  -		}
  -
  -		// do it
  -		//		System.out.println( request + " " + rresponse );
  -		ctx.handleRequest(rrequest, rresponse);
  -
  -		// finish and clean up
  -		rresponse.finish();
  -
  -		// protocol notification
  -		msg.endResponse();
  +		contextM.service(rrequest, rresponse);
   		
   		rrequest.recycle();
   		rresponse.recycle();