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ö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 }