#156703: WeakListenerImpl: Can't remove java.beans.PropertyChangeListener using method
authorTomas Holy <t_h@netbeans.org>
Thu, 07 May 2009 17:15:05 +0200
changeset 78083f91fcb8942
parent 779 2ab49fc6ea59
child 781 3111e3fd5785
child 911 362470b1549a
#156703: WeakListenerImpl: Can't remove java.beans.PropertyChangeListener using method
openide.util/src/org/openide/util/WeakListenerImpl.java
     1.1 --- a/openide.util/src/org/openide/util/WeakListenerImpl.java	Wed May 06 15:28:40 2009 +0200
     1.2 +++ b/openide.util/src/org/openide/util/WeakListenerImpl.java	Thu May 07 17:15:05 2009 +0200
     1.3 @@ -145,6 +145,7 @@
     1.4          return this;
     1.5      }
     1.6  
     1.7 +    @Override
     1.8      public String toString() {
     1.9          Object listener = ref.get();
    1.10  
    1.11 @@ -475,16 +476,19 @@
    1.12  
    1.13          /** To string prints class.
    1.14          */
    1.15 +        @Override
    1.16          public String toString() {
    1.17              return super.toString() + "[" + listenerClass + "]"; // NOI18N
    1.18          }
    1.19  
    1.20          /** Equal is extended to equal also with proxy object.
    1.21          */
    1.22 +        @Override
    1.23          public boolean equals(Object obj) {
    1.24              return (proxy == obj) || (this == obj);
    1.25          }
    1.26  
    1.27 +        @Override
    1.28          Object getImplementator() {
    1.29              return proxy;
    1.30          }
    1.31 @@ -523,9 +527,6 @@
    1.32          }
    1.33  
    1.34          public void run() {
    1.35 -            // prepare array for passing arguments to getMethod/invoke
    1.36 -            Object[] params = new Object[1];
    1.37 -            Class[] types = new Class[1];
    1.38              Object src = null; // On whom we're listening
    1.39              Method remove = null;
    1.40  
    1.41 @@ -559,8 +560,10 @@
    1.42  
    1.43              // get the remove method or use the last one
    1.44              if (remove == null) {
    1.45 -                types[0] = ref.listenerClass;
    1.46 -                remove = getRemoveMethod(methodClass, methodName, types[0]);
    1.47 +                remove = getRemoveMethod(methodClass, methodName, new Class[]{ref.listenerClass});
    1.48 +                if (remove == null) {
    1.49 +                    remove = getRemoveMethod(methodClass, methodName, new Class[]{String.class, ref.listenerClass});
    1.50 +                }
    1.51  
    1.52                  if (remove == null) {
    1.53                      LOG.warning(
    1.54 @@ -579,10 +582,12 @@
    1.55                  }
    1.56              }
    1.57  
    1.58 -            params[0] = ref.getImplementator(); // Whom to unregister
    1.59 -
    1.60              try {
    1.61 -                remove.invoke(src, params);
    1.62 +                if (remove.getParameterTypes().length == 1) {
    1.63 +                    remove.invoke(src, new Object[]{ref.getImplementator()});
    1.64 +                } else {
    1.65 +                    remove.invoke(src, new Object[]{null, ref.getImplementator()});
    1.66 +                }
    1.67              } catch (Exception ex) { // from invoke(), should not happen
    1.68                  // #151415 - ignore exception from AbstractPreferences if node has been removed
    1.69                  if (!"removePreferenceChangeListener".equals(methodName) && !"removeNodeChangeListener".equals(methodName)) {  //NOI18N
    1.70 @@ -598,8 +603,7 @@
    1.71          }
    1.72  
    1.73          /* can return null */
    1.74 -        private Method getRemoveMethod(Class<?> methodClass, String methodName, Class listenerClass) {
    1.75 -            final Class<?>[] clarray = new Class<?>[] { listenerClass };
    1.76 +        private Method getRemoveMethod(Class<?> methodClass, String methodName, Class<?>[] clarray) {
    1.77              Method m = null;
    1.78  
    1.79              try {