mx4j/src/core/mx4j/server/interceptor NotificationListenerMBeanServerInterceptor.java,1.13,1.14

Simone Bordet <[email protected]> Mon, 07 Nov 2005 20:29:40 +0000
Newsgroups gmane.comp.java.mx4j.cvs
Message-ID <[email protected]>
Update of /cvsroot/mx4j/mx4j/src/core/mx4j/server/interceptor
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29950/src/core/mx4j/server/interceptor

Modified Files:
	NotificationListenerMBeanServerInterceptor.java 
Log Message:
+ Fixed NPE when no listeners where present for an MBean.
+ Code cleanup

Index: NotificationListenerMBeanServerInterceptor.java
===================================================================
RCS file: /cvsroot/mx4j/mx4j/src/core/mx4j/server/interceptor/NotificationListenerMBeanServerInterceptor.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -C2 -d -r1.13 -r1.14
*** NotificationListenerMBeanServerInterceptor.java	23 Oct 2005 21:04:43 -0000	1.13
--- NotificationListenerMBeanServerInterceptor.java	7 Nov 2005 20:29:33 -0000	1.14
***************
*** 9,17 ****
  package mx4j.server.interceptor;
  
- import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.HashSet;
  import java.util.Iterator;
- import java.util.List;
  import java.util.Map;
  import java.util.Set;
--- 9,15 ----
***************
*** 41,123 ****
     }
  
