Author: rmannibucau
Date: Tue Oct 30 18:19:45 2012
New Revision: 1403811

URL: http://svn.apache.org/viewvc?rev=1403811&view=rev
Log:
TOMEE-510 shade mbean annotation api in openejb-api

Modified:
    
openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
    openejb/trunk/openejb/container/openejb-api/pom.xml
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/monitoring/JMXContainer.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/monitoring/JMXDeployer.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/MBeanDeployer.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/JMXBasicDataSource.java
    openejb/trunk/openejb/osgi/openejb-core-osgi/pom.xml

Modified: 
openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java?rev=1403811&r1=1403810&r2=1403811&view=diff
==============================================================================
--- 
openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
 (original)
+++ 
openejb/trunk/openejb/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
 Tue Oct 30 18:19:45 2012
@@ -273,7 +273,7 @@ public abstract class TomEEContainer<Con
                        final String name = file.getName();
                        folderFile = new File(file.getParentFile(), 
name.substring(0, name.length() - 4));
                 }
-            } while (file.exists() || folderFile.exists()); // we unpack the 
war/ear and the delete of "i" can fail (on win in particular)
+            } while (file.getParentFile().exists()); // we will delete the 
parent (to clean even complicated unpacking)
             if (!file.getParentFile().exists() && 
!file.getParentFile().mkdirs()) {
                 LOGGER.warning("can't create " + file.getParent());
             }

Modified: openejb/trunk/openejb/container/openejb-api/pom.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-api/pom.xml?rev=1403811&r1=1403810&r2=1403811&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-api/pom.xml (original)
+++ openejb/trunk/openejb/container/openejb-api/pom.xml Tue Oct 30 18:19:45 2012
@@ -32,11 +32,43 @@
 
   <dependencies>
     <dependency>
-      <groupId>org.apache.geronimo.specs</groupId>
-      <artifactId>geronimo-jpa_2.0_spec</artifactId>
-      <version>1.1</version>
-      <scope>provided</scope>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>mbean-annotation-api</artifactId>
+      <version>${project.version}</version>
     </dependency>
   </dependencies>
-</project>
 
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-shade-plugin</artifactId>
+        <version>2.0</version>
+        <executions>
+          <execution>
+            <phase>package</phase>
+            <goals>
+              <goal>shade</goal>
+            </goals>
+            <configuration>
+              <relocations>
+                <relocation>
+                  <pattern>javax.management</pattern>
+                  <shadedPattern>org.apache.openejb.api.jmx</shadedPattern>
+                  <includes>
+                    <include>javax.management.MBean</include>
+                    <include>javax.management.Description</include>
+                    <include>javax.management.ManagedAttribute</include>
+                    <include>javax.management.ManagedOperation</include>
+                    <include>javax.management.NotificationInfo</include>
+                    <include>javax.management.NotificationInfos</include>
+                  </includes>
+                </relocation>
+              </relocations>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java?rev=1403811&r1=1403810&r2=1403811&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ReloadableEntityManagerFactory.java
 Tue Oct 30 18:19:45 2012
@@ -20,6 +20,10 @@ package org.apache.openejb.assembler.cla
 import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.OpenEJBRuntimeException;
 import org.apache.openejb.api.internal.Internal;
+import org.apache.openejb.api.jmx.Description;
+import org.apache.openejb.api.jmx.MBean;
+import org.apache.openejb.api.jmx.ManagedAttribute;
+import org.apache.openejb.api.jmx.ManagedOperation;
 import org.apache.openejb.jee.JAXBContextFactory;
 import org.apache.openejb.jee.Persistence;
 import org.apache.openejb.jee.PersistenceUnitCaching;
@@ -34,11 +38,7 @@ import org.apache.openejb.persistence.Qu
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 
-import javax.management.Description;
-import javax.management.MBean;
 import javax.management.MBeanServer;
-import javax.management.ManagedAttribute;
-import javax.management.ManagedOperation;
 import javax.management.ObjectName;
 import javax.management.openmbean.CompositeData;
 import javax.management.openmbean.CompositeDataSupport;

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/monitoring/JMXContainer.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/monitoring/JMXContainer.java?rev=1403811&r1=1403810&r2=1403811&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/monitoring/JMXContainer.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/monitoring/JMXContainer.java
 Tue Oct 30 18:19:45 2012
@@ -16,13 +16,14 @@
  */
 package org.apache.openejb.assembler.monitoring;
 
