/*
* 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.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectStreamField;
import java.io.Serializable;
import java.io.StreamCorruptedException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.management.Descriptor;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanConstructorInfo;
import javax.management.MBeanException;
import javax.management.MBeanInfo;
import javax.management.MBeanNotificationInfo;
import javax.management.MBeanOperationInfo;
import javax.management.RuntimeOperationsException;
import org.jboss.mx.modelmbean.ModelMBeanConstants;
import org.jboss.mx.util.Serialization;
/**
* Support class for ModelMBeanInfo interface.
*
* @see javax.management.modelmbean.ModelMBeanInfo
*
* @author Juha Lindfors.
* @author Adrian Brock.
* @author Thomas Diesler.
* @version $Revision: 57200 $
*
*/
public class ModelMBeanInfoSupport
extends MBeanInfo
implements ModelMBeanInfo, Serializable
{
// Constants -----------------------------------------------------
// Attributes ----------------------------------------------------
/**
* MBean descriptor for this Model MBean.
*/
private Descriptor mbeanDescriptor = null;
// Static --------------------------------------------------------
private static final long serialVersionUID;
private static final ObjectStreamField[] serialPersistentFields;
private ModelMBeanAttributeInfo[] modelAttributes = null;
private ModelMBeanConstructorInfo[] modelConstructors = null;
private ModelMBeanOperationInfo[] modelOperations = null;
private ModelMBeanNotificationInfo[] modelNotifications = null;
static
{
switch (Serialization.version)
{
case Serialization.V1R0:
serialVersionUID = -3944083498453227709L;
// REVIEW: This is not in the spec, constructed from exceptions in testing
serialPersistentFields = new ObjectStreamField[]
{
new ObjectStreamField("mmbAttributes", new MBeanAttributeInfo[0].getClass()),
new ObjectStreamField("mmbConstructors", new MBeanConstructorInfo[0].getClass()),
new ObjectStreamField("mmbNotifications", new MBeanNotificationInfo[0].getClass()),
new ObjectStreamField("mmbOperations", new MBeanOperationInfo[0].getClass()),
new ObjectStreamField("modelMBeanDescriptor", Descriptor.class)
};
break;
default:
serialVersionUID = -1935722590756516193L;
serialPersistentFields = new ObjectStreamField[]
{
new ObjectStreamField("modelMBeanAttributes", new MBeanAttributeInfo[0].getClass()),
new ObjectStreamField("modelMBeanConstructors", new MBeanConstructorInfo[0].getClass()),
new ObjectStreamField("modelMBeanNotifications", new MBeanNotificationInfo[0].getClass()),
new ObjectStreamField("modelMBeanOperations", new MBeanOperationInfo[0].getClass()),
new ObjectStreamField("modelMBeanDescriptor", Descriptor.class)
};
}
}
// Constructors --------------------------------------------------
/**
* Copy constructor for Model MBean info. This instance is initialized with
* the values of the given Model MBean info.
*
* @param mbi Model MBean info used to initialize this instance
*/
public ModelMBeanInfoSupport(ModelMBeanInfo mbi)
{
super(mbi.getClassName(), mbi.getDescription(), mbi.getAttributes(),
mbi.getConstructors(), mbi.getOperations(), mbi.getNotifications());
modelAttributes = (ModelMBeanAttributeInfo[]) mbi.getAttributes();
modelConstructors = (ModelMBeanConstructorInfo[]) mbi.getConstructors();
modelOperations = (ModelMBeanOperationInfo[]) mbi.getOperations();
modelNotifications = (ModelMBeanNotificationInfo[]) mbi.getNotifications();
try
{
setMBeanDescriptor(mbi.getMBeanDescriptor());
}
catch (MBeanException e)
{
throw new RuntimeException("Cannot set MBean descriptor", e);
}
}
/**
* Creates an instance of Model MBean info implementation based on the given
* values. The Model MBean is configured with a default MBean descriptor.
*
* @param className name of the Model MBean implementation class
* @param description human readable description string for this Model MBean
* @param modelAttributes an array of Model MBean attribute metadata to describe
* the management modelAttributes of this Model MBean
* @param modelConstructors an array of Model MBean constructor metadata that
* describes the modelConstructors of this Model MBean
* implementation class
* @param modelOperations an array of Model MBean operation metadata to describe
* the management modelOperations of this Model MBean
* @param modelNotifications an array of Model MBean notification metadata to
* describe the management modelNotifications of this
* Model MBean
*/
public ModelMBeanInfoSupport(String className, String description,
ModelMBeanAttributeInfo[] modelAttributes,
ModelMBeanConstructorInfo[] modelConstructors,
ModelMBeanOperationInfo[] modelOperations,
ModelMBeanNotificationInfo[] modelNotifications)
{
super(className, description,
(null == modelAttributes) ? new ModelMBeanAttributeInfo[0] : modelAttributes,
(null == modelConstructors) ? new ModelMBeanConstructorInfo[0] : modelConstructors,
(null == modelOperations) ? new ModelMBeanOperationInfo[0] : modelOperations,
(null == modelNotifications) ? new ModelMBeanNotificationInfo[0] : modelNotifications);
this.modelAttributes = (ModelMBeanAttributeInfo[]) super.getAttributes();
this.modelConstructors = (ModelMBeanConstructorInfo[]) super.getConstructors();
this.modelOperations = (ModelMBeanOperationInfo[]) super.getOperations();
this.modelNotifications = (ModelMBeanNotificationInfo[]) super.getNotifications();
try
{
setMBeanDescriptor(createDefaultDescriptor());
}
catch(MBeanException e)
{
throw new RuntimeException("Cannot set MBean descriptor", e);
}
}
/**
* Creates an instance of Model MBean info implementation based on the given
* values and descriptor.
*
* @param className name of the Model MBean implementation class
* @param description human readable description string for this Model MBean
* @param modelAttributes an array of Model MBean attribute metadata to describe
* the management modelAttributes of this Model MBean
* @param modelConstructors an array of Model MBean constructor metadata that
* describes the modelConstructors of this Model MBean
* implementation class
* @param modelOperations an array of Model MBean operation metadata to describe
* the management modelOperations of this Model MBean
* @param modelNotifications an array of Model MBean notification metadata to
* describe the management modelNotifications of this
* Model MBean
* @param mbeandescriptor descriptor for the MBean
*/
public ModelMBeanInfoSupport(String className, String description,
ModelMBeanAttributeInfo[] modelAttributes,
ModelMBeanConstructorInfo[] modelConstructors,
ModelMBeanOperationInfo[] modelOperations,
ModelMBeanNotificationInfo[] modelNotifications, Descriptor mbeandescriptor)
throws RuntimeOperationsException
{
super(className, description,
(null == modelAttributes) ? new ModelMBeanAttributeInfo[0] : modelAttributes,
(null == modelConstructors) ? new ModelMBeanConstructorInfo[0] : modelConstructors,
(null == modelOperations) ? new ModelMBeanOperationInfo[0] : modelOperations,
(null == modelNotifications) ? new ModelMBeanNotificationInfo[0] : modelNotifications);
this.modelAttributes = (ModelMBeanAttributeInfo[]) super.getAttributes();
this.modelConstructors = (ModelMBeanConstructorInfo[]) super.getConstructors();
this.modelOperations = (ModelMBeanOperationInfo[]) super.getOperations();
this.modelNotifications = (ModelMBeanNotificationInfo[]) super.getNotifications();
try
{
setMBeanDescriptor(mbeandescriptor);
}
catch(MBeanException e)
{
throw new RuntimeException("Cannot set MBean descriptor", e);
}
}
// ModelMBeanInfo interface implementation -----------------------
/**
* Returns the descriptors of an Model MBean for a given management
* interface element type. The descriptor type must be one of the following:
* * - {@link org.jboss.mx.modelmbean.ModelMBeanConstants#MBEAN_DESCRIPTOR MBEAN_DESCRIPTOR} * - {@link org.jboss.mx.modelmbean.ModelMBeanConstants#ATTRIBUTE_DESCRIPTOR ATTRIBUTE_DESCRIPTOR} * - {@link org.jboss.mx.modelmbean.ModelMBeanConstants#OPERATION_DESCRIPTOR OPERATION_DESCRIPTOR} * - {@link org.jboss.mx.modelmbean.ModelMBeanConstants#NOTIFICATION_DESCRIPTOR NOTIFICATION_DESCRIPTOR} * - {@link org.jboss.mx.modelmbean.ModelMBeanConstants#CONSTRUCTOR_DESCRIPTOR CONSTRUCTOR_DESCRIPTOR} * - {@link org.jboss.mx.modelmbean.ModelMBeanConstants#ALL_DESCRIPTORS ALL_DESCRIPTORS} * ** * Using ALL_DESCRIPTORS returns descriptors for the MBean, and all * its modelAttributes, modelOperations, modelNotifications and modelConstructors. * * @param descrType descriptor type string * * @return MBean descriptors. */ public Descriptor[] getDescriptors(String descrType) throws MBeanException { if (descrType == null) { List list = new ArrayList(100); list.add(mbeanDescriptor); list.addAll(getAttributeDescriptors().values()); list.addAll(getOperationDescriptors().values()); list.addAll(getNotificationDescriptors().values()); list.addAll(getConstructorDescriptors().values()); return (Descriptor[])list.toArray(new Descriptor[0]); } else if (descrType.equalsIgnoreCase(ModelMBeanConstants.MBEAN_DESCRIPTOR)) return new Descriptor[] { mbeanDescriptor }; else if (descrType.equalsIgnoreCase(ModelMBeanConstants.ATTRIBUTE_DESCRIPTOR)) return (Descriptor[])getAttributeDescriptors().values().toArray(new Descriptor[0]); else if (descrType.equalsIgnoreCase(ModelMBeanConstants.OPERATION_DESCRIPTOR)) return (Descriptor[])getOperationDescriptors().values().toArray(new Descriptor[0]); else if (descrType.equalsIgnoreCase(ModelMBeanConstants.NOTIFICATION_DESCRIPTOR)) return (Descriptor[])getNotificationDescriptors().values().toArray(new Descriptor[0]); else if (descrType.equalsIgnoreCase(ModelMBeanConstants.CONSTRUCTOR_DESCRIPTOR)) return (Descriptor[])getConstructorDescriptors().values().toArray(new Descriptor[0]); throw new IllegalArgumentException("unknown descriptor type: " + descrType); } /** * Returns a descriptor of a management interface element matching the given * name and type. The descriptor type string must be one of the following:
* * - {@link org.jboss.mx.modelmbean.ModelMBeanConstants#MBEAN_DESCRIPTOR MBEAN_DESCRIPTOR} * - {@link org.jboss.mx.modelmbean.ModelMBeanConstants#ATTRIBUTE_DESCRIPTOR ATTRIBUTE_DESCRIPTOR} * - {@link org.jboss.mx.modelmbean.ModelMBeanConstants#OPERATION_DESCRIPTOR OPERATION_DESCRIPTOR} * - {@link org.jboss.mx.modelmbean.ModelMBeanConstants#NOTIFICATION_DESCRIPTOR NOTIFICATION_DESCRIPTOR} * - {@link org.jboss.mx.modelmbean.ModelMBeanConstants#CONSTRUCTOR_DESCRIPTOR CONSTRUCTOR_DESCRIPTOR} * ** * @param descrName name of the descriptor * @param descrType type of the descriptor * * @return the requested descriptor or null if it was not found * * @throws RuntimeOperationsException if an illegal descriptor type was given */ public Descriptor getDescriptor(String descrName, String descrType) throws MBeanException { if (descrType == null) throw new RuntimeOperationsException(new IllegalArgumentException("null descriptor type")); if (descrType.equalsIgnoreCase(ModelMBeanConstants.MBEAN_DESCRIPTOR)) return mbeanDescriptor; else if (descrType.equalsIgnoreCase(ModelMBeanConstants.ATTRIBUTE_DESCRIPTOR)) return getAttributeDescriptor(descrName); else if (descrType.equalsIgnoreCase(ModelMBeanConstants.OPERATION_DESCRIPTOR)) return getOperationDescriptor(descrName); else if (descrType.equalsIgnoreCase(ModelMBeanConstants.CONSTRUCTOR_DESCRIPTOR)) return getConstructorDescriptor(descrName); else if (descrType.equalsIgnoreCase(ModelMBeanConstants.NOTIFICATION_DESCRIPTOR)) return getNotificationDescriptor(descrName); throw new RuntimeOperationsException(new IllegalArgumentException("unknown descriptor type: " + descrType)); } /** * Adds or replaces the descriptors in this Model MBean. All descriptors * must be valid. Null references will be ignored. * * @param inDescriptors array of descriptors */ public void setDescriptors(Descriptor[] inDescriptors) throws MBeanException { for (int i = 0; i < inDescriptors.length; ++i) { if (inDescriptors[i] != null && inDescriptors[i].isValid()) { setDescriptor( inDescriptors[i], (String)inDescriptors[i].getFieldValue(ModelMBeanConstants.DESCRIPTOR_TYPE) ); } } } /** * Adds or replaces the descriptor in this Model MBean. Descriptor must be * valid. If descrType is not specified, the descriptorType * field of the given descriptor is used.
*
* The descriptorType must contain one of the following values:
* * - {@link org.jboss.mx.modelmbean.ModelMBeanConstants#MBEAN_DESCRIPTOR MBEAN_DESCRIPTOR} * - {@link org.jboss.mx.modelmbean.ModelMBeanConstants#ATTRIBUTE_DESCRIPTOR ATTRIBUTE_DESCRIPTOR} * - {@link org.jboss.mx.modelmbean.ModelMBeanConstants#OPERATION_DESCRIPTOR OPERATION_DESCRIPTOR} * - {@link org.jboss.mx.modelmbean.ModelMBeanConstants#NOTIFICATION_DESCRIPTOR NOTIFICATION_DESCRIPTOR} * - {@link org.jboss.mx.modelmbean.ModelMBeanConstants#CONSTRUCTOR_DESCRIPTOR CONSTRUCTOR_DESCRIPTOR} * ** * @param descr descriptor to set * @param descrType descriptor type string, can be null * * @throws RuntimeOperationsException if descr is null, or * descriptor is not valid. */ public void setDescriptor(Descriptor descr, String descrType) throws MBeanException { if (descr == null) throw new RuntimeOperationsException(new IllegalArgumentException("null descriptor")); if (!descr.isValid()) throw new RuntimeOperationsException(new IllegalArgumentException("not a valid descriptor")); if (descrType == null) descrType = (String)descr.getFieldValue(ModelMBeanConstants.DESCRIPTOR_TYPE); if (descrType.equalsIgnoreCase(ModelMBeanConstants.MBEAN_DESCRIPTOR)) { setMBeanDescriptor(descr); } else if (descrType.equalsIgnoreCase(ModelMBeanConstants.ATTRIBUTE_DESCRIPTOR)) { ModelMBeanAttributeInfo info = getAttribute((String)descr.getFieldValue(ModelMBeanConstants.NAME)); info.setDescriptor(descr); } else if (descrType.equalsIgnoreCase(ModelMBeanConstants.OPERATION_DESCRIPTOR)) { ModelMBeanOperationInfo info = getOperation((String)descr.getFieldValue(ModelMBeanConstants.NAME)); info.setDescriptor(descr); } else if (descrType.equalsIgnoreCase(ModelMBeanConstants.CONSTRUCTOR_DESCRIPTOR)) { ModelMBeanConstructorInfo info = getConstructor((String)descr.getFieldValue(ModelMBeanConstants.NAME)); info.setDescriptor(descr); } else if (descrType.equalsIgnoreCase(ModelMBeanConstants.NOTIFICATION_DESCRIPTOR)) { ModelMBeanNotificationInfo info = getNotification((String)descr.getFieldValue(ModelMBeanConstants.NAME)); info.setDescriptor(descr); } else throw new RuntimeOperationsException(new IllegalArgumentException("unknown descriptor type: " + descrType)); } /** * Returns the attribute info for the named attribute, or null if there is none. */ public ModelMBeanAttributeInfo getAttribute(String inName) throws MBeanException { if (inName == null) throw new RuntimeOperationsException(new IllegalArgumentException("Null attribute name")); for (int i = 0; i < modelAttributes.length; ++i) { if (modelAttributes[i].getName().equals(inName)) return modelAttributes[i]; } return null; } /** * Returns the operation info for the named attribute, or null if there is none. */ public ModelMBeanOperationInfo getOperation(String inName) throws MBeanException { if (inName == null) throw new RuntimeOperationsException(new IllegalArgumentException("Null operation name")); for (int i = 0; i < modelOperations.length; ++i) if (modelOperations[i].getName().equals(inName)) return modelOperations[i]; return null; } /** * Returns the constructor info for the named attribute, or null if there is none. */ public ModelMBeanConstructorInfo getConstructor(String inName) throws MBeanException { if (inName == null) throw new RuntimeOperationsException(new IllegalArgumentException("Null constructor name")); for (int i = 0; i < modelConstructors.length; ++i) if (modelConstructors[i].getName().equals(inName)) return modelConstructors[i]; return null; } /** * Returns the attribute info for the named attribute, or null if there is none. */ public ModelMBeanNotificationInfo getNotification(String inName) throws MBeanException { if (inName == null) throw new RuntimeOperationsException(new IllegalArgumentException("Null notification name")); for (int i = 0; i < modelNotifications.length; ++i) if (modelNotifications[i].getName().equals(inName)) return modelNotifications[i]; return null; } public MBeanAttributeInfo[] getAttributes() { return super.getAttributes(); } public MBeanOperationInfo[] getOperations() { return super.getOperations(); } public MBeanConstructorInfo[] getConstructors() { return super.getConstructors(); } public MBeanNotificationInfo[] getNotifications() { return super.getNotifications(); } public Descriptor getMBeanDescriptor() throws MBeanException { return mbeanDescriptor; } /** * Sets the ModelMBean's descriptor. This descriptor contains default, MBean wide metadata about the MBean and * default policies for persistence and caching. This operation does a complete replacement of the descriptor, * no merging is done. * * If the descriptor to set to is null then the default descriptor will be created. * * The default descriptor is: name=mbeanName,descriptorType=mbean, displayName=this.getClassName(), persistPolicy=never,log=F,export=F,visiblity=1 * If the descriptor does not contain all these fields, they will be added with these default values. * See getMBeanDescriptor method javadoc for description of valid field names. */ public void setMBeanDescriptor(Descriptor inDescriptor) throws MBeanException, RuntimeOperationsException { if (inDescriptor == null) inDescriptor = createDefaultDescriptor(); if (inDescriptor.isValid() && isMBeanDescriptorValid(inDescriptor)) { addDefaultMBeanDescriptorFields(inDescriptor); this.mbeanDescriptor = inDescriptor; } } /** * Validate the descriptor in the context of an attribute */ private boolean isMBeanDescriptorValid(Descriptor inDescriptor) { String name = (String)inDescriptor.getFieldValue(ModelMBeanConstants.NAME); if (name == null) throw new RuntimeOperationsException (new IllegalArgumentException("Invalid null name")); String descriptorType = (String)inDescriptor.getFieldValue(ModelMBeanConstants.DESCRIPTOR_TYPE); if (ModelMBeanConstants.MBEAN_DESCRIPTOR.equalsIgnoreCase(descriptorType) == false) throw new RuntimeOperationsException (new IllegalArgumentException("Invalid descriptorType, for mbean '" + name + "' expected 'MBean' but got: " + descriptorType)); return true; } // Public -------------------------------------------------------- /** * @deprecated use {@link #getDescriptor(String, String)} instead. */ public Descriptor getDescriptor(String descrName) throws MBeanException { /* * NOTE: this method is not part of the ModelMBeanInfo interface but is * included in the RI javadocs so it is also here for the sake * of completeness. The problem here though is that this method * to work without the descriptor type string assumes unique name * for all descriptors regardless their type (something that is * not mandated by the spec). Hence the deprecated tag. [JPL] */ if (descrName.equals(mbeanDescriptor.getFieldValue(ModelMBeanConstants.NAME))) return mbeanDescriptor; Descriptor descr = null; descr = (Descriptor)getAttributeDescriptors().get(descrName); if (descr != null) return descr; descr = (Descriptor)getOperationDescriptors().get(descrName); if (descr != null) return descr; descr = (Descriptor)getNotificationDescriptors().get(descrName); if (descr != null) return descr; descr = (Descriptor)getConstructorDescriptors().get(descrName); if (descr != null) return descr; return null; } // Y overrides --------------------------------------------------- public synchronized Object clone() { ModelMBeanInfoSupport clone = (ModelMBeanInfoSupport)super.clone(); clone.mbeanDescriptor = (Descriptor)mbeanDescriptor.clone(); return clone; } // Private ------------------------------------------------------- private void addDefaultMBeanDescriptorFields(Descriptor descr) { if (descr.getFieldValue(ModelMBeanConstants.NAME) == null || descr.getFieldValue(ModelMBeanConstants.NAME).equals("")) descr.setField(ModelMBeanConstants.NAME, getClassName()); if (descr.getFieldValue(ModelMBeanConstants.DESCRIPTOR_TYPE) == null) descr.setField(ModelMBeanConstants.DESCRIPTOR_TYPE, ModelMBeanConstants.MBEAN_DESCRIPTOR); if (!(((String)descr.getFieldValue(ModelMBeanConstants.DESCRIPTOR_TYPE)).equalsIgnoreCase(ModelMBeanConstants.MBEAN_DESCRIPTOR))) descr.setField(ModelMBeanConstants.DESCRIPTOR_TYPE, ModelMBeanConstants.MBEAN_DESCRIPTOR); if (descr.getFieldValue(ModelMBeanConstants.DISPLAY_NAME) == null) descr.setField(ModelMBeanConstants.DISPLAY_NAME, getClassName()); if (descr.getFieldValue(ModelMBeanConstants.PERSIST_POLICY) == null) descr.setField(ModelMBeanConstants.PERSIST_POLICY, ModelMBeanConstants.PP_NEVER); if (descr.getFieldValue(ModelMBeanConstants.LOG) == null) descr.setField(ModelMBeanConstants.LOG, "F"); if (descr.getFieldValue(ModelMBeanConstants.VISIBILITY) == null) descr.setField(ModelMBeanConstants.VISIBILITY, ModelMBeanConstants.HIGH_VISIBILITY); } /** * The default descriptor is: * name=mbeanName * descriptorType=mbean * displayName=this.getClassName() * persistPolicy=never * log=F * visiblity=1 */ private Descriptor createDefaultDescriptor() { return new DescriptorSupport(new String[] { ModelMBeanConstants.NAME + "=" + getClassName() , ModelMBeanConstants.DESCRIPTOR_TYPE + "=" + ModelMBeanConstants.MBEAN_DESCRIPTOR, ModelMBeanConstants.DISPLAY_NAME + "=" + getClassName(), ModelMBeanConstants.PERSIST_POLICY + "=" + ModelMBeanConstants.PP_NEVER, ModelMBeanConstants.LOG + "=" + "F", ModelMBeanConstants.VISIBILITY + "=" + ModelMBeanConstants.HIGH_VISIBILITY }); } private Map getAttributeDescriptors() { Map map = new HashMap(); for (int i = 0; i < modelAttributes.length; ++i) map.put(modelAttributes[i].getName(), (modelAttributes[i]).getDescriptor()); return map; } private Descriptor getAttributeDescriptor(String descrName) { for (int i = 0; i < modelAttributes.length; ++i) if (modelAttributes[i].getName().equals(descrName)) return modelAttributes[i].getDescriptor(); return null; } private Map getOperationDescriptors() { Map map = new HashMap(); for (int i = 0; i < modelOperations.length; ++i) map.put(modelOperations[i].getName(), (modelOperations[i]).getDescriptor()); return map; } private Descriptor getOperationDescriptor(String descrName) { for (int i = 0; i < modelOperations.length; ++i) if (modelOperations[i].getName().equals(descrName)) return modelOperations[i].getDescriptor(); return null; } private Map getConstructorDescriptors() { Map map = new HashMap(); for (int i = 0; i < modelConstructors.length; ++i) map.put(modelConstructors[i].getName(), (modelConstructors[i]).getDescriptor()); return map; } private Descriptor getConstructorDescriptor(String descrName) { for (int i = 0; i < modelConstructors.length; ++i) if (modelConstructors[i].getName().equals(descrName)) return modelConstructors[i].getDescriptor(); return null; } private Map getNotificationDescriptors() { Map map = new HashMap(); for (int i = 0; i < modelNotifications.length; ++i) map.put(modelNotifications[i].getName(), (modelNotifications[i]).getDescriptor()); return map; } private Descriptor getNotificationDescriptor(String descrName) { for (int i = 0; i < modelNotifications.length; ++i) if (modelNotifications[i].getName().equals(descrName)) return modelNotifications[i].getDescriptor(); return null; } private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException { ModelMBeanAttributeInfo[] attrInfo; ModelMBeanConstructorInfo[] consInfo; ModelMBeanOperationInfo[] operInfo; ModelMBeanNotificationInfo[] notifyInfo; Descriptor desc; ObjectInputStream.GetField getField = ois.readFields(); switch (Serialization.version) { case Serialization.V1R0: attrInfo = (ModelMBeanAttributeInfo[]) getField.get("mmbAttributes", null); consInfo = (ModelMBeanConstructorInfo[]) getField.get("mmbConstructors", null); notifyInfo = (ModelMBeanNotificationInfo[]) getField.get("mmbNotifications", null); operInfo = (ModelMBeanOperationInfo[]) getField.get("mmbOperations", null); break; default: attrInfo = (ModelMBeanAttributeInfo[]) getField.get("modelMBeanAttributes", null); consInfo = (ModelMBeanConstructorInfo[]) getField.get("modelMBeanConstructors", null); notifyInfo = (ModelMBeanNotificationInfo[]) getField.get("modelMBeanNotifications", null); operInfo = (ModelMBeanOperationInfo[]) getField.get("modelMBeanOperations", null); } desc = (Descriptor) getField.get("modelMBeanDescriptor", null); if (desc == null) throw new StreamCorruptedException("Null descriptor?"); this.modelAttributes = (null == attrInfo) ? new ModelMBeanAttributeInfo[0] : attrInfo; this.modelConstructors = (null == consInfo) ? new ModelMBeanConstructorInfo[0] : consInfo; this.modelOperations = (null == operInfo) ? new ModelMBeanOperationInfo[0] : operInfo; this.modelNotifications = (null == notifyInfo) ? new ModelMBeanNotificationInfo[0] : notifyInfo; try { setMBeanDescriptor(createDefaultDescriptor()); } catch(MBeanException ignore) { } } private void writeObject(ObjectOutputStream oos) throws IOException { ObjectOutputStream.PutField putField = oos.putFields(); switch (Serialization.version) { case Serialization.V1R0: putField.put("mmbAttributes", modelAttributes); putField.put("mmbConstructors", modelConstructors); putField.put("mmbNotifications", modelNotifications); putField.put("mmbOperations", modelOperations); break; default: putField.put("modelMBeanAttributes", modelAttributes); putField.put("modelMBeanConstructors", modelConstructors); putField.put("modelMBeanNotifications", modelNotifications); putField.put("modelMBeanOperations", modelOperations); } putField.put("modelMBeanDescriptor", mbeanDescriptor); oos.writeFields(); } }