    001    /*****************************************************************************
    002     * Copyright (C) NanoContainer Organization. All rights reserved.            *
    003     * ------------------------------------------------------------------------- *
    004     * The software in this package is published under the terms of the BSD      *
    005     * style license a copy of which has been included with this distribution in *
    006     * the LICENSE.txt file.                                                     *
    007     *                                                                           *
    008     * Original code by Joerg Schaible                                           *
    009     *****************************************************************************/
    010
    011    package org.picocontainer.gems.jmx;
    012
    013    import javax.management.MBeanInfo;
    014
    015    import org.picocontainer.PicoContainer;
    016
    017
    018    /**
    019     * Abstract base class for MBeanInfoProvider that search MBeanInfo in the PicoContainer registered with a key that
    020     * follows naming conventions.
    021     * @author J&ouml;rg Schaible
    022     */
    023    public abstract class AbstractNamingConventionMBeanInfoProvider implements MBeanInfoProvider {
    024
    025        /**
    026         * Locate a MBeanInfo as component in a PicoContainer. If no component is registered using the name of the MBeanInfo
    027         * as key, the method turns the name into a type and searches again.
    028         * @param mBeanInfoName The name of the {@link MBeanInfo} used as key.
    029         * @param picoContainer The {@link PicoContainer} used for the lookup.
    030         * @param classLoader The {@link ClassLoader} used to load the type of the key.
    031         * @return Returns the MBeanInfo instance or <code>null</code>.
    032         */
    033        protected MBeanInfo instantiateMBeanInfo(
    034                final String mBeanInfoName, final PicoContainer picoContainer, ClassLoader classLoader) {
    035            MBeanInfo mBeanInfo = null;
    036            try {
    037                mBeanInfo = (MBeanInfo)picoContainer.getComponent(mBeanInfoName);
    038            } catch (final ClassCastException e) {
    039                // wrong type, search goes on
    040            }
    041            if (mBeanInfo == null) {
    042                if (classLoader == null) {
    043                    classLoader = Thread.currentThread().getContextClassLoader();
    044                }
    045                try {
    046                    final Class mBeanInfoType = classLoader.loadClass(mBeanInfoName);
    047                    if (MBeanInfo.class.isAssignableFrom(mBeanInfoType)) {
    048                        mBeanInfo = (MBeanInfo)picoContainer.getComponent(mBeanInfoType);
    049                    }
    050                } catch (final ClassNotFoundException e) {
    051                    // no such class
    052                }
    053            }
    054            return mBeanInfo;
    055        }
    056
    057    }