Author: rmannibucau
Date: Mon Nov 14 22:16:30 2011
New Revision: 1201935

URL: http://svn.apache.org/viewvc?rev=1201935&view=rev
Log:
adding dynamic-proxy-to-access-mbean example

Added:
    openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/
    openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/README.md
    openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/pom.xml
    openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/
    openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/main/
    openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/main/java/
    
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/main/java/org/
    
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/main/java/org/superbiz/
    
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/main/java/org/superbiz/dynamic/
    
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/main/java/org/superbiz/dynamic/mbean/
    
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/main/java/org/superbiz/dynamic/mbean/DynamicMBeanHandler.java
    
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/main/java/org/superbiz/dynamic/mbean/ObjectName.java
    openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/
    openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/
    
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/
    
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/
    
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/
    
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/
    
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/DynamicMBeanClient.java
    
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/DynamicMBeanClientTest.java
    
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/simple/
    
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/simple/Simple.java
    
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/simple/SimpleMBean.java
Modified:
    openejb/trunk/openejb/examples/index.md
    openejb/trunk/openejb/examples/pom.xml

Added: openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/README.md
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/README.md?rev=1201935&view=auto
==============================================================================
--- openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/README.md 
(added)
+++ openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/README.md Mon 
Nov 14 22:16:30 2011
@@ -0,0 +1,259 @@
+Title: dynamic-proxy-to-access-mbean
+
+*Help us document this example! Source available in 
[svn](http://svn.apache.org/repos/asf/openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean)
 or 
[git](https://github.com/apache/openejb/tree/trunk/openejb/examples/dynamic-proxy-to-access-mbean).
 Open a [JIRA](https://issues.apache.org/jira/browse/TOMEE) with patch or pull 
request*
+
+## Example
+
+Acessing MBean is something simple through the JMX API but it is often 
technical and not very interesting.
+
+This example simplify this work simply doing it generically in a proxy.
+
+So from an user side you simple declare an interface to access your MBeans.
+
+Note: the example implementation uses a local MBeanServer but enhancing the 
example API
+it is easy to imagine a remote connection with user/password if needed.
+
+## ObjectName API (annotation)
+
+Simply an annotation to get the object
+
+       package org.superbiz.dynamic.mbean;
+
+       import java.lang.annotation.Retention;
+       import java.lang.annotation.Target;
+
+       import static java.lang.annotation.ElementType.TYPE;
+       import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+       @Target({TYPE, METHOD})
+       @Retention(RUNTIME)
+       public @interface ObjectName {
+               String value();
+       }
+
+## DynamicMBeanHandler (thr proxy implementation)
+
+       package org.superbiz.dynamic.mbean;
+
+       import javax.management.Attribute;
+       import javax.management.MBeanAttributeInfo;
+       import javax.management.MBeanInfo;
+       import javax.management.MBeanServer;
+       import javax.management.MalformedObjectNameException;
+       import javax.management.ObjectName;
+       import java.lang.management.ManagementFactory;
+       import java.lang.reflect.InvocationHandler;
+       import java.lang.reflect.Method;
+       import java.util.Map;
+       import java.util.concurrent.ConcurrentHashMap;
+
+       public class DynamicMBeanHandler implements InvocationHandler {
+               private Map<Method, ObjectName> objectNames = new 
ConcurrentHashMap<Method, ObjectName>();
+
+               @Override public Object invoke(Object proxy, Method method, 
Object[] args) throws Throwable {
+                   if (method.getDeclaringClass().equals(Object.class) && 
"toString".equals(method.getName())) {
+                       return getClass().getSimpleName() + " Proxy";
+                   }
+
+                   final MBeanServer server = 
ManagementFactory.getPlatformMBeanServer();
+                   final String methodName = method.getName();
+                   final ObjectName objectName = getObjectName(method);
+                   final MBeanInfo infos = server.getMBeanInfo(objectName);
+                   if (methodName.startsWith("set") && methodName.length() > 3 
&& args != null && args.length == 1
+                           && (Void.TYPE.equals(method.getReturnType()) || 
Void.class.equals(method.getReturnType()))) {
+                       final String attributeName =  attributeName(infos, 
methodName, method.getParameterTypes()[0]);
+                       server.setAttribute(objectName, new 
Attribute(attributeName, args[0]));
+                       return null;
+                   } else if (methodName.startsWith("get") && (args == null || 
args.length == 0) && methodName.length() > 3) {
+                       final String attributeName =  attributeName(infos, 
methodName, method.getReturnType());
+                       return server.getAttribute(objectName, attributeName);
+                   }
+                   // operation
+                   return server.invoke(objectName, methodName, args, 
getSignature(method));
+               }
+
+               private String[] getSignature(Method method) {
+                   String[] args = new 
String[method.getParameterTypes().length];
+                   for (int i = 0; i < method.getParameterTypes().length; i++) 
{
+                       args[i] = method.getParameterTypes()[i].getName();
+                   }
+                   return args; // note: null should often work...
+               }
+
+               private String attributeName(MBeanInfo infos, String 
methodName, Class<?> type) {
+                   String found = null;
+                   String foundBackUp = null; // without checking the type
+                   final String attributeName = methodName.substring(3, 
methodName.length());
+                   final String lowerName = 
Character.toLowerCase(methodName.charAt(3)) + methodName.substring(4, 
methodName.length());
+
+                   for (MBeanAttributeInfo attribute : infos.getAttributes()) {
+                       final String name = attribute.getName();
+                       if (attributeName.equals(name)) {
+                           foundBackUp = attributeName;
+                           if (attribute.getType().equals(type.getName())) {
+                               found = name;
+                           }
+                       } else if (found == null && ((lowerName.equals(name) && 
!attributeName.equals(name))
+                                                           || 
lowerName.equalsIgnoreCase(name))) {
+                           foundBackUp = name;
+                           if (attribute.getType().equals(type.getName())) {
+                               found = name;
+                           }
+                       }
+                   }
+
+                   if (found == null) {
+                       throw new UnsupportedOperationException("cannot find 
attribute " + attributeName);
+                   }
+
+                   return found;
+               }
+
+               private synchronized ObjectName getObjectName(Method method) 
throws MalformedObjectNameException {
+                   if (!objectNames.containsKey(method)) {
+                       synchronized (objectNames) {
+                           if (!objectNames.containsKey(method)) { // double 
check for synchro
+                               org.superbiz.dynamic.mbean.ObjectName on = 
method.getAnnotation(org.superbiz.dynamic.mbean.ObjectName.class);
+                               if (on == null) {
+                                   Class<?> current = 
method.getDeclaringClass();
+                                   do {
+                                       on = 
method.getDeclaringClass().getAnnotation(org.superbiz.dynamic.mbean.ObjectName.class);
+                                       current = current.getSuperclass();
+                                   } while (on == null && current != null);
+                                   if (on == null) {
+                                       throw new 
UnsupportedOperationException("class or method should define the objectName to 
use for invocation: " + method.toGenericString());
+                                   }
+                               }
+                               objectNames.put(method, new 
ObjectName(on.value()));
+                           }
+                       }
+                   }
+                   return objectNames.get(method);
+               }
+       }    
+
+## DynamicMBeanClient (the dynamic JMX client)
+
+       package org.superbiz.dynamic.mbean;
+
+       import org.apache.openejb.api.Proxy;
+       import org.superbiz.dynamic.mbean.DynamicMBeanHandler;
+       import org.superbiz.dynamic.mbean.ObjectName;
+
+       import javax.ejb.Singleton;
+
+       /**
+        * @author rmannibucau
+        */
+       @Singleton
+       @Proxy(DynamicMBeanHandler.class)
+       @ObjectName(DynamicMBeanClient.OBJECT_NAME)
+       public interface DynamicMBeanClient {
+               static final String OBJECT_NAME = 
"test:group=DynamicMBeanClientTest";
+
+               int getCounter();
+               void setCounter(int i);
+               int length(String aString);
+       }
+
+## The MBean used for the test
+
+### SimpleMBean
+
+       package org.superbiz.dynamic.mbean.simple;
+
+       public interface SimpleMBean {
+               int length(String s);
+
+               int getCounter();
+               void setCounter(int c);
+       }
+
+## Simple
+
+       package org.superbiz.dynamic.mbean.simple;
+
+       public class Simple implements SimpleMBean {
+               private int counter = 0;
+
+               @Override public int length(String s) {
+                   if (s == null) {
+                       return 0;
+                   }
+                   return s.length();
+               }
+
+               @Override public int getCounter() {
+                   return counter;
+               }
+
+               @Override public void setCounter(int c) {
+                   counter = c;
+               }
+       }
+
+## DynamicMBeanClientTest (The test)
+
+package org.superbiz.dynamic.mbean;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.superbiz.dynamic.mbean.simple.Simple;
+
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.ejb.embeddable.EJBContainer;
+import javax.management.Attribute;
+import javax.management.ObjectName;
+import java.lang.management.ManagementFactory;
+
+import static junit.framework.Assert.assertEquals;
+
+public class DynamicMBeanClientTest {
+    private static ObjectName objectName;
+    private static EJBContainer container;
+
+    @EJB private DynamicMBeanClient client;
+
+    @BeforeClass public static void start() {
+        container = EJBContainer.createEJBContainer();
+    }
+
+    @Before public void injectAndRegisterMBean() throws Exception {
+        container.getContext().bind("inject", this);
+        objectName = new ObjectName(DynamicMBeanClient.OBJECT_NAME);
+        ManagementFactory.getPlatformMBeanServer().registerMBean(new Simple(), 
objectName);
+    }
+
+    @After public void unregisterMBean() throws Exception {
+        if (objectName != null) {
+            
ManagementFactory.getPlatformMBeanServer().unregisterMBean(objectName);
+        }
+    }
+
+    @Test public void get() throws Exception {
+        assertEquals(0, client.getCounter());
+        ManagementFactory.getPlatformMBeanServer().setAttribute(objectName, 
new Attribute("Counter", 5));
+        assertEquals(5, client.getCounter());
+    }
+
+    @Test public void set() throws Exception {
+        assertEquals(0, ((Integer) 
ManagementFactory.getPlatformMBeanServer().getAttribute(objectName, 
"Counter")).intValue());
+        client.setCounter(8);
+        assertEquals(8, ((Integer) 
ManagementFactory.getPlatformMBeanServer().getAttribute(objectName, 
"Counter")).intValue());
+    }
+
+    @Test public void operation() {
+        assertEquals(7, client.length("openejb"));
+    }
+
+    @AfterClass public static void close() {
+        if (container != null) {
+            container.close();
+        }
+    }
+}
+

Added: openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/pom.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/pom.xml?rev=1201935&view=auto
==============================================================================
--- openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/pom.xml (added)
+++ openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/pom.xml Mon 
Nov 14 22:16:30 2011
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.superbiz</groupId>
+  <artifactId>dynamic-proxy-to-access-mbean</artifactId>
+  <packaging>jar</packaging>
+  <version>1.1-SNAPSHOT</version>
+  <name>OpenEJB :: Examples :: Dynamic MBean Proxy</name>
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+  <build>
+    <defaultGoal>install</defaultGoal>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>2.3.2</version>
+        <configuration>
+          <source>1.6</source>
+          <target>1.6</target>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  <repositories>
+    <repository>
+      <id>apache-m2-snapshot</id>
+      <name>Apache Snapshot Repository</name>
+      <url>http://repository.apache.org/snapshots</url>
+    </repository>
+  </repositories>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.openejb</groupId>
+      <artifactId>javaee-api</artifactId>
+      <version>6.0-3-SNAPSHOT</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.openejb</groupId>
+      <artifactId>openejb-api</artifactId>
+      <version>4.0.0-beta-2-SNAPSHOT</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.8.1</version>
+      <scope>test</scope>
+    </dependency>
+
+    <!--
+    The <scope>test</scope> guarantees that non of your runtime
+    code is dependent on any OpenEJB classes.
+    -->
+    <dependency>
+      <groupId>org.apache.openejb</groupId>
+      <artifactId>openejb-core</artifactId>
+      <version>4.0.0-beta-2-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <!--
+  This section allows you to configure where to publish libraries for sharing.
+  It is not required and may be deleted.  For more information see:
+  http://maven.apache.org/plugins/maven-deploy-plugin/
+  -->
+  <distributionManagement>
+    <repository>
+      <id>localhost</id>
+      <url>file://${basedir}/target/repo/</url>
+    </repository>
+    <snapshotRepository>
+      <id>localhost</id>
+      <url>file://${basedir}/target/snapshot-repo/</url>
+    </snapshotRepository>
+  </distributionManagement>
+
+</project>
+

Added: 
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/main/java/org/superbiz/dynamic/mbean/DynamicMBeanHandler.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/main/java/org/superbiz/dynamic/mbean/DynamicMBeanHandler.java?rev=1201935&view=auto
==============================================================================
--- 
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/main/java/org/superbiz/dynamic/mbean/DynamicMBeanHandler.java
 (added)
+++ 
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/main/java/org/superbiz/dynamic/mbean/DynamicMBeanHandler.java
 Mon Nov 14 22:16:30 2011
@@ -0,0 +1,101 @@
+package org.superbiz.dynamic.mbean;
+
+import javax.management.Attribute;
+import javax.management.MBeanAttributeInfo;
+import javax.management.MBeanInfo;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import java.lang.management.ManagementFactory;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @author rmannibucau
+ */
+public class DynamicMBeanHandler implements InvocationHandler {
+    private Map<Method, ObjectName> objectNames = new 
ConcurrentHashMap<Method, ObjectName>();
+
+    @Override public Object invoke(Object proxy, Method method, Object[] args) 
throws Throwable {
+        if (method.getDeclaringClass().equals(Object.class) && 
"toString".equals(method.getName())) {
+            return getClass().getSimpleName() + " Proxy";
+        }
+
+        final MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+        final String methodName = method.getName();
+        final ObjectName objectName = getObjectName(method);
+        final MBeanInfo infos = server.getMBeanInfo(objectName);
+        if (methodName.startsWith("set") && methodName.length() > 3 && args != 
null && args.length == 1
+                && (Void.TYPE.equals(method.getReturnType()) || 
Void.class.equals(method.getReturnType()))) {
+            final String attributeName =  attributeName(infos, methodName, 
method.getParameterTypes()[0]);
+            server.setAttribute(objectName, new Attribute(attributeName, 
args[0]));
+            return null;
+        } else if (methodName.startsWith("get") && (args == null || 
args.length == 0) && methodName.length() > 3) {
+            final String attributeName =  attributeName(infos, methodName, 
method.getReturnType());
+            return server.getAttribute(objectName, attributeName);
+        }
+        // operation
+        return server.invoke(objectName, methodName, args, 
getSignature(method));
+    }
+
+    private String[] getSignature(Method method) {
+        String[] args = new String[method.getParameterTypes().length];
+        for (int i = 0; i < method.getParameterTypes().length; i++) {
+            args[i] = method.getParameterTypes()[i].getName();
+        }
+        return args; // note: null should often work...
+    }
+
+    private String attributeName(MBeanInfo infos, String methodName, Class<?> 
type) {
+        String found = null;
+        String foundBackUp = null; // without checking the type
+        final String attributeName = methodName.substring(3, 
methodName.length());
+        final String lowerName = Character.toLowerCase(methodName.charAt(3)) + 
methodName.substring(4, methodName.length());
+
+        for (MBeanAttributeInfo attribute : infos.getAttributes()) {
+            final String name = attribute.getName();
+            if (attributeName.equals(name)) {
+                foundBackUp = attributeName;
+                if (attribute.getType().equals(type.getName())) {
+                    found = name;
+                }
+            } else if (found == null && ((lowerName.equals(name) && 
!attributeName.equals(name))
+                                                || 
lowerName.equalsIgnoreCase(name))) {
+                foundBackUp = name;
+                if (attribute.getType().equals(type.getName())) {
+                    found = name;
+                }
+            }
+        }
+
+        if (found == null) {
+            throw new UnsupportedOperationException("cannot find attribute " + 
attributeName);
+        }
+
+        return found;
+    }
+
+    private synchronized ObjectName getObjectName(Method method) throws 
MalformedObjectNameException {
+        if (!objectNames.containsKey(method)) {
+            synchronized (objectNames) {
+                if (!objectNames.containsKey(method)) { // double check for 
synchro
+                    org.superbiz.dynamic.mbean.ObjectName on = 
method.getAnnotation(org.superbiz.dynamic.mbean.ObjectName.class);
+                    if (on == null) {
+                        Class<?> current = method.getDeclaringClass();
+                        do {
+                            on = 
method.getDeclaringClass().getAnnotation(org.superbiz.dynamic.mbean.ObjectName.class);
+                            current = current.getSuperclass();
+                        } while (on == null && current != null);
+                        if (on == null) {
+                            throw new UnsupportedOperationException("class or 
method should define the objectName to use for invocation: " + 
method.toGenericString());
+                        }
+                    }
+                    objectNames.put(method, new ObjectName(on.value()));
+                }
+            }
+        }
+        return objectNames.get(method);
+    }
+}

Added: 
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/main/java/org/superbiz/dynamic/mbean/ObjectName.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/main/java/org/superbiz/dynamic/mbean/ObjectName.java?rev=1201935&view=auto
==============================================================================
--- 
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/main/java/org/superbiz/dynamic/mbean/ObjectName.java
 (added)
+++ 
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/main/java/org/superbiz/dynamic/mbean/ObjectName.java
 Mon Nov 14 22:16:30 2011
@@ -0,0 +1,17 @@
+package org.superbiz.dynamic.mbean;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * @author rmannibucau
+ */
+@Target({TYPE, METHOD})
+@Retention(RUNTIME)
+public @interface ObjectName {
+    String value();
+}

Added: 
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/DynamicMBeanClient.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/DynamicMBeanClient.java?rev=1201935&view=auto
==============================================================================
--- 
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/DynamicMBeanClient.java
 (added)
+++ 
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/DynamicMBeanClient.java
 Mon Nov 14 22:16:30 2011
@@ -0,0 +1,19 @@
+package org.superbiz.dynamic.mbean;
+
+import org.apache.openejb.api.Proxy;
+
+import javax.ejb.Singleton;
+
+/**
+ * @author rmannibucau
+ */
+@Singleton
+@Proxy(DynamicMBeanHandler.class)
+@ObjectName(DynamicMBeanClient.OBJECT_NAME)
+public interface DynamicMBeanClient {
+    static final String OBJECT_NAME = "test:group=DynamicMBeanClientTest";
+
+    int getCounter();
+    void setCounter(int i);
+    int length(String aString);
+}

Added: 
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/DynamicMBeanClientTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/DynamicMBeanClientTest.java?rev=1201935&view=auto
==============================================================================
--- 
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/DynamicMBeanClientTest.java
 (added)
+++ 
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/DynamicMBeanClientTest.java
 Mon Nov 14 22:16:30 2011
@@ -0,0 +1,64 @@
+package org.superbiz.dynamic.mbean;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.superbiz.dynamic.mbean.simple.Simple;
+
+import javax.ejb.EJB;
+import javax.ejb.embeddable.EJBContainer;
+import javax.management.Attribute;
+import javax.management.ObjectName;
+import java.lang.management.ManagementFactory;
+
+import static junit.framework.Assert.assertEquals;
+
+/**
+ * @author rmannibucau
+ */
+public class DynamicMBeanClientTest {
+    private static ObjectName objectName;
+    private static EJBContainer container;
+
+    @EJB private DynamicMBeanClient client;
+
+    @BeforeClass public static void start() {
+        container = EJBContainer.createEJBContainer();
+    }
+
+    @Before public void injectAndRegisterMBean() throws Exception {
+        container.getContext().bind("inject", this);
+        objectName = new ObjectName(DynamicMBeanClient.OBJECT_NAME);
+        ManagementFactory.getPlatformMBeanServer().registerMBean(new Simple(), 
objectName);
+    }
+
+    @After public void unregisterMBean() throws Exception {
+        if (objectName != null) {
+            
ManagementFactory.getPlatformMBeanServer().unregisterMBean(objectName);
+        }
+    }
+
+    @Test public void get() throws Exception {
+        assertEquals(0, client.getCounter());
+        ManagementFactory.getPlatformMBeanServer().setAttribute(objectName, 
new Attribute("Counter", 5));
+        assertEquals(5, client.getCounter());
+    }
+
+    @Test public void set() throws Exception {
+        assertEquals(0, ((Integer) 
ManagementFactory.getPlatformMBeanServer().getAttribute(objectName, 
"Counter")).intValue());
+        client.setCounter(8);
+        assertEquals(8, ((Integer) 
ManagementFactory.getPlatformMBeanServer().getAttribute(objectName, 
"Counter")).intValue());
+    }
+
+    @Test public void operation() {
+        assertEquals(7, client.length("openejb"));
+    }
+
+    @AfterClass public static void close() {
+        if (container != null) {
+            container.close();
+        }
+    }
+}

Added: 
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/simple/Simple.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/simple/Simple.java?rev=1201935&view=auto
==============================================================================
--- 
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/simple/Simple.java
 (added)
+++ 
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/simple/Simple.java
 Mon Nov 14 22:16:30 2011
@@ -0,0 +1,23 @@
+package org.superbiz.dynamic.mbean.simple;
+
+/**
+ * @author rmannibucau
+ */
+public class Simple implements SimpleMBean {
+    private int counter = 0;
+
+    @Override public int length(String s) {
+        if (s == null) {
+            return 0;
+        }
+        return s.length();
+    }
+
+    @Override public int getCounter() {
+        return counter;
+    }
+
+    @Override public void setCounter(int c) {
+        counter = c;
+    }
+}

Added: 
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/simple/SimpleMBean.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/simple/SimpleMBean.java?rev=1201935&view=auto
==============================================================================
--- 
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/simple/SimpleMBean.java
 (added)
+++ 
openejb/trunk/openejb/examples/dynamic-proxy-to-access-mbean/src/test/java/org/superbiz/dynamic/mbean/simple/SimpleMBean.java
 Mon Nov 14 22:16:30 2011
@@ -0,0 +1,11 @@
+package org.superbiz.dynamic.mbean.simple;
+
+/**
+ * @author rmannibucau
+ */
+public interface SimpleMBean {
+    int length(String s);
+
+    int getCounter();
+    void setCounter(int c);
+}

Modified: openejb/trunk/openejb/examples/index.md
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/index.md?rev=1201935&r1=1201934&r2=1201935&view=diff
==============================================================================
--- openejb/trunk/openejb/examples/index.md (original)
+++ openejb/trunk/openejb/examples/index.md Mon Nov 14 22:16:30 2011
@@ -155,6 +155,7 @@
 
  - [dynamic-dao-implementation](dynamic-dao-implementation/README.html)
  - [dynamic-implementation](dynamic-implementation/README.html)
+ - [dynamic-proxy-to-access-mbean](dynamic-proxy-to-access-mbean/README.html)
 }
 
 

Modified: openejb/trunk/openejb/examples/pom.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/examples/pom.xml?rev=1201935&r1=1201934&r2=1201935&view=diff
==============================================================================
--- openejb/trunk/openejb/examples/pom.xml (original)
+++ openejb/trunk/openejb/examples/pom.xml Mon Nov 14 22:16:30 2011
@@ -92,6 +92,7 @@
     <module>dynamic-implementation</module>
     <module>cdi-alternative-and-stereotypes</module>
     <module>cdi-events</module>
+    <module>dynamic-proxy-to-access-mbea</module>
   </modules>
   <profiles>
     <profile>


Reply via email to