You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2010/10/19 21:52:29 UTC

svn commit: r1024381 - in /tomcat/trunk/java/org/apache/catalina: Context.java core/StandardContext.java core/StandardContextValve.java

Author: markt
Date: Tue Oct 19 19:52:28 2010
New Revision: 1024381

URL: http://svn.apache.org/viewvc?rev=1024381&view=rev
Log:
Re-factor ServletRequestListener events with an eye to https://issues.apache.org/bugzilla/show_bug.cgi?id=49991 and any possible future changes in the Servlet spec

Modified:
    tomcat/trunk/java/org/apache/catalina/Context.java
    tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
    tomcat/trunk/java/org/apache/catalina/core/StandardContextValve.java

Modified: tomcat/trunk/java/org/apache/catalina/Context.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/Context.java?rev=1024381&r1=1024380&r2=1024381&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/Context.java (original)
+++ tomcat/trunk/java/org/apache/catalina/Context.java Tue Oct 19 19:52:28 2010
@@ -24,6 +24,7 @@ import java.util.Set;
 
 import javax.servlet.ServletContainerInitializer;
 import javax.servlet.ServletContext;
+import javax.servlet.ServletRequest;
 import javax.servlet.ServletSecurityElement;
 import javax.servlet.descriptor.JspConfigDescriptor;
 
@@ -1005,6 +1006,20 @@ public interface Context extends Contain
 
 
     /**
+     * Notify all {@link ServletRequestListener}s that a request has started.
+     * @return <code>true</code> if the listeners fire successfully, else
+     *         <code>false</code>
+     */
+    public boolean fireRequestInitEvent(ServletRequest request);
+
+    /**
+     * Notify all {@link ServletRequestListener}s that a request has ended.
+     * @return <code>true</code> if the listeners fire successfully, else
+     *         <code>false</code>
+     */
+    public boolean fireRequestDestroyEvent(ServletRequest request);
+
+    /**
      * Reload this web application, if reloading is supported.
      *
      * @exception IllegalStateException if the <code>reloadable</code>

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=1024381&r1=1024380&r2=1024381&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Tue Oct 19 19:52:28 2010
@@ -48,6 +48,7 @@ import javax.management.NotificationList
 import javax.management.ObjectName;
 import javax.naming.NamingException;
 import javax.naming.directory.DirContext;
+import javax.servlet.DispatcherType;
 import javax.servlet.FilterConfig;
 import javax.servlet.Servlet;
 import javax.servlet.ServletContainerInitializer;
@@ -57,7 +58,9 @@ import javax.servlet.ServletContextEvent
 import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRegistration;
+import javax.servlet.ServletRequest;
 import javax.servlet.ServletRequestAttributeListener;
+import javax.servlet.ServletRequestEvent;
 import javax.servlet.ServletRequestListener;
 import javax.servlet.ServletSecurityElement;
 import javax.servlet.descriptor.JspConfigDescriptor;
@@ -5503,6 +5506,83 @@ public class StandardContext extends Con
         return hostName;
     }
 
+
+    @Override
+    public boolean fireRequestInitEvent(ServletRequest request) {
+
+        Object instances[] = getApplicationEventListeners();
+
+        if ((instances != null) && (instances.length > 0)) {
+
+            ServletRequestEvent event = 
+                    new ServletRequestEvent(getServletContext(), request);
+
+            for (int i = 0; i < instances.length; i++) {
+                if (instances[i] == null)
+                    continue;
+                if (!(instances[i] instanceof ServletRequestListener))
+                    continue;
+                ServletRequestListener listener =
+                    (ServletRequestListener) instances[i];
+                
+                try {
+                    // Don't fire the listener for async requests
+                    if (!DispatcherType.ASYNC.equals(
+                            request.getDispatcherType())) {
+                        listener.requestInitialized(event);
+                    }
+                } catch (Throwable t) {
+                    ExceptionUtils.handleThrowable(t);
+                    getLogger().error(sm.getString(
+                            "standardContext.requestListener.requestInit",
+                            instances[i].getClass().getName()), t);
+                    request.setAttribute(Globals.EXCEPTION_ATTR,t);
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+
+    @Override
+    public boolean fireRequestDestroyEvent(ServletRequest request) {
+        Object instances[] = getApplicationEventListeners();
+
+        if ((instances != null) && (instances.length > 0)) {
+
+            ServletRequestEvent event = 
+                    new ServletRequestEvent(getServletContext(), request);
+
+            for (int i = 0; i < instances.length; i++) {
+                int j = (instances.length -1) -i;
+                if (instances[j] == null)
+                    continue;
+                if (!(instances[j] instanceof ServletRequestListener))
+                    continue;
+                ServletRequestListener listener =
+                    (ServletRequestListener) instances[j];
+                
+                try {
+                    // Don't fire the listener for async requests
+                    if (!DispatcherType.ASYNC.equals(
+                            request.getDispatcherType())) {
+                        listener.requestDestroyed(event);
+                    }
+                } catch (Throwable t) {
+                    ExceptionUtils.handleThrowable(t);
+                    getLogger().error(sm.getString(
+                            "standardContext.requestListener.requestInit",
+                            instances[j].getClass().getName()), t);
+                    request.setAttribute(Globals.EXCEPTION_ATTR,t);
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+
     /**
      * Set the appropriate context attribute for our work directory.
      */

Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContextValve.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContextValve.java?rev=1024381&r1=1024380&r2=1024381&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardContextValve.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardContextValve.java Tue Oct 19 19:52:28 2010
@@ -166,66 +166,15 @@ final class StandardContextValve
             }
         }
 
