User: juhalindfors Date: 01/12/05 06:24:55 Modified: src/main/org/jboss/mx/server MBeanServerImpl.java Added: src/main/org/jboss/mx/server ObjectInputStreamWithClassLoader.java StandardMBean.java Log: more server stuff Revision Changes Path 1.2 +293 -55 jmx/src/main/org/jboss/mx/server/MBeanServerImpl.java Index: MBeanServerImpl.java =================================================================== RCS file: /cvsroot/jboss/jmx/src/main/org/jboss/mx/server/MBeanServerImpl.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- MBeanServerImpl.java 2001/12/03 02:20:55 1.1 +++ MBeanServerImpl.java 2001/12/05 14:24:55 1.2 @@ -12,8 +12,14 @@ import javax.management.Attribute; import javax.management.AttributeList; import javax.management.MBeanServer; +import javax.management.MBeanServerDelegate; +import javax.management.MBeanRegistration; +import javax.management.MBeanServerNotification; +import javax.management.NotificationBroadcaster; import javax.management.NotificationListener; import javax.management.NotificationFilter; +import javax.management.MalformedObjectNameException; +import javax.management.NotCompliantMBeanException; import javax.management.InstanceAlreadyExistsException; import javax.management.NotCompliantMBeanException; import javax.management.MBeanRegistrationException; @@ -23,6 +29,7 @@ import javax.management.InvalidAttributeValueException; import javax.management.ListenerNotFoundException; import javax.management.RuntimeErrorException; +import javax.management.RuntimeOperationsException; import javax.management.QueryExp; import javax.management.MBeanInfo; import javax.management.DynamicMBean; @@ -30,7 +37,10 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; + import java.io.ObjectInputStream; +import java.io.ByteArrayInputStream; +import java.io.IOException; import org.jboss.mx.server.registry.BasicMBeanRegistry; import org.jboss.mx.server.registry.MBeanRegistry; @@ -38,12 +48,37 @@ public class MBeanServerImpl implements MBeanServer { + + public final static String MBEAN_SERVER_DELEGATE = "JMImplementation:type=MBeanServerDelegate"; + + protected static long registrationNotificationSequence = 1; + protected static long unregistrationNotificationSequence = 1; + protected String defaultDomain = "DefaultDomain"; protected MBeanRegistry registry = null; + protected MBeanServerDelegate delegate = null; public MBeanServerImpl(String defaultDomain) { + this.defaultDomain = defaultDomain; this.registry = new BasicMBeanRegistry(); + this.delegate = new MBeanServerDelegate(); + + try { + registerMBean(delegate, new ObjectName(MBEAN_SERVER_DELEGATE)); + } + catch (MalformedObjectNameException e) { + throw new Error("Cannot create MBean Server Delegate."); + } + catch (InstanceAlreadyExistsException e) { + throw new Error("Cannot register the MBean Server Delegate."); + } + catch (MBeanRegistrationException e) { + throw new Error("Exception registering the the MBean Server Delegate: " + e.getTargetException().toString()); + } + catch (NotCompliantMBeanException e) { + throw new Error("MBean Server Delegate is not a compliant MBean"); + } } @@ -51,8 +86,7 @@ try { Class clazz = DefaultLoaderRepository.loadClass(className); return clazz.newInstance(); - } - catch (ClassNotFoundException e) { + } catch (ClassNotFoundException e) { throw new ReflectionException(e, "Class not found: " + className); } catch (InstantiationException e) { @@ -63,30 +97,47 @@ } } - public Object instantiate(String className, ObjectName loaderName) + public Object instantiate(String className, ObjectName loaderName) throws ReflectionException, MBeanException, InstanceNotFoundException { - return null; + try { + ClassLoader loader = (ClassLoader)registry.get(loaderName).getInstance(); + + if (loader == null) + loader = this.getClass().getClassLoader(); + + Class clazz = loader.loadClass(className); + return clazz.newInstance(); + } catch (ClassCastException e) { + throw new ReflectionException(e, loaderName + " is not a class loader."); + } + catch (ClassNotFoundException e) { + throw new ReflectionException(e, "Class not found: " + className); + } + catch (InstantiationException e) { + throw new ReflectionException(e, "Caanot instantiate with not-args constructor: " + className); + } + catch (IllegalAccessException e) { + throw new ReflectionException(e, "Illegal access to default constructor: " + className); + } } - public Object instantiate(String className, Object[] params, String[] signature) + public Object instantiate(String className, Object[] params, String[] signature) throws ReflectionException, MBeanException { try { Class clazz = DefaultLoaderRepository.loadClass(className); - + Class[] sign = new Class[signature.length]; - for (int i = 0; i < signature.length; ++i) { + for (int i = 0; i < signature.length; ++i) { try { sign[i] = DefaultLoaderRepository.loadClass(signature[i]); - } - catch (ClassNotFoundException e) { + } catch (ClassNotFoundException e) { throw new ReflectionException(e, "Constructor parameter class not found: " + signature[i]); } } - + Constructor constructor = clazz.getConstructor(sign); return constructor.newInstance(params); - } - catch (ClassNotFoundException e) { + } catch (ClassNotFoundException e) { throw new ReflectionException(e, "Class not found: " + className); } catch (InstantiationException e) { @@ -102,18 +153,55 @@ Throwable t = e.getTargetException(); if (t instanceof Exception) throw new MBeanException((Exception)t, "Constructor has thrown an exception: " + t.getMessage()); - else - throw new RuntimeErrorException((Error)t, "Error thrown from the specified constructor: " + t.getMessage()); + else + throw new RuntimeErrorException((Error)t, "Error thrown from the specified constructor: " + t.getMessage()); } } - public java.lang.Object instantiate(String className, ObjectName loaderName, Object[] params, String[] signature) + public Object instantiate(String className, ObjectName loaderName, Object[] params, String[] signature) throws ReflectionException, MBeanException, InstanceNotFoundException { - return null; + try { + ClassLoader cl = (ClassLoader)registry.get(loaderName).getInstance(); + + if (cl == null) + cl = this.getClass().getClassLoader(); + + Class clazz = cl.loadClass(className); + + Class[] sign = new Class[signature.length]; + for (int i = 0; i < signature.length; ++i) { + try { + sign[i] = cl.loadClass(signature[i]); + } catch (ClassNotFoundException e) { + // FIXME: should we delegate to DLR before throwing the exception? + throw new ReflectionException(e, "Constructor parameter class not found: " + signature[i]); + } + } + Constructor constructor = clazz.getConstructor(sign); + return constructor.newInstance(params); + } catch (ClassNotFoundException e) { + throw new ReflectionException(e, "Class not found: " + className); + } + catch (InstantiationException e) { + throw new ReflectionException(e, "Cannot instantiate with specified constructor: " + className); + } + catch (IllegalAccessException e) { + throw new ReflectionException(e, "Illegal access to specified constructor: " + className); + } + catch (NoSuchMethodException e) { + throw new ReflectionException(e, "Specified constructor not found for class " + className); + } + catch (InvocationTargetException e) { + Throwable t = e.getTargetException(); + if (t instanceof Exception) + throw new MBeanException((Exception)t, "Constructor has thrown an exception: " + t.getMessage()); + else + throw new RuntimeErrorException((Error)t, "Error thrown from the specified constructor: " + t.getMessage()); + } } - public ObjectInstance createMBean(String className, ObjectName name) + public ObjectInstance createMBean(String className, ObjectName name) throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException, MBeanException, NotCompliantMBeanException { Object mbean = instantiate(className); registerMBean(mbean, name); @@ -136,39 +224,111 @@ public ObjectInstance createMBean(String className, ObjectName name, ObjectName loaderName, Object[] params, String[] signature) throws ReflectionException, InstanceAlreadyExistsException, MBeanRegistrationException, MBeanException, NotCompliantMBeanException, InstanceNotFoundException { - return null; + Object mbean = instantiate(className, loaderName, params, signature); + registerMBean(mbean, name); + return new ObjectInstance(name, className); } public ObjectInstance registerMBean(Object object, ObjectName name) throws InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException { + if (isRegistered(name)) throw new InstanceAlreadyExistsException("MBean " + name + " already registered."); - + + MBeanRegistration registrationInterface = null; MBeanEntry entry = null; + boolean registrationDone = true; - if (isStandardMBean(object)) - throw new Error("StandardMBean NYI"); - - else if (DynamicMBean.class.isAssignableFrom(object.getClass())) { - entry = new MBeanEntry(name, object); + if (object instanceof MBeanRegistration) { + MBeanRegistration reg = (MBeanRegistration)object; + try { + ObjectName mbeanName = reg.preRegister(this, name); + if (name == null) + name = mbeanName; + } + catch (Throwable t) { + registrationDone = false; + } + } + + if (name == null) + throw new RuntimeOperationsException(new NullPointerException("null object name")); + + if (registrationDone) { + if (getMBeanType(object) == STANDARD_MBEAN) { + try { + entry = new MBeanEntry(name, new StandardMBean(object)); + } + catch (ReflectionException e) { + throw new MBeanRegistrationException(e.getTargetException(), "Registration of MBean '" + name + "' failed: " + e.getTargetException().toString()); + } + } + else if (object instanceof DynamicMBean) + entry = new MBeanEntry(name, object); + else + throw new NotCompliantMBeanException(object + " is not compliant MBean (does not implement Standard or Dynamic MBean interface)."); + registry.add(entry); + + delegate.sendNotification( + new MBeanServerNotification( + MBeanServerNotification.REGISTRATION_NOTIFICATION, + delegate, + registrationNotificationSequence++, + name + ) + ); } - else - throw new NotCompliantMBeanException(object + " is not compliant MBean."); + + + if (registrationInterface != null) + registrationInterface.postRegister(new Boolean(registrationDone)); + - return new ObjectInstance(name, entry.getClassName()); + return (registrationDone) ? new ObjectInstance(name, entry.getClassName()) + : null; } public void unregisterMBean(ObjectName name) throws InstanceNotFoundException, MBeanRegistrationException { + Object mbean = registry.get(name).getInstance(); + MBeanRegistration registrationInterface = null; + boolean unregisterSuccessful = true; + + // FIXME: need to fix this for standard mbean + if (mbean instanceof MBeanRegistration) { + registrationInterface = (MBeanRegistration)mbean; + try { + registrationInterface.preDeregister(); + } + catch (Throwable t) { + return; + } + } + registry.remove(name); - } + + // FIXME: if CL, remove from class loader repository + + delegate.sendNotification( + new MBeanServerNotification( + MBeanServerNotification.UNREGISTRATION_NOTIFICATION, + delegate, + unregistrationNotificationSequence++, + name + ) + ); + + if (registrationInterface != null) + registrationInterface.postDeregister(); + } public ObjectInstance getObjectInstance(ObjectName name) throws InstanceNotFoundException { if (!isRegistered(name)) throw new InstanceNotFoundException(name + " not registered."); - - return null;//new ObjectInstance(name, registry.get(name).getClassName()); + + // FIXME: check for std + return new ObjectInstance(name, registry.get(name).getClassName()); } public java.util.Set queryMBeans(ObjectName name, QueryExp query) { @@ -180,7 +340,7 @@ } public boolean isRegistered(ObjectName name) { - return registry.contains(name); + return registry.contains(name); } public java.lang.Integer getMBeanCount() { @@ -189,26 +349,26 @@ public Object getAttribute(ObjectName name, String attribute) throws MBeanException, AttributeNotFoundException, InstanceNotFoundException, ReflectionException { - //DynamicMBean mbean = registry.get(name).getInvocationInterface(); - return null;//mbean.getAttribute(attribute); + DynamicMBean mbean = registry.get(name).getInvocationInterface(); + return mbean.getAttribute(attribute); } public AttributeList getAttributes(ObjectName name, String[] attributes) throws InstanceNotFoundException, ReflectionException { - //DynamicMBean mbean = registry.get(name).getInvocationInterface(); - return null;//mbean.getAttributes(attributes); + DynamicMBean mbean = registry.get(name).getInvocationInterface(); + return mbean.getAttributes(attributes); } public void setAttribute(ObjectName name, Attribute attribute) throws InstanceNotFoundException, AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException { - //DynamicMBean mbean = registry.get(name).getInvocationInterface(); - //mbean.setAttribute(attribute); + DynamicMBean mbean = registry.get(name).getInvocationInterface(); + mbean.setAttribute(attribute); } public AttributeList setAttributes(ObjectName name, AttributeList attributes) throws InstanceNotFoundException, ReflectionException { - //DynamicMBean mbean = registry.get(name).getInvocationInterface(); - return null;//mbean.setAttributes(attributes); + DynamicMBean mbean = registry.get(name).getInvocationInterface(); + return mbean.setAttributes(attributes); } public Object invoke(ObjectName name, String operationName, Object[] params, String[] signature) @@ -221,26 +381,55 @@ return defaultDomain; } - public void addNotificationListener(ObjectName name, NotificationListener listener, NotificationFilter filter, Object handback) throws InstanceNotFoundException { - throw new Error("NYI"); + public void addNotificationListener(ObjectName name, NotificationListener listener, NotificationFilter filter, Object handback) + throws InstanceNotFoundException { + + // FIXME: need to set source on outgoing notifications + // FIXME: standard's instance + try { + NotificationBroadcaster broadcaster = (NotificationBroadcaster)registry.get(name).getInstance(); + broadcaster.addNotificationListener(listener, filter, handback); + } + catch (ClassCastException e) { + throw new RuntimeOperationsException(e, "MBean " + name + " does not implement the NotificationBroadcaster interface."); + } } - public void addNotificationListener(ObjectName name, ObjectName listener, NotificationFilter filter, Object handback) throws InstanceNotFoundException { - throw new Error("NYI"); + public void addNotificationListener(ObjectName name, ObjectName listener, NotificationFilter filter, Object handback) + throws InstanceNotFoundException { + try { + NotificationBroadcaster broadcaster = (NotificationBroadcaster)registry.get(name).getInstance(); + broadcaster.addNotificationListener((NotificationListener)registry.get(listener).getInstance(), filter, handback); + } + catch (ClassCastException e) { + throw new RuntimeOperationsException(e, "MBean " + listener + " is not a notification listener or " + name + " does not implement notification broadcaster interface."); + } } public void removeNotificationListener(ObjectName name, NotificationListener listener) throws InstanceNotFoundException, ListenerNotFoundException { - throw new Error("NYI"); + try { + NotificationBroadcaster broadcaster = (NotificationBroadcaster)registry.get(name).getInstance(); + broadcaster.removeNotificationListener(listener); + } + catch (ClassCastException e) { + throw new RuntimeOperationsException(e, "MBean " + name + " does not implement the NotificationBroadcaster interface."); + } } public void removeNotificationListener(ObjectName name, ObjectName listener) throws InstanceNotFoundException, ListenerNotFoundException { - throw new Error("NYI"); + try { + NotificationBroadcaster broadcaster = (NotificationBroadcaster)registry.get(name).getInstance(); + broadcaster.removeNotificationListener((NotificationListener)registry.get(listener).getInstance()); + } + catch (ClassCastException e) { + throw new RuntimeOperationsException(e, e.getMessage()); + } } public MBeanInfo getMBeanInfo(ObjectName name) throws InstanceNotFoundException, IntrospectionException, ReflectionException { - return null;//registry.get(name).getInvocationInterface().getMBeanInfo(); + return registry.get(name).getInvocationInterface().getMBeanInfo(); } public boolean isInstanceOf(ObjectName name, java.lang.String className) throws InstanceNotFoundException { @@ -248,27 +437,76 @@ } public ObjectInputStream deserialize(ObjectName name, byte[] data) throws InstanceNotFoundException, OperationsException { - - return null; + try { + ClassLoader cl = registry.get(name).getInstance().getClass().getClassLoader(); + return new ObjectInputStreamWithClassLoader(new ByteArrayInputStream(data), cl); + } + catch (IOException e) { + throw new OperationsException("I/O exception deserializing: " + e.getMessage()); + } } public ObjectInputStream deserialize(String className, byte[] data) throws OperationsException, ReflectionException { - return null; - + try { + Class c = DefaultLoaderRepository.loadClass(className); + ClassLoader cl = c.getClassLoader(); + return new ObjectInputStreamWithClassLoader(new ByteArrayInputStream(data), cl); + } + catch (IOException e) { + throw new OperationsException("I/O exception deserializing: " + e.getMessage()); + } + catch (ClassNotFoundException e) { + throw new ReflectionException(e, "Class not found from default repository: " + className); + } } - public ObjectInputStream deserialize(String className, ObjectName loaderName, byte[] data) throws InstanceNotFoundException, OperationsException, ReflectionException { - return null; + try { + ClassLoader cl = (ClassLoader)registry.get(loaderName).getInstance(); + return new ObjectInputStreamWithClassLoader(new ByteArrayInputStream(data), cl); + } + catch (IOException e) { + throw new OperationsException("I/O exception deserializing: " + e.getMessage()); + } } - - protected boolean isStandardMBean(Object object) { + protected int getMBeanType(Object object) { + + Class clazz = object.getClass(); + int type = NOT_AN_MBEAN; - return false; + while (clazz != null) { + Class[] interfaces = clazz.getInterfaces(); + + for (int i = 0; i < interfaces.length; ++i) { + type = getMBeanInterface(clazz.getName(), interfaces[i]); + if (type != NOT_AN_MBEAN) return type; + + Class[] superInterfaces = interfaces[i].getInterfaces(); + for (int j = 0; j < interfaces.length; ++j) { + type = getMBeanInterface(clazz.getName(), superInterfaces[j]); + if (type != NOT_AN_MBEAN) return type; + } + } + clazz = clazz.getSuperclass(); + } + + return type; } + private static int DYNAMIC_MBEAN = 0x321; + private static int STANDARD_MBEAN = 0x123; + private static int NOT_AN_MBEAN = 0xc0de; + + private int getMBeanInterface(String className, Class c) { + if (c.getName().equals("javax.management.DynamicMBean")) + return DYNAMIC_MBEAN; + if (c.getName().equals(className + "MBean")) + return STANDARD_MBEAN; + return NOT_AN_MBEAN; + } + } 1.1 jmx/src/main/org/jboss/mx/server/ObjectInputStreamWithClassLoader.java Index: ObjectInputStreamWithClassLoader.java =================================================================== /* * LGPL */ package org.jboss.mx.server; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectStreamClass; import java.io.IOException; import java.lang.reflect.Proxy; /** * This replaces the EjbossInputStream in the storage package. * The input stream will take a class loader in its constructor and look * into it to retrieve the class definitions. * It is used throughout the server to deserialize parameters and objects * whose definition are in a jar and not the global classpath * It also has better comments than the previous version. * * @author <a href="[EMAIL PROTECTED]">Rickard Oberg</a> * @since Ejboss 0.9 */ public class ObjectInputStreamWithClassLoader extends ObjectInputStream { /** * The classloader to use when the default classloader cannot find * the classes in the stream. */ ClassLoader cl; /******************************************************************************/ /******************************************************************************/ /* /* CONSTRUCTORS /* /******************************************************************************/ /******************************************************************************/ /** * Construct a new instance with the given classloader and input stream. * * @param ClassLoader classloader to use * @param InputStream stream to read objects from */ public ObjectInputStreamWithClassLoader(InputStream in, ClassLoader cl) throws IOException { super(in); this.cl = cl; } /******************************************************************************/ /******************************************************************************/ /* /* OVERWRITING <ObjectInputStream> /* /******************************************************************************/ /******************************************************************************/ /** * Resolve the class described in the osc parameter. First, try the * default classloader (implemented by the super class). If it cannot * load the class, try the classloader given to this instance. * * @param ObjectStreamClass class description object * @return the Class corresponding to class description * @exception IOException if an I/O error occurs * @exception ClassNotFoundException if the class cannot be found by the classloader */ protected Class resolveClass(ObjectStreamClass osc) throws IOException, ClassNotFoundException { return cl.loadClass(osc.getName()); } protected Class resolveProxyClass( String[] interfaces ) throws IOException, ClassNotFoundException { Class[] interfacesClass = new Class[interfaces.length]; for( int i=0; i< interfaces.length; i++ ) { interfacesClass[i] = Class.forName(interfaces[i], false, cl); } return Proxy.getProxyClass(cl, interfacesClass); } } 1.1 jmx/src/main/org/jboss/mx/server/StandardMBean.java Index: StandardMBean.java =================================================================== /* * LGPL */ package org.jboss.mx.server; import java.util.Map; import java.util.HashMap; import java.util.Iterator; import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException; import javax.management.DynamicMBean; import javax.management.Attribute; import javax.management.AttributeList; import javax.management.MBeanInfo; import javax.management.MBeanOperationInfo; import javax.management.MBeanParameterInfo; import javax.management.JMException; import javax.management.NotCompliantMBeanException; import javax.management.ReflectionException; import javax.management.RuntimeErrorException; import javax.management.MBeanException; import javax.management.AttributeNotFoundException; import javax.management.InvalidAttributeValueException; import javax.management.loading.DefaultLoaderRepository; import org.jboss.mx.metadata.StandardMetaData; public class StandardMBean implements DynamicMBean { public static Class getMBeanInterface(Object resource) { Class clazz = resource.getClass(); while (clazz != null) { Class[] interfaces = clazz.getInterfaces(); for (int i = 0; i < interfaces.length; ++i) { if (interfaces[i].getName().equals(clazz.getName() + "MBean")) return interfaces[i]; Class[] superInterfaces = interfaces[i].getInterfaces(); for (int j = 0; j < superInterfaces.length; ++j) { if (superInterfaces[j].getName().equals(clazz.getName() + "MBean")) return superInterfaces[j]; } } clazz = clazz.getSuperclass(); } return null; } public static Class[] getSignatureAsClassArray(MBeanParameterInfo[] signature, ClassLoader cl) throws ClassNotFoundException { Class[] sign = new Class[signature.length]; for (int i = 0; i < signature.length; ++i) { try { String type = signature[i].getType(); if (isPrimitive(type)) sign[i] = getPrimitive(type); else sign[i] = cl.loadClass(signature[i].getName()); } catch (ClassNotFoundException e) { // if the explicit CL fails, go to the repository... allow CNFE to be thrown DefaultLoaderRepository.loadClass(signature[i].getName()); } } return sign; } public static boolean isPrimitive(String type) { if (int.class.getName().equals(type)) return true; else if (float.class.getName().equals(type)) return true; else if (double.class.getName().equals(type)) return true; else if (long.class.getName().equals(type)) return true; else if (byte.class.getName().equals(type)) return true; else if (boolean.class.getName().equals(type)) return true; else if (char.class.getName().equals(type)) return true; else if (void.class.getName().equals(type)) return true; else if (short.class.getName().equals(type)) return true; return false; } public static Class getPrimitive(String type) { if (int.class.getName().equals(type)) return Integer.TYPE; else if (float.class.getName().equals(type)) return Float.TYPE; else if (double.class.getName().equals(type)) return Double.TYPE; else if (long.class.getName().equals(type)) return Long.TYPE; else if (byte.class.getName().equals(type)) return Byte.TYPE; else if (boolean.class.getName().equals(type)) return Boolean.TYPE; else if (char.class.getName().equals(type)) return Character.TYPE; else if (void.class.getName().equals(type)) return Void.TYPE; else if (short.class.getName().equals(type)) return Short.TYPE; return null; } private MBeanInfo info = null; private Object resource = null; private Class invocationInterface = null; private Map operationMap = new HashMap(); private Map attributeMap = new HashMap(); public StandardMBean(Object resource) throws NotCompliantMBeanException, ReflectionException { this.resource = resource; this.info = new StandardMetaData(resource).build(); this.invocationInterface = StandardMBean.getMBeanInterface(resource); MBeanOperationInfo[] operations = info.getOperations(); for (int i = 0; i < operations.length; ++i) { try { // FIXME: name is not enough for overloaded operations! operationMap.put(operations[i].getName(), invocationInterface.getMethod( operations[i].getName(), getSignatureAsClassArray(operations[i].getSignature(), resource.getClass().getClassLoader()) )); } catch (ClassNotFoundException e) { throw new ReflectionException(e, "Unable to load operation " + operations[i].getName() + " parameter types: " + e.getMessage()); } catch (NoSuchMethodException e) { throw new ReflectionException(e); } } } public Object invoke(String operationName, Object[] args, String[] signature) throws MBeanException, ReflectionException { // FIXME: Interceptors try { Method m = (Method)operationMap.get(operationName); return m.invoke(resource, args); } catch (IllegalAccessException e) { throw new ReflectionException(e, "Illegal access to method " + operationName); } catch (IllegalArgumentException e) { throw new ReflectionException(e, "Illegal operation arguments in " + operationName + ": " + e.getMessage()); } catch (InvocationTargetException e) { if (e.getTargetException() instanceof Exception) { Exception e2 = (Exception)e.getTargetException(); throw new MBeanException(e2, "Operation " + operationName + " on MBean " + info.getClassName() + " has thrown an exception: " + e2.toString()); } else { Error err = (Error)e.getTargetException(); throw new RuntimeErrorException(err, "Operation " + operationName + " on MBean " + info.getClassName() + " has thrown an errpr: " + err.toString()); } } catch (NullPointerException e) { throw new ReflectionException(e, "Operation " + operationName + " is not a declared management operation in " + invocationInterface + " interface."); } } public Object getAttribute(java.lang.String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException { throw new Error("NYI"); // FIXME: deal with runtime exceptions and errors from the resource } public void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException { throw new Error("NYI"); // FIXME: deal with runtime exceptions and errors from the resource } public AttributeList getAttributes(java.lang.String[] attributes) { if (attributes == null) throw new IllegalArgumentException("null array"); AttributeList list = new AttributeList(); for (int i = 0; i < attributes.length; ++i) { try { list.add(new Attribute(attributes[i], getAttribute(attributes[i]))); } catch (JMException ignored) { // if the attribute could not be retrieved, skip it } } return list; } public AttributeList setAttributes(AttributeList attributes) { if (attributes == null) throw new IllegalArgumentException("null list"); AttributeList results = new AttributeList(); Iterator it = attributes.iterator(); while (it.hasNext()) { try { Attribute attr = (Attribute)it.next(); setAttribute(attr); results.add(attr); } catch (JMException ignored) { // if unable to set the attribute, skip it } } return results; } public MBeanInfo getMBeanInfo() { return info; } }
_______________________________________________ Jboss-development mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/jboss-development