tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ma...@apache.org
Subject svn commit: r490093 - /tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/core/ApplicationDispatcher.java
Date Mon, 25 Dec 2006 01:04:37 GMT
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: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Mime
View raw message