1 package com.eviware.soapui.support;
2
3 import java.beans.PropertyChangeEvent;
4 import java.beans.PropertyChangeListener;
5 import java.lang.ref.WeakReference;
6 import java.lang.reflect.Method;
7
8 public class WeakPropertyChangeListener implements PropertyChangeListener
9 {
10 WeakReference<?> listenerRef;
11 Object src;
12
13 @SuppressWarnings( "unchecked" )
14 public WeakPropertyChangeListener( PropertyChangeListener listener, Object src )
15 {
16 listenerRef = new WeakReference( listener );
17 this.src = src;
18 }
19
20 public void propertyChange( PropertyChangeEvent evt )
21 {
22 PropertyChangeListener listener = ( PropertyChangeListener )listenerRef.get();
23 if( listener == null )
24 {
25 removeListener();
26 }
27 else
28 listener.propertyChange( evt );
29 }
30
31 private void removeListener()
32 {
33 try
34 {
35 Method method = src.getClass().getMethod( "removePropertyChangeListener",
36 new Class[] { PropertyChangeListener.class } );
37 method.invoke( src, new Object[] { this } );
38 }
39 catch( Exception e )
40 {
41 e.printStackTrace();
42 }
43 }
44 }