You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2002/11/25 22:03:50 UTC

cvs commit: jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core StandardValveContext.java ApplicationFilterChain.java ApplicationFilterFactory.java DummyRequest.java StandardPipeline.java StandardWrapperValve.java

remm        2002/11/25 13:03:50

  Modified:    catalina/src/share/org/apache/catalina/core
                        ApplicationFilterChain.java
                        ApplicationFilterFactory.java DummyRequest.java
                        StandardPipeline.java StandardWrapperValve.java
  Added:       catalina/src/share/org/apache/catalina/core
                        StandardValveContext.java
  Log:
  - Optimize valves and filters processing (more optimization of
    the filter part coming).
  - Use request fields instead of allocating objects on each invocation.
  
  Revision  Changes    Path
  1.4       +5 -5      jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/ApplicationFilterChain.java
  
  Index: ApplicationFilterChain.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/ApplicationFilterChain.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ApplicationFilterChain.java	16 Oct 2002 15:42:09 -0000	1.3
  +++ ApplicationFilterChain.java	25 Nov 2002 21:03:50 -0000	1.4
  @@ -329,7 +329,7 @@
       void release() {
   
           this.filters.clear();
  -        this.iterator = iterator;
  +        this.iterator = null;
           this.servlet = null;
   
       }
  
  
  
  1.4       +18 -4     jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/ApplicationFilterFactory.java
  
  Index: ApplicationFilterFactory.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/ApplicationFilterFactory.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ApplicationFilterFactory.java	12 Sep 2002 00:09:27 -0000	1.3
  +++ ApplicationFilterFactory.java	25 Nov 2002 21:03:50 -0000	1.4
  @@ -98,6 +98,9 @@
       public static final String DISPATCHER_TYPE_ATTR="org.apache.catalina.core.DISPATCHER_TYPE";
       public static final String DISPATCHER_REQUEST_PATH_ATTR="org.apache.catalina.core.DISPATCHER_REQUEST_PATH";
   
  +    private static final SecurityManager securityManager = 
  +        System.getSecurityManager();
  +
       // ----------------------------------------------------------- Constructors
   
   
  @@ -142,7 +145,18 @@
               return (null);
   
           // Create and initialize a filter chain object
  -        ApplicationFilterChain filterChain = new ApplicationFilterChain();
  +        ApplicationFilterChain filterChain = null;
  +        if (securityManager == null) {
  +            Request req = (Request) request;
  +            filterChain = (ApplicationFilterChain) req.getFilterChain();
  +            if (filterChain == null) {
  +                filterChain = new ApplicationFilterChain();
  +                req.setFilterChain(filterChain);
  +            }
  +        } else {
  +            // Security: Do not recycle
  +            filterChain = new ApplicationFilterChain();
  +        }
   
           filterChain.setServlet(servlet);
   
  
  
  
  1.2       +25 -4     jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/DummyRequest.java
  
  Index: DummyRequest.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/DummyRequest.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DummyRequest.java	9 Oct 2002 08:01:11 -0000	1.1
  +++ DummyRequest.java	25 Nov 2002 21:03:50 -0000	1.2
  @@ -91,6 +91,7 @@
   import javax.naming.NamingException;
   import javax.naming.Binding;
   import javax.naming.directory.DirContext;
  +import javax.servlet.FilterChain;
   import javax.servlet.RequestDispatcher;
   import javax.servlet.Servlet;
   import javax.servlet.ServletContext;
  @@ -112,6 +113,7 @@
   import org.apache.catalina.HttpRequest;
   import org.apache.catalina.Logger;
   import org.apache.catalina.Response;
  +import org.apache.catalina.ValveContext;
   import org.apache.catalina.Wrapper;
   import org.apache.catalina.deploy.ApplicationParameter;
   import org.apache.catalina.util.Enumerator;
  @@ -149,6 +151,9 @@
       protected String servletPath = null;
       protected Wrapper wrapper = null;
   
  +    protected FilterChain filterChain = null;
  +    protected ValveContext valveContext = null;
  +
       public String getContextPath() {
           return (contextPath);
       }
  @@ -161,6 +166,14 @@
           return decodedURI;
       }
   
  +    public FilterChain getFilterChain() {
  +        return (this.filterChain);
  +    }
  +
  +    public void setFilterChain(FilterChain filterChain) {
  +        this.filterChain = filterChain;
  +    }
  +
       public String getQueryString() {
           return queryString;
       }
  @@ -183,6 +196,14 @@
   
       public void setServletPath(String path) {
           servletPath = path;
  +    }
  +
  +    public ValveContext getValveContext() {
  +        return (this.valveContext);
  +    }
  +
  +    public void setValveContext(ValveContext valveContext) {
  +        this.valveContext = valveContext;
       }
   
       public Wrapper getWrapper() {
  
  
  
  1.2       +14 -75    jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardPipeline.java
  
  Index: StandardPipeline.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardPipeline.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- StandardPipeline.java	18 Jul 2002 16:48:13 -0000	1.1
  +++ StandardPipeline.java	25 Nov 2002 21:03:50 -0000	1.2
  @@ -477,7 +477,17 @@
           throws IOException, ServletException {
   
           // Invoke the first Valve in this pipeline for this request
  -        (new StandardPipelineValveContext()).invokeNext(request, response);
  +        //(new StandardPipelineValveContext()).invokeNext(request, response);
  +
  +        StandardValveContext valveContext = 
  +            (StandardValveContext) request.getValveContext();
  +        if (valveContext == null) {
  +            valveContext = new StandardValveContext();
  +            request.setValveContext(valveContext);
  +        }
  +
  +        valveContext.set(basic, valves);
  +        valveContext.invokeNext(request, response);
   
       }
   
  @@ -577,77 +587,6 @@
                                  "]: " + message);
               throwable.printStackTrace(System.out);
           }
  -
  -    }
  -
  -
  -    // ------------------------------- StandardPipelineValveContext Inner Class
  -
  -
  -    protected class StandardPipelineValveContext
  -        implements ValveContext {
  -
  -
  -        // ------------------------------------------------- Instance Variables
  -
  -
  -        protected int stage = 0;
  -
  -
  -        // --------------------------------------------------------- Properties
  -
  -
  -        /**
  -          * Return descriptive information about this ValveContext 
  -          * implementation.
  -          */
  -        public String getInfo() {
  -            return info;
  -        }
  -
  -
  -        // ----------------------------------------------------- Public Methods
  -
  -
  -        /**
  -         * Cause the <code>invoke()</code> method of the next Valve that is 
  -         * part of the Pipeline currently being processed (if any) to be 
  -         * executed, passing on the specified request and response objects 
  -         * plus this <code>ValveContext</code> instance.  Exceptions thrown by
  -         * a subsequently executed Valve (or a Filter or Servlet at the 
  -         * application level) will be passed on to our caller.
  -         *
  -         * If there are no more Valves to be executed, an appropriate
  -         * ServletException will be thrown by this ValveContext.
  -         *
  -         * @param request The request currently being processed
  -         * @param response The response currently being created
  -         *
  -         * @exception IOException if thrown by a subsequent Valve, Filter, or
  -         *  Servlet
  -         * @exception ServletException if thrown by a subsequent Valve, Filter,
  -         *  or Servlet
  -         * @exception ServletException if there are no further Valves 
  -         *  configured in the Pipeline currently being processed
  -         */
  -        public void invokeNext(Request request, Response response)
  -            throws IOException, ServletException {
  -
  -            int subscript = stage;
  -            stage = stage + 1;
  -
  -            // Invoke the requested Valve for the current request thread
  -            if (subscript < valves.length) {
  -                valves[subscript].invoke(request, response, this);
  -            } else if ((subscript == valves.length) && (basic != null)) {
  -                basic.invoke(request, response, this);
  -            } else {
  -                throw new ServletException
  -                    (sm.getString("standardPipeline.noValve"));
  -            }
  -
  -        }
  -
   
       }
   
  
  
  
  1.7       +6 -5      jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardWrapperValve.java
  
  Index: StandardWrapperValve.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardWrapperValve.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- StandardWrapperValve.java	9 Oct 2002 12:52:40 -0000	1.6
  +++ StandardWrapperValve.java	25 Nov 2002 21:03:50 -0000	1.7
  @@ -262,7 +262,8 @@
           ApplicationFilterFactory factory = 
               ApplicationFilterFactory.getInstance();
           ApplicationFilterChain filterChain = 
  -            factory.createFilterChain(sreq, wrapper, servlet);
  +            factory.createFilterChain((ServletRequest) request, 
  +                                      wrapper, servlet);
   
           // Call the filter chain for this request
           // NOTE: This also calls the servlet's service() method
  
  
  
  1.1                  jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardValveContext.java
  
  Index: StandardValveContext.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardValveContext.java,v 1.1 2002/11/25 21:03:50 remm Exp $
   * $Revision: 1.1 $
   * $Date: 2002/11/25 21:03:50 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2001 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.catalina.core;
  
  
  import java.io.IOException;
  import javax.servlet.ServletException;
  import org.apache.catalina.Request;
  import org.apache.catalina.Response;
  import org.apache.catalina.Valve;
  import org.apache.catalina.ValveContext;
  import org.apache.catalina.util.StringManager;
  
  
  /**
   * Standard implementation of a <code>ValveContext</code>.
   *
   * @author Craig R. McClanahan
   * @author Remy Maucherat
   */
  
  public class StandardValveContext
      implements ValveContext {
  
  
      // ----------------------------------------------------- Instance Variables
  
  
      /**
       * The string manager for this package.
       */
      protected static StringManager sm =
          StringManager.getManager(Constants.Package);
  
  
      protected String info = 
          "org.apache.catalina.core.StandardValveContext/1.0";
      protected int stage = 0;
      protected Valve basic = null;
      protected Valve valves[] = null;
  
  
      // ------------------------------------------------------------- Properties
  
  
      /**
       * Return descriptive information about this ValveContext 
       * implementation.
       */
      public String getInfo() {
          return info;
      }
  
  
      // --------------------------------------------------------- Public Methods
  
  
      /**
       * Cause the <code>invoke()</code> method of the next Valve that is 
       * part of the Pipeline currently being processed (if any) to be 
       * executed, passing on the specified request and response objects 
       * plus this <code>ValveContext</code> instance.  Exceptions thrown by
       * a subsequently executed Valve (or a Filter or Servlet at the 
       * application level) will be passed on to our caller.
       *
       * If there are no more Valves to be executed, an appropriate
       * ServletException will be thrown by this ValveContext.
       *
       * @param request The request currently being processed
       * @param response The response currently being created
       *
       * @exception IOException if thrown by a subsequent Valve, Filter, or
       *  Servlet
       * @exception ServletException if thrown by a subsequent Valve, Filter,
       *  or Servlet
       * @exception ServletException if there are no further Valves 
       *  configured in the Pipeline currently being processed
       */
      public void invokeNext(Request request, Response response)
          throws IOException, ServletException {
  
          int subscript = stage;
          stage = stage + 1;
  
          // Invoke the requested Valve for the current request thread
          if (subscript < valves.length) {
              valves[subscript].invoke(request, response, this);
          } else if ((subscript == valves.length) && (basic != null)) {
              basic.invoke(request, response, this);
          } else {
              throw new ServletException
                  (sm.getString("standardPipeline.noValve"));
          }
  
      }
  
  
      // -------------------------------------------------------- Package Methods
  
  
      /**
       * Reset state.
       */
      void set(Valve basic, Valve valves[]) {
          stage = 0;
          this.basic = basic;
          this.valves = valves;
      }
  
  
  }
  
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


