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();
+ }
}