You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2010/05/06 23:58:58 UTC

svn commit: r941949 - in /tapestry/tapestry5/trunk/tapestry-ioc/src: main/java/org/apache/tapestry5/ioc/internal/services/UpdateListenerHubImpl.java test/java/org/apache/tapestry5/ioc/internal/services/UpdateListenerHubImplTest.java

Author: hlship
Date: Thu May  6 21:58:58 2010
New Revision: 941949

URL: http://svn.apache.org/viewvc?rev=941949&view=rev
Log:
TAP5-1136: java.lang.UnsupportedOperationException from UpdateListenerHub when a weak reference is reclaimed

Modified:
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/UpdateListenerHubImpl.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/UpdateListenerHubImplTest.java

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/UpdateListenerHubImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/UpdateListenerHubImpl.java?rev=941949&r1=941948&r2=941949&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/UpdateListenerHubImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/UpdateListenerHubImpl.java Thu May  6 21:58:58 2010
@@ -41,16 +41,23 @@ public class UpdateListenerHubImpl imple
      */
     public void fireCheckForUpdates()
     {
+        List<WeakReference<UpdateListener>> deadReferences = CollectionFactory.newList();
+
         Iterator<WeakReference<UpdateListener>> i = listeners.iterator();
 
         while (i.hasNext())
         {
-            UpdateListener listener = i.next().get();
+            WeakReference<UpdateListener> reference = i.next();
+
+            UpdateListener listener = reference.get();
 
             if (listener == null)
-                i.remove();
+                deadReferences.add(reference);
             else
                 listener.checkForUpdates();
         }
+
+        if (!deadReferences.isEmpty())
+            listeners.removeAll(deadReferences);
     }
 }

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/UpdateListenerHubImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/UpdateListenerHubImplTest.java?rev=941949&r1=941948&r2=941949&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/UpdateListenerHubImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/UpdateListenerHubImplTest.java Thu May  6 21:58:58 2010
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry5.ioc.internal.services;
 
+import java.lang.ref.WeakReference;
+
 import org.apache.tapestry5.ioc.internal.services.UpdateListenerHubImpl;
 import org.apache.tapestry5.ioc.test.TestBase;
 import org.apache.tapestry5.services.UpdateListener;
@@ -39,4 +41,31 @@ public class UpdateListenerHubImplTest e
 
         verify();
     }
+
+    @Test
+    public void weak_references_are_not_invoked_once_clears() throws Exception
+    {
+        UpdateListener listener = new UpdateListener()
+        {
+            public void checkForUpdates()
+            {
+                throw new RuntimeException("checkForUpdates() should not be invoked on a dead reference.");
+            }
+        };
+
+        WeakReference<UpdateListener> ref = new WeakReference<UpdateListener>(listener);
+
+        UpdateListenerHub hub = new UpdateListenerHubImpl();
+
+        hub.addUpdateListener(listener);
+
+        listener = null;
+
+        while (ref.get() != null)
+        {
+            System.gc();
+        }
+
+        hub.fireCheckForUpdates();
+    }
 }