-    /**
-     * The goal of this machinery is to make sure that, for a given emitter,
-     * when a listener is removed the listener can be identity compared
-     * (using ==) with a listener that has been previously added to the same emitter.
-     * This is the reason why {@link ListenerWrapperKey#equals} has been implemented
-     * using identity (==) and not equality (equals()).
-     * The listener instance passed by the MBeanServer to the emitter when removing
-     * the listener itself should be the same passed when the listener was added.
-     * If for any reason the listener is not found, it will be wrapped with a new
-     * wrapper that will allow the emitter to compare listener by equality
-     * (what normally happens using Collection data structures) and behave correctly
-     * most of the times (certainly MX4J's NotificationBroadcasterSupport will do).
-     */
-    private ListenerWrapper getOrCreateListenerWrapper(MBeanMetaData metadata, NotificationListener listener)
-    {
-       ListenerWrapperKey key = new ListenerWrapperKey(listener, metadata.getObjectName());
-       ListenerWrapper wrapper = null;
-       synchronized (wrappers)
-       {
-          wrapper = getListenerWrapper(key);
-          if (wrapper == null)
-          {
-             wrapper = new ListenerWrapper(listener, metadata.getObjectName());
-             wrappers.put(key, wrapper);
-          }
- 
-          List keys = (List)objectNames.get(metadata.getObjectName());
-          if (keys == null)
-          {
-             keys = new ArrayList();
-             objectNames.put(metadata.getObjectName(), keys);
-          }
-          keys.add(key);
-       }
-       return wrapper;
-    }
- 
-    private ListenerWrapper removeListenerWrapper(MBeanMetaData metadata, NotificationListener listener)
-    {
-       ListenerWrapperKey key = new ListenerWrapperKey(listener, metadata.getObjectName());
-       return removeListenerWrapper(key);
-    }
- 
-    private ListenerWrapper removeListenerWrapper(ListenerWrapperKey key)
-    {
-       synchronized (wrappers)
-       {
-          ListenerWrapper wrapper = (ListenerWrapper)wrappers.remove(key);
- 
-          List keys = (List)objectNames.get(key.getObjectName());
-          if (keys != null)
-          {
- 
-          }
- 
-          return wrapper;
-       }
-    }
- 
-    private ListenerWrapper decreaseOrRemoveListenerWrapper(MBeanMetaData metadata, NotificationListener listener)
-    {
-       ListenerWrapperKey key = new ListenerWrapperKey(listener, metadata.getObjectName());
-       synchronized (wrappers)
-       {
-          ListenerWrapper wrapper = getListenerWrapper(key);
-          if (wrapper == null) return null;
-          if (wrapper.getReferenceCount() == 1) removeListenerWrapper(key);
-          return wrapper;
-       }
-    }
- 
-    private ListenerWrapper getListenerWrapper(ListenerWrapperKey key)
-    {
-       synchronized(wrappers)
-       {
-          return (ListenerWrapper)wrappers.get(key);
-       }
-    }
- 
     public void addNotificationListener(MBeanMetaData metadata, NotificationListener listener, NotificationFilter filter, Object handback)
     {
--- 39,42 ----
***************
*** 220,240 ****
     public void registration(MBeanMetaData metadata, int operation) throws MBeanRegistrationException
     {
!       if (operation == POST_DEREGISTER)
        {
!          // We must clean up in case the MBean is unregistered
!          // and the listeners are not removed
!          synchronized (wrappers)
           {
!             Set keys = (Set)objectNames.remove(metadata.getObjectName());
!             for (Iterator iterator = keys.iterator(); iterator.hasNext();)
              {
!                ListenerWrapperKey key = (ListenerWrapperKey)iterator.next();
!                ListenerWrapper wrapper = (ListenerWrapper)wrappers.remove(key);
!                wrapper.resetReferenceCount();
              }
           }
        }
- 
-       super.registration(metadata, operation);
     }
  
--- 139,168 ----
     public void registration(MBeanMetaData metadata, int operation) throws MBeanRegistrationException
     {
!       if (isEnabled())
        {
!          if (operation == POST_DEREGISTER)
           {
!             // We must clean up in case the MBean is unregistered
!             // and the listeners are not removed
!             synchronized (wrappers)
              {
!                Set keys = (Set)objectNames.remove(metadata.getObjectName());
!                if (keys != null)
!                {
!                   for (Iterator iterator = keys.iterator(); iterator.hasNext();)
!                   {
!                      ListenerWrapperKey key = (ListenerWrapperKey)iterator.next();
!                      ListenerWrapper wrapper = (ListenerWrapper)wrappers.remove(key);
!                      wrapper.resetReferenceCount();
!                   }
!                }
              }
           }
+          super.registration(metadata, operation);
+       }
+       else
+       {
+          super.registration(metadata, operation);
        }
     }
  
***************
*** 320,335 ****
        public boolean equals(Object obj)
        {
!          if (obj == null) return false;
!          if (obj == this) return true;
! 
!          try
!          {
!             ListenerWrapper other = (ListenerWrapper)obj;
!             return getTargetListener().equals(other.getTargetListener());
!          }
!          catch (ClassCastException ignored)
!          {
!          }
!          return false;
        }
  
--- 248,255 ----
        public boolean equals(Object obj)
        {
!          if (this == obj) return true;
!          if (obj == null || getClass() != obj.getClass()) return false;
!          final ListenerWrapper wrapper = (ListenerWrapper)obj;
!          return getTargetListener().equals(wrapper.getTargetListener());
        }
  
***************
*** 359,370 ****
        {
           if (this == obj) return true;
!          if (!(obj instanceof ListenerWrapperKey)) return false;
! 
!          ListenerWrapperKey other = (ListenerWrapperKey)obj;
! 
!          if (listener != other.listener) return false;
!          if (!objectName.equals(other.objectName)) return false;
! 
!          return true;
        }
  
--- 279,286 ----
        {
           if (this == obj) return true;
!          if (obj == null || getClass() != obj.getClass()) return false;
!          final ListenerWrapperKey that = (ListenerWrapperKey)obj;
!          if (!listener.equals(that.listener)) return false;
!          return objectName.equals(that.objectName);
        }
  



-------------------------------------------------------
SF.Net email is sponsored by:
Tame your development challenges with Apache's Geronimo App Server. Download
it for free - -and be entered to win a 42" plasma tv or your very own
Sony(tm)PSP.  Click here to play: http://sourceforge.net/geronimo.php