Author: markt
Date: Mon Dec 15 16:18:31 2014
New Revision: 1645686

URL: http://svn.apache.org/r1645686
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=57326
Enable AsyncListeners to re-register themselves through 
AsyncListener.onStartAsync ()

Modified:
    tomcat/tc8.0.x/trunk/   (props changed)
    tomcat/tc8.0.x/trunk/java/org/apache/catalina/core/AsyncContextImpl.java
    tomcat/tc8.0.x/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java
    tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml

Propchange: tomcat/tc8.0.x/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Dec 15 16:18:31 2014
@@ -1 +1 @@
-/tomcat/trunk:1636524,1637156,1637176,1637188,1637331,1637684,1637695,1638720-1638725,1639653,1640010,1640083-1640084,1640088,1640275,1640322,1640347,1640361,1640365,1640403,1640410,1640652,1640655-1640658,1640688,1640700-1640883,1640903,1640976,1640978,1641000,1641026,1641038-1641039,1641051-1641052,1641058,1641064,1641300,1641369,1641374,1641380,1641486,1641634,1641656-1641692,1641704,1641707-1641718,1641720-1641722,1641735,1641981,1642233,1642280,1642554,1642564,1642595,1642606,1642668,1642679,1642697,1642699,1642766,1643002,1643045,1643054-1643055,1643066,1643121,1643128,1643206,1643209-1643210,1643216,1643249,1643270,1643283,1643309-1643310,1643323,1643365-1643366,1643370-1643371,1643465,1643474,1643536,1643570,1643634,1643649,1643651,1643654,1643675,1643731,1643733-1643734,1643761,1643766,1643814,1643937,1643963,1644017,1644169,1644201-1644203,1644321,1644323,1644516,1644523,1644529,1644535,1644730,1644768,1644784-1644785,1644790,1644793,1644815,1644884,1644886,1644890,1644892
 
,1644910,1644924,1644929-1644930,1644935,1644989,1645011,1645247,1645355,1645357,1645455,1645465,1645469,1645471,1645473,1645475,1645487,1645626,1645641
+/tomcat/trunk:1636524,1637156,1637176,1637188,1637331,1637684,1637695,1638720-1638725,1639653,1640010,1640083-1640084,1640088,1640275,1640322,1640347,1640361,1640365,1640403,1640410,1640652,1640655-1640658,1640688,1640700-1640883,1640903,1640976,1640978,1641000,1641026,1641038-1641039,1641051-1641052,1641058,1641064,1641300,1641369,1641374,1641380,1641486,1641634,1641656-1641692,1641704,1641707-1641718,1641720-1641722,1641735,1641981,1642233,1642280,1642554,1642564,1642595,1642606,1642668,1642679,1642697,1642699,1642766,1643002,1643045,1643054-1643055,1643066,1643121,1643128,1643206,1643209-1643210,1643216,1643249,1643270,1643283,1643309-1643310,1643323,1643365-1643366,1643370-1643371,1643465,1643474,1643536,1643570,1643634,1643649,1643651,1643654,1643675,1643731,1643733-1643734,1643761,1643766,1643814,1643937,1643963,1644017,1644169,1644201-1644203,1644321,1644323,1644516,1644523,1644529,1644535,1644730,1644768,1644784-1644785,1644790,1644793,1644815,1644884,1644886,1644890,1644892
 
,1644910,1644924,1644929-1644930,1644935,1644989,1645011,1645247,1645355,1645357,1645455,1645465,1645469,1645471,1645473,1645475,1645487,1645626,1645641,1645685

Modified: 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/core/AsyncContextImpl.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/core/AsyncContextImpl.java?rev=1645686&r1=1645685&r2=1645686&view=diff
==============================================================================
--- tomcat/tc8.0.x/trunk/java/org/apache/catalina/core/AsyncContextImpl.java 
(original)
+++ tomcat/tc8.0.x/trunk/java/org/apache/catalina/core/AsyncContextImpl.java 
Mon Dec 15 16:18:31 2014
@@ -339,6 +339,7 @@ public class AsyncContextImpl implements
 
         List<AsyncListenerWrapper> listenersCopy = new ArrayList<>();
         listenersCopy.addAll(listeners);
+        listeners.clear();
         for (AsyncListenerWrapper listener : listenersCopy) {
             try {
                 listener.fireOnStartAsync(event);
@@ -348,7 +349,6 @@ public class AsyncContextImpl implements
                         listener.getClass().getName() + "]", t);
             }
         }
-        listeners.clear();
     }
 
     @Override

