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);
}
|