Author: darran.lofthouse(a)jboss.com
Date: 2009-05-15 08:54:11 -0400 (Fri, 15 May 2009)
New Revision: 10042
Modified:
stack/native/branches/jbossws-native-2.0.1.SP2_CP03_JBPAPP-2010/src/main/java/org/jboss/ws/metadata/umdm/EndpointMetaData.java
stack/native/branches/jbossws-native-2.0.1.SP2_CP03_JBPAPP-2010/version.properties
Log:
[JBPAPP-2010] Correct WeakReference handling in ConfigObservable to remove cleared
WeakReferences.
Modified:
stack/native/branches/jbossws-native-2.0.1.SP2_CP03_JBPAPP-2010/src/main/java/org/jboss/ws/metadata/umdm/EndpointMetaData.java
===================================================================
---
stack/native/branches/jbossws-native-2.0.1.SP2_CP03_JBPAPP-2010/src/main/java/org/jboss/ws/metadata/umdm/EndpointMetaData.java 2009-05-15
12:02:40 UTC (rev 10041)
+++
stack/native/branches/jbossws-native-2.0.1.SP2_CP03_JBPAPP-2010/src/main/java/org/jboss/ws/metadata/umdm/EndpointMetaData.java 2009-05-15
12:54:11 UTC (rev 10042)
@@ -23,6 +23,8 @@
// $Id$
+import java.lang.ref.Reference;
+import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.lang.reflect.Method;
import java.util.ArrayList;
@@ -803,6 +805,7 @@
class ConfigObservable extends Observable
{
+ private ReferenceQueue<WeakReference<Observer>> queue = new
ReferenceQueue<WeakReference<Observer>>();
private List<WeakReference<Observer>> observer = new
ArrayList<WeakReference<Observer>>();
public void doNotify(Object object)
@@ -813,15 +816,17 @@
public synchronized void addObserver(Observer o)
{
- observer.add( new WeakReference(o));
+ clearCollected();
+ observer.add(new WeakReference(o, queue));
}
public synchronized void deleteObserver(Observer o)
{
- for(WeakReference<Observer> w : observer)
+ clearCollected();
+ for (WeakReference<Observer> w : observer)
{
Observer tmp = w.get();
- if(tmp.equals(o))
+ if (tmp != null && tmp.equals(o))
{
observer.remove(o);
break;
@@ -837,16 +842,29 @@
public void notifyObservers(Object arg)
{
- if(hasChanged())
+ clearCollected();
+ if (hasChanged())
{
- for(WeakReference<Observer> w : observer)
+ for (WeakReference<Observer> w : observer)
{
Observer tmp = w.get();
- tmp.update(this, arg);
-
+ if (tmp != null)
+ {
+ tmp.update(this, arg);
+ }
}
}
}
+
+ private void clearCollected()
+ {
+ Reference ref;
+ while ((ref = queue.poll()) != null)
+ {
+ observer.remove(ref);
+ }
+
+ }
}
public List<UnifiedPortComponentRefMetaData> getServiceRefContrib()
Modified:
stack/native/branches/jbossws-native-2.0.1.SP2_CP03_JBPAPP-2010/version.properties
===================================================================
---
stack/native/branches/jbossws-native-2.0.1.SP2_CP03_JBPAPP-2010/version.properties 2009-05-15
12:02:40 UTC (rev 10041)
+++
stack/native/branches/jbossws-native-2.0.1.SP2_CP03_JBPAPP-2010/version.properties 2009-05-15
12:54:11 UTC (rev 10042)
@@ -5,8 +5,8 @@
specification.vendor=JBoss (
http://www.jboss.org)
specification.version=jbossws-2.0
-version.id=2.0.1.SP2_CP03
-repository.id=2.0.1.SP2_CP03
+version.id=2.0.1.SP2_CP03_JBPAPP-2010
+repository.id=2.0.1.SP2_CP03_JBPAPP-2010
implementation.title=JBoss Web Services - Native
implementation.url=http://www.jboss.org/products/jbossws