package org.oddjob.jmx.handlers; import java.util.Map; import javax.management.MBeanAttributeInfo; import javax.management.MBeanException; import javax.management.MBeanNotificationInfo; import javax.management.MBeanOperationInfo; import javax.management.ReflectionException; import org.oddjob.Describeable; import org.oddjob.arooa.ArooaSession; import org.oddjob.describe.Describer; import org.oddjob.describe.UniversalDescriber; import org.oddjob.jmx.RemoteOperation; import org.oddjob.jmx.client.ClientHandlerResolver; import org.oddjob.jmx.client.HandlerVersion; import org.oddjob.jmx.client.VanillaHandlerResolver; import org.oddjob.jmx.server.JMXOperation; import org.oddjob.jmx.server.JMXOperationFactory; import org.oddjob.jmx.server.ServerInterfaceHandler; import org.oddjob.jmx.server.ServerInterfaceHandlerFactory; import org.oddjob.jmx.server.ServerSideToolkit; /** * InterfaceHandler for the {@link org.oddjob.jmx.client.Describable} * interface. * * @author Rob Gordon. */ public class DescribeableHandlerFactory implements ServerInterfaceHandlerFactory<Object, Describeable> { public static final HandlerVersion VERSION = new HandlerVersion(1, 0); private static final JMXOperation<Map<String, String>> DESCRIBE = new JMXOperationFactory(Describeable.class ).operationFor("describe", "Describe properties.", MBeanOperationInfo.INFO); public Class<Object> interfaceClass() { return Object.class; } public MBeanAttributeInfo[] getMBeanAttributeInfo() { return new MBeanAttributeInfo[0]; } public MBeanOperationInfo[] getMBeanOperationInfo() { return new MBeanOperationInfo[] { DESCRIBE.getOpInfo() }; } public MBeanNotificationInfo[] getMBeanNotificationInfo() { return new MBeanNotificationInfo[0]; } public ServerInterfaceHandler createServerHandler(Object target, ServerSideToolkit ojmb) { return new ServerDescribeableHandler(target, ojmb.getServerSession().getArooaSession()); } public ClientHandlerResolver<Describeable> clientHandlerFactory() { return new VanillaHandlerResolver<Describeable>( Describeable.class.getName()); } class ServerDescribeableHandler implements ServerInterfaceHandler { private final Object object; private final Describer describer; ServerDescribeableHandler(Object object, ArooaSession session) { this.object = object; this.describer = new UniversalDescriber(session); } public Object invoke(RemoteOperation<?> operation, Object[] params) throws MBeanException, ReflectionException { if (DESCRIBE.equals(operation)) { return describer.describe(object); } else { throw new ReflectionException( new IllegalStateException("invoked for an unknown method."), operation.getActionName()); } } public void destroy() { } } }