/* * JBoss, Home of Professional Open Source. * Copyright 2006, 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 javax.management.relation; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.ObjectStreamField; import java.io.StreamCorruptedException; import java.util.HashSet; import java.util.List; import java.util.Vector; import javax.management.MBeanServerNotification; import javax.management.Notification; import javax.management.NotificationFilterSupport; import javax.management.ObjectName; import org.jboss.mx.util.Serialization; /** * A helper class, used to filter notifications of registration, * unregistration of selected object names. * * @author Adrian Brock. * @version $Revision: 57200 $ * *
Revisions: *
20020711 Adrian Brock: *
* * WARNING!! WARNING!! The spec says the MBeanServerNotificationFilter * accepts everything by default. The RI does exactly the opposite. * I follow the RI. */ public MBeanServerNotificationFilter() { } // Public ------------------------------------------------------ /** * Disable all object names. Rejects all notifications. */ public synchronized void disableAllObjectNames() { enabled = new HashSet(); disabled = null; } /** * Disable an object name. * * @param objectName the object name to disable. * @exception IllegalArgumentException for a null object name */ public synchronized void disableObjectName(ObjectName objectName) throws IllegalArgumentException { if (objectName == null) throw new IllegalArgumentException("null object name"); if (enabled != null) enabled.remove(objectName); if (disabled != null && disabled.contains(objectName) == false) disabled.add(objectName); } /** * Enable all object names. Accepts all notifications. */ public synchronized void enableAllObjectNames() { enabled = null; disabled = new HashSet(); } /** * Enable an object name. * * @param objectName the object name to enable. * @exception IllegalArgumentException for a null object name */ public synchronized void enableObjectName(ObjectName objectName) throws IllegalArgumentException { if (objectName == null) throw new IllegalArgumentException("null object name"); if (disabled != null) disabled.remove(objectName); if (enabled != null && enabled.contains(objectName) == false) enabled.add(objectName); } /** * Get all the disabled object names.
*
* Returns a vector of disabled object names.
* Null for all object names disabled.
* An empty vector means all object names enabled.
*
* @return the vector of disabled object names.
*/
public synchronized Vector getDisabledObjectNames()
{
if (disabled == null)
return null;
return new Vector(disabled);
}
/**
* Get all the enabled object names.
*
* Returns a vector of enabled object names.
* Null for all object names enabled.
* An empty vector means all object names disabled.
*
* @return the vector of enabled object names.
*/
public synchronized Vector getEnabledObjectNames()
{
if (enabled == null)
return null;
return new Vector(enabled);
}
/**
* @return human readable string.
*/
public String toString()
{
StringBuffer buffer = new StringBuffer(100);
buffer.append(getClass().getName()).append(":");
buffer.append(" enabledTypes=").append(getEnabledTypes());
buffer.append(" enabledObjectNames=").append(getEnabledObjectNames());
buffer.append(" disabledObjectNames=").append(getDisabledObjectNames());
return buffer.toString();
}
// NotificationFilterSupport overrides -------------------------
/**
* Test to see whether this notification is enabled
*
* @param notification the notification to filter
* @return true when the notification should be sent, false otherwise
* @exception IllegalArgumentException for null notification.
*/
public synchronized boolean isNotificationEnabled(Notification notification)
throws IllegalArgumentException
{
if (notification == null)
throw new IllegalArgumentException("null notification");
// Check the notification type
if (super.isNotificationEnabled(notification) == false)
return false;
// Get the object name
MBeanServerNotification mbsNotification = (MBeanServerNotification) notification;
ObjectName objectName = mbsNotification.getMBeanName();
// Is it enabled?
if (enabled != null)
return enabled.contains(objectName);
// Is it not disabled?
if (disabled.contains(objectName) == false)
return true;
// Disabled
return false;
}
// Private -----------------------------------------------------
private void readObject(ObjectInputStream ois)
throws IOException, ClassNotFoundException
{
ObjectInputStream.GetField getField = ois.readFields();
List deselectedNames;
List selectedNames;
switch (Serialization.version)
{
case Serialization.V1R0:
deselectedNames = (List) getField.get("myDeselectObjNameList", null);
selectedNames = (List) getField.get("mySelectObjNameList", null);
break;
default:
deselectedNames = (List) getField.get("deselectedNames", null);
selectedNames = (List) getField.get("selectedNames", null);
}
if (deselectedNames == null && selectedNames == null)
throw new StreamCorruptedException("Nothing enabled or disabled?");
if (deselectedNames == null)
disabled = null;
else
disabled = new HashSet(deselectedNames);
if (selectedNames == null)
enabled = null;
else
enabled = new HashSet(selectedNames);
}
private void writeObject(ObjectOutputStream oos)
throws IOException
{
ObjectOutputStream.PutField putField = oos.putFields();
switch (Serialization.version)
{
case Serialization.V1R0:
putField.put("myDeselectObjNameList", getDisabledObjectNames());
putField.put("mySelectObjNameList", getEnabledObjectNames());
break;
default:
putField.put("deselectedNames", getDisabledObjectNames());
putField.put("selectedNames", getEnabledObjectNames());
}
oos.writeFields();
}
}