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/03/25 20:34:38 UTC

svn commit: r927560 - in /tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5: ioc/internal/services/UpdateListenerHubImpl.java services/UpdateListenerHub.java

Author: hlship
Date: Thu Mar 25 19:34:37 2010
New Revision: 927560

URL: http://svn.apache.org/viewvc?rev=927560&view=rev
Log:
TAP5-1079: Change UpdateListenerHub to hold a weak reference to its listeners

Modified:
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/UpdateListenerHubImpl.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/services/UpdateListenerHub.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=927560&r1=927559&r2=927560&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 Mar 25 19:34:37 2010
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry5.ioc.internal.services;
 
+import java.lang.ref.WeakReference;
+import java.util.Iterator;
 import java.util.List;
 
 import org.apache.tapestry5.ioc.annotations.PreventServiceDecoration;
@@ -25,13 +27,13 @@ import org.apache.tapestry5.services.Upd
 @PreventServiceDecoration
 public class UpdateListenerHubImpl implements UpdateListenerHub
 {
-    private final List<UpdateListener> listeners = CollectionFactory.newThreadSafeList();
+    private final List<WeakReference<UpdateListener>> listeners = CollectionFactory.newThreadSafeList();
 
     public void addUpdateListener(UpdateListener listener)
     {
         Defense.notNull(listener, "listener");
 
-        listeners.add(listener);
+        listeners.add(new WeakReference<UpdateListener>(listener));
     }
 
     /**
@@ -39,9 +41,16 @@ public class UpdateListenerHubImpl imple
      */
     public void fireCheckForUpdates()
     {
-        for (UpdateListener listener : listeners)
+        Iterator<WeakReference<UpdateListener>> i = listeners.iterator();
+
+        while (i.hasNext())
         {
-            listener.checkForUpdates();
+            UpdateListener listener = i.next().get();
+
+            if (listener == null)
+                i.remove();
+            else
+                listener.checkForUpdates();
         }
     }
 }

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/services/UpdateListenerHub.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/services/UpdateListenerHub.java?rev=927560&r1=927559&r2=927560&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/services/UpdateListenerHub.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/services/UpdateListenerHub.java Thu Mar 25 19:34:37 2010
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry5.services;
 
+import org.apache.tapestry5.ioc.ObjectLocator;
+
 /**
  * Manages a set of {@link org.apache.tapestry5.services.UpdateListener}s. Periodically (say, every request during
  * development, or every minute or so during production), request processing is locked down so that only a single thread
@@ -24,6 +26,10 @@ package org.apache.tapestry5.services;
  * <p>
  * Note that this interface has moved from module tapestry-core to tapestry-ioc, but has kept the same package (for
  * backwards compatibility reasons).
+ * <p>
+ * A <em>weak reference</em> to the listener is kept; this ensures that registering as a listener will not prevent a
+ * listener instance from being reclaimed by the garbage collector (this is useful as proxies created by
+ * {@link ObjectLocator#proxy(Class, Class)} may register as listeners, but still be ephemeral).
  * 
  * @since 5.1.0.0
  */