-        // Normal request processing
-        Object instances[] = context.getApplicationEventListeners();
-
-        ServletRequestEvent event = null;
-
-        if ((instances != null) && (instances.length > 0)) {
-            event = new ServletRequestEvent
-                (((Context) container).getServletContext(), 
-                 request.getRequest());
-            // create pre-service event
-            for (int i = 0; i < instances.length; i++) {
-                if (instances[i] == null)
-                    continue;
-                if (!(instances[i] instanceof ServletRequestListener))
-                    continue;
-                ServletRequestListener listener =
-                    (ServletRequestListener) instances[i];
-                try {
-                    if (!request.isAsyncDispatching()) {
-                        listener.requestInitialized(event);
-                    }
-                } catch (Throwable t) {
-                    ExceptionUtils.handleThrowable(t);
-                    container.getLogger().error(sm.getString(
-                            "standardContext.requestListener.requestInit",
-                            instances[i].getClass().getName()), t);
-                    ServletRequest sreq = request.getRequest();
-                    sreq.setAttribute(Globals.EXCEPTION_ATTR,t);
-                    return;
-                }
+        // If a request init listener throws an exception, the request is
+        // aborted
+        if (context.fireRequestInitEvent(request)) {
+            if (request.isAsyncSupported()) {
+                request.setAsyncSupported(wrapper.getPipeline().isAsyncSupported());
             }
-        }
-        if (request.isAsyncSupported()) {
-            request.setAsyncSupported(wrapper.getPipeline().isAsyncSupported());
-        }
-        wrapper.getPipeline().getFirst().invoke(request, response);
+            wrapper.getPipeline().getFirst().invoke(request, response);
 
-        if ((instances !=null ) && (instances.length > 0)) {
-            // create post-service event
-            for (int i = 0; i < instances.length; i++) {
-                int j = (instances.length -1) -i;
-                if (instances[j] == null)
-                    continue;
-                if (!(instances[j] instanceof ServletRequestListener))
-                    continue;
-                ServletRequestListener listener =
-                    (ServletRequestListener) instances[j];
-                try {
-                    if (!request.isAsyncDispatching()) {
-                        listener.requestDestroyed(event);
-                    }
-                } catch (Throwable t) {
-                    ExceptionUtils.handleThrowable(t);
-                    container.getLogger().error(sm.getString(
-                            "standardContext.requestListener.requestDestroy",
-                            instances[j].getClass().getName()), t);
-                    ServletRequest sreq = request.getRequest();
-                    sreq.setAttribute(Globals.EXCEPTION_ATTR,t);
-                }
-            }
+            context.fireRequestDestroyEvent(request);
         }
     }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org