-import java.util.Map;
-import javax.management.Description;
-import javax.management.ManagedAttribute;
 import org.apache.openejb.BeanContext;
 import org.apache.openejb.Container;
+import org.apache.openejb.api.jmx.Description;
+import org.apache.openejb.api.jmx.ManagedAttribute;
 import org.apache.openejb.assembler.classic.ContainerInfo;
 
+import java.util.Map;
+
 @Description("describe a container")
 public class JMXContainer {
     private final Container container;

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/monitoring/JMXDeployer.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/monitoring/JMXDeployer.java?rev=1403811&r1=1403810&r2=1403811&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/monitoring/JMXDeployer.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/monitoring/JMXDeployer.java
 Tue Oct 30 18:19:45 2012
@@ -18,10 +18,10 @@ package org.apache.openejb.assembler.mon
 
 import java.util.Collection;
 import java.util.Properties;
-import javax.management.Description;
-import javax.management.MBean;
-import javax.management.ManagedAttribute;
-import javax.management.ManagedOperation;
+import org.apache.openejb.api.jmx.Description;
+import org.apache.openejb.api.jmx.MBean;
+import org.apache.openejb.api.jmx.ManagedAttribute;
+import org.apache.openejb.api.jmx.ManagedOperation;
 import javax.naming.Context;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/MBeanDeployer.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/MBeanDeployer.java?rev=1403811&r1=1403810&r2=1403811&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/MBeanDeployer.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/MBeanDeployer.java
 Tue Oct 30 18:19:45 2012
@@ -23,9 +23,10 @@ import org.apache.xbean.finder.Annotated
 import org.apache.xbean.finder.AnnotationFinder;
 import org.apache.xbean.finder.IAnnotationFinder;
 
-import javax.management.MBean;
+import java.lang.annotation.Annotation;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 
@@ -47,12 +48,16 @@ public class MBeanDeployer implements Dy
                 cl = getClass().getClassLoader();
             }
         }
+
+        final Collection<Class<? extends Annotation>> mbeanClasses = new 
ArrayList<Class<? extends Annotation>>(2);
+        mbeanClasses.add(org.apache.openejb.api.jmx.MBean.class);
+
         try { // for OSGi environment, javax.management is imported by the JRE
-            cl.loadClass("javax.management.MBean");
+            mbeanClasses.add((Class<? extends Annotation>) 
cl.loadClass("javax.management.MBean"));
         } catch (NoClassDefFoundError noClassDefFoundError) {
-            return appModule;
+            // ignored
         } catch (ClassNotFoundException e) {
-            return appModule;
+            // ignored
         }
 
         // there is an ejbmodule by webapp so we should't need to go through 
the webapp
@@ -62,15 +67,17 @@ public class MBeanDeployer implements Dy
                 continue;
             }
 
-            for (Annotated<Class<?>> clazz : 
ejbModule.getFinder().findMetaAnnotatedClasses(MBean.class)) {
-                final Class<?> realClass = clazz.get();
-                final String name = realClass.getName();
-                if (done.contains(name)) {
-                    continue;
-                }
+            for (Class<? extends Annotation> mclazz : mbeanClasses) {
+                for (Annotated<Class<?>> clazz : 
ejbModule.getFinder().findMetaAnnotatedClasses(mclazz)) {
+                    final Class<?> realClass = clazz.get();
+                    final String name = realClass.getName();
+                    if (done.contains(name)) {
+                        continue;
+                    }
 
-                ejbModule.getMbeans().add(name);
-                done.add(name);
+                    ejbModule.getMbeans().add(name);
+                    done.add(name);
+                }
             }
         }
         for (ClientModule clientModule : appModule.getClientModules()) {
@@ -78,13 +85,15 @@ public class MBeanDeployer implements Dy
                 continue;
             }
 
-            for (Annotated<Class<?>> clazz : 
clientModule.getFinder().findMetaAnnotatedClasses(MBean.class)) {
-                final String name = clazz.get().getName();
-                if (done.contains(name)) {
-                    continue;
-                }
+            for (Class<? extends Annotation> mclazz : mbeanClasses) {
+                for (Annotated<Class<?>> clazz : 
clientModule.getFinder().findMetaAnnotatedClasses(mclazz)) {
+                    final String name = clazz.get().getName();
+                    if (done.contains(name)) {
+                        continue;
+                    }
 
-                clientModule.getMbeans().add(name);
+                    clientModule.getMbeans().add(name);
+                }
             }
         }
 
