Author: rmannibucau
Date: Thu Aug 21 19:40:16 2014
New Revision: 1619559

URL: http://svn.apache.org/r1619559
Log:
TOMEE-1325 suporting interfaces for synamic subclassing

Added:
    
tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/dyni/LocalButDynamicSingletonTest.java
      - copied, changed from r1618689, 
tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/dyni/DynamicSingletonTest.java
Modified:
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/dyni/DynamicSubclass.java
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/dyni/DynamicSubclass.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/dyni/DynamicSubclass.java?rev=1619559&r1=1619558&r2=1619559&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/dyni/DynamicSubclass.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/dyni/DynamicSubclass.java
 Thu Aug 21 19:40:16 2014
@@ -39,11 +39,15 @@ import java.lang.reflect.Modifier;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.locks.ReentrantLock;
 
+import static java.util.Arrays.asList;
+
 /**
  * @version $Rev$ $Date$
  */
@@ -169,31 +173,38 @@ public class DynamicSubclass implements 
         return classToProxy.getName() + IMPL_SUFFIX;
     }
 
-    private static void getNonPrivateMethods(Class<?> clazz, final Map<String, 
List<Method>> methodMap) {
-        while (clazz != null) {
-            for (final Method method : clazz.getDeclaredMethods()) {
-                final int modifiers = method.getModifiers();
-
-                if (Modifier.isFinal(modifiers)
-                    || Modifier.isPrivate(modifiers)
-                    || Modifier.isStatic(modifiers)) {
-                    continue;
-                }
+    private static void getNonPrivateMethods(final Class<?> impl, final 
Map<String, List<Method>> methodMap) {
+        final Class<?>[] interfaces = impl.getInterfaces();
+        final Collection<Class<?>> api = new ArrayList<>(interfaces.length + 
1);
+        api.add(impl);
+        api.addAll(asList(interfaces));
+
+        for (Class<?> clazz : api) {
+            while (clazz != null && clazz != Object.class) {
+                for (final Method method : clazz.getDeclaredMethods()) {
+                    final int modifiers = method.getModifiers();
+
+                    if (Modifier.isFinal(modifiers)
+                            || Modifier.isPrivate(modifiers)
+                            || Modifier.isStatic(modifiers)) {
+                        continue;
+                    }
 
-                List<Method> methods = methodMap.get(method.getName());
-                if (methods == null) {
-                    methods = new ArrayList<>();
-                    methods.add(method);
-                    methodMap.put(method.getName(), methods);
-                } else {
-                    if (!isOverridden(methods, method)) {
-                        // method is not overridden, so add it
+                    List<Method> methods = methodMap.get(method.getName());
+                    if (methods == null) {
+                        methods = new ArrayList<>();
                         methods.add(method);
+                        methodMap.put(method.getName(), methods);
+                    } else {
+                        if (!isOverridden(methods, method)) {
+                            // method is not overridden, so add it
+                            methods.add(method);
+                        }
                     }
                 }
-            }
 
-            clazz = clazz.getSuperclass();
+                clazz = clazz.getSuperclass();
+            }
         }
     }
 

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java?rev=1619559&r1=1619558&r2=1619559&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
 Thu Aug 21 19:40:16 2014
@@ -123,7 +123,7 @@ public final class ApplicationComposers 
         WebApp.class, EjbJar.class, EnterpriseBean.class,
         Persistence.class, PersistenceUnit.class,
         Connector.class, Beans.class,
-        Class[].class
+        Class[].class, Class.class
     };
 
     static {

Copied: 
tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/dyni/LocalButDynamicSingletonTest.java
 (from r1618689, 
tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/dyni/DynamicSingletonTest.java)
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/dyni/LocalButDynamicSingletonTest.java?p2=tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/dyni/LocalButDynamicSingletonTest.java&p1=tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/dyni/DynamicSingletonTest.java&r1=1618689&r2=1619559&rev=1619559&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/dyni/DynamicSingletonTest.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/dyni/LocalButDynamicSingletonTest.java
 Thu Aug 21 19:40:16 2014
@@ -29,41 +29,37 @@ import java.lang.reflect.InvocationHandl
 import java.lang.reflect.Method;
 
 
-/**
- * @version $Rev$ $Date$
- */
 @RunWith(ApplicationComposer.class)
-public class DynamicSingletonTest extends Assert {
-
+public class LocalButDynamicSingletonTest extends Assert {
     @EJB
     private Colors colors;
 
     @Module
-    public Class[] dynamic() {
-        return new Class[]{Colors.class};
+    public Class<?> dynamic() {
+        return ColorsBean.class;
     }
 
     @Test
     public void test() throws Exception {
-
         assertNotNull(colors);
         assertEquals("red", colors.red());
         assertEquals("handle:blue(hello)", colors.blue("hello"));
         assertEquals("handle:green()", colors.green());
     }
 
+    public static interface Colors {
+        String green();
+        String blue(String s);
+        String red();
+    }
 
     @Singleton
-    public static abstract class Colors implements InvocationHandler {
-
+    public static abstract class ColorsBean implements InvocationHandler, 
Colors {
+        @Override
         public String red() {
             return "red";
         }
 
-        public abstract String green();
-
-        public abstract String blue(String s);
-
         @Override
         public Object invoke(final Object proxy, final Method method, final 
Object[] args) throws Throwable {
             return "handle:" + method.getName() + "(" + Join.join(",", args) + 
")";


Reply via email to