Re: cvs commit: jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core StandardValveContext.java ApplicationFilterChain.java ApplicationFilterFactory.java DummyRequest.java StandardPipeline.java StandardWrapperValve.java

Posted by Jeanfrancois Arcand <jf...@apache.org>.
Yep...works fine.

Have nice dream and think of me shaving snow at -15 degre celsius :-(

-- Jeanfrancois

Remy Maucherat wrote:

> Jeanfrancois Arcand wrote:
>
>> Hi Remy,
>>
>> the Administration Tool throw the following exception with your 
>> latest change in ApplicationFilterFactory
>>
>> java.lang.ClassCastException
>>    at 
>> org.apache.catalina.core.ApplicationFilterFactory.createFilterChain(ApplicationFilterFactory.java:150) 
>>
>>    at 
>> org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:713) 
>>
>>    at 
>> org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:464) 
>>
>>
>> The problem is at line
>>
>>  +        if (securityManager == null) {
>>  +            Request req = (Request) request;
>>
>> The request is an instance of 
>> org.apache.catalina.core.ApplicationHttpRequest, who extends 
>> HttpServletRequestWrapper and who cannot be casted into a Request 
>> object (IMBW). I will investigate further....
>>
>> Any ideas?
>
>
> I experimented with using an instanceof, as saving an object 
> allocation seems like a good idea. Let me know if there's a problem, 
> and I'll fix it tomorrow (going to bed now; yawn :) ).
>
> Remy
>
>
> -- 
> To unsubscribe, e-mail:   
> <ma...@jakarta.apache.org>
> For additional commands, e-mail: 
> <ma...@jakarta.apache.org>
>
>


--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


Re: cvs commit: jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core StandardValveContext.java ApplicationFilterChain.java ApplicationFilterFactory.java DummyRequest.java StandardPipeline.java StandardWrapperValve.java

Posted by Remy Maucherat <re...@apache.org>.
Jeanfrancois Arcand wrote:
> Hi Remy,
> 
> the Administration Tool throw the following exception with your latest 
> change in ApplicationFilterFactory
> 
> java.lang.ClassCastException
>    at 
> org.apache.catalina.core.ApplicationFilterFactory.createFilterChain(ApplicationFilterFactory.java:150) 
> 
>    at 
> org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:713) 
> 
>    at 
> org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:464) 
> 
> 
> The problem is at line
> 
>  +        if (securityManager == null) {
>  +            Request req = (Request) request;
> 
> The request is an instance of 
> org.apache.catalina.core.ApplicationHttpRequest, who extends 
> HttpServletRequestWrapper and who cannot be casted into a Request object 
> (IMBW). I will investigate further....
> 
> Any ideas?

I experimented with using an instanceof, as saving an object allocation 
seems like a good idea. Let me know if there's a problem, and I'll fix 
it tomorrow (going to bed now; yawn :) ).