Modified: 
tomcat/tc8.0.x/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java?rev=1645686&r1=1645685&r2=1645686&view=diff
==============================================================================
--- 
tomcat/tc8.0.x/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java 
(original)
+++ 
tomcat/tc8.0.x/trunk/test/org/apache/catalina/core/TestAsyncContextImpl.java 
Mon Dec 15 16:18:31 2014
@@ -31,6 +31,7 @@ import javax.servlet.AsyncListener;
 import javax.servlet.DispatcherType;
 import javax.servlet.GenericServlet;
 import javax.servlet.RequestDispatcher;
+import javax.servlet.Servlet;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletRequestEvent;
@@ -463,8 +464,7 @@ public class TestAsyncContextImpl extend
         // No file system docBase required
         Context ctx = tomcat.addContext("", null);
 
-        TimeoutServlet timeout =
-                new TimeoutServlet(completeOnTimeout, dispatchUrl);
+        TimeoutServlet timeout = new TimeoutServlet(completeOnTimeout, 
dispatchUrl);
 
         Wrapper wrapper = Tomcat.addServlet(ctx, "time", timeout);
         wrapper.setAsyncSupported(true);
@@ -859,6 +859,21 @@ public class TestAsyncContextImpl extend
         }
     }
 
+    private static class StickyTrackingListener extends TrackingListener {
+
+        public StickyTrackingListener(boolean completeOnError,
+                boolean completeOnTimeout, String dispatchUrl) {
+            super(completeOnError, completeOnTimeout, dispatchUrl);
+        }
+
+        @Override
+        public void onStartAsync(AsyncEvent event) throws IOException {
+            super.onStartAsync(event);
+            // Re-add this listener to the new AsyncContext
+            event.getAsyncContext().addListener(this);
+        }
+    }
+
     public static class TrackingRequestListener
             implements ServletRequestListener {
 
@@ -2066,4 +2081,67 @@ public class TestAsyncContextImpl extend
         }
         Assert.assertEquals(expectedTrack, getTrack());
     }
+
+
+    // https://issues.apache.org/bugzilla/show_bug.cgi?id=57326
+    @Test
+    public void testAsyncContextListenerClearing() throws Exception {
+        resetTracker();
+
+        // Setup Tomcat instance
+        Tomcat tomcat = getTomcatInstance();
+
+        // No file system docBase required
+        Context ctx = tomcat.addContext("", null);
+
+        Servlet stage1 = new DispatchingServletTracking("/stage2", true);
+        Wrapper wrapper1 = Tomcat.addServlet(ctx, "stage1", stage1);
+        wrapper1.setAsyncSupported(true);
+        ctx.addServletMapping("/stage1", "stage1");
+
+        Servlet stage2 = new DispatchingServletTracking("/stage3", false);
+        Wrapper wrapper2 = Tomcat.addServlet(ctx, "stage2", stage2);
+        wrapper2.setAsyncSupported(true);
+        ctx.addServletMapping("/stage2", "stage2");
+
+        Servlet stage3 = new NonAsyncServlet();
+        Tomcat.addServlet(ctx, "stage3", stage3);
+        ctx.addServletMapping("/stage3", "stage3");
+
+        TesterAccessLogValve alv = new TesterAccessLogValve();
+        ctx.getPipeline().addValve(alv);
+
+        tomcat.start();
+
+        getUrl("http://localhost:"; + getPort()+ "/stage1");
+
+        
assertEquals("doGet-startAsync-doGet-startAsync-onStartAsync-NonAsyncServletGet-onComplete-",
 getTrack());
+
+        // Check the access log
+        alv.validateAccessLog(1, 200, 0, REQUEST_TIME);
+    }
+
+    private static class DispatchingServletTracking extends HttpServlet {
+
+        private static final long serialVersionUID = 1L;
+
+        private final String target;
+        private final boolean addTrackingListener;
+
+        public DispatchingServletTracking(String target, boolean 
addTrackingListener) {
+            this.target = target;
+            this.addTrackingListener = addTrackingListener;
+        }
+
+        @Override
+        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+                throws ServletException, IOException {
+            track("doGet-startAsync-");
+            AsyncContext ac = req.startAsync();
+            if (addTrackingListener) {
+                ac.addListener(new StickyTrackingListener(false, false, null));
+            }
+            ac.dispatch(target);
+         }
+    }
 }

Modified: tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml?rev=1645686&r1=1645685&r2=1645686&view=diff
==============================================================================
--- tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml Mon Dec 15 16:18:31 2014
@@ -152,6 +152,11 @@
         extending. (violetagg)
       </update>
       <fix>
+        <bug>57326</bug>: Enable <code>AsyncListener</code> implementations to
+        re-register themselves during <code>AsyncListener.onStartAsync</code>.
+        (markt)
+      </fix>
+      <fix>
         <bug>57331</bug>: Allow ExpiresFilter to use "year" as synonym for
         "years" in its configuration. (kkolinko)
       </fix>



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

Reply via email to