/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.mx.notification;
import java.util.HashMap;
import java.util.Iterator;
import javax.management.JMException;
import javax.management.ListenerNotFoundException;
import javax.management.NotificationBroadcaster;
import javax.management.NotificationFilter;
import javax.management.NotificationListener;
import javax.management.ObjectName;
/**
* A notification listener registry per ObjectName.
*
* @author <a href="mailto:Adrian.Brock@HappeningTimes.com">Adrian Brock</a>.
* @author <a href="mailto:juha@jboss.org">Juha Lindfors</a>
*
* @version $Revision: 81022 $
*
* <p><b>Revisions:</b>
*
* <p><b>20030806 Juha Lindfors:</b>
* <ul>
* <li>
* Added removeAll()
* </ul>
*
*/
public class MBeanServerListenerRegistry
{
// Attributes ----------------------------------------------------
/**
* A map of object names to listener registries.
*/
private HashMap registries = new HashMap();
// Constructor ---------------------------------------------------
/**
* Create a notification listener registry
*/
public MBeanServerListenerRegistry()
{
}
// Public --------------------------------------------------------
/**
* Adds a listener to the mbean
*
* @param name the object name
* @param broadcaster the broadcaster
* @param listener the listener to register
* @param filter filters the notifications in the broadcaster, can be null
* @param handback the object to include in the notification, can be null
* @exception IllegalArgumentException for a null object name or listener
*/
public void add(ObjectName name, NotificationBroadcaster broadcaster,
NotificationListener listener, NotificationFilter filter, Object handback)
{
if (name == null)
throw new IllegalArgumentException("Null name");
if (listener == null)
throw new IllegalArgumentException("Null listener");
ListenerRegistry registry = null;
synchronized(registries)
{
registry = (ListenerRegistry) registries.get(name);
if (registry == null)
registry = new ListenerRegistry(new MBeanServerListenerRegistrationFactory(name, broadcaster));
registries.put(name, registry);
}
try
{
registry.add(listener, filter, handback);
}
catch (JMException e)
{
// This shouldn't happen
throw new RuntimeException(e.toString());
}
}
/**
* Removes all registrations for an mbean broadcaster.
*
* @param name the object name
* @exception IllegalArgumentException for a null object name
*/
public void remove(ObjectName name)
{
if (name == null)
throw new IllegalArgumentException("Null name");
ListenerRegistry registry = null;
synchronized(registries)
{
registry = (ListenerRegistry) registries.remove(name);
if (registry == null)
return;
}
// Remove the registrations with the MBean
for (ListenerRegistry.ListenerRegistrationIterator iterator = registry.iterator(); iterator.hasNext();)
{
ListenerRegistration registration = iterator.nextRegistration();
registration.removed();
}
}
/**
* Removes all registrations for a listener.
*
* @param name the object name
* @param listener the listener to remove
* @exception ListenerNotFoundException when the listener is not registered
* @exception IllegalArgumentException for a null object name
*/
public void remove(ObjectName name, NotificationListener listener)
throws ListenerNotFoundException
{
if (name == null)
throw new IllegalArgumentException("Null name");
synchronized(registries)
{
ListenerRegistry registry = (ListenerRegistry) registries.get(name);
if (registry == null)
throw new ListenerNotFoundException("Listener not found " + listener + " for object name " + name);
registry.remove(listener);
if (registry.isEmpty())
registries.remove(name);
}
}
/**
* Removes only the registrations for a listener that match the filter and handback.
*
* @param name the object name
* @param listener the listener to remove
* @param filter the filter of the registration to remove
* @param handback the handback object of the registration to remove
* @exception ListenerNotFoundException when the listener is not registered
* @exception IllegalArgumentException for a null object name
*/
public void remove(ObjectName name, NotificationListener listener, NotificationFilter filter, Object handback)
throws ListenerNotFoundException
{
if (name == null)
throw new IllegalArgumentException("Null name");
synchronized(registries)
{
ListenerRegistry registry = (ListenerRegistry) registries.get(name);
if (registry == null)
throw new ListenerNotFoundException("Listener not found listener=" + listener +
" filter=" + filter + " handback=" + handback +
" for object name " + name);
registry.remove(listener, filter, handback);
if (registry.isEmpty())
registries.remove(name);
}
}
/**
* Clears all listener registries from this registry.
*/
public void removeAll()
{
synchronized (registries)
{
Iterator it = registries.keySet().iterator();
while (it.hasNext())
{
ListenerRegistry registry = (ListenerRegistry)registries.get(it.next());
registry.removeAll();
}
}
}
}