Repository: wicket
Updated Branches:
  refs/heads/wicket-atmosphere-tester c9a0b8fc1 -> 2a123aebd


WICKET-5619 ConcurrentModificationException may occur when calling 
EventBus.post()

Use Iterables#filter() as suggested at 
com.google.common.collect.Collections2#filter


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/18f269e1
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/18f269e1
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/18f269e1

Branch: refs/heads/wicket-atmosphere-tester
Commit: 18f269e13b4c6f14ede7b44a495c2f0782d1a0f6
Parents: f0eb015
Author: Martin Tzvetanov Grigorov <[email protected]>
Authored: Thu Aug 14 13:28:44 2014 +0200
Committer: Martin Tzvetanov Grigorov <[email protected]>
Committed: Thu Aug 14 13:28:44 2014 +0200

----------------------------------------------------------------------
 .../atmosphere/AtmosphereRequestHandler.java     |  9 +++++----
 .../wicket/atmosphere/AtmosphereWebRequest.java  |  8 ++++----
 .../org/apache/wicket/atmosphere/EventBus.java   | 19 +++++++++++--------
 3 files changed, 20 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/18f269e1/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java
----------------------------------------------------------------------
diff --git 
a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java
 
b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java
index 8824468..3ba143d 100644
--- 
a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java
+++ 
b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java
@@ -16,7 +16,7 @@
  */
 package org.apache.wicket.atmosphere;
 
-import java.util.Collection;
+import java.util.Iterator;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.Page;
@@ -44,7 +44,7 @@ public class AtmosphereRequestHandler implements 
IRequestHandler
 
        private final AtmosphereEvent event;
 
-       private final Collection<EventSubscription> subscriptions;
+       private final Iterator<EventSubscription> subscriptions;
 
        private final EventSubscriptionInvoker eventSubscriptionInvoker;
 
@@ -58,7 +58,7 @@ public class AtmosphereRequestHandler implements 
IRequestHandler
         * @param event
         * @param eventSubscriptionInvoker
         */
-       public AtmosphereRequestHandler(PageKey pageKey, 
Collection<EventSubscription> subscriptions,
+       public AtmosphereRequestHandler(PageKey pageKey, 
Iterator<EventSubscription> subscriptions,
                AtmosphereEvent event, EventSubscriptionInvoker 
eventSubscriptionInvoker)
        {
                this.pageKey = pageKey;
@@ -78,8 +78,9 @@ public class AtmosphereRequestHandler implements 
IRequestHandler
 
        private void executeHandlers(AjaxRequestTarget target, Page page)
        {
-               for (EventSubscription curSubscription : subscriptions)
+               while (subscriptions.hasNext())
                {
+                       EventSubscription curSubscription = 
subscriptions.next();
                        if 
(curSubscription.getContextAwareFilter().apply(event))
                        {
                                String componentPath = 
curSubscription.getComponentPath();

http://git-wip-us.apache.org/repos/asf/wicket/blob/18f269e1/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereWebRequest.java
----------------------------------------------------------------------
diff --git 
a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereWebRequest.java
 
b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereWebRequest.java
index eb8f5c1..b373983 100644
--- 
a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereWebRequest.java
+++ 
b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereWebRequest.java
@@ -17,7 +17,7 @@
 package org.apache.wicket.atmosphere;
 
 import java.nio.charset.Charset;
-import java.util.Collection;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 
@@ -47,12 +47,12 @@ class AtmosphereWebRequest extends ServletWebRequest
 
        private final PageKey pageKey;
 
-       private final Collection<EventSubscription> subscriptions;
+       private final Iterator<EventSubscription> subscriptions;
 
        private final AtmosphereEvent event;
 
        AtmosphereWebRequest(ServletWebRequest wrappedRequest, PageKey pageKey,
-               Collection<EventSubscription> subscriptions, AtmosphereEvent 
event)
+               Iterator<EventSubscription> subscriptions, AtmosphereEvent 
event)
        {
                super(wrappedRequest.getContainerRequest(), 
wrappedRequest.getFilterPrefix());
                this.wrappedRequest = wrappedRequest;
@@ -66,7 +66,7 @@ class AtmosphereWebRequest extends ServletWebRequest
                return pageKey;
        }
 
-       public Collection<EventSubscription> getSubscriptions()
+       public Iterator<EventSubscription> getSubscriptions()
        {
                return subscriptions;
        }

http://git-wip-us.apache.org/repos/asf/wicket/blob/18f269e1/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventBus.java
----------------------------------------------------------------------
diff --git 
a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventBus.java
 
b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventBus.java
index a87a9c5..80837b8 100644
--- 
a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventBus.java
+++ 
b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventBus.java
@@ -17,7 +17,6 @@
 package org.apache.wicket.atmosphere;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -48,9 +47,9 @@ import org.atmosphere.cpr.BroadcasterFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.collect.Collections2;
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
 
@@ -380,21 +379,25 @@ public class EventBus implements UnboundListener
                ThreadContext.detach();
                ThreadContext.setApplication(application);
                PageKey key;
-               Collection<EventSubscription> subscriptionsForPage;
+               Iterable<EventSubscription> subscriptionsForPage;
                synchronized (this)
                {
                        key = trackedPages.get(resource.uuid());
-                       subscriptionsForPage = Collections2.filter(
-                               
Collections.unmodifiableCollection(subscriptions.get(key)), new 
EventFilter(event));
+                       Collection<EventSubscription> eventSubscriptions = 
subscriptions.get(key);
+                       subscriptionsForPage = 
Iterables.filter(eventSubscriptions, new EventFilter(event));
                }
                if (key == null)
                        broadcaster.removeAtmosphereResource(resource);
-               else if (!subscriptionsForPage.isEmpty())
-                       post(resource, key, subscriptionsForPage, event);
+               else
+               {
+                       Iterator<EventSubscription> iterator = 
subscriptionsForPage.iterator();
+                       if (iterator.hasNext())
+                               post(resource, key, iterator, event);
+               }
        }
 
        private void post(AtmosphereResource resource, PageKey pageKey,
-               Collection<EventSubscription> subscriptionsForPage, 
AtmosphereEvent event)
+               Iterator<EventSubscription> subscriptionsForPage, 
AtmosphereEvent event)
        {
                String filterPath = WebApplication.get()
                        .getWicketFilter()

Reply via email to