Author: markt
Date: Sun Dec 24 17:04:36 2006
New Revision: 490093
URL: http://svn.apache.org/viewvc?view=rev&rev=490093
Log:
Revert my thread safety patch - it was bad.
I do intend to commit a revised patch after some further testing.
Modified:
tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/core/ApplicationDispatcher.java
Modified:
tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/core/ApplicationDispatcher.java
URL:
http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/core/ApplicationDispatcher.java?view=diff&rev=490093&r1=490092&r2=490093
==============================================================================
---
tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/core/ApplicationDispatcher.java
(original)
+++
tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/core/ApplicationDispatcher.java
Sun Dec 24 17:04:36 2006
@@ -131,6 +131,7 @@
this.context = (Context) wrapper.getParent();
this.requestURI = requestURI;
this.servletPath = servletPath;
+ this.origServletPath = servletPath;
this.pathInfo = pathInfo;
this.queryString = queryString;
this.name = name;
@@ -152,12 +153,30 @@
private static Log log = LogFactory.getLog(ApplicationDispatcher.class);
/**
+ * The request specified by the dispatching application.
+ */
+ private ServletRequest appRequest = null;
+
+
+ /**
+ * The response specified by the dispatching application.
+ */
+ private ServletResponse appResponse = null;
+
+
+ /**
* The Context this RequestDispatcher is associated with.
*/
private Context context = null;
/**
+ * Are we performing an include() instead of a forward()?
+ */
+ private boolean including = false;
+
+
+ /**
* Descriptive information about this implementation.
*/
private static final String info =
@@ -171,6 +190,18 @@
/**
+ * The outermost request that will be passed on to the invoked servlet.
+ */
+ private ServletRequest outerRequest = null;
+
+
+ /**
+ * The outermost response that will be passed on to the invoked servlet.
+ */
+ private ServletResponse outerResponse = null;
+
+
+ /**
* The extra path information for this RequestDispatcher.
*/
private String pathInfo = null;
@@ -187,13 +218,13 @@
*/
private String requestURI = null;
-
/**
* The servlet path for this RequestDispatcher.
*/
private String servletPath = null;
-
+ private String origServletPath = null;
+
/**
* The StringManager for this package.
*/
@@ -215,6 +246,18 @@
private Wrapper wrapper = null;
+ /**
+ * The request wrapper we have created and installed (if any).
+ */
+ private ServletRequest wrapRequest = null;
+
+
+ /**
+ * The response wrapper we have created and installed (if any).
+ */
+ private ServletResponse wrapResponse = null;
+
+
// ------------------------------------------------------------- Properties
@@ -280,12 +323,11 @@
}
// Set up to handle the specified request and response
- ServletRequest outerRequest = request;
- ServletResponse outerResponse = response;
-
+ setup(request, response, false);
+
if (Globals.STRICT_SERVLET_COMPLIANCE) {
// Check SRV.8.2 / SRV.14.2.5.1 compliance
- checkSameObjects(request, response);
+ checkSameObjects();
}
// Identify the HTTP-specific request and response objects (if any)
@@ -301,9 +343,8 @@
if ( log.isDebugEnabled() )
log.debug(" Non-HTTP Forward");
- // TODO - this doesn't appear to agree with the comments above
- processRequest(hrequest,hresponse,outerRequest,outerResponse,null,
- null);
+
+ processRequest(hrequest,hresponse);
}
@@ -314,18 +355,17 @@
log.debug(" Named Dispatcher Forward");
ApplicationHttpRequest wrequest =
- (ApplicationHttpRequest) wrapRequest(outerRequest);
+ (ApplicationHttpRequest) wrapRequest();
wrequest.setRequestURI(hrequest.getRequestURI());
wrequest.setContextPath(hrequest.getContextPath());
wrequest.setServletPath(hrequest.getServletPath());
wrequest.setPathInfo(hrequest.getPathInfo());
wrequest.setQueryString(hrequest.getQueryString());
- processRequest(request,response,outerRequest,outerResponse,
- wrequest,null);
+ processRequest(request,response);
wrequest.recycle();
- unwrapRequest(outerRequest, wrequest);
+ unwrapRequest();
}
@@ -336,7 +376,7 @@
log.debug(" Path Based Forward");
ApplicationHttpRequest wrequest =
- (ApplicationHttpRequest) wrapRequest(outerRequest);
+ (ApplicationHttpRequest) wrapRequest();
String contextPath = context.getPath();
if (hrequest.getAttribute(Globals.FORWARD_REQUEST_URI_ATTR) ==
null) {
@@ -361,11 +401,10 @@
wrequest.setQueryParams(queryString);
}
-
processRequest(request,response,outerRequest,outerResponse,wrequest,
- null);
+ processRequest(request,response);
wrequest.recycle();
- unwrapRequest(outerRequest, wrequest);
+ unwrapRequest();
}
@@ -414,11 +453,7 @@
* @exception ServletException if a servlet error occurs
*/
private void processRequest(ServletRequest request,
- ServletResponse response,
- ServletRequest outerRequest,
- ServletResponse outerResponse,
- ServletRequest wrapRequest,
- ServletResponse wrapResponse)
+ ServletResponse response)
throws IOException, ServletException {
Integer disInt = (Integer) request.getAttribute
@@ -427,15 +462,13 @@
if (disInt.intValue() != ApplicationFilterFactory.ERROR) {
outerRequest.setAttribute
(ApplicationFilterFactory.DISPATCHER_REQUEST_PATH_ATTR,
- servletPath);
+ origServletPath);
outerRequest.setAttribute
(ApplicationFilterFactory.DISPATCHER_TYPE_ATTR,
new Integer(ApplicationFilterFactory.FORWARD));
- invoke(outerRequest, response, outerRequest, outerResponse,
- wrapRequest, wrapResponse);
+ invoke(outerRequest, response);
} else {
- invoke(outerRequest, response, outerRequest, outerResponse,
- wrapRequest, wrapResponse);
+ invoke(outerRequest, response);
}
}
@@ -477,17 +510,16 @@
throws ServletException, IOException
{
// Set up to handle the specified request and response
- ServletRequest outerRequest = request;
- ServletResponse outerResponse = response;
+ setup(request, response, true);
if (Globals.STRICT_SERVLET_COMPLIANCE) {
// Check SRV.8.2 / SRV.14.2.5.1 compliance
- checkSameObjects(request, response);
+ checkSameObjects();
}
// Create a wrapped response to use for this request
// ServletResponse wresponse = null;
- ServletResponse wresponse = wrapResponse(outerResponse, true);
+ wrapResponse();
// Handle a non-HTTP include
if (!(request instanceof HttpServletRequest) ||
@@ -496,12 +528,9 @@
if ( log.isDebugEnabled() )
log.debug(" Non-HTTP Include");
request.setAttribute(ApplicationFilterFactory.DISPATCHER_TYPE_ATTR,
- new Integer(ApplicationFilterFactory.INCLUDE));
- request.setAttribute(
- ApplicationFilterFactory.DISPATCHER_REQUEST_PATH_ATTR,
- servletPath);
- invoke(request, outerResponse, outerRequest, outerResponse, null,
- wresponse);
+ new
Integer(ApplicationFilterFactory.INCLUDE));
+
request.setAttribute(ApplicationFilterFactory.DISPATCHER_REQUEST_PATH_ATTR,
origServletPath);
+ invoke(request, outerResponse);
}
// Handle an HTTP named dispatcher include
@@ -511,18 +540,14 @@
log.debug(" Named Dispatcher Include");
ApplicationHttpRequest wrequest =
- (ApplicationHttpRequest) wrapRequest(outerRequest);
+ (ApplicationHttpRequest) wrapRequest();
wrequest.setAttribute(Globals.NAMED_DISPATCHER_ATTR, name);
if (servletPath != null)
wrequest.setServletPath(servletPath);
- wrequest.setAttribute(
- ApplicationFilterFactory.DISPATCHER_TYPE_ATTR,
- new Integer(ApplicationFilterFactory.INCLUDE));
- wrequest.setAttribute(
- ApplicationFilterFactory.DISPATCHER_REQUEST_PATH_ATTR,
- servletPath);
- invoke(outerRequest, outerResponse, outerRequest, outerResponse,
- wrequest, wresponse);
+
wrequest.setAttribute(ApplicationFilterFactory.DISPATCHER_TYPE_ATTR,
+ new
Integer(ApplicationFilterFactory.INCLUDE));
+
wrequest.setAttribute(ApplicationFilterFactory.DISPATCHER_REQUEST_PATH_ATTR,
origServletPath);
+ invoke(outerRequest, outerResponse);
wrequest.recycle();
}
@@ -534,7 +559,7 @@
log.debug(" Path Based Include");
ApplicationHttpRequest wrequest =
- (ApplicationHttpRequest) wrapRequest(outerRequest);
+ (ApplicationHttpRequest) wrapRequest();
String contextPath = context.getPath();
if (requestURI != null)
wrequest.setAttribute(Globals.INCLUDE_REQUEST_URI_ATTR,
@@ -544,7 +569,7 @@
contextPath);
if (servletPath != null)
wrequest.setAttribute(Globals.INCLUDE_SERVLET_PATH_ATTR,
- servletPath);
+ servletPath);
if (pathInfo != null)
wrequest.setAttribute(Globals.INCLUDE_PATH_INFO_ATTR,
pathInfo);
@@ -554,14 +579,10 @@
wrequest.setQueryParams(queryString);
}
- wrequest.setAttribute(
- ApplicationFilterFactory.DISPATCHER_TYPE_ATTR,
- new Integer(ApplicationFilterFactory.INCLUDE));
- wrequest.setAttribute(
- ApplicationFilterFactory.DISPATCHER_REQUEST_PATH_ATTR,
- servletPath);
- invoke(outerRequest, outerResponse, outerRequest, outerResponse,
- wrequest, wresponse);
+
wrequest.setAttribute(ApplicationFilterFactory.DISPATCHER_TYPE_ATTR,
+ new
Integer(ApplicationFilterFactory.INCLUDE));
+
wrequest.setAttribute(ApplicationFilterFactory.DISPATCHER_REQUEST_PATH_ATTR,
origServletPath);
+ invoke(outerRequest, outerResponse);
wrequest.recycle();
}
@@ -587,9 +608,7 @@
* @exception IOException if an input/output error occurs
* @exception ServletException if a servlet error occurs
*/
- private void invoke(ServletRequest request, ServletResponse response,
- ServletRequest outerRequest, ServletResponse outerResponse,
- ServletRequest wrapRequest, ServletResponse wrapResponse)
+ private void invoke(ServletRequest request, ServletResponse response)
throws IOException, ServletException {
// Checking to see if the context classloader is the current context
@@ -632,14 +651,12 @@
servlet = wrapper.allocate();
}
} catch (ServletException e) {
- wrapper.getLogger().error(
- sm.getString("applicationDispatcher.allocateException",
+
wrapper.getLogger().error(sm.getString("applicationDispatcher.allocateException",
wrapper.getName()),
StandardWrapper.getRootCause(e));
servletException = e;
servlet = null;
} catch (Throwable e) {
- wrapper.getLogger().error(
- sm.getString("applicationDispatcher.allocateException",
+
wrapper.getLogger().error(sm.getString("applicationDispatcher.allocateException",
wrapper.getName()), e);
servletException = new ServletException
(sm.getString("applicationDispatcher.allocateException",
@@ -649,8 +666,8 @@
// Get the FilterChain Here
ApplicationFilterFactory factory =
ApplicationFilterFactory.getInstance();
- ApplicationFilterChain filterChain =
- factory.createFilterChain(request,wrapper,servlet);
+ ApplicationFilterChain filterChain = factory.createFilterChain(request,
+
wrapper,servlet);
// Call the service() method for the allocated servlet instance
try {
String jspFile = wrapper.getJspFile();
@@ -714,8 +731,7 @@
} catch (Throwable e) {
log.error(sm.getString("standardWrapper.releaseFilters",
wrapper.getName()), e);
- //FIXME Exception handling needs to be simpiler to what is in the
- //StandardWrapperValue
+ //FIXME Exception handling needs to be simpiler to what is in the
StandardWrapperValue
}
// Deallocate the allocated servlet instance
@@ -724,13 +740,11 @@
wrapper.deallocate(servlet);
}
} catch (ServletException e) {
- wrapper.getLogger().error(
- sm.getString("applicationDispatcher.deallocateException",
+
wrapper.getLogger().error(sm.getString("applicationDispatcher.deallocateException",
wrapper.getName()), e);
servletException = e;
} catch (Throwable e) {
- wrapper.getLogger().error(
- sm.getString("applicationDispatcher.deallocateException",
+
wrapper.getLogger().error(sm.getString("applicationDispatcher.deallocateException",
wrapper.getName()), e);
servletException = new ServletException
(sm.getString("applicationDispatcher.deallocateException",
@@ -743,8 +757,8 @@
// Unwrap request/response if needed
// See Bugzilla 30949
- unwrapRequest(outerRequest, wrapRequest);
- unwrapResponse(outerResponse, wrapResponse);
+ unwrapRequest();
+ unwrapResponse();
// Rethrow an exception if one was thrown by the invoked servlet
if (ioException != null)
@@ -758,10 +772,29 @@
/**
+ * Set up to handle the specified request and response
+ *
+ * @param request The servlet request specified by the caller
+ * @param response The servlet response specified by the caller
+ * @param including Are we performing an include() as opposed to
+ * a forward()?
+ */
+ private void setup(ServletRequest request, ServletResponse response,
+ boolean including) {
+
+ this.appRequest = request;
+ this.appResponse = response;
+ this.outerRequest = request;
+ this.outerResponse = response;
+ this.including = including;
+
+ }
+
+
+ /**
* Unwrap the request if we have wrapped it.
*/
- private void unwrapRequest(ServletRequest outerRequest,
- ServletRequest wrapRequest) {
+ private void unwrapRequest() {
if (wrapRequest == null)
return;
@@ -798,8 +831,7 @@
/**
* Unwrap the response if we have wrapped it.
*/
- private void unwrapResponse(ServletResponse outerResponse,
- ServletResponse wrapResponse) {
+ private void unwrapResponse() {
if (wrapResponse == null)
return;
@@ -837,7 +869,7 @@
* Create and return a request wrapper that has been inserted in the
* appropriate spot in the request chain.
*/
- private ServletRequest wrapRequest(ServletRequest outerRequest) {
+ private ServletRequest wrapRequest() {
// Locate the request we should insert in front of
ServletRequest previous = null;
@@ -888,6 +920,7 @@
outerRequest = wrapper;
else
((ServletRequestWrapper) previous).setRequest(wrapper);
+ wrapRequest = wrapper;
return (wrapper);
}
@@ -897,8 +930,7 @@
* Create and return a response wrapper that has been inserted in the
* appropriate spot in the response chain.
*/
- private ServletResponse wrapResponse(ServletResponse outerResponse,
- boolean including) {
+ private ServletResponse wrapResponse() {
// Locate the response we should insert in front of
ServletResponse previous = null;
@@ -930,13 +962,13 @@
outerResponse = wrapper;
else
((ServletResponseWrapper) previous).setResponse(wrapper);
+ wrapResponse = wrapper;
return (wrapper);
}
- private void checkSameObjects(ServletRequest appRequest,
- ServletResponse appResponse) throws ServletException {
+ private void checkSameObjects() throws ServletException {
ServletRequest originalRequest =
ApplicationFilterChain.getLastServicedRequest();
ServletResponse originalResponse =
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]