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>