Remy


--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


Re: cvs commit: jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core StandardValveContext.java ApplicationFilterChain.java ApplicationFilterFactory.java DummyRequest.java StandardPipeline.java StandardWrapperValve.java

Posted by Remy Maucherat <re...@apache.org>.
Jeanfrancois Arcand wrote:
> Hi Remy,
> 
> the Administration Tool throw the following exception with your latest 
> change in ApplicationFilterFactory
> 
> java.lang.ClassCastException
>    at 
> org.apache.catalina.core.ApplicationFilterFactory.createFilterChain(ApplicationFilterFactory.java:150) 
> 
>    at 
> org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:713) 
> 
>    at 
> org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:464) 
> 
> 
> The problem is at line
> 
>  +        if (securityManager == null) {
>  +            Request req = (Request) request;
> 
> The request is an instance of 
> org.apache.catalina.core.ApplicationHttpRequest, who extends 
> HttpServletRequestWrapper and who cannot be casted into a Request object 
> (IMBW). I will investigate further....
> 
> Any ideas?

I forgot some cases, apparently. I'll revert part of the changes 
tomorrow and work on improving the filter chain instead of trying to 
recycle it (using a complex collection is really overkill).

Remy


--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


Re: cvs commit: jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core StandardValveContext.java ApplicationFilterChain.java ApplicationFilterFactory.java DummyRequest.java StandardPipeline.java StandardWrapperValve.java

Posted by Jeanfrancois Arcand <je...@sun.com>.
Hi Remy,

the Administration Tool throw the following exception with your latest 
change in ApplicationFilterFactory

java.lang.ClassCastException
    at 
org.apache.catalina.core.ApplicationFilterFactory.createFilterChain(ApplicationFilterFactory.java:150)
    at 
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:713)
    at 
