[272197] RendererFactory listener list can grow without bound
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/RendererFactory.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/RendererFactory.java
index 9f294d3..19c133c 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/RendererFactory.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/RendererFactory.java
@@ -8,10 +8,9 @@
**************************************************************************************************/
package org.eclipse.wst.common.internal.emf.resource;
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.Collection;
import java.util.Iterator;
+import java.util.Map;
+import java.util.WeakHashMap;
public abstract class RendererFactory {
@@ -56,7 +55,8 @@
private static final Notifier INSTANCE = new Notifier();
- private final Collection resourceFactoryListeners = new ArrayList();
+ // use a WeakHashMap for a weak HashSet
+ private final Map resourceFactoryListeners = new WeakHashMap();
private Notifier() {
}
@@ -72,17 +72,11 @@
* work
*/
if (rendererFactory != RendererFactory.getDefaultRendererFactory()) {
- WeakReference wref = null;
- Listener listener = null;
synchronized (resourceFactoryListeners) {
- for (Iterator i = resourceFactoryListeners.iterator(); i.hasNext();) {
- wref = (WeakReference) i.next();
- listener = (Listener) wref.get();
+ for (Iterator i = resourceFactoryListeners.keySet().iterator(); i.hasNext();) {
+ Listener listener = (Listener) i.next();
//System.out.println("Notifying Listener: " + listener);
- if (listener != null)
- listener.updateRendererFactory(rendererFactory);
- else
- i.remove();
+ listener.updateRendererFactory(rendererFactory);
}
}
}
@@ -92,29 +86,13 @@
public void addListener(Listener l) {
//System.out.println("Adding listener: " + l);
synchronized (resourceFactoryListeners) {
- resourceFactoryListeners.add(new WeakReference(l));
+ resourceFactoryListeners.put(l, null);
}
}
public void removeListener(Listener listenerToRemove) {
- final int length = resourceFactoryListeners.size();
- if (length > 0) {
- WeakReference wref = null;
- Listener listener = null;
- synchronized (resourceFactoryListeners) {
- for (Iterator i = resourceFactoryListeners.iterator(); i.hasNext();) {
- wref = (WeakReference) i.next();
- listener = (Listener) wref.get();
- if (listener != null) {
- if (listener == listenerToRemove) {
- i.remove();
- break;
- }
- } else {
- i.remove();
- }
- }
- }
+ synchronized (resourceFactoryListeners) {
+ resourceFactoryListeners.remove(listenerToRemove);
}
}