Author: simoneg
Date: Tue Jun 15 23:23:13 2010
New Revision: 955084

URL: http://svn.apache.org/viewvc?rev=955084&view=rev
Log:
Added better support for generic interfaces (fixes SortedSet problem in 
PropertyInfo)

Modified:
    
labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/utils/GenericClass.java
    
labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/utils/TestGenericClass.java

Modified: 
labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/utils/GenericClass.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/utils/GenericClass.java?rev=955084&r1=955083&r2=955084&view=diff
==============================================================================
--- 
labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/utils/GenericClass.java
 (original)
+++ 
labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/utils/GenericClass.java
 Tue Jun 15 23:23:13 2010
@@ -26,9 +26,11 @@ import java.lang.reflect.TypeVariable;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.magma.basics.MagmaException;
 
@@ -135,13 +137,27 @@ public class GenericClass {
        }
 
        private void recurse(Class<?> clazz) {
-               Type supclass = clazz.getGenericSuperclass();
-               Class simplesup = clazz.getSuperclass();
-               if (supclass == null) return;
-               if (supclass instanceof ParameterizedType) {
-                       recurse(clazz, simplesup, (ParameterizedType) supclass);
+               if (clazz.isInterface()) {
+                       Type[] supints = clazz.getGenericInterfaces();
+                       Class<?>[] simpleints = clazz.getInterfaces();
+                       for (int i = 0; i < supints.length; i++) {
+                               Type supclass = supints[i];
+                               Class simplesup = simpleints[i];
+                               if (supclass instanceof ParameterizedType) {
+                                       recurse(clazz, simplesup, 
(ParameterizedType) supclass);
+                               } else {
+                                       recurse(simplesup);
+                               }                               
+                       }
                } else {
-                       recurse(simplesup);
+                       Type supclass = clazz.getGenericSuperclass();
+                       Class simplesup = clazz.getSuperclass();
+                       if (supclass == null) return;
+                       if (supclass instanceof ParameterizedType) {
+                               recurse(clazz, simplesup, (ParameterizedType) 
supclass);
+                       } else {
+                               recurse(simplesup);
+                       }
                }
        }
 
@@ -191,6 +207,20 @@ public class GenericClass {
                        return forGenericType(type);
                }
        }
+
+       private void recurseInterfaces(Class<?> base, Set<Class<?>> explore) {
+               explore.add(base);
+               Class<?>[] supers = base.getInterfaces();
+               for (Class<?> class1 : supers) {
+                       recurseInterfaces(class1, explore);
+               }
+       }
+       
+       private void recurseClasses(Class<?> base, Set<Class<?>> explore) {
+               explore.add(base);
+               Class<?> superclass = base.getSuperclass();
+               if (superclass != null) recurseClasses(superclass, explore);
+       }
        
        /**
         * Search for all occurrencies of a specific method.
@@ -210,8 +240,13 @@ public class GenericClass {
         */
        public List<MethodDef> findMethods(String name, Class<?>... 
parameterTypes) {
                List<MethodDef> founds = new ArrayList<MethodDef>();
-               Class<?> current = myclass;
-               while (current != null) {
+               Set<Class<?>> explore = new HashSet<Class<?>>();
+               if (myclass.isInterface()) {
+                       recurseInterfaces(myclass, explore);
+               } else {
+                       recurseClasses(myclass, explore);
+               }
+               for (Class<?> current : explore) {
                        Method[] methods = current.getDeclaredMethods();
                        for (Method method : methods) {
                                if (!method.isBridge() && !method.isSynthetic() 
&& method.getName().equals(name)) {

Modified: 
labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/utils/TestGenericClass.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/utils/TestGenericClass.java?rev=955084&r1=955083&r2=955084&view=diff
==============================================================================
--- 
labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/utils/TestGenericClass.java
 (original)
+++ 
labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/utils/TestGenericClass.java
 Tue Jun 15 23:23:13 2010
@@ -17,10 +17,15 @@
 package org.apache.magma.basics.utils;
 
 import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.not;
+import static org.junit.Assert.*;
 import static org.junit.Assert.assertThat;
 
+import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
 
 import org.apache.magma.basics.utils.GenericClass.MethodDef;
 import org.apache.magma.basics.utils.genericstuff.CompicatedThing;
@@ -28,6 +33,8 @@ import org.apache.magma.basics.utils.gen
 import org.apache.magma.basics.utils.genericstuff.FinallyConcrete;
 import org.junit.Test;
 
+import sun.misc.Sort;
+
 
 public class TestGenericClass {
 
@@ -48,6 +55,25 @@ public class TestGenericClass {
                
                
assertThat(methods.get(0).getReturnType().getBaseClass().getName(), 
equalTo(String.class.getName()));
        }
+
+       public SortedSet<ConcreteThing> testset = new TreeSet<ConcreteThing>();
+
+       
+       @Test
+       public void testInterfaceHierarchy() throws Exception {
+               
+               Field field = this.getClass().getField("testset");
+               GenericClass gc = GenericClass.forField(field);
+               List<MethodDef> methods = gc.findMethods("add", new Class<?>[] 
{ null });
+               assertThat(methods.size(), not(equalTo(0)));
+               
+               MethodDef met = methods.get(0);
+               GenericClass[] paramtype = met.getParameterTypes();
+               assertThat(paramtype.length, not(equalTo(0)));
+               
+               Class<?> clzz = paramtype[0].getBaseClass();
+               assertThat(clzz.getSimpleName(), 
equalTo(ConcreteThing.class.getSimpleName()));
+       }
        
        @Test
        public void subclassFirstAndOnlyOne() throws Exception {



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to