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 016 /** 017 * A DynamicMBeanProvider that constructs StandardMBean instances that follow the JMX naming conventions. The name of 018 * the management interface must follow the naming conventions with an <em>MBean</em> appended to the MBean's type. 019 * The implementation will use the registered MBeanInfoProvider instances of type 020 * {@link ComponentKeyConventionMBeanInfoProvider} and {@link ComponentTypeConventionMBeanInfoProvider} to provide a 021 * {@link MBeanInfo} for the component's MBean. If a {@link MBeanInfo} was found, the MBean's type is used from the 022 * MBeanInfo otherwise the type is the implementation class of the component. 023 * @author Jörg Schaible 024 */ 025 public class NamingConventionConstructingProvider extends AbstractConstructingProvider { 026 027 private final ObjectNameFactory objectNameFactory; 028 private final MBeanInfoProvider[] mBeanProviders; 029 private final StandardMBeanFactory mBeanFactory; 030 031 /** 032 * Construct a NamingConventionConstructingProvider. Following {@link MBeanInfoProvider} instances are registered 033 * with this constructor: 034 * <ul> 035 * <li>{@link ComponentKeyConventionMBeanInfoProvider}</li> 036 * <li>{@link ComponentTypeConventionMBeanInfoProvider}</li> 037 * </ul> 038 * @param factory The ObjectNameFactory used to name the created MBeans. 039 */ 040 public NamingConventionConstructingProvider(final ObjectNameFactory factory) { 041 if (factory == null) { 042 throw new NullPointerException("ObjectNameFactory is null"); 043 } 044 mBeanFactory = new StandardMBeanFactory(); 045 objectNameFactory = factory; 046 mBeanProviders = new MBeanInfoProvider[]{ 047 new ComponentKeyConventionMBeanInfoProvider(), new ComponentTypeConventionMBeanInfoProvider()}; 048 } 049 050 /** 051 * Return a {@link StandardMBeanFactory}. 052 * @see org.picocontainer.gems.jmx.AbstractConstructingProvider#getMBeanFactory() 053 */ 054 @Override 055 protected DynamicMBeanFactory getMBeanFactory() { 056 return mBeanFactory; 057 } 058 059 /** 060 * @see org.picocontainer.gems.jmx.AbstractConstructingProvider#getObjectNameFactory() 061 */ 062 @Override 063 public ObjectNameFactory getObjectNameFactory() { 064 return objectNameFactory; 065 } 066 067 /** 068 * Return an array with an instance of type {@link ComponentKeyConventionMBeanInfoProvider} and 069 * {@link ComponentTypeConventionMBeanInfoProvider}. 070 * @see org.picocontainer.gems.jmx.AbstractConstructingProvider#getMBeanInfoProviders() 071 */ 072 @Override 073 public MBeanInfoProvider[] getMBeanInfoProviders() { 074 return mBeanProviders; 075 } 076 077 /** 078 * Determin the default management interface using naming convetions of the JMX specification. 079 * @param implementation The type of the component's implementation. 080 * @param mBeanInfo The {@link MBeanInfo} to expose the component. May be <code>null</code>. 081 * @return Returns the management interface. 082 * @throws ClassNotFoundException Thrown if no interface can be determined. 083 */ 084 @Override 085 protected Class getManagementInterface(final Class implementation, final MBeanInfo mBeanInfo) 086 throws ClassNotFoundException { 087 return mBeanFactory.getDefaultManagementInterface(implementation, mBeanInfo); 088 } 089 }