[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