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]