package org.jboss.seam.jmx; import java.lang.reflect.Proxy; import javax.management.DynamicMBean; import javax.management.InstanceAlreadyExistsException; import javax.management.MBeanException; import javax.management.MBeanRegistrationException; import javax.management.MBeanServer; import javax.management.MBeanServerFactory; import javax.management.NotCompliantMBeanException; import javax.management.ObjectName; import javax.management.ReflectionException; public class MBeanProxy { // Static -------------------------------------------------------- /** * Creates a proxy to an MBean in the given MBean server. * * @param intrface the interface this proxy implements * @param name object name of the MBean this proxy connects to * @param agentID agent ID of the MBean server this proxy connects to * * @return proxy instance * * @throws MBeanProxyCreationException if the proxy could not be created */ public static Object get(Class intrface, ObjectName name, String agentID) throws MBeanProxyCreationException { return get(intrface, name, (MBeanServer) MBeanServerFactory.findMBeanServer(agentID).get(0)); } /** * Creates a proxy to an MBean in the given MBean server. * * @param intrface the interface this proxy implements * @param name object name of the MBean this proxy connects to * @param server MBean server this proxy connects to * * @return proxy instance * * @throws MBeanProxyCreationException if the proxy could not be created */ public static Object get(Class intrface, ObjectName name, MBeanServer server) throws MBeanProxyCreationException { return get(new Class[] { intrface, ProxyContext.class, DynamicMBean.class }, name, server); } /** */ public static Object get(ObjectName name, MBeanServer server) throws MBeanProxyCreationException { return get(new Class[] { ProxyContext.class, DynamicMBean.class }, name, server); } private static Object get(Class[] interfaces, ObjectName name, MBeanServer server) throws MBeanProxyCreationException { return Proxy.newProxyInstance( Thread.currentThread().getContextClassLoader(), interfaces, new JMXInvocationHandler(server, name) ); } /** * Convenience method for registering an MBean and retrieving a proxy for it. * * @param instance MBean instance to be registered * @param intrface the interface this proxy implements * @param name object name of the MBean * @param agentID agent ID of the MBean server this proxy connects to * * @return proxy instance * * @throws MBeanProxyCreationException if the proxy could not be created */ public static Object create(Class instance, Class intrface, ObjectName name, String agentID) throws MBeanProxyCreationException { return create(instance, intrface, name,(MBeanServer) MBeanServerFactory.findMBeanServer(agentID).get(0)); } /** * Convenience method for registering an MBean and retrieving a proxy for it. * * @param instance MBean instance to be registered * @param intrface the interface this proxy implements * @param name object name of the MBean * @param server MBean server this proxy connects to * * @throws MBeanProxyCreationException if the proxy could not be created */ public static Object create(Class instance, Class intrface, ObjectName name, MBeanServer server) throws MBeanProxyCreationException { try { server.createMBean(instance.getName(), name); return get(intrface, name, server); } catch (ReflectionException e) { throw new MBeanProxyCreationException("Creating the MBean failed: " + e.toString()); } catch (InstanceAlreadyExistsException e) { throw new MBeanProxyCreationException("Instance already exists: " + name); } catch (MBeanRegistrationException e) { throw new MBeanProxyCreationException("Error registering the MBean to the server: " + e.toString()); } catch (MBeanException e) { throw new MBeanProxyCreationException(e.toString()); } catch (NotCompliantMBeanException e) { throw new MBeanProxyCreationException("Not a compliant MBean " + instance.getClass().getName() + ": " + e.toString()); } } }