/* * 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.modelmbean; import java.util.ArrayList; import java.util.Arrays; import javax.management.Attribute; import javax.management.AttributeChangeNotification; import javax.management.AttributeList; import javax.management.AttributeNotFoundException; import javax.management.InstanceNotFoundException; import javax.management.InvalidAttributeValueException; import javax.management.ListenerNotFoundException; import javax.management.MBeanException; import javax.management.MBeanInfo; import javax.management.MBeanNotificationInfo; import javax.management.MBeanRegistration; import javax.management.MBeanServer; import javax.management.Notification; import javax.management.NotificationEmitter; import javax.management.NotificationFilter; import javax.management.NotificationListener; import javax.management.ObjectName; import javax.management.ReflectionException; import javax.management.RuntimeOperationsException; import javax.management.loading.ClassLoaderRepository; import org.jboss.mx.modelmbean.RequiredModelMBeanInstantiator; /** * Mandatory Model MBean implementation. The Model MBean implementation * can be configured by setting a jbossmx.required.modelmbean.class * system property. * * @see javax.management.modelmbean.ModelMBean * * @author Juha Lindfors. * @author Thomas Diesler. * @version $Revision: 57200 $ */ public class RequiredModelMBean implements ModelMBean, MBeanRegistration, NotificationEmitter { // Attributes ---------------------------------------------------- private ModelMBean delegate = null; private MBeanRegistration registrationInterface = null; private Boolean isRegistered = new Boolean(false); // Constructors -------------------------------------------------- public RequiredModelMBean() throws MBeanException, RuntimeOperationsException { delegate = RequiredModelMBeanInstantiator.instantiate(); if (delegate instanceof MBeanRegistration) registrationInterface = (MBeanRegistration)delegate; } /** * Constructs a RequiredModelMBean object using ModelMBeanInfo passed in. * As long as the RequiredModelMBean is not registered with the MBeanServer yet, * the RequiredModelMBean's MBeanInfo and Descriptors can be customized using the * setModelMBeanInfo(javax.management.modelmbean.ModelMBeanInfo) method. * * After the RequiredModelMBean's MBeanInfo and Descriptors are customized, * the RequiredModelMBean can be registered with the MBeanServer. */ public RequiredModelMBean(ModelMBeanInfo info) throws MBeanException, RuntimeOperationsException { if (info == null) throw new RuntimeOperationsException(new IllegalArgumentException("Null model mbean info")); delegate = RequiredModelMBeanInstantiator.instantiate(info); if (delegate instanceof MBeanRegistration) registrationInterface = (MBeanRegistration)delegate; } // ModelMBean implementation ------------------------------------- public void setModelMBeanInfo(ModelMBeanInfo info) throws MBeanException, RuntimeOperationsException { if (isRegistered.booleanValue()) throw new RuntimeOperationsException(new IllegalStateException("Cannot set ModelMBeanInfo, mbean already registered")); delegate.setModelMBeanInfo(info); } public void setManagedResource(Object mr, String mr_type) throws MBeanException, RuntimeOperationsException, InstanceNotFoundException, InvalidTargetObjectTypeException { delegate.setManagedResource(mr, mr_type); } // PersistentMBean implementation -------------------------------- public void load() throws MBeanException, RuntimeOperationsException, InstanceNotFoundException { delegate.load(); } public void store() throws MBeanException, RuntimeOperationsException, InstanceNotFoundException { delegate.store(); } // DynamicMBean implementation ----------------------------------- public MBeanInfo getMBeanInfo() { return delegate.getMBeanInfo(); } public Object invoke(String opName, Object[] opArgs, String[] sig) throws MBeanException, ReflectionException { return delegate.invoke(opName, opArgs, sig); } public Object getAttribute(String attrName) throws AttributeNotFoundException, MBeanException, ReflectionException { return delegate.getAttribute(attrName); } public AttributeList getAttributes(String[] attrNames) { return delegate.getAttributes(attrNames); } public void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException { delegate.setAttribute(attribute); } public AttributeList setAttributes(AttributeList attributes) { return delegate.setAttributes(attributes); } // ModelMBeanNotificationBroadcaster implementation -------------- public void addNotificationListener(NotificationListener inlistener, NotificationFilter infilter, Object inhandback) throws IllegalArgumentException { delegate.addNotificationListener(inlistener, infilter, inhandback); } public void removeNotificationListener(NotificationListener inlistener) throws ListenerNotFoundException { delegate.removeNotificationListener(inlistener); } public void removeNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback) throws ListenerNotFoundException { if (delegate instanceof NotificationEmitter) ((NotificationEmitter)delegate).removeNotificationListener(listener, filter, handback); else throw new UnsupportedOperationException("Delegate is not a NotificationEmitter " + delegate.getClass()); } public void sendNotification(Notification ntfyObj) throws MBeanException, RuntimeOperationsException { delegate.sendNotification(ntfyObj); } public void sendNotification(String ntfyText) throws MBeanException, RuntimeOperationsException { delegate.sendNotification(ntfyText); } /** Returns the array of Notifications generated by the RequiredModelMBean. * RequiredModelMBean may always send also two additional notifications: * One with descriptor "name=GENERIC,descriptorType=notification,log=T,severity=5,displayName=jmx.modelmbean.generic" * Second is a standard attribute change notification with descriptor "name=ATTRIBUTE_CHANGE,descriptorType=notification,log=T,severity=5,displayName=jmx.attribute.change" * Thus these two notifications are always added to those specified by the application. * * @return */ public MBeanNotificationInfo[] getNotificationInfo() { MBeanNotificationInfo generic = null; MBeanNotificationInfo attrChange = null; MBeanNotificationInfo[] resourceInfo = delegate.getNotificationInfo(); for(int n = 0; n < resourceInfo.length; n ++) { MBeanNotificationInfo notify = resourceInfo[n]; String name = notify.getName(); if( name.equals("GENERIC") ) generic = notify; else if( name.equals("ATTRIBUTE_CHANGE") ) attrChange = notify; } if( generic == null || attrChange == null ) { ArrayList tmp = new ArrayList(Arrays.asList(resourceInfo)); if( attrChange == null ) { String[] types = {"jmx.attribute.change"}; ModelMBeanNotificationInfo n = new ModelMBeanNotificationInfo(types, "ATTRIBUTE_CHANGE", "Attribute change notfication"); n.getDescriptor().setField("log", "T"); n.getDescriptor().setField("displayName", "jmx.attribute.change"); tmp.add(0, n); } if( generic == null ) { String[] types = {"jmx.modelmbean.generic"}; ModelMBeanNotificationInfo n = new ModelMBeanNotificationInfo(types, "GENERIC", "Generic text msg"); n.getDescriptor().setField("log", "T"); n.getDescriptor().setField("displayName", "jmx.modelmbean.generic"); tmp.add(0, n); } resourceInfo = new MBeanNotificationInfo[tmp.size()]; tmp.toArray(resourceInfo); } return resourceInfo; } public void addAttributeChangeNotificationListener(NotificationListener inlistener, String inAttributeName, Object inhandback) throws MBeanException, RuntimeOperationsException, IllegalArgumentException { delegate.addAttributeChangeNotificationListener(inlistener, inAttributeName, inhandback); } public void removeAttributeChangeNotificationListener(NotificationListener inlistener, String inAttributeName) throws MBeanException, RuntimeOperationsException, ListenerNotFoundException { delegate.removeAttributeChangeNotificationListener(inlistener, inAttributeName); } public void sendAttributeChangeNotification(AttributeChangeNotification ntfyObj) throws MBeanException, RuntimeOperationsException { delegate.sendAttributeChangeNotification(ntfyObj); } public void sendAttributeChangeNotification(Attribute inOldVal, Attribute inNewVal) throws MBeanException, RuntimeOperationsException { delegate.sendAttributeChangeNotification(inOldVal, inNewVal); } // MBeanRegistration implementation ------------------------------ public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception { if (registrationInterface != null) return registrationInterface.preRegister(server, name); return name; } public void postRegister(Boolean registrationDone) { if (registrationInterface != null) registrationInterface.postRegister(registrationDone); isRegistered = registrationDone; } public void preDeregister() throws Exception { if (registrationInterface != null) registrationInterface.preDeregister(); } public void postDeregister() { isRegistered = new Boolean(false); if (registrationInterface != null) registrationInterface.postDeregister(); } protected ClassLoaderRepository getClassLoaderRepository() { return null; } }