FileDocCategorySizeDatePackage
StandardMBeanMetaDataImpl.javaAPI DocJava SE 5 API3961Fri Aug 26 14:55:00 BST 2005com.sun.jmx.mbeanserver

StandardMBeanMetaDataImpl.java

/*
 * @(#)StandardMBeanMetaDataImpl.java	1.2 05/05/27
 *
 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

package com.sun.jmx.mbeanserver;

import javax.management.MBeanInfo;
import javax.management.StandardMBean;

/**
 * Override StandardMetaDataImpl in order to redefine the caching
 * of MBean Information in StandardMBean.
 *
 * @since 1.6
 */
public final class StandardMBeanMetaDataImpl extends StandardMetaDataImpl {

    private final StandardMBean mbean;

    /**
     * Constructor.
     */
    public StandardMBeanMetaDataImpl(StandardMBean mbean) {
        super(false);
        this.mbean = mbean;
    }

    /**
     * We need to override this method because some methods
     * from BaseMetaDataImpl rely on MetaData#getMBeanInfo().
     * <p>
     * The default caching implemented in StandardMetaDataImpl
     * will not work if two instances of class <var>c</var>
     * can have different management interfaces, which is
     * made possible by {@link javax.management.StandardMBean}.
     *
     * @return mbean.getMBeanInfo();
     */
    MBeanInfo getCachedMBeanInfo(Class beanClass) {

        if (beanClass == null) return null;

        // Need the synchronized block as long as implementation
        // and mbeanInterface are not final.
        //
        synchronized (mbean) {
            // Consistency checking: beanClass must be equal
            // to mbean.getImplementationClass().
            //
            final Class implementationClass =
                mbean.getImplementationClass();
            if (implementationClass == null) return null;
            if (!beanClass.equals(implementationClass)) return null;

            // Should always come here (null cases excepted)...
            //
            return mbean.getMBeanInfo();
        }
    }

    /**
     * We need to override this method because some methods
     * from StandardMetaDataImpl rely on it.
     * <p>
     * The default caching implemented in StandardMetaDataImpl
     * will not work if two instances of class <var>c</var>
     * can have different management interfaces, which is
     * made possible by {@link javax.management.StandardMBean}.
     *
     * @return mbean.getMBeanInterface();
     */
    Class getCachedMBeanInterface(Class beanClass) {
        // Need the synchronized block as long as implementation
        // and mbeanInterface are not final.
        //
        synchronized (mbean) {
            // Consistency checking: beanClass must be equal
            // to mbean.getImplementationClass().
            //
            final Class implementationClass =
                mbean.getImplementationClass();
            if (implementationClass == null) return null;
            if (!beanClass.equals(implementationClass)) return null;

            // Should always come here (null cases excepted)...
            //
            return mbean.getMBeanInterface();
        }
    }

    /**
     * Need to override this method because default caching implemented
     * in StandardMetaDataImpl will not work if two instances of class
     * <var>c</var> can have different <var>mbeanInterface</var>.
     * <p>
     * The default caching mechanism in StandardMetaDataImpl uses
     * class static {@link java.util.WeakHashMap WeakHashMaps} - and
     * is common to all instance of StandardMetaData - hence to
     * all MBeanServer.
     * <p>
     * As this default mechanism might not always work for
     * StandardMBean objects (may have several instances of class
     * <var>c</var> with different MBean interfaces), we disable
     * this default caching by defining an empty
     * <code>cacheMBeanInfo()</code> method.
     * <p>
     * Caching in our case is no longer performed by the MetaData
     * object, but by the StandardMBean object.
     */
    void cacheMBeanInfo(Class c, Class mbeanInterface, MBeanInfo mbeanInfo) {
    }
}