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...@hyperreal.org on 1999/11/03 21:39:00 UTC

cvs commit: jakarta-tomcat/src/share/org/apache/tomcat/core Constants.java Container.java Context.java DefaultServlet.java Request.java RequestDispatcherImpl.java RequestMapper.java ServletContextFacade.java ServletLoader.java

costin      99/11/03 12:38:59

  Modified:    src/share/org/apache/tomcat/core Constants.java
                        Container.java Context.java DefaultServlet.java
                        Request.java RequestDispatcherImpl.java
                        RequestMapper.java ServletContextFacade.java
                        ServletLoader.java
  Log:
  Merged fixes from J2EE branch to main branch.
  This is only for tomcat.core package.
  
  Revision  Changes    Path
  1.3       +8 -3      jakarta-tomcat/src/share/org/apache/tomcat/core/Constants.java
  
  Index: Constants.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Constants.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Constants.java	1999/10/15 00:34:29	1.2
  +++ Constants.java	1999/11/03 20:38:49	1.3
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Constants.java,v 1.2 1999/10/15 00:34:29 akv Exp $
  - * $Revision: 1.2 $
  - * $Date: 1999/10/15 00:34:29 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Constants.java,v 1.3 1999/11/03 20:38:49 costin Exp $
  + * $Revision: 1.3 $
  + * $Date: 1999/11/03 20:38:49 $
    *
    * ====================================================================
    *
  @@ -171,6 +171,8 @@
       }
   
       public static class JSP {
  +	public static final String NAME = "jsp";
  +	
           public static class Directive {
               public static class Compile {
                   public static final String Name = "jsp_precompile";
  @@ -196,6 +198,8 @@
               "javax.servlet.error.exception_type";
           public static final String ERROR_MESSAGE =
               "javax.servlet.error.message";
  +        public static final String RESOLVED_SERVLET =
  +            "javax.servlet.resolved";
       }
   
       public static class Locale {
  @@ -221,5 +225,6 @@
           public static final String HTTPS = "https";
           public static final String FILE = "file";
           public static final String WAR = "war";
  +        public static final String JAR = "jar";
       }
   }
  
  
  
  1.2       +25 -16    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.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Container.java	1999/10/09 00:30:01	1.1
  +++ Container.java	1999/11/03 20:38:51	1.2
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Container.java,v 1.1 1999/10/09 00:30:01 duncan Exp $
  - * $Revision: 1.1 $
  - * $Date: 1999/10/09 00:30:01 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Container.java,v 1.2 1999/11/03 20:38:51 costin Exp $
  + * $Revision: 1.2 $
  + * $Date: 1999/11/03 20:38:51 $
    *
    * ====================================================================
    *
  @@ -78,7 +78,6 @@
   public class Container {
   
       private Context context;
  -    private ClassLoader classLoader;
       private ServletLoader servletLoader;
       private Hashtable servlets = new Hashtable();
       private Hashtable prefixMappedServlets = new Hashtable();
  @@ -97,14 +96,6 @@
   	return context;
       }
   
  -    ClassLoader getClassLoader() {
  -        return this.classLoader;
  -    }
  -
  -    void setClassLoader(ClassLoader classLoader) {
  -        this.classLoader = classLoader;
  -    }
  -
       ServletLoader getLoader() {
   	if(servletLoader == null) {
   	    servletLoader = new ServletLoader(this);
  @@ -190,19 +181,35 @@
   	servlets.put(name, wrapper);
       }
   
  -    boolean containsServlet(String name) {
  -        ServletWrapper[] sw = getServlets(name);
  +    /** True if we have a servlet with className.
  +     */
  +    boolean containsServlet(String className) {
  +        ServletWrapper[] sw = getServlets(className);
   
           return (sw != null &&
   	    sw.length > 0);
       }
   
  +    /** Check if we have a servlet with the specified name
  +     */
       boolean containsServletByName(String name) {
   	return (servlets.containsKey(name));
       }
   
  -    void removeServlet(String name) {
  -        removeServlets(getServlets(name));
  +    /** Remove all servlets with a specific class name
  +     */
  +    void removeServlet(String className) {
  +        removeServlets(getServlets(className));
  +    }
  +
  +    /** Remove the servlet with a specific name
  +     */
  +    void removeServletByName(String servletName) {
  +	ServletWrapper wrapper=(ServletWrapper)servlets.get(servletName);
  +	if( wrapper != null ) {
  +	    ServletWrapper wa[]={wrapper};
  +	    removeServlets( wa );
  +	}
       }
   
       boolean containsJSP(String path) {
  @@ -422,6 +429,8 @@
   	}
       }
   
  +    /** Return servlets with a specified class name
  +     */
       private ServletWrapper[] getServlets(String name) {
           Vector servletWrappers = new Vector();
   	Enumeration enum = servlets.keys();
  
  
  
  1.7       +80 -61    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.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- Context.java	1999/11/01 20:50:46	1.6
  +++ Context.java	1999/11/03 20:38:51	1.7
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Context.java,v 1.6 1999/11/01 20:50:46 costin Exp $
  - * $Revision: 1.6 $
  - * $Date: 1999/11/01 20:50:46 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Context.java,v 1.7 1999/11/03 20:38:51 costin Exp $
  + * $Revision: 1.7 $
  + * $Date: 1999/11/03 20:38:51 $
    *
    * ====================================================================
    *
  @@ -64,6 +64,7 @@
   
   package org.apache.tomcat.core;
   
  +import org.apache.tomcat.server.*;
   import org.apache.tomcat.util.*;
   import org.apache.tomcat.deployment.*;
   import java.io.*;
  @@ -240,19 +241,11 @@
       }
   
       public ClassLoader getClassLoader() {
  -        ClassLoader cl = this.container.getClassLoader();
  -
  -        if (cl == null) {
  -            cl = (ClassLoader)this.container.getLoader();
  -        }
  -
  -	return (ClassLoader)cl;
  +      return this.classLoader;
       }
   
       public void setClassLoader(ClassLoader classLoader) {
  -        if (! this.initialized) {
  -	    this.container.setClassLoader(classLoader);
  -        }
  +      this.classLoader = classLoader;
       }
   
       public String getClassPath() {
  @@ -269,8 +262,12 @@
           return cp;
       }
       
  -    public void setClassPath(String classpath) {
  -        this.classPath = classpath;
  +    public void setClassPath(String classPath) {
  +        if (this.classPath.trim().length() > 0) {
  +	    this.classPath += File.pathSeparator;
  +	}
  +
  +        this.classPath += classPath;
       }
       
       /**
  @@ -521,8 +518,10 @@
   
       public Object getAttribute(String name) {
           if (name.equals("org.apache.tomcat.jsp_classpath"))
  -            return getClassPath();
  -        else {
  +	  return getClassPath();
  +	else if(name.equals("org.apache.tomcat.classloader")) {
  +	  return this.container.getLoader();
  +        }else {
               Object o = attributes.get(name);
               return attributes.get(name);
           }
  @@ -636,6 +635,13 @@
   	request.setServletPath(result.getServletPath());
   	request.setPathInfo(result.getPathInfo());
   
  +        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());
   
  @@ -663,27 +669,25 @@
       private void clearDir(File dir) {
           String[] files = dir.list();
   
  -        if (files == null) {
  -            return;
  -        }
  -
  -	for (int i = 0; i < files.length; i++) {
  -	    File f = new File(dir, files[i]);
  -
  -	    if (f.isDirectory()) {
  -		clearDir(f);
  +        if (files != null) {
  +	    for (int i = 0; i < files.length; i++) {
  +	        File f = new File(dir, files[i]);
  +
  +	        if (f.isDirectory()) {
  +		    clearDir(f);
  +	        }
  +
  +	        try {
  +	            f.delete();
  +	        } catch (Exception e) {
  +	        }
   	    }
   
   	    try {
  -	        f.delete();
  +	        dir.delete();
   	    } catch (Exception e) {
   	    }
  -	}
  -
  -	try {
  -	    dir.delete();
  -	} catch (Exception e) {
  -	}
  +        }
       }
   
       private void processWebApp(InputStream is) {
  @@ -755,14 +759,14 @@
   		resourceName =
   		    ((ServletDescriptor)webComponentDescriptor).getClassName();
   
  -		if (container.containsServlet(resourceName)) {
  +		if (container.containsServletByName(name)) {
   		    String msg = sm.getString("context.dd.dropServlet",
  -		        resourceName);
  +		        name + "(" + resourceName + ")" );
   
   		    System.out.println(msg);
   		    
   		    removeResource = true;
  -		    container.removeServlet(resourceName);
  +		    container.removeServletByName(name);
   		}
   
   		container.addServlet(name, resourceName, description);
  @@ -912,41 +916,56 @@
       }
   
       private void loadServlets() {
  -	Vector loadServlets = new Vector();
  +	Vector orderedKeys = new Vector();
   	Enumeration e = loadableServlets.keys();
  +	
  +	// order keys
   
   	while (e.hasMoreElements()) {
   	    Integer key = (Integer)e.nextElement();
  -	    Vector v = (Vector)loadableServlets.get(key);
  -	    Enumeration lse = v.elements();
  +	    int slot = -1;
  +
  +	    for (int i = 0; i < orderedKeys.size(); i++) {
  +	        if (key.intValue() <
  +		    ((Integer)(orderedKeys.elementAt(i))).intValue()) {
  +		    slot = i;
  +
  +		    break;
  +		}
  +	    }
   
  -	    while (lse.hasMoreElements()) {
  -	        loadServlets.addElement(lse.nextElement());
  +	    if (slot > -1) {
  +	        orderedKeys.insertElementAt(key, slot);
  +	    } else {
  +	        orderedKeys.addElement(key);
   	    }
   	}
   
  -        // Changed because this is exactly opposite of what we want....
  -        // Servlets were being loaded in the exact opposite order.
  -        // Priorities IMO, should start with 0.
  -        // Only System Servlets should be at 0 and rest of the servlets
  -        // should be +ve integers.
  -        // WARNING: Please do not change this without talking to:
  -        // harishp@eng.sun.com (J2EE impact)
  -	// for (int i = loadServlets.size() - 1; i >= 0; i--) {
  -
  -	for(int i = 0; i < loadServlets.size(); ++i) {
  -            String servletName = (String)loadServlets.elementAt(i);
  -	    LookupResult result =
  -	        container.lookupServletByName(servletName);
  +	// loaded ordered servlets
   
  -	    try {
  -	        result.getWrapper().loadServlet(); 
  -	    } catch (Exception ee) {
  -		ee.printStackTrace();
  -	        String msg = sm.getString("context.loadServlet.e",
  -		    servletName);
  +	// Priorities IMO, should start with 0.
  +	// Only System Servlets should be at 0 and rest of the
  +	// servlets should be +ve integers.
  +	// WARNING: Please do not change this without talking to:
  +	// harishp@eng.sun.com (J2EE impact)
  +
  +	for (int i = 0; i < orderedKeys.size(); i ++) {
  +	    Integer key = (Integer)orderedKeys.elementAt(i);
  +	    e = ((Vector)(loadableServlets.get(key))).elements();
   
  -	        System.out.println(msg);
  +	    while (e.hasMoreElements()) {
  +		String servletName = (String)e.nextElement();
  +		LookupResult result =
  +		    container.lookupServletByName(servletName);
  +
  +		try {
  +		    result.getWrapper().loadServlet();
  +		} catch (Exception ee) {
  +		    String msg = sm.getString("context.loadServlet.e",
  +		        servletName);
  +
  +		    System.out.println(msg);
  +		} 
   	    }
   	}
       }
  
  
  
  1.5       +63 -16    jakarta-tomcat/src/share/org/apache/tomcat/core/DefaultServlet.java
  
  Index: DefaultServlet.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/DefaultServlet.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- DefaultServlet.java	1999/11/01 20:50:46	1.4
  +++ DefaultServlet.java	1999/11/03 20:38:52	1.5
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/DefaultServlet.java,v 1.4 1999/11/01 20:50:46 costin Exp $
  - * $Revision: 1.4 $
  - * $Date: 1999/11/01 20:50:46 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/DefaultServlet.java,v 1.5 1999/11/03 20:38:52 costin Exp $
  + * $Revision: 1.5 $
  + * $Date: 1999/11/03 20:38:52 $
    *
    * ====================================================================
    *
  @@ -64,6 +64,7 @@
   
   package org.apache.tomcat.core;
   
  +import org.apache.tomcat.server.*;
   import org.apache.tomcat.util.*;
   import java.io.*;
   import java.net.*;
  @@ -282,12 +283,16 @@
   
   	while (enum.hasMoreElements()) {
   	    String fileName = (String)enum.nextElement();
  -	    File f = new File(file, fileName);
   
  -	    if (f.exists()) {
  -	        welcomeFile = fileName;
  +            if (fileName != null &&
  +                fileName.trim().length() > 0) {
  +	        File f = new File(file, fileName);
   
  -		break;
  +	        if (f.exists()) {
  +	            welcomeFile = fileName;
  +
  +		    break;
  +                }
   	    }
   	}
   
  @@ -351,10 +356,32 @@
           // return 404 instead of the JSP source
   	// On all platforms, makes sure we don't let ../'s through
           // Unfortunately, on Unix, it prevents symlinks from working
  -	if (! absPath.equals(canPath)) {
  -	    response.sendError(response.SC_NOT_FOUND);
  -
  -	    return;
  +	// So, a check for File.separatorChar='\\' ..... It hopefully
  +	// happens on flavors of Windows.
  +	if (File.separatorChar  == '\\') { 
  +		// On Windows check ignore case....
  +		if(!absPath.equalsIgnoreCase(canPath)) {
  +	    	response.sendError(response.SC_NOT_FOUND);
  +	    	return;
  +		}
  +	} else {
  +		// The following code on Non Windows disallows ../ 
  +		// in the path but also disallows symlinks.... 
  +		// 
  +		// if(!absPath.equals(canPath)) {
  +	    	// response.sendError(response.SC_NOT_FOUND);
  +	    	// return;
  +		// }
  +		// instead lets look for ".." in the absolute path
  +		// and disallow only that. 
  +		// Why should we loose out on symbolic links?
  +		//
  +
  +		if(absPath.indexOf("..") != -1) {
  +			// We have .. in the path...
  +	    	response.sendError(response.SC_NOT_FOUND);
  +	    	return;
  +		}
   	}
   
   	String mimeType = mimeTypes.getContentTypeFor(file.getName());
  @@ -484,12 +511,32 @@
   
           absPath = FilePathUtil.patch(absPath);
   
  -	if (! absPath.equals(canPath)) {
  -	    response.sendError(response.SC_NOT_FOUND);
  -
  -	    return;
  +	if (File.separatorChar  == '\\') { 
  +		// On Windows check ignore case....
  +		if(!absPath.equalsIgnoreCase(canPath)) {
  +		    response.sendError(response.SC_NOT_FOUND);
  +		    return;
  +		}
  +	} else {
  +		// The following code on Non Windows disallows ../ 
  +		// in the path but also disallows symlinks.... 
  +		// 
  +		// if(!absPath.equals(canPath)) {
  +	    	// response.sendError(response.SC_NOT_FOUND);
  +	    	// return;
  +		// }
  +		// instead lets look for ".." in the absolute path
  +		// and disallow only that. 
  +		// Why should we loose out on symbolic links?
  +		//
  +
  +		if(absPath.indexOf("..") != -1) {
  +		    // We have .. in the path...
  +		    response.sendError(response.SC_NOT_FOUND);
  +		    return;
  +		}
   	}
  -	
  +
   	Vector dirs = new Vector();
   	Vector files = new Vector();
   	String[] fileNames = file.list();
  
  
  
  1.8       +12 -4     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.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- Request.java	1999/11/02 17:37:19	1.7
  +++ Request.java	1999/11/03 20:38:52	1.8
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Request.java,v 1.7 1999/11/02 17:37:19 costin Exp $
  - * $Revision: 1.7 $
  - * $Date: 1999/11/02 17:37:19 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Request.java,v 1.8 1999/11/03 20:38:52 costin Exp $
  + * $Revision: 1.8 $
  + * $Date: 1999/11/03 20:38:52 $
    *
    * ====================================================================
    *
  @@ -421,7 +421,8 @@
       }
   
       public void setParameters( Hashtable h ) {
  -	this.parameters=h;
  +	if(h!=null)
  +	    this.parameters=h;
   	// XXX Should we override query parameters ??
       }
           
  @@ -453,6 +454,13 @@
        */
       public void setQueryString(String queryString) {
   	this.queryString = queryString;
  +        // catch any parse exceptions
  +
  +        try {
  +            this.parameters = HttpUtils.parseQueryString(queryString);
  +        } catch (Exception e) {
  +            this.parameters.clear();
  +        }
       }
       
   //     public void setScheme(String scheme) {
  
  
  
  1.2       +80 -42    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.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- RequestDispatcherImpl.java	1999/10/09 00:30:15	1.1
  +++ RequestDispatcherImpl.java	1999/11/03 20:38:52	1.2
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/RequestDispatcherImpl.java,v 1.1 1999/10/09 00:30:15 duncan Exp $
  - * $Revision: 1.1 $
  - * $Date: 1999/10/09 00:30:15 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/RequestDispatcherImpl.java,v 1.2 1999/11/03 20:38:52 costin Exp $
  + * $Revision: 1.2 $
  + * $Date: 1999/11/03 20:38:52 $
    *
    * ====================================================================
    * 
  @@ -90,34 +90,6 @@
       RequestDispatcherImpl(Context context) {
           this.context = context;
       }
  -
  -    void setName(String name) {
  -        this.name = name;
  -	this.lookupResult =
  -	    context.getContainer().lookupServletByName(this.name);
  -    }
  -
  -    void setPath(String urlPath) {
  -	int i = urlPath.indexOf("?");
  -
  -	if (i > -1) {
  -	    try {
  -		this.queryString =
  -                    urlPath.substring(i + 1, urlPath.length());
  -	    } catch (Exception e) {
  -	    }
  -
  -	    urlPath = urlPath.substring(0, i);
  -	}
  -
  -	this.urlPath = urlPath;
  -	this.lookupResult =
  -	    context.getContainer().lookupServlet(this.urlPath);
  -    }
  -
  -    public boolean isValid() {
  -        return (this.lookupResult != null);
  -    }
       
       public void forward(ServletRequest request, ServletResponse response)
       throws ServletException, IOException {
  @@ -125,13 +97,9 @@
   	    (HttpServletRequestFacade)request;
   	HttpServletResponseFacade resFacade =
   	    (HttpServletResponseFacade)response;
  +        Request realRequest = reqFacade.getRealRequest();
  +        Response realResponse = resFacade.getRealResponse();
   
  -	Request realRequest = null;
  -	Response realResponse = null;
  -
  -        realRequest = reqFacade.getRealRequest();
  -        realResponse = resFacade.getRealResponse();
  -
   	if (realResponse.isStarted()) {
               String msg = sm.getString("rdi.forward.ise");
   
  @@ -145,9 +113,23 @@
   	ForwardedRequest fRequest =
   	    new ForwardedRequest(realRequest, urlPath);
   
  +        // join the query strings of the destination request
  +        // with the originaing request in that order.
  +
  +        String aggregatedQueryString = this.queryString;
  +
  +        if (realRequest.getQueryString() != null &&
  +            realRequest.getQueryString().trim().length() > 0) {
  +            if (aggregatedQueryString == null) {
  +                aggregatedQueryString = realRequest.getQueryString();
  +            } else {
  +                aggregatedQueryString += "&" + realRequest.getQueryString();
  +            }
  +        }
  +
           fRequest.setServletPath(this.lookupResult.getServletPath());
   	fRequest.setPathInfo(this.lookupResult.getPathInfo());
  -        fRequest.setQueryString(queryString);
  +        fRequest.setQueryString(aggregatedQueryString);
   
   	this.lookupResult.getWrapper().handleRequest(fRequest, resFacade);
       }
  @@ -155,6 +137,10 @@
       public void include(ServletRequest request, ServletResponse response)
       throws ServletException, IOException {
   	HttpServletRequest req = (HttpServletRequest)request;
  +
  +        // XXX
  +        // while this appears to work i believe the code
  +        // could be streamlined/normalized a bit.
   	
   	// if we are in a chained include, then we'll store the attributes
   	// from the last round so that we've got them for the next round
  @@ -166,14 +152,15 @@
   	String path_info =
               (String)req.getAttribute(Constants.Attribute.PathInfo);
   	String query_string =
  -            (String)req.getAttribute(Constants.Attribute.QueryString);
  +	    (String)req.getAttribute(Constants.Attribute.QueryString);
   	
   	HttpServletRequestFacade reqFacade =
   	    (HttpServletRequestFacade)request;
   	HttpServletResponseFacade resFacade =
   	    (HttpServletResponseFacade)response;
  -	Request realRequest = reqFacade.getRealRequest();
  +        Request realRequest = reqFacade.getRealRequest();
   	Response realResponse = resFacade.getRealResponse();
  +        String originalQueryString = realRequest.getQueryString();
   
   	// XXX
   	// not sure why we're pre-pending context.getPath() here
  @@ -199,15 +186,38 @@
                   lookupResult.getPathInfo());
   	}
   
  -	if (queryString != null) {
  +        // join the query strings of the destination request
  +        // with the originaing request in that order.
  +
  +        String aggregatedQueryString = this.queryString;
  +
  +        if (realRequest.getQueryString() != null &&
  +            realRequest.getQueryString().trim().length() > 0) {
  +            if (aggregatedQueryString == null) {
  +                aggregatedQueryString = realRequest.getQueryString();
  +            } else {
  +                aggregatedQueryString += "&" + realRequest.getQueryString();
  +            }
  +        }
  +
  +	if (aggregatedQueryString != null) {
   	    req.setAttribute(Constants.Attribute.QueryString,
  -                queryString);
  +                aggregatedQueryString);
   	}
  +
  +        // inline the aggregated query string for the scope
  +        // of the include
  +
  +	reqFacade.getRealRequest().setQueryString(aggregatedQueryString);
   	
   	IncludedResponse iResponse = new IncludedResponse(realResponse);
   
   	lookupResult.getWrapper().handleRequest(reqFacade, iResponse);
   
  +        // revert the query string to its original value
  +
  +        reqFacade.getRealRequest().setQueryString(originalQueryString);
  +
   	if (request_uri != null) {
   	    req.setAttribute(Constants.Attribute.RequestURI, request_uri);
   	} else {
  @@ -233,5 +243,33 @@
   	} else {
   	    reqFacade.removeAttribute(Constants.Attribute.QueryString);
   	}
  +    }
  +
  +    void setName(String name) {
  +        this.name = name;
  +	this.lookupResult =
  +	    context.getContainer().lookupServletByName(this.name);
  +    }
  +
  +    void setPath(String urlPath) {
  +	int i = urlPath.indexOf("?");
  +
  +	if (i > -1) {
  +	    try {
  +		this.queryString =
  +                    urlPath.substring(i + 1, urlPath.length());
  +	    } catch (Exception e) {
  +	    }
  +
  +	    urlPath = urlPath.substring(0, i);
  +	}
  +
  +	this.urlPath = urlPath;
  +	this.lookupResult =
  +	    context.getContainer().lookupServlet(this.urlPath);
  +    }
  +
  +    boolean isValid() {
  +        return (this.lookupResult != null);
       }
   }
  
  
  
  1.3       +79 -30    jakarta-tomcat/src/share/org/apache/tomcat/core/RequestMapper.java
  
  Index: RequestMapper.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/RequestMapper.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- RequestMapper.java	1999/10/12 07:17:47	1.2
  +++ RequestMapper.java	1999/11/03 20:38:53	1.3
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/RequestMapper.java,v 1.2 1999/10/12 07:17:47 gonzo Exp $
  - * $Revision: 1.2 $
  - * $Date: 1999/10/12 07:17:47 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/RequestMapper.java,v 1.3 1999/11/03 20:38:53 costin Exp $
  + * $Revision: 1.3 $
  + * $Date: 1999/11/03 20:38:53 $
    *
    * ====================================================================
    *
  @@ -80,6 +80,7 @@
       private String servletPath = null;
       private String mapPath = null;
       private String pathInfo = null;
  +    private String resourceName = null;
   
       RequestMapper() {
       }
  @@ -101,9 +102,11 @@
   	ServletWrapper wrapper = getMatch(path);
   
   	if (wrapper != null) {
  -	    lookupResult = new LookupResult(wrapper,
  -	        this.servletPath, this.mapPath, this.pathInfo);
  -	}
  +            this.mapPath = getMapPath(wrapper);
  +
  +            lookupResult = new LookupResult(wrapper,
  +                this.servletPath, this.mapPath, this.pathInfo);
  +        }
   
   	return lookupResult;
       }
  @@ -130,31 +133,8 @@
   	// lookup real servlet if what we're actually
   	// dealing with a jsp file
   
  -	if (wrapper != null) {
  -	    String servletPath = this.servletPath;
  -	    String pathInfo = this.pathInfo;
  -	    boolean stillSearching = true;
  -	    int counter = 0;
  -
  -            while (stillSearching) {
  -                if (wrapper.getPath() != null &&
  -		    wrapper.getServletClass() == null) {
  -		    wrapper = getMatch(wrapper.getPath() + pathInfo);
  -		    this.mapPath = this.servletPath;
  -
  -                    if (stillSearching &&
  -		        ++counter > Constants.RequestURIMatchRecursion) {
  -		        stillSearching = false;
  -		    }
  -		} else {
  -		  stillSearching = false;
  -		}
  -	    }
  +        wrapper = getResolvedServlet(wrapper);
   
  -	    this.servletPath = servletPath;
  -	    this.pathInfo = pathInfo;
  -	}
  -
   	return wrapper;
       }
   
  @@ -245,5 +225,74 @@
   	}
   
   	return wrapper;
  +    }
  +
  +    private ServletWrapper getResolvedServlet(ServletWrapper wrapper) {
  +        if (wrapper != null) {
  +            String servletPath = this.servletPath;
  +            String pathInfo = this.pathInfo;
  +            boolean stillSearching = true;
  +            int counter = 0;
  +
  +            this.resourceName = this.servletPath;
  +
  +            while (stillSearching) {
  +                if (wrapper.getPath() != null &&
  +                    wrapper.getServletClass() == null) {
  +                        this.resourceName = wrapper.getPath();
  +                        wrapper = getMatch(wrapper.getPath() +
  +                            (pathInfo == null ? "" : pathInfo));
  +                        this.mapPath = this.servletPath;
  +
  +                        if (stillSearching &&
  +                            ++counter > Constants.RequestURIMatchRecursion) {
  +                            stillSearching = false;
  +                        }
  +                } else {
  +                    stillSearching = false;
  +                }
  +            }
  +
  +            this.servletPath = servletPath;
  +            this.pathInfo = pathInfo;
  +        }
  +
  +        return wrapper;
  +    }
  +
  +    private String getMapPath(ServletWrapper wrapper) {
  +        String mapPath = this.mapPath;
  +
  +        // 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 (this.servletPath.equals(Constants.Servlet.Invoker.Map) &&
  +            this.pathInfo != null) {
  +            String s = this.pathInfo;
  +
  +            if (this.pathInfo.startsWith("/")) {
  +                s = this.pathInfo.substring(1);
  +            }
  +
  +            int i = s.indexOf("/");
  +
  +            if (i > -1) {
  +                s = s.substring(0, i);
  +            }
  +
  +            mapPath = "/" + s;
  +        } else if (mapPath == null &&
  +            this.resourceName != null) {
  +            // XXX
  +            // hack to differentiate amongst a mapped servlet and a jsp
  +            if (! wrapper.getServletName().equals(Constants.JSP.NAME)) {
  +                mapPath = "/" + wrapper.getServletClass();
  +            } else {
  +                mapPath = this.resourceName;
  +            }
  +        }
  +
  +        return mapPath;
       }
   }
  
  
  
  1.3       +4 -4      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.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ServletContextFacade.java	1999/10/15 00:34:30	1.2
  +++ ServletContextFacade.java	1999/11/03 20:38:53	1.3
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ServletContextFacade.java,v 1.2 1999/10/15 00:34:30 akv Exp $
  - * $Revision: 1.2 $
  - * $Date: 1999/10/15 00:34:30 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ServletContextFacade.java,v 1.3 1999/11/03 20:38:53 costin Exp $
  + * $Revision: 1.3 $
  + * $Date: 1999/11/03 20:38:53 $
    *
    * ====================================================================
    *
  @@ -338,7 +338,7 @@
           // Can't get this anymore - Harish. A stop-gap arrangement.
   	// context.getLogModule().log(msg);
   	
  -	System.err.println(msg);
  +	//	System.err.println(msg);
       }
   
       public String getInitParameter(String name) {
  
  
  
  1.3       +57 -24    jakarta-tomcat/src/share/org/apache/tomcat/core/ServletLoader.java
  
  Index: ServletLoader.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ServletLoader.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ServletLoader.java	1999/10/15 03:20:26	1.2
  +++ ServletLoader.java	1999/11/03 20:38:54	1.3
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ServletLoader.java,v 1.2 1999/10/15 03:20:26 harishp Exp $
  - * $Revision: 1.2 $
  - * $Date: 1999/10/15 03:20:26 $
  + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ServletLoader.java,v 1.3 1999/11/03 20:38:54 costin Exp $
  + * $Revision: 1.3 $
  + * $Date: 1999/11/03 20:38:54 $
    *
    * ====================================================================
    *
  @@ -222,7 +222,7 @@
           Class clazz = null;
   
   	try {
  -	    ClassLoader parent = container.getClassLoader();
  +	    ClassLoader parent = container.getContext().getClassLoader();
   
   	    if (parent != null) {
   	        clazz = parent.loadClass(name);
  @@ -361,7 +361,8 @@
   
   	    if (f.exists() &&
   	        f.isDirectory()) {
  -		String[] jars = getJarFiles(f);
  +                JarFinder jarFinder = new JarFinder();
  +		String[] jars = jarFinder.getJars(f);
   
   		for (int i = 0; i < jars.length; i++) {
   		    String s = f.toString() + File.separator + jars[i];
  @@ -369,11 +370,12 @@
   		    try {
   		        URL tURL = new URL(Constants.Request.FILE,
                               null, s);
  -			URL jURL = new URL(Constants.Request.WAR +
  -                            ":" + tURL);
  +			URL jURL = new URL(Constants.Request.JAR +
  +                            ":" + tURL + "!/" + entryName);
   
  -			u = resolveURL(jURL, null, entryName);
  +			u = jURL;
   		    } catch (MalformedURLException mue) {
  +		        mue.printStackTrace();
   		        u = null;
   		    }
   
  @@ -406,7 +408,8 @@
   
                   if (f.exists() &&
                       f.isDirectory()) {
  -                    String[] jars = getJarFiles(f);
  +                    JarFinder jarFinder = new JarFinder();
  +		    String[] jars = jarFinder.getJars(f);
   
                       for (int i = 0; i < jars.length; i++) {
                           String s = f.toString() + File.separator +
  @@ -457,8 +460,8 @@
   	    s += ((! s.endsWith("/")) ? "/" : "") + name.trim();
   	}
   
  -	if (base.getProtocol().equalsIgnoreCase(Constants.Request.WAR)) {
  -	    u = new URL(base.toString() +
  +	if (base.getProtocol().equalsIgnoreCase(Constants.Request.JAR)) {
  +	  u = new URL(base.toString() +
                   ((s.length() > 0) ? "!" : "") + s);
   	} else {
   	    u = new URL(base.toString() +
  @@ -484,12 +487,6 @@
   	return baos.toByteArray();
       }
   
  -    private String[] getJarFiles(File f) {
  -        FilenameFilter filter = new JarFilter("jar");
  -
  -        return f.list(filter);
  -    }
  -
       private String classPathFormat(Enumeration e) {
           String cp = "";
   
  @@ -508,16 +505,52 @@
           return cp;
       }
   }
  +
  +class JarFinder {
  +    private Vector jars = null;
   
  -class JarFilter implements FilenameFilter {
  -    String extension = "";
  +    String[] getJars(String dir) {
  +        File f = new File(dir);
  +
  +        return getJars(f, null);
  +    }
  +
  +    String[] getJars(String dir, String path) {
  +        File f = new File(dir);
  +
  +        return getJars(f, path);
  +    }
   
  -    JarFilter(String extension) {
  -        this.extension = extension;
  +    String[] getJars(File dir) {
  +        return getJars(dir, null);
       }
  +
  +    private String[] getJars(File dir, String path) {
  +        File[] files = dir.listFiles();
  +
  +        for (int i = 0; i < files.length; i++) {
  +            File file = files[i];
  +            String p = (path != null) ? path + File.separator : "";
  +
  +            if (file.canRead()) {
  +                if (file.isFile() &&
  +                    file.getName().toLowerCase().endsWith(
  +                        "." + "jar")) {
  +                    if (this.jars == null) {
  +                        this.jars = new Vector();
  +                    }
  +
  +                    this.jars.addElement(p + file.getName());
  +                } else if (file.isDirectory()) {
  +                    getJars(file, p + file.getName());
  +                }
  +            }
  +        }
  +
  +        String[] jars = new String[this.jars.size()];
  +
  +        this.jars.copyInto((Object[])jars);
   
  -    public boolean accept(File dir, String name) {
  -        return (name != null &&
  -	    name.endsWith("." + this.extension));
  +        return jars;
       }
   }