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
[EMAIL PROTECTED] 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 [EMAIL PROTECTED]
*
* 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: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>