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/78fc5b53 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/78fc5b53 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/78fc5b53 Branch: refs/heads/wicket-6.x Commit: 78fc5b53eb09a76a2e7f307f2ce5fbbd2c8f6c0a Parents: 66bff0b Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Thu Aug 14 13:28:44 2014 +0200 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Fri Aug 15 09:48:17 2014 +0200 ---------------------------------------------------------------------- .../atmosphere/AtmosphereRequestHandler.java | 9 ++++---- .../wicket/atmosphere/AtmosphereWebRequest.java | 8 +++---- .../org/apache/wicket/atmosphere/EventBus.java | 22 ++++++++++++-------- 3 files changed, 22 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/78fc5b53/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/78fc5b53/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/78fc5b53/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 e60ca01..6b56d56 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,7 @@ package org.apache.wicket.atmosphere; import java.util.Collection; -import java.util.Collections; +import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -48,9 +48,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; @@ -234,7 +234,7 @@ public class EventBus implements UnboundListener if (log.isDebugEnabled()) { log.debug("registered page {} for session {}", pageKey.getPageId(), - pageKey.getSessionId()); + pageKey.getSessionId()); } } @@ -395,21 +395,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) getBroadcaster().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()
