Author: markt
Date: Thu Feb 17 10:32:07 2011
New Revision: 1071565

URL: http://svn.apache.org/viewvc?rev=1071565&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=50789
Provide an option to enable ServletRequestListeners for forwards as required by 
some CDI frameworks.

Modified:
    tomcat/trunk/java/org/apache/catalina/Context.java
    tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java
    tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
    tomcat/trunk/webapps/docs/changelog.xml
    tomcat/trunk/webapps/docs/config/context.xml

Modified: tomcat/trunk/java/org/apache/catalina/Context.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/Context.java?rev=1071565&r1=1071564&r2=1071565&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/Context.java (original)
+++ tomcat/trunk/java/org/apache/catalina/Context.java Thu Feb 17 10:32:07 2011
@@ -1315,5 +1315,18 @@ public interface Context extends Contain
      * deployment. If not specified, defaults to the empty string.
      */
     public String getWebappVersion();
+    
+    /**
+     * Configure whether or not requests listeners will be fired on forwards 
for
+     * this Context.
+     */
+    public void setFireRequestListenersOnForwards(boolean enable);
+
+    /**
+     * Determine whether or not requests listeners will be fired on forwards 
for
+     * this Context.
+     */
+    public boolean getFireRequestListenersOnForwards();
+    
 }
 

Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java?rev=1071565&r1=1071564&r2=1071565&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java Thu 
Feb 17 10:32:07 2011
@@ -453,19 +453,31 @@ final class ApplicationDispatcher
                 
         DispatcherType disInt = (DispatcherType) 
request.getAttribute(ApplicationFilterFactory.DISPATCHER_TYPE_ATTR);
         if (disInt != null) {
-            if (disInt != DispatcherType.ERROR) {
-                state.outerRequest.setAttribute
-                    (ApplicationFilterFactory.DISPATCHER_REQUEST_PATH_ATTR,
-                     getCombinedPath());
-                state.outerRequest.setAttribute
-                    (ApplicationFilterFactory.DISPATCHER_TYPE_ATTR,
-                     DispatcherType.FORWARD);
-                invoke(state.outerRequest, response, state);
-            } else {
-                invoke(state.outerRequest, response, state);
+            boolean doInvoke = true;
+            
+            if (context.getFireRequestListenersOnForwards() &&
+                    !context.fireRequestInitEvent(request)) {
+                doInvoke = false;
+            }
+
+            if (doInvoke) {
+                if (disInt != DispatcherType.ERROR) {
+                    state.outerRequest.setAttribute
+                        (ApplicationFilterFactory.DISPATCHER_REQUEST_PATH_ATTR,
+                         getCombinedPath());
+                    state.outerRequest.setAttribute
+                        (ApplicationFilterFactory.DISPATCHER_TYPE_ATTR,
+                         DispatcherType.FORWARD);
+                    invoke(state.outerRequest, response, state);
+                } else {
+                    invoke(state.outerRequest, response, state);
+                }
+                
+                if (context.getFireRequestListenersOnForwards()) {
+                    context.fireRequestDestroyEvent(request);
+                }
             }
         }
-
     }
     
     

Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContext.java?rev=1071565&r1=1071564&r2=1071565&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Thu Feb 17 
10:32:07 2011
@@ -833,10 +833,24 @@ public class StandardContext extends Con
     private String webappVersion = "";
 
     private boolean addWebinfClassesResources = false;
+    
+    private boolean fireRequestListenersOnForwards = false;
 
     // ----------------------------------------------------- Context Properties
 
 
+    @Override
+    public void setFireRequestListenersOnForwards(boolean enable) {
+        fireRequestListenersOnForwards = enable;
+    }
+
+
+    @Override
+    public boolean getFireRequestListenersOnForwards() {
+        return fireRequestListenersOnForwards;
+    }
+
+
     public void setAddWebinfClassesResources(
             boolean addWebinfClassesResources) {
         this.addWebinfClassesResources = addWebinfClassesResources;

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1071565&r1=1071564&r2=1071565&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Thu Feb 17 10:32:07 2011
@@ -89,6 +89,10 @@
         class. (markt)
       </fix>
       <fix>
+        <bug>50789</bug>: Provide an option to enable ServletRequestListeners
+        for forwards as required by some CDI frameworks. (markt)
+      </fix>
+      <fix>
         <bug>50793</bug>: When processing Servlet 3.0 async requests, ensure
         that the requestInitialized and requestDestroyed events are only fired
         once per request at the correct times. (markt)

Modified: tomcat/trunk/webapps/docs/config/context.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/context.xml?rev=1071565&r1=1071564&r2=1071565&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/config/context.xml (original)
+++ tomcat/trunk/webapps/docs/config/context.xml Thu Feb 17 10:32:07 2011
@@ -240,6 +240,15 @@
         sufficient.</p>
       </attribute>
 
+      <attribute name="fireRequestListenersOnForwards" required="false">
+        <p>Set to <code>true</code> to fire any configured
+        ServletRequestListeners  when Tomcat forwards a request. This is
+        primarily of use to users of CDI frameworks that use
+        ServletRequestListeners to configure the necessary environment for a
+        request. If not specified, the default value of <code>false</code> is
+        used.</p>
+      </attribute>
+
       <attribute name="logEffectiveWebXml" required="false">
         <p>Set to <code>true</code> if you want the effective web.xml used for 
a
         web application to be logged (at INFO level) when the application



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to