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.MBeanServer;
014
015 import org.picocontainer.ComponentAdapter;
016 import org.picocontainer.gems.GemsCharacteristics;
017 import org.picocontainer.Parameter;
018 import org.picocontainer.PicoCompositionException;
019 import org.picocontainer.ComponentMonitor;
020 import org.picocontainer.LifecycleStrategy;
021 import org.picocontainer.behaviors.AbstractBehaviorFactory;
022
023 import java.lang.management.ManagementFactory;
024 import java.util.Properties;
025
026
027 /**
028 * {@link org.picocontainer.ComponentFactory} that instantiates {@link JMXExposed} instances.
029 * @author Jörg Schaible
030 */
031 @SuppressWarnings("serial")
032 public class JMXExposing extends AbstractBehaviorFactory {
033
034
035 private final MBeanServer mBeanServer;
036 private final DynamicMBeanProvider[] providers;
037
038 /**
039 * Constructs a JMXExposingComponentFactory that uses the system default MBean Server.
040 * @since PicoContainer-Gems 2.4
041 */
042 public JMXExposing() {
043 this(ManagementFactory.getPlatformMBeanServer());
044 }
045
046
047 /**
048 * Construct a JMXExposingComponentFactory.
049 * @param mBeanServer The {@link MBeanServer} used for registering the MBean.
050 * @param providers An array with providers for converting the component instance into a
051 * {@link javax.management.DynamicMBean}.
052 * @throws NullPointerException Thrown if the {@link MBeanServer} or the array with the {@link DynamicMBeanProvider}
053 * instances is null.
054 */
055 public JMXExposing(
056 final MBeanServer mBeanServer,
057 final DynamicMBeanProvider[] providers) throws NullPointerException {
058 if (mBeanServer == null || providers == null) {
059 throw new NullPointerException();
060 }
061 this.mBeanServer = mBeanServer;
062 this.providers = providers;
063 }
064
065 /**
066 * Construct a JMXExposingComponentFactory. This instance uses a {@link DynamicMBeanComponentProvider} as
067 * default to register any component instance in the {@link MBeanServer}, that is already a
068 * {@link javax.management.DynamicMBean}.
069 * @param mBeanServer The {@link MBeanServer} used for registering the MBean.
070 * @throws NullPointerException Thrown if the {@link MBeanServer} or the array with the {@link DynamicMBeanProvider}
071 * instances is null.
072 */
073 public JMXExposing(final MBeanServer mBeanServer)
074 throws NullPointerException {
075 this(mBeanServer, new DynamicMBeanProvider[]{new DynamicMBeanComponentProvider()});
076 }
077
078
079 /**
080 * Retrieve a {@link ComponentAdapter}. Wrap the instance retrieved by the delegate with an instance of a
081 * {@link JMXExposed}.
082 * @see org.picocontainer.ComponentFactory#createComponentAdapter(ComponentMonitor,LifecycleStrategy,Properties,Object,Class,Parameter...)
083 */
084 @Override
085 public <T> ComponentAdapter<T> createComponentAdapter(
086 final ComponentMonitor componentMonitor, final LifecycleStrategy lifecycleStrategy, final Properties componentProperties, final Object componentKey, final Class<T> componentImplementation, final Parameter... parameters)
087 throws PicoCompositionException {
088 final ComponentAdapter<T> delegateAdapter = super.createComponentAdapter(
089 componentMonitor, lifecycleStrategy,
090 componentProperties, componentKey, componentImplementation, parameters);
091 if (AbstractBehaviorFactory.removePropertiesIfPresent(componentProperties, GemsCharacteristics.NO_JMX)) {
092 return delegateAdapter;
093 } else {
094 AbstractBehaviorFactory.removePropertiesIfPresent(componentProperties, GemsCharacteristics.JMX);
095 return componentMonitor.newBehavior(new JMXExposed<T>(delegateAdapter, mBeanServer, providers));
096 }
097 }
098
099
100 @Override
101 public <T> ComponentAdapter<T> addComponentAdapter(final ComponentMonitor componentMonitor,
102 final LifecycleStrategy lifecycleStrategy,
103 final Properties componentProperties,
104 final ComponentAdapter<T> adapter) {
105 if (AbstractBehaviorFactory.removePropertiesIfPresent(componentProperties, GemsCharacteristics.NO_JMX)) {
106 return super.addComponentAdapter(componentMonitor,
107 lifecycleStrategy,
108 componentProperties,
109 adapter);
110 } else {
111 return componentMonitor.newBehavior(new JMXExposed<T>(super.addComponentAdapter(componentMonitor,
112 lifecycleStrategy,
113 componentProperties,
114 adapter), mBeanServer, providers));
115 }
116
117 }
118 }