01: /*****************************************************************************
02: * Copyright (C) NanoContainer Organization. All rights reserved. *
03: * ------------------------------------------------------------------------- *
04: * The software in this package is published under the terms of the BSD *
05: * style license a copy of which has been included with this distribution in *
06: * the LICENSE.txt file. *
07: * *
08: * Original code by Joerg Schaible *
09: *****************************************************************************/package org.picocontainer.gems.jmx;
10:
11: import javax.management.DynamicMBean;
12: import javax.management.MalformedObjectNameException;
13: import javax.management.ObjectName;
14:
15: import org.picocontainer.ComponentAdapter;
16: import org.picocontainer.PicoContainer;
17:
18: /**
19: * DynamicMBeanProvider, that will provide a component directly if it is already a {@link DynamicMBean}.
20: * @author Jörg Schaible
21: */
22: public class DynamicMBeanComponentProvider implements
23: DynamicMBeanProvider {
24:
25: private final ObjectNameFactory objectNameFactory;
26:
27: /**
28: * Construct a DynamicMBeanComponentProvider. This instance will use a {@link TypedObjectNameFactory} and register
29: * all MBeans in the default domain of the {@link javax.management.MBeanServer}.
30: */
31: public DynamicMBeanComponentProvider() {
32: this (new TypedObjectNameFactory());
33: }
34:
35: /**
36: * Construct a DynamicMBeanComponentProvider with a specified ObjectNameFactory.
37: * @param factory The {@link ObjectNameFactory}.
38: */
39: public DynamicMBeanComponentProvider(final ObjectNameFactory factory) {
40: if (factory == null) {
41: throw new NullPointerException("ObjectFactoryName is null");
42: }
43: objectNameFactory = factory;
44: }
45:
46: /**
47: * Provide the component itself as {@link DynamicMBean} if it is one and if an {@link ObjectName} can be created.
48: * @see org.picocontainer.gems.jmx.DynamicMBeanProvider#provide(org.picocontainer.PicoContainer,
49: * org.picocontainer.ComponentAdapter)
50: */
51: public JMXRegistrationInfo provide(
52: final PicoContainer picoContainer,
53: final ComponentAdapter componentAdapter) {
54: if (DynamicMBean.class.isAssignableFrom(componentAdapter
55: .getComponentImplementation())) {
56: final DynamicMBean mBean = (DynamicMBean) componentAdapter
57: .getComponentInstance(picoContainer);
58: try {
59: final ObjectName objectName = objectNameFactory.create(
60: componentAdapter.getComponentKey(), mBean);
61: if (objectName != null) {
62: return new JMXRegistrationInfo(objectName, mBean);
63: }
64: } catch (final MalformedObjectNameException e) {
65: throw new JMXRegistrationException(
66: "Cannot create ObjectName for component '"
67: + componentAdapter.getComponentKey()
68: + "'", e);
69: }
70: }
71: return null;
72: }
73: }
|