[jboss-cvs] JBossAS SVN: r103815 - in projects/jboss-reflect/trunk/src: main/java/org/jboss/reflect/plugins/javassist and 2 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Mon Apr 12 06:16:35 EDT 2010
Author: kabir.khan at jboss.com
Date: 2010-04-12 06:16:34 -0400 (Mon, 12 Apr 2010)
New Revision: 103815
Added:
projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/support/ClassInfoTypeVariableRecursiveBounded.java
Modified:
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/GenericsUtil.java
projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistHelper.java
projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/test/ClassInfoGenericMembersTest.java
Log:
[JBREFLECT-5] Recursive bounded type variables
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/GenericsUtil.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/GenericsUtil.java 2010-04-12 09:58:14 UTC (rev 103814)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/GenericsUtil.java 2010-04-12 10:16:34 UTC (rev 103815)
@@ -26,6 +26,8 @@
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.lang.reflect.WildcardType;
+import java.util.HashSet;
+import java.util.Set;
/**
* Common methods needed by both the javassist and introspection implementations
@@ -45,11 +47,11 @@
public static String getGenericName(Type type)
{
StringBuilder sb = new StringBuilder();
- appendTypeGenericInfo(type, sb);
+ appendTypeGenericInfo(type, sb, null);
return sb.toString();
}
- protected static void appendTypeGenericInfo(Type type, StringBuilder sb)
+ protected static void appendTypeGenericInfo(Type type, StringBuilder sb, Set<String> doneVars)
{
if (type instanceof Class)
{
@@ -63,37 +65,48 @@
if (lower.length > 0)
{
- appendTypeGenericInfo(lower[0], sb);
+ appendTypeGenericInfo(lower[0], sb, doneVars);
}
else if (upper.length > 0)
{
- appendTypeGenericInfo(upper[0], sb);
+ appendTypeGenericInfo(upper[0], sb, doneVars);
}
}
else if (type instanceof ParameterizedType)
{
ParameterizedType ptype = (ParameterizedType)type;
- appendTypeGenericInfo(ptype.getRawType(), sb);
- sb.append("<");
+ appendTypeGenericInfo(ptype.getRawType(), sb, doneVars);
+ StringBuilder params = new StringBuilder();
+ params.append("<");
Type[] types = ptype.getActualTypeArguments();
for (int i = 0 ; i < types.length ; i++)
{
if (i > 0)
- sb.append(", ");
- appendTypeGenericInfo(types[i], sb);
+ params.append(", ");
+ appendTypeGenericInfo(types[i], params, doneVars);
}
- sb.append(">");
+ if (params.length() > 1)
+ {
+ params.append(">");
+ sb.append(params.toString());
+ }
}
else if (type instanceof GenericArrayType)
{
GenericArrayType gtype = (GenericArrayType)type;
- appendTypeGenericInfo(gtype.getGenericComponentType(), sb);
+ appendTypeGenericInfo(gtype.getGenericComponentType(), sb, doneVars);
sb.append("[]");
}
else if (type instanceof TypeVariable)
{
TypeVariable typeVar = (TypeVariable)type;
- appendTypeGenericInfo(typeVar.getBounds()[0], sb);
+ if (doneVars == null)
+ doneVars = new HashSet<String>();
+ if (!doneVars.contains(typeVar.getName()))
+ {
+ doneVars.add(typeVar.getName());
+ appendTypeGenericInfo(typeVar.getBounds()[0], sb, doneVars);
+ }
}
else
{
Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistHelper.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistHelper.java 2010-04-12 09:58:14 UTC (rev 103814)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistHelper.java 2010-04-12 10:16:34 UTC (rev 103815)
@@ -22,6 +22,8 @@
package org.jboss.reflect.plugins.javassist;
import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
import java.util.Stack;
import javassist.CtBehavior;
@@ -105,7 +107,7 @@
static String getGenericName(ObjectType type, JavassistTypeVariableSpy spy)
{
StringBuilder sb = new StringBuilder();
- appendTypeGenericInfo(type, spy, sb);
+ appendTypeGenericInfo(type, spy, sb, null);
return sb.toString();
}
@@ -115,9 +117,10 @@
* @param type the type
* @param spy used to determine actual types of type variables
* @param sb the string builder receiving the name
+ * @param doneVars the names of the done type variables
* @return the generic type name
*/
- private static void appendTypeGenericInfo(ObjectType type, JavassistTypeVariableSpy spy, StringBuilder sb)
+ private static void appendTypeGenericInfo(ObjectType type, JavassistTypeVariableSpy spy, StringBuilder sb, Set<String> doneVars)
{
if (type instanceof ClassType)
@@ -129,33 +132,47 @@
if (arguments != null && arguments.length > 0)
{
- sb.append("<");
+ StringBuilder params = new StringBuilder();
+ params.append("<");
for (int i = 0 ; i < arguments.length ; i++)
{
if (i > 0)
- sb.append(", ");
+ params.append(", ");
if (arguments[i].getType() == null)
- sb.append(Object.class.getName());
+ params.append(Object.class.getName());
else
- appendTypeGenericInfo(arguments[i].getType(), spy, sb);
+ appendTypeGenericInfo(arguments[i].getType(), spy, params, doneVars);
}
- sb.append(">");
+ if (params.length() > 1)
+ {
+ params.append(">");
+ sb.append(params.toString());
+ }
}
}
else if (type instanceof SignatureAttribute.TypeVariable)
{
- Type real = spy.getTypeBound((TypeVariable)type);
+ TypeVariable tv = (TypeVariable)type;
+ Type real = spy.getTypeBound(tv);
if (real instanceof ObjectType == false)
throw new IllegalStateException("Type is not an instance of ObjectType " + real);
- appendTypeGenericInfo((ObjectType)real, spy, sb);
+
+ if (doneVars == null)
+ doneVars = new HashSet<String>();
+ tv.getName();
+ if (!doneVars.contains(tv.getName()))
+ {
+ doneVars.add(tv.getName());
+ appendTypeGenericInfo((ObjectType)real, spy, sb, doneVars);
+ }
}
else if (type instanceof ArrayType)
{
ArrayType array = (ArrayType)type;
- appendTypeGenericInfo((ObjectType)array.getComponentType(), spy, sb);
+ appendTypeGenericInfo((ObjectType)array.getComponentType(), spy, sb, doneVars);
for (int i = 0 ; i < array.getDimension() ; i++)
sb.append("[]");
}
Added: projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/support/ClassInfoTypeVariableRecursiveBounded.java
===================================================================
--- projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/support/ClassInfoTypeVariableRecursiveBounded.java (rev 0)
+++ projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/support/ClassInfoTypeVariableRecursiveBounded.java 2010-04-12 10:16:34 UTC (rev 103815)
@@ -0,0 +1,36 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.classinfo.support;
+
+/**
+ *
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class ClassInfoTypeVariableRecursiveBounded<T extends ClassInfoTypeVariableRecursiveBounded<T>>
+{
+ public T genericTypeVariableRecursiveBounded(T param, String s)
+ {
+ return null;
+ }
+
+}
Modified: projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/test/ClassInfoGenericMembersTest.java
===================================================================
--- projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/test/ClassInfoGenericMembersTest.java 2010-04-12 09:58:14 UTC (rev 103814)
+++ projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/test/ClassInfoGenericMembersTest.java 2010-04-12 10:16:34 UTC (rev 103815)
@@ -30,6 +30,7 @@
import java.lang.reflect.TypeVariable;
import java.lang.reflect.WildcardType;
import java.util.Collection;
+import java.util.HashSet;
import java.util.Map;
import org.jboss.reflect.spi.ArrayInfo;
@@ -40,6 +41,7 @@
import org.jboss.reflect.spi.TypeInfo;
import org.jboss.test.classinfo.support.ClassInfoTypeVariable;
import org.jboss.test.classinfo.support.ClassInfoTypeVariableBounded;
+import org.jboss.test.classinfo.support.ClassInfoTypeVariableRecursiveBounded;
/**
*
@@ -295,6 +297,11 @@
testMethod(true, "genericTypeVariableBounded");
}
+ public void testGenericTypeVariableRecursiveBoundedFromClass() throws Throwable
+ {
+ testMethod(true, ClassInfoTypeVariableRecursiveBounded.class, "genericTypeVariableRecursiveBounded");
+ }
+
public void testMixGenericsAndNonGenericsMethod() throws Throwable
{
testMethod(true, "mixGenericsAndNonGenerics");
@@ -432,24 +439,29 @@
assertTypeAgainstRawReflect(f.getGenericType(), finfo.getType());
}
- protected void assertTypeArgumentsAgainstRawReflect(Type[] reflectTypes, TypeInfo[] actualTypeArguments)
+ protected void assertTypeArgumentsAgainstRawReflect(Type[] reflectTypes, TypeInfo[] actualTypeArguments, HashSet<String> doneVars)
{
assertEquals(reflectTypes.length, actualTypeArguments.length);
for (int i = 0 ; i < reflectTypes.length ; i++)
{
- assertTypeAgainstRawReflect(reflectTypes[i], actualTypeArguments[i]);
+ assertTypeAgainstRawReflect(reflectTypes[i], actualTypeArguments[i], doneVars);
}
}
protected void assertTypeAgainstRawReflect(Type reflectType, TypeInfo actualType)
{
+ assertTypeAgainstRawReflect(reflectType, actualType, new HashSet<String>());
+ }
+
+ protected void assertTypeAgainstRawReflect(Type reflectType, TypeInfo actualType, HashSet<String> doneVars)
+ {
if (reflectType instanceof ParameterizedType)
{
ParameterizedType type = (ParameterizedType)reflectType;
Type rawType = type.getRawType();
- assertTypeAgainstRawReflect(rawType, actualType);
+ assertTypeAgainstRawReflect(rawType, actualType, doneVars);
- assertTypeArgumentsAgainstRawReflect(type.getActualTypeArguments(), ((ClassInfo)actualType).getActualTypeArguments());
+ assertTypeArgumentsAgainstRawReflect(type.getActualTypeArguments(), ((ClassInfo)actualType).getActualTypeArguments(), doneVars);
}
else if (reflectType instanceof Class)
{
@@ -460,18 +472,22 @@
{
WildcardType wtype = (WildcardType)reflectType;
if (wtype.getLowerBounds().length > 0)
- assertTypeAgainstRawReflect(wtype.getLowerBounds()[0], actualType);
+ assertTypeAgainstRawReflect(wtype.getLowerBounds()[0], actualType, doneVars);
else
- assertTypeAgainstRawReflect(wtype.getUpperBounds()[0], actualType);
+ assertTypeAgainstRawReflect(wtype.getUpperBounds()[0], actualType, doneVars);
}
else if (reflectType instanceof TypeVariable)
{
- assertTypeAgainstRawReflect(((TypeVariable)reflectType).getBounds()[0], actualType);
+ TypeVariable<?> tv = (TypeVariable<?>)reflectType;
+ if (doneVars.contains(tv.getName()))
+ return;
+ doneVars.add(tv.getName());
+ assertTypeAgainstRawReflect(tv.getBounds()[0], actualType, doneVars);
}
else if (reflectType instanceof GenericArrayType)
{
ArrayInfo array = assertInstanceOf(actualType, ArrayInfo.class);
- assertTypeAgainstRawReflect(((GenericArrayType)reflectType).getGenericComponentType(), array.getComponentType());
+ assertTypeAgainstRawReflect(((GenericArrayType)reflectType).getGenericComponentType(), array.getComponentType(), doneVars);
}
else
{
More information about the jboss-cvs-commits
mailing list