[jboss-dev-forums] [Design the new POJO MicroContainer] - Support for @JMX on attributes

alesj do-not-reply at jboss.com
Fri Jun 20 07:30:17 EDT 2008


Tim raised this question on MC user forum:
 - http://www.jboss.com/index.html?module=bb&op=viewtopic&t=137721

So I hacked something in this direction - adding annotation plugin for @JMX.

  | public abstract class JMXAnnotationPlugin<T extends AnnotatedInfo> extends AbstractAnnotationPlugin<T, JMX>
  | {
  |    protected JMXAnnotationPlugin()
  |    {
  |       super(JMX.class);
  |    }
  | 
  |    protected List<? extends MetaDataVisitorNode> internalApplyAnnotation(T info, MetaData metaData, JMX jmx, KernelControllerContext context) throws Throwable
  |    {
  |       Class<?> exposedInterface = jmx.exposedInterface();
  |       if (exposedInterface == null || void.class.equals(exposedInterface))
  |          exposedInterface = getExposedInterface(info);
  |       if (exposedInterface == null || exposedInterface.isInterface() == false)
  |          throw new IllegalArgumentException("Illegal exposed interface: " + exposedInterface);
  | 
  |       BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder(createObjectName(context, info, jmx), exposedInterface.getName());
  |       // TODO - uncomment with new MC release; builder.addAnnotation(jmx);
  |       Object proxy = createProxy(context, info, exposedInterface);
  |       KernelController controller = (KernelController)context.getController();
  |       controller.install(builder.getBeanMetaData(), proxy);
  | 
  |       // no change directly on context
  |       return null;
  |    }
  | 
  |    /**
  |     * Create proxy for attribute.
  |     *
  |     * @param context the context
  |     * @param info the info
  |     * @param exposedInterface the exposed interface
  |     * @return attribute's proxy
  |     * @throws Throwable for any error
  |     */
  |    protected Object createProxy(KernelControllerContext context, T info, Class<?> exposedInterface) throws Throwable
  |    {
  |       return Proxy.newProxyInstance(
  |             context.getClassLoader(),
  |             new Class<?>[]{exposedInterface},
  |             new AttributeInvocationHandler(context, getName(info))
  |       );
  |    }
  | 
  |    protected void internalCleanAnnotation(T info, MetaData metaData, JMX jmx, KernelControllerContext context) throws Throwable
  |    {
  |       Controller controller = context.getController();
  |       controller.uninstall(createObjectName(context, info, jmx));
  |    }
  | 
  |    /**
  |     * Get exposed interface from info.
  |     *
  |     * @param info the info
  |     * @return exposed interface
  |     */
  |    protected abstract Class<?> getExposedInterface(T info);
  | 
  |    /**
  |     * Get name from info.
  |     *
  |     * @param info the info
  |     * @return info's name
  |     */
  |    protected abstract String getName(T info);
  | 
  |    /**
  |     * Create object name.
  |     *
  |     * @param context the context
  |     * @param info the info
  |     * @param jmx the annotation
  |     * @return obejct name
  |     * @throws Exception for any error
  |     */
  |    protected String createObjectName(ControllerContext context, T info, JMX jmx) throws Exception
  |    {
  |       if (jmx != null)
  |       {
  |          String jmxName = jmx.name();
  |          if (jmxName != null && jmxName.length() > 0)
  |             return jmxName;
  |       }
  | 
  |       // try to build one from the bean name and  info param
  |       String name = context.getName().toString();
  |       String objectName = name;
  |       if (name.contains(":") == false)
  |       {
  |          objectName = "jboss.pojo:name='" + name + "'";
  |       }
  |       return objectName + ",property=" + getName(info);
  |    }
  | 
  |    /**
  |     * Attribute invocation handler.
  |     */
  |    protected class AttributeInvocationHandler implements InvocationHandler
  |    {
  |       private KernelControllerContext context;
  |       private String property;
  | 
  |       protected AttributeInvocationHandler(KernelControllerContext context, String property)
  |       {
  |          this.context = context;
  |          this.property = property;
  |       }
  | 
  |       public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
  |       {
  |          Object target = context.get(property);
  |          return method.invoke(target, args);
  |       }
  |    }
  | }
  | 

I'm creating a proxy target around @JMX exposed attribute, installing it to MC, hence leaving all the rest of jmx work to MC.

Does this look legit?

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4159534#4159534

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4159534



More information about the jboss-dev-forums mailing list