001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.mx.notification;
023:
024: import java.util.HashMap;
025: import java.util.Iterator;
026:
027: import javax.management.JMException;
028: import javax.management.ListenerNotFoundException;
029: import javax.management.NotificationBroadcaster;
030: import javax.management.NotificationFilter;
031: import javax.management.NotificationListener;
032: import javax.management.ObjectName;
033:
034: /**
035: * A notification listener registry per ObjectName.
036: *
037: * @author <a href="mailto:Adrian.Brock@HappeningTimes.com">Adrian Brock</a>.
038: * @author <a href="mailto:juha@jboss.org">Juha Lindfors</a>
039: *
040: * @version $Revision: 57200 $
041: *
042: * <p><b>Revisions:</b>
043: *
044: * <p><b>20030806 Juha Lindfors:</b>
045: * <ul>
046: * <li>
047: * Added removeAll()
048: * </ul>
049: *
050: */
051: public class MBeanServerListenerRegistry {
052: // Attributes ----------------------------------------------------
053:
054: /**
055: * A map of object names to listener registries.
056: */
057: private HashMap registries = new HashMap();
058:
059: // Constructor ---------------------------------------------------
060:
061: /**
062: * Create a notification listener registry
063: */
064: public MBeanServerListenerRegistry() {
065: }
066:
067: // Public --------------------------------------------------------
068:
069: /**
070: * Adds a listener to the mbean
071: *
072: * @param name the object name
073: * @param broadcaster the broadcaster
074: * @param listener the listener to register
075: * @param filter filters the notifications in the broadcaster, can be null
076: * @param handback the object to include in the notification, can be null
077: * @exception IllegalArgumentException for a null object name or listener
078: */
079: public void add(ObjectName name,
080: NotificationBroadcaster broadcaster,
081: NotificationListener listener, NotificationFilter filter,
082: Object handback) {
083: if (name == null)
084: throw new IllegalArgumentException("Null name");
085: if (listener == null)
086: throw new IllegalArgumentException("Null listener");
087:
088: ListenerRegistry registry = null;
089: synchronized (registries) {
090: registry = (ListenerRegistry) registries.get(name);
091: if (registry == null)
092: registry = new ListenerRegistry(
093: new MBeanServerListenerRegistrationFactory(
094: name, broadcaster));
095: registries.put(name, registry);
096: }
097:
098: try {
099: registry.add(listener, filter, handback);
100: } catch (JMException e) {
101: // This shouldn't happen
102: throw new RuntimeException(e.toString());
103: }
104: }
105:
106: /**
107: * Removes all registrations for an mbean broadcaster.
108: *
109: * @param name the object name
110: * @exception IllegalArgumentException for a null object name
111: */
112: public void remove(ObjectName name) {
113: if (name == null)
114: throw new IllegalArgumentException("Null name");
115:
116: ListenerRegistry registry = null;
117: synchronized (registries) {
118: registry = (ListenerRegistry) registries.remove(name);
119: if (registry == null)
120: return;
121: }
122:
123: // Remove the registrations with the MBean
124: for (ListenerRegistry.ListenerRegistrationIterator iterator = registry
125: .iterator(); iterator.hasNext();) {
126: ListenerRegistration registration = iterator
127: .nextRegistration();
128: registration.removed();
129: }
130: }
131:
132: /**
133: * Removes all registrations for a listener.
134: *
135: * @param name the object name
136: * @param listener the listener to remove
137: * @exception ListenerNotFoundException when the listener is not registered
138: * @exception IllegalArgumentException for a null object name
139: */
140: public void remove(ObjectName name, NotificationListener listener)
141: throws ListenerNotFoundException {
142: if (name == null)
143: throw new IllegalArgumentException("Null name");
144:
145: synchronized (registries) {
146: ListenerRegistry registry = (ListenerRegistry) registries
147: .get(name);
148: if (registry == null)
149: throw new ListenerNotFoundException(
150: "Listener not found " + listener
151: + " for object name " + name);
152:
153: registry.remove(listener);
154: if (registry.isEmpty())
155: registries.remove(name);
156: }
157: }
158:
159: /**
160: * Removes only the registrations for a listener that match the filter and handback.
161: *
162: * @param name the object name
163: * @param listener the listener to remove
164: * @param filter the filter of the registration to remove
165: * @param handback the handback object of the registration to remove
166: * @exception ListenerNotFoundException when the listener is not registered
167: * @exception IllegalArgumentException for a null object name
168: */
169: public void remove(ObjectName name, NotificationListener listener,
170: NotificationFilter filter, Object handback)
171: throws ListenerNotFoundException {
172: if (name == null)
173: throw new IllegalArgumentException("Null name");
174:
175: synchronized (registries) {
176: ListenerRegistry registry = (ListenerRegistry) registries
177: .get(name);
178: if (registry == null)
179: throw new ListenerNotFoundException(
180: "Listener not found listener=" + listener
181: + " filter=" + filter + " handback="
182: + handback + " for object name " + name);
183:
184: registry.remove(listener, filter, handback);
185: if (registry.isEmpty())
186: registries.remove(name);
187: }
188: }
189:
190: /**
191: * Clears all listener registries from this registry.
192: */
193: public void removeAll() {
194: synchronized (registries) {
195: Iterator it = registries.keySet().iterator();
196:
197: while (it.hasNext()) {
198: ListenerRegistry registry = (ListenerRegistry) registries
199: .get(it.next());
200: registry.removeAll();
201: }
202: }
203: }
204:
205: }
|