org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:464)

The problem is at line

  +        if (securityManager == null) {
  +            Request req = (Request) request;

The request is an instance of 
org.apache.catalina.core.ApplicationHttpRequest, who extends 
HttpServletRequestWrapper and who cannot be casted into a Request object 
(IMBW). I will investigate further....

Any ideas?

-- Jeanfrancois

 



remm@apache.org wrote:

>remm        2002/11/25 13:03:50
>
>  Modified:    catalina/src/share/org/apache/catalina/core
>                        ApplicationFilterChain.java
>                        ApplicationFilterFactory.java DummyRequest.java
>                        StandardPipeline.java StandardWrapperValve.java
>  Added:       catalina/src/share/org/apache/catalina/core
>                        StandardValveContext.java
>  Log:
>  - Optimize valves and filters processing (more optimization of
>    the filter part coming).
>  - Use request fields instead of allocating objects on each invocation.
>  
>  Revision  Changes    Path
>  1.4       +5 -5      jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/ApplicationFilterChain.java
>  
>  Index: ApplicationFilterChain.java
>  ===================================================================
>  RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/ApplicationFilterChain.java,v
>  retrieving revision 1.3
>  retrieving revision 1.4
>  diff -u -r1.3 -r1.4
>  --- ApplicationFilterChain.java	16 Oct 2002 15:42:09 -0000	1.3
>  +++ ApplicationFilterChain.java	25 Nov 2002 21:03:50 -0000	1.4
>  @@ -329,7 +329,7 @@
>       void release() {
>   
>           this.filters.clear();
>  -        this.iterator = iterator;
>  +        this.iterator = null;
>           this.servlet = null;
>   
>       }
>  
>  
>  
>  1.4       +18 -4     jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/ApplicationFilterFactory.java
>  
>  Index: ApplicationFilterFactory.java
>  ===================================================================
>  RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/ApplicationFilterFactory.java,v
>  retrieving revision 1.3
>  retrieving revision 1.4
>  diff -u -r1.3 -r1.4
>  --- ApplicationFilterFactory.java	12 Sep 2002 00:09:27 -0000	1.3
>  +++ ApplicationFilterFactory.java	25 Nov 2002 21:03:50 -0000	1.4
>  @@ -98,6 +98,9 @@
>       public static final String DISPATCHER_TYPE_ATTR="org.apache.catalina.core.DISPATCHER_TYPE";
>       public static final String DISPATCHER_REQUEST_PATH_ATTR="org.apache.catalina.core.DISPATCHER_REQUEST_PATH";
>   
>  +    private static final SecurityManager securityManager = 
>  +        System.getSecurityManager();
>  +
>       // ----------------------------------------------------------- Constructors
>   
>   
>  @@ -142,7 +145,18 @@
>               return (null);
>   
>           // Create and initialize a filter chain object
>  -        ApplicationFilterChain filterChain = new ApplicationFilterChain();
>  +        ApplicationFilterChain filterChain = null;
>  +        if (securityManager == null) {
>  +            Request req = (Request) request;
>  +            filterChain = (ApplicationFilterChain) req.getFilterChain();
>  +            if (filterChain == null) {
>  +                filterChain = new ApplicationFilterChain();
>  +                req.setFilterChain(filterChain);
>  +            }
>  +        } else {
>  +            // Security: Do not recycle
>  +            filterChain = new ApplicationFilterChain();
>  +        }
>   
>           filterChain.setServlet(servlet);
>   
>  
>  
>  
>  1.2       +25 -4     jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/DummyRequest.java
>  
>  Index: DummyRequest.java
>  ===================================================================
>  RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/DummyRequest.java,v
>  retrieving revision 1.1
>  retrieving revision 1.2
>  diff -u -r1.1 -r1.2
>  --- DummyRequest.java	9 Oct 2002 08:01:11 -0000	1.1
>  +++ DummyRequest.java	25 Nov 2002 21:03:50 -0000	1.2
>  @@ -91,6 +91,7 @@
>   import javax.naming.NamingException;
>   import javax.naming.Binding;
>   import javax.naming.directory.DirContext;
>  +import javax.servlet.FilterChain;
>   import javax.servlet.RequestDispatcher;
>   import javax.servlet.Servlet;
>   import javax.servlet.ServletContext;
>  @@ -112,6 +113,7 @@
>   import org.apache.catalina.HttpRequest;
>   import org.apache.catalina.Logger;
>   import org.apache.catalina.Response;
>  +import org.apache.catalina.ValveContext;
>   import org.apache.catalina.Wrapper;
>   import org.apache.catalina.deploy.ApplicationParameter;
>   import org.apache.catalina.util.Enumerator;
>  @@ -149,6 +151,9 @@
>       protected String servletPath = null;
>       protected Wrapper wrapper = null;
>   
>  +    protected FilterChain filterChain = null;
>  +    protected ValveContext valveContext = null;
>  +
>       public String getContextPath() {
>           return (contextPath);
>       }
>  @@ -161,6 +166,14 @@
>           return decodedURI;
>       }
>   
>  +    public FilterChain getFilterChain() {
>  +        return (this.filterChain);
>  +    }
>  +
>  +    public void setFilterChain(FilterChain filterChain) {
>  +        this.filterChain = filterChain;
>  +    }
>  +
>       public String getQueryString() {
>           return queryString;
>       }
>  @@ -183,6 +196,14 @@
>   
>       public void setServletPath(String path) {
>           servletPath = path;
>  +    }
>  +
>  +    public ValveContext getValveContext() {
>  +        return (this.valveContext);
>  +    }
>  +
>  +    public void setValveContext(ValveContext valveContext) {
>  +        this.valveContext = valveContext;
>       }
>   
>       public Wrapper getWrapper() {
>  
>  
>  
>  1.2       +14 -75    jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardPipeline.java
>  
>  Index: StandardPipeline.java
>  ===================================================================
>  RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardPipeline.java,v
>  retrieving revision 1.1
>  retrieving revision 1.2
>  diff -u -r1.1 -r1.2
>  --- StandardPipeline.java	18 Jul 2002 16:48:13 -0000	1.1
>  +++ StandardPipeline.java	25 Nov 2002 21:03:50 -0000	1.2
>  @@ -477,7 +477,17 @@
>           throws IOException, ServletException {
>   
>           // Invoke the first Valve in this pipeline for this request
>  -        (new StandardPipelineValveContext()).invokeNext(request, response);
>  +        //(new StandardPipelineValveContext()).invokeNext(request, response);
>  +
>  +        StandardValveContext valveContext = 
>  +            (StandardValveContext) request.getValveContext();
>  +        if (valveContext == null) {
>  +            valveContext = new StandardValveContext();
>  +            request.setValveContext(valveContext);
>  +        }
>  +
>  +        valveContext.set(basic, valves);
>  +        valveContext.invokeNext(request, response);
>   
>       }
>   
>  @@ -577,77 +587,6 @@
>                                  "]: " + message);
>               throwable.printStackTrace(System.out);
>           }
>  -
>  -    }
>  -
>  -
>  -    // ------------------------------- StandardPipelineValveContext Inner Class
>  -
>  -
>  -    protected class StandardPipelineValveContext
>  -        implements ValveContext {
>  -
>  -
>  -        // ------------------------------------------------- Instance Variables
>  -
>  -
>  -        protected int stage = 0;
>  -
>  -
>  -        // --------------------------------------------------------- Properties
>  -
>  -
>  -        /**
>  -          * Return descriptive information about this ValveContext 
>  -          * implementation.
>  -          */
>  -        public String getInfo() {
>  -            return info;
>  -        }
>  -
>  -
>  -        // ----------------------------------------------------- Public Methods
>  -
>  -
>  -        /**
>  -         * Cause the <code>invoke()</code> method of the next Valve that is 
>  -         * part of the Pipeline currently being processed (if any) to be 
>  -         * executed, passing on the specified request and response objects 
>  -         * plus this <code>ValveContext</code> instance.  Exceptions thrown by
>  -         * a subsequently executed Valve (or a Filter or Servlet at the 
>  -         * application level) will be passed on to our caller.
>  -         *
>  -         * If there are no more Valves to be executed, an appropriate
>  -         * ServletException will be thrown by this ValveContext.
>  -         *
>  -         * @param request The request currently being processed
>  -         * @param response The response currently being created
>  -         *
>  -         * @exception IOException if thrown by a subsequent Valve, Filter, or
>  -         *  Servlet
>  -         * @exception ServletException if thrown by a subsequent Valve, Filter,
>  -         *  or Servlet
>  -         * @exception ServletException if there are no further Valves 
>  -         *  configured in the Pipeline currently being processed
>  -         */
>  -        public void invokeNext(Request request, Response response)
>  -            throws IOException, ServletException {
>  -
>  -            int subscript = stage;
>  -            stage = stage + 1;
>  -
>  -            // Invoke the requested Valve for the current request thread
>  -            if (subscript < valves.length) {
>  -                valves[subscript].invoke(request, response, this);
>  -            } else if ((subscript == valves.length) && (basic != null)) {
>  -                basic.invoke(request, response, this);
>  -            } else {
>  -                throw new ServletException
>  -                    (sm.getString("standardPipeline.noValve"));
>  -            }
>  -
>  -        }
>  -
>   
>       }
>   
>  
>  
>  
>  1.7       +6 -5      jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardWrapperValve.java
>  
>  Index: StandardWrapperValve.java
>  ===================================================================
>  RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardWrapperValve.java,v
>  retrieving revision 1.6
>  retrieving revision 1.7
>  diff -u -r1.6 -r1.7
>  --- StandardWrapperValve.java	9 Oct 2002 12:52:40 -0000	1.6
>  +++ StandardWrapperValve.java	25 Nov 2002 21:03:50 -0000	1.7
>  @@ -262,7 +262,8 @@
>           ApplicationFilterFactory factory = 
>               ApplicationFilterFactory.getInstance();
>           ApplicationFilterChain filterChain = 
>  -            factory.createFilterChain(sreq, wrapper, servlet);
>  +            factory.createFilterChain((ServletRequest) request, 
>  +                                      wrapper, servlet);
>   
>           // Call the filter chain for this request
>           // NOTE: This also calls the servlet's service() method
>  
>  
>  
>  1.1                  jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardValveContext.java
>  
>  Index: StandardValveContext.java
>  ===================================================================
>  /*
>   * $Header: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardValveContext.java,v 1.1 2002/11/25 21:03:50 remm Exp $
>   * $Revision: 1.1 $
>   * $Date: 2002/11/25 21:03:50 $
>   *
>   * ====================================================================
>   *
>   * The Apache Software License, Version 1.1
>   *
>   * Copyright (c) 1999-2001 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.catalina.core;
>  
>  
>  import java.io.IOException;
>  import javax.servlet.ServletException;
>  import org.apache.catalina.Request;
>  import org.apache.catalina.Response;
>  import org.apache.catalina.Valve;
>  import org.apache.catalina.ValveContext;
>  import org.apache.catalina.util.StringManager;
>  
>  
>  /**
>   * Standard implementation of a <code>ValveContext</code>.
>   *
>   * @author Craig R. McClanahan
>   * @author Remy Maucherat
>   */
>  
>  public class StandardValveContext
>      implements ValveContext {
>  
>  
>      // ----------------------------------------------------- Instance Variables
>  
>  
>      /**
>       * The string manager for this package.
>       */
>      protected static StringManager sm =
>          StringManager.getManager(Constants.Package);
>  
>  
>      protected String info = 
>          "org.apache.catalina.core.StandardValveContext/1.0";
>      protected int stage = 0;
>      protected Valve basic = null;
>      protected Valve valves[] = null;
>  
>  
>      // ------------------------------------------------------------- Properties
>  
>  
>      /**
>       * Return descriptive information about this ValveContext 
>       * implementation.
>       */
>      public String getInfo() {
>          return info;
>      }
>  
>  
>      // --------------------------------------------------------- Public Methods
>  
>  
>      /**
>       * Cause the <code>invoke()</code> method of the next Valve that is 
>       * part of the Pipeline currently being processed (if any) to be 
>       * executed, passing on the specified request and response objects 
>       * plus this <code>ValveContext</code> instance.  Exceptions thrown by
>       * a subsequently executed Valve (or a Filter or Servlet at the 
>       * application level) will be passed on to our caller.
>       *
>       * If there are no more Valves to be executed, an appropriate
>       * ServletException will be thrown by this ValveContext.
>       *
>       * @param request The request currently being processed
>       * @param response The response currently being created
>       *
>       * @exception IOException if thrown by a subsequent Valve, Filter, or
>       *  Servlet
>       * @exception ServletException if thrown by a subsequent Valve, Filter,
>       *  or Servlet
>       * @exception ServletException if there are no further Valves 
>       *  configured in the Pipeline currently being processed
>       */
>      public void invokeNext(Request request, Response response)
>          throws IOException, ServletException {
>  
>          int subscript = stage;
>          stage = stage + 1;
>  
>          // Invoke the requested Valve for the current request thread
>          if (subscript < valves.length) {
>              valves[subscript].invoke(request, response, this);
>          } else if ((subscript == valves.length) && (basic != null)) {
>              basic.invoke(request, response, this);
>          } else {
>              throw new ServletException
>                  (sm.getString("standardPipeline.noValve"));
>          }
>  
>      }
>  
>  
>      // -------------------------------------------------------- Package Methods
>  
>  
>      /**
>       * Reset state.
>       */
>      void set(Valve basic, Valve valves[]) {
>          stage = 0;
>          this.basic = basic;
>          this.valves = valves;
>      }
>  
>  
>  }
>  
>  
>  
>  
>
>--
>To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
>For additional commands, e-mail: <ma...@jakarta.apache.org>
>
>
>  
>


--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>