- /*
- * @(#)MetaDataImpl.java 1.28 03/12/19
- *
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
-
- package com.sun.jmx.mbeanserver;
-
-
-
- // java import
-
- import java.lang.reflect.Method;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.InvocationTargetException;
- import java.util.Hashtable;
- import java.util.Iterator;
- import java.io.PrintWriter;
- import java.io.StringWriter;
-
- // RI import
- import javax.management.* ;
- import com.sun.jmx.trace.Trace;
-
- /**
- * The MetaData class provides local access to the metadata service in
- * an agent.
- *
- * @since 1.5
- * @since.unbundled JMX RI 1.2
- */
- public class MetaDataImpl implements MetaData {
-
- /** The name of this class to be used for tracing */
- private final static String dbgTag = "MetaDataImpl";
-
- /** MetaData for DynamicMBeans **/
- private final DynamicMetaDataImpl dynamic;
- private final StandardMetaDataImpl standard;
-
- /**
- * The MBeanInstantiator associated to the MetaData
- */
- protected final MBeanInstantiator instantiator;
-
- // Not sure we need this...
- private final class PrivateStandardMeta extends StandardMetaDataImpl {
- PrivateStandardMeta() {
- super();
- }
- // public synchronized void testCompliance(Class c) {
- // MetaDataImpl.this.testStrictCompliance(c);
- // }
- protected Class findClass(String className, ClassLoader loader)
- throws ReflectionException {
- return MetaDataImpl.this.findClass(className,loader);
- }
- protected Class[] findSignatureClasses(String[] signature,
- ClassLoader loader)
- throws ReflectionException {
- return MetaDataImpl.this.findSignatureClasses(signature,loader);
- }
-
- }
-
- // Not sure we need this...
- private final class PrivateDynamicMeta extends DynamicMetaDataImpl {
- PrivateDynamicMeta() {
- super();
- }
- // public synchronized void testCompliance(Class c) {
- // MetaDataImpl.this.testStrictCompliance(c);
- // }
- protected Class findClass(String className, ClassLoader loader)
- throws ReflectionException {
- return MetaDataImpl.this.findClass(className,loader);
- }
- protected Class[] findSignatureClasses(String[] signature,
- ClassLoader loader)
- throws ReflectionException {
- return MetaDataImpl.this.findSignatureClasses(signature,loader);
- }
-
- }
-
- /**
- * Creates a Metadata Service.
- * @param instantiator The MBeanInstantiator that will be used to
- * take care of class loading issues.
- * This parameter may not be null.
- * @exception IllegalArgumentException if the instantiator is null.
- */
- public MetaDataImpl(MBeanInstantiator instantiator) {
- if (instantiator == null) throw new
- IllegalArgumentException("instantiator must not be null.");
- this.instantiator = instantiator;
- this.dynamic = new PrivateDynamicMeta();
- this.standard = new PrivateStandardMeta();
- // ------------------------------
- // ------------------------------
- }
-
-
- protected MetaData getMetaData(Class c) {
- if (DynamicMBean.class.isAssignableFrom(c))
- return dynamic;
- else
- return standard;
- }
-
- protected MetaData getMetaData(Object moi) {
- if (moi instanceof DynamicMBean)
- return dynamic;
- else
- return standard;
- }
-
- /**
- * This methods tests if the MBean is JMX compliant
- */
- public synchronized void testCompliance(Class c)
- throws NotCompliantMBeanException {
- final MetaData meta = getMetaData(c);
- meta.testCompliance(c);
- }
-
-
- /**
- * This methods returns the MBean interface of an MBean
- */
- public Class getMBeanInterfaceFromClass(Class c) {
- return standard.getMBeanInterfaceFromClass(c);
- }
-
-
- /**
- * This method discovers the attributes and operations that an MBean
- * exposes for management.
- *
- * @param beanClass The class to be analyzed.
- *
- * @return An instance of MBeanInfo allowing to retrieve all methods
- * and operations of this class.
- *
- * @exception IntrospectionException if an exception occurs during
- * introspection.
- * @exception NotCompliantMBeanException if the MBean class is not
- * MBean compliant.
- *
- */
- public MBeanInfo getMBeanInfoFromClass(Class beanClass)
- throws IntrospectionException, NotCompliantMBeanException {
- return standard.getMBeanInfoFromClass(beanClass);
- }
-
-
- //---------------------------------------------------------------------
- //
- // From the MetaData interface
- //
- //---------------------------------------------------------------------
-
- public final String getMBeanClassName(Object moi)
- throws IntrospectionException, NotCompliantMBeanException {
- final MetaData meta = getMetaData(moi);
- return meta.getMBeanClassName(moi);
- }
-
- public final MBeanInfo getMBeanInfo(Object moi)
- throws IntrospectionException {
- final MetaData meta = getMetaData(moi);
- return meta.getMBeanInfo(moi);
- }
-
- public final Object getAttribute(Object instance, String attribute)
- throws MBeanException, AttributeNotFoundException,
- ReflectionException {
-
- final MetaData meta = getMetaData(instance);
- return meta.getAttribute(instance,attribute);
- }
-
- public final AttributeList getAttributes(Object instance,
- String[] attributes)
- throws ReflectionException {
-
- final MetaData meta = getMetaData(instance);
- return meta.getAttributes(instance, attributes);
- }
-
- public final AttributeList setAttributes(Object instance,
- AttributeList attributes)
- throws ReflectionException {
-
- final MetaData meta = getMetaData(instance);
- return meta.setAttributes(instance,attributes);
- }
-
-
- public final Object setAttribute(Object instance, Attribute attribute)
- throws AttributeNotFoundException, InvalidAttributeValueException,
- MBeanException, ReflectionException {
-
- final MetaData meta = getMetaData(instance);
- return meta.setAttribute(instance,attribute);
- }
-
- public final Object invoke(Object instance, String operationName,
- Object params[], String signature[])
- throws MBeanException, ReflectionException {
-
- if (operationName == null) {
- final RuntimeException r =
- new IllegalArgumentException("Operation name cannot be null");
- throw new RuntimeOperationsException(r,
- "Exception occured trying to invoke the operation on the MBean");
- }
- final MetaData meta = getMetaData(instance);
- return meta.invoke(instance,operationName,params,signature);
- }
-
- public boolean isInstanceOf(Object instance, String className)
- throws ReflectionException {
-
- // XXX revisit here: ModelMBean ???
- final MetaData meta = getMetaData(instance);
- return meta.isInstanceOf(instance,className);
- }
-
- public ObjectName preRegisterInvoker(Object moi, ObjectName name,
- MBeanServer mbs)
- throws InstanceAlreadyExistsException, MBeanRegistrationException {
-
- if (!(moi instanceof MBeanRegistration)) return name;
- final MetaData meta = getMetaData(moi);
- return meta.preRegisterInvoker(moi,name,mbs);
- }
-
- public void postRegisterInvoker(Object moi, boolean registrationDone) {
- if (!(moi instanceof MBeanRegistration)) return;
-
- final MetaData meta = getMetaData(moi);
- meta.postRegisterInvoker(moi,registrationDone);
- }
-
- public void preDeregisterInvoker(Object moi)
- throws MBeanRegistrationException {
- if (!(moi instanceof MBeanRegistration)) return;
- final MetaData meta = getMetaData(moi);
- meta.preDeregisterInvoker(moi);
- }
-
-
- public void postDeregisterInvoker(Object moi) {
- if (!(moi instanceof MBeanRegistration)) return;
- final MetaData meta = getMetaData(moi);
- meta.postDeregisterInvoker(moi);
- }
-
- /**
- * Find a class using the specified ClassLoader.
- **/
- protected Class findClass(String className, ClassLoader loader)
- throws ReflectionException {
- return instantiator.findClass(className, loader);
- }
-
- /**
- * Find the classes from a signature using the specified ClassLoader.
- **/
- protected Class[] findSignatureClasses(String[] signature,
- ClassLoader loader)
- throws ReflectionException {
- return ((signature == null)?null:
- instantiator.findSignatureClasses(signature,loader));
- }
-
- // TRACES & DEBUG
- //---------------
-
- private static boolean isTraceOn() {
- return Trace.isSelected(Trace.LEVEL_TRACE, Trace.INFO_MBEANSERVER);
- }
-
- private static void trace(String clz, String func, String info) {
- Trace.send(Trace.LEVEL_TRACE, Trace.INFO_MBEANSERVER, clz, func, info);
- }
-
- private static void trace(String func, String info) {
- trace(dbgTag, func, info);
- }
-
- private static boolean isDebugOn() {
- return Trace.isSelected(Trace.LEVEL_DEBUG, Trace.INFO_MBEANSERVER);
- }
-
- private static void debug(String clz, String func, String info) {
- Trace.send(Trace.LEVEL_DEBUG, Trace.INFO_MBEANSERVER, clz, func, info);
- }
-
- private static void debug(String func, String info) {
- debug(dbgTag, func, info);
- }
-
- private static void debugX(String func,Throwable e) {
- if (isDebugOn()) {
- final StringWriter s = new StringWriter();
- e.printStackTrace(new PrintWriter(s));
- final String stack = s.toString();
-
- debug(dbgTag,func,"Exception caught in "+ func+"(): "+e);
- debug(dbgTag,func,stack);
-
- // java.lang.System.err.println("**** Exception caught in "+
- // func+"(): "+e);
- // java.lang.System.err.println(stack);
- }
- }
-
- }