@@ -101,13 +110,15 @@ public class MBeanDeployer implements Dy
         if (libs.size() > 0) {
             // force descriptor for additinal libs since it shouldn't occur 
often and can save some time
             final IAnnotationFinder finder = new AnnotationFinder(new 
ConfigurableClasspathArchive(appModule.getClassLoader(), true, libs));
-            for (Annotated<Class<?>> clazz : 
finder.findMetaAnnotatedClasses(MBean.class)) {
-                final String name = clazz.get().getName();
-                if (done.contains(name)) {
-                    continue;
-                }
+            for (Class<? extends Annotation> mclazz : mbeanClasses) {
+                for (Annotated<Class<?>> clazz : 
finder.findMetaAnnotatedClasses(mclazz)) {
+                    final String name = clazz.get().getName();
+                    if (done.contains(name)) {
+                        continue;
+                    }
 
-                appModule.getAdditionalLibMbeans().add(name);
+                    appModule.getAdditionalLibMbeans().add(name);
+                }
             }
         }
 

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java?rev=1403811&r1=1403810&r2=1403811&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
 Tue Oct 30 18:19:45 2012
@@ -853,7 +853,6 @@ public class StatefulContainer implement
                 EntityManagerFactory entityManagerFactory = entry.getKey();
                 Map properties = entry.getValue();
 
-
                 JtaEntityManagerRegistry.EntityManagerTracker 
entityManagerTracker = 
entityManagerRegistry.getInheritedEntityManager(entityManagerFactory);
                 EntityManager entityManager;
                 if (entityManagerTracker == null) {

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java?rev=1403811&r1=1403810&r2=1403811&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/monitoring/DynamicMBeanWrapper.java
 Tue Oct 30 18:19:45 2012
@@ -17,13 +17,18 @@
 package org.apache.openejb.monitoring;
 
 import javassist.util.proxy.ProxyFactory;
+import org.apache.openejb.api.jmx.Description;
+import org.apache.openejb.api.jmx.MBean;
+import org.apache.openejb.api.jmx.ManagedAttribute;
+import org.apache.openejb.api.jmx.ManagedOperation;
+import org.apache.openejb.api.jmx.NotificationInfo;
+import org.apache.openejb.api.jmx.NotificationInfos;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 
 import javax.management.Attribute;
 import javax.management.AttributeList;
 import javax.management.AttributeNotFoundException;
-import javax.management.Description;
 import javax.management.DynamicMBean;
 import javax.management.ImmutableDescriptor;
 import javax.management.IntrospectionException;
@@ -33,14 +38,14 @@ import javax.management.MBeanException;
 import javax.management.MBeanInfo;
 import javax.management.MBeanNotificationInfo;
 import javax.management.MBeanOperationInfo;
-import javax.management.ManagedAttribute;
-import javax.management.ManagedOperation;
-import javax.management.NotificationInfo;
-import javax.management.NotificationInfos;
 import javax.management.ReflectionException;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.lang.reflect.Proxy;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -50,6 +55,23 @@ import java.util.ResourceBundle;
 public class DynamicMBeanWrapper implements DynamicMBean {
     public static final Logger logger = 
Logger.getInstance(LogCategory.OPENEJB_DEPLOY, DynamicMBeanWrapper.class);
 
+    private static final Map<Class<?>, Class<? extends Annotation>> 
OPENEJB_API_TO_JAVAX = new HashMap<Class<?>, Class<? extends Annotation>>();
+    static {
+        final ClassLoader loader = DynamicMBeanWrapper.class.getClassLoader();
+        try {
+            OPENEJB_API_TO_JAVAX.put(MBean.class, (Class<? extends 
Annotation>) loader.loadClass("javax.management.MBean"));
+            OPENEJB_API_TO_JAVAX.put(Description.class, (Class<? extends 
Annotation>) loader.loadClass("javax.management.Description"));
+            OPENEJB_API_TO_JAVAX.put(ManagedOperation.class, (Class<? extends 
Annotation>) loader.loadClass("javax.management.ManagedOperation"));
+            OPENEJB_API_TO_JAVAX.put(ManagedAttribute.class, (Class<? extends 
Annotation>) loader.loadClass("javax.management.ManagedAttribute"));
+            OPENEJB_API_TO_JAVAX.put(NotificationInfo.class, (Class<? extends 
Annotation>) loader.loadClass("javax.management.NotificationInfo"));
+            OPENEJB_API_TO_JAVAX.put(NotificationInfos.class, (Class<? extends 
Annotation>) loader.loadClass("javax.management.NotificationInfos"));
+        } catch (ClassNotFoundException cnfe) {
+            // ignored
+        } catch (NoClassDefFoundError ncdfe) {
+            // ignored
+        }
+    }
+
     private final MBeanInfo info;
     private final Map<String, Method> getters = new HashMap<String, Method>();
     private final Map<String, Method> setters = new HashMap<String, Method>();
@@ -75,16 +97,16 @@ public class DynamicMBeanWrapper impleme
         instance = givenInstance;
 
         // class
-        Description classDescription = 
annotatedMBean.getAnnotation(Description.class);
+        Description classDescription = findAnnotation(annotatedMBean, 
Description.class);
         description = getDescription(classDescription, "a MBean built by 
OpenEJB");
 
-        NotificationInfo notification = 
annotatedMBean.getAnnotation(NotificationInfo.class);
+        NotificationInfo notification = findAnnotation(annotatedMBean, 
NotificationInfo.class);
         if (notification != null) {
             MBeanNotificationInfo notificationInfo = 
getNotificationInfo(notification);
             notificationInfos.add(notificationInfo);
         }
 
-        NotificationInfos notifications = 
annotatedMBean.getAnnotation(NotificationInfos.class);
+        NotificationInfos notifications = findAnnotation(annotatedMBean, 
NotificationInfos.class);
         if (notifications != null && notifications.value() != null) {
             for (NotificationInfo n : notifications.value()) {
                 MBeanNotificationInfo notificationInfo = 
getNotificationInfo(n);
@@ -102,7 +124,7 @@ public class DynamicMBeanWrapper impleme
                 continue;
             }
 
-            if (m.getAnnotation(ManagedAttribute.class) != null) {
+            if (findAnnotation(m, ManagedAttribute.class) != null) {
                 String methodName = m.getName();
                 String attrName = methodName;
                 if (((attrName.startsWith("get") && 
m.getParameterTypes().length == 0)
@@ -123,11 +145,11 @@ public class DynamicMBeanWrapper impleme
                 } else if (methodName.startsWith("set")) {
                     setters.put(attrName, m);
                 }
-            } else if (m.getAnnotation(ManagedOperation.class) != null) {
+            } else if (findAnnotation(m, ManagedOperation.class) != null) {
                 operations.put(m.getName(), m);
 
                 String operationDescr = "";
-                Description descr = m.getAnnotation(Description.class);
+                Description descr = findAnnotation(m, Description.class);
                 if (descr != null) {
                     operationDescr = getDescription(descr, "-");
                 }
@@ -141,7 +163,7 @@ public class DynamicMBeanWrapper impleme
             Method mtd = e.getValue();
 
             String attrDescr = "";
-            Description descr = mtd.getAnnotation(Description.class);
+            Description descr = findAnnotation(mtd, Description.class);
             if (descr != null) {
                 attrDescr = getDescription(descr, "-");
             }
@@ -161,6 +183,58 @@ public class DynamicMBeanWrapper impleme
                 notificationInfos.toArray(new 
MBeanNotificationInfo[notificationInfos.size()]));
     }
 
+    private <T extends Annotation> T findAnnotation(final Method method, final 
Class<T> searchedAnnotation) {
+        final T annotation = method.getAnnotation(searchedAnnotation);
+        if (annotation != null) {
+            return annotation;
+        }
+
+        if (OPENEJB_API_TO_JAVAX.containsKey(searchedAnnotation)) {
+            final Class<? extends Annotation> clazz = 
OPENEJB_API_TO_JAVAX.get(searchedAnnotation);
+            final Object javaxAnnotation = method.getAnnotation(clazz);
+            if (javaxAnnotation != null) {
+                return annotationProxy(javaxAnnotation, searchedAnnotation);
+            }
+        }
+        return null;
+    }
+
+    private <T extends Annotation> T findAnnotation(final Field field, final 
Class<T> searchedAnnotation) {
+        final T annotation = field.getAnnotation(searchedAnnotation);
+        if (annotation != null) {
+            return annotation;
+        }
+
+        if (OPENEJB_API_TO_JAVAX.containsKey(searchedAnnotation)) {
+            final Class<? extends Annotation> clazz = 
OPENEJB_API_TO_JAVAX.get(searchedAnnotation);
+            final Object javaxAnnotation = field.getAnnotation(clazz);
+            if (javaxAnnotation != null) {
+                return annotationProxy(javaxAnnotation, searchedAnnotation);
+            }
+        }
+        return null;
+    }
+
+    private <T extends Annotation> T findAnnotation(final Class<?> 
annotatedMBean, final Class<T> searchedAnnotation) {
+        final T annotation = annotatedMBean.getAnnotation(searchedAnnotation);
+        if (annotation != null) {
+            return annotation;
+        }
+
+        if (OPENEJB_API_TO_JAVAX.containsKey(searchedAnnotation)) {
+            final Class<? extends Annotation> clazz = 
OPENEJB_API_TO_JAVAX.get(searchedAnnotation);
+            final Object javaxAnnotation = annotatedMBean.getAnnotation(clazz);
+            if (javaxAnnotation != null) {
+                return annotationProxy(javaxAnnotation, searchedAnnotation);
+            }
+        }
+        return null;
+    }
+
+    private static <T extends Annotation> T annotationProxy(final Object 
javaxAnnotation, final Class<T> clazz) {
+        return (T) 
Proxy.newProxyInstance(DynamicMBeanWrapper.class.getClassLoader(), new 
Class<?>[]{clazz}, new AnnotationHandler(javaxAnnotation));
+    }
+
     private MBeanNotificationInfo getNotificationInfo(NotificationInfo n) {
         String description = getDescription(n.description(), "-");
         return new MBeanNotificationInfo(n.types(),
@@ -283,4 +357,41 @@ public class DynamicMBeanWrapper impleme
         }
         throw new MBeanException(new IllegalArgumentException(), actionName + 
" doesn't exist");
     }
+
+    private static class AnnotationHandler implements InvocationHandler {
+        private final Object delegate;
+
+        public AnnotationHandler(final Object javaxAnnotation) {
+            delegate = javaxAnnotation;
+        }
+
+        @Override
+        public Object invoke(Object proxy, Method method, Object[] args) 
throws Throwable {
+            Object result = null;
+            for (Method mtd : delegate.getClass().getMethods()) { // simple 
heurisitc which should be enough
+                if (mtd.getName().equals(method.getName())) {
+                    result = mtd.invoke(delegate, args);
+                    break;
+                }
+            }
+
+            if (result == null) {
+                return null;
+            }
+
+            if (result.getClass().isArray()) {
+                final Object[] array = (Object[]) result;
+                if (array.length == 0 || 
!OPENEJB_API_TO_JAVAX.containsValue(array[0].getClass())) {
+                    return array;
+                }
+
+                final Object[] translated = new Object[array.length];
+                for (int i = 0; i < translated.length; i++) {
+                    translated[i] = annotationProxy(array[i], 
OPENEJB_API_TO_JAVAX.get(array[i].getClass()));
+                }
+            }
+
+            return result;
+        }
+    }
 }

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/JMXBasicDataSource.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/JMXBasicDataSource.java?rev=1403811&r1=1403810&r2=1403811&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/JMXBasicDataSource.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/dbcp/JMXBasicDataSource.java
 Tue Oct 30 18:19:45 2012
@@ -19,10 +19,10 @@ package org.apache.openejb.resource.jdbc
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.sql.Statement;
-import javax.management.Description;
+import org.apache.openejb.api.jmx.Description;
 import javax.management.MBeanServer;
-import javax.management.ManagedAttribute;
-import javax.management.ManagedOperation;
+import org.apache.openejb.api.jmx.ManagedAttribute;
+import org.apache.openejb.api.jmx.ManagedOperation;
 import javax.management.ObjectName;
 import org.apache.openejb.monitoring.DynamicMBeanWrapper;
 import org.apache.openejb.monitoring.LocalMBeanServer;

Modified: openejb/trunk/openejb/osgi/openejb-core-osgi/pom.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/osgi/openejb-core-osgi/pom.xml?rev=1403811&r1=1403810&r2=1403811&view=diff
==============================================================================
--- openejb/trunk/openejb/osgi/openejb-core-osgi/pom.xml (original)
+++ openejb/trunk/openejb/osgi/openejb-core-osgi/pom.xml Tue Oct 30 18:19:45 
2012
@@ -356,6 +356,7 @@
       '=META-INF.org^.apache^.openejb',
       org.apache.openejb;version=${openejb.osgi.export.version},
       org.apache.openejb.api.internal;version=${openejb.osgi.export.version},
+      org.apache.openejb.api.jmx;version=${openejb.osgi.export.version},
       org.apache.openejb.async;version=${openejb.osgi.export.version},
       org.apache.openejb.assembler;version=${openejb.osgi.export.version},
       
org.apache.openejb.assembler.classic;version=${openejb.osgi.export.version},


Reply via email to