[jboss-cvs] JBossAS SVN: r102421 - in projects/jboss-reflect/trunk/src: main/java/org/jboss/reflect/plugins/introspection and 2 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Mar 15 13:44:57 EDT 2010


Author: kabir.khan at jboss.com
Date: 2010-03-15 13:44:56 -0400 (Mon, 15 Mar 2010)
New Revision: 102421

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/introspection/IntrospectionTypeInfoFactoryImpl.java
   projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactoryImpl.java
   projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/test/ClassInfoGenericClassTest.java
Log:
[JBREFLECT-5] Make sure GenericArrayTypes are cached

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-03-15 17:00:02 UTC (rev 102420)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/GenericsUtil.java	2010-03-15 17:44:56 UTC (rev 102421)
@@ -21,8 +21,10 @@
 */ 
 package org.jboss.reflect.plugins;
 
+import java.lang.reflect.GenericArrayType;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
 import java.lang.reflect.WildcardType;
 
 /**
@@ -84,6 +86,18 @@
          }
          sb.append(">");
       }
+      else if (type instanceof GenericArrayType)
+      {
+         GenericArrayType gtype = (GenericArrayType)type;
+         appendTypeGenericInfo(gtype.getGenericComponentType(), sb);
+         sb.append("[]");
+      }
+      else if (type instanceof TypeVariable)
+      {
+         //This is probably the wrong name, revisit when implementing type variables
+         TypeVariable typeVar = (TypeVariable)type;
+         sb.append(typeVar.getName());
+      }
       else
       {
          //TODO This might need implementing once we test wildcards
@@ -107,8 +121,16 @@
          if (wtype.getLowerBounds().length > 0)
             return findClassLoader(wtype.getLowerBounds()[0]);
       }
+      if (type instanceof GenericArrayType)
+      {
+         return findClassLoader(((GenericArrayType)type).getGenericComponentType());
+      }
+      if (type instanceof TypeVariable)
+      {
+         TypeVariable<?> typeVar = (TypeVariable<?>)type;
+         return findClassLoader(typeVar.getBounds()[0]);
+      }
       
-      
       throw new IllegalArgumentException(type.getClass().getName() + " is not handled yet");
    }
 

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/introspection/IntrospectionTypeInfoFactoryImpl.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/introspection/IntrospectionTypeInfoFactoryImpl.java	2010-03-15 17:00:02 UTC (rev 102420)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/introspection/IntrospectionTypeInfoFactoryImpl.java	2010-03-15 17:44:56 UTC (rev 102421)
@@ -403,9 +403,22 @@
    @Override
    protected TypeInfo getGenericArrayType(GenericArrayType type)
    {
-      Type compType = type.getGenericComponentType();
-      TypeInfo componentType = getTypeInfo(compType);
-      return new ArrayInfoImpl(componentType);
+      //Look in the cache first
+      String genericName = GenericsUtil.getGenericName(type);
+      ClassLoader cl = GenericsUtil.findClassLoader(type);
+      Map<String, TypeInfo> cache = getClassLoaderCache(cl);
+      TypeInfo info = cache.get(genericName);
+      if (info != null)
+         return info;
+      
+      //Create the wildcard type info
+      ClassInfo raw = (ClassInfo)getTypeInfo(type.getGenericComponentType());
+      info = new ArrayInfoImpl(raw);
+
+      //Cache the wildcard type info
+      cache.put(genericName, info);
+      
+      return info;
    }
 
    /**
@@ -732,8 +745,5 @@
       cache.put(genericName, info);
       
       return info;
-
    }
-   
-   
 }

Modified: projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactoryImpl.java
===================================================================
--- projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactoryImpl.java	2010-03-15 17:00:02 UTC (rev 102420)
+++ projects/jboss-reflect/trunk/src/main/java/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactoryImpl.java	2010-03-15 17:44:56 UTC (rev 102421)
@@ -52,6 +52,7 @@
 import org.jboss.reflect.plugins.javassist.classpool.DefaultClassPoolFactory;
 import org.jboss.reflect.spi.AnnotationInfo;
 import org.jboss.reflect.spi.AnnotationValue;
+import org.jboss.reflect.spi.ArrayInfo;
 import org.jboss.reflect.spi.ClassInfo;
 import org.jboss.reflect.spi.DelegateClassInfo;
 import org.jboss.reflect.spi.MutableClassInfo;
@@ -813,9 +814,42 @@
     */
    protected TypeInfo getGenericArrayType(GenericArrayType type)
    {
+      //Look in the cache first
+      String genericName = GenericsUtil.getGenericName(type);
+      ClassLoader cl = GenericsUtil.findClassLoader(type);
+      Map<String, WeakReference<TypeInfo>> cache = getClassLoaderCache(cl);
+      TypeInfo info = getFromCache(genericName, cache);
+      if (info != null)
+         return info;
+      
+      //Create the wildcard type info
       Type compType = type.getGenericComponentType();
       TypeInfo componentType = getTypeInfo(compType);
-      return new ArrayInfoImpl(componentType);
+      
+      String arrayName = getArrayCtClass(componentType);
+      CtClass clazz = getCtClass(arrayName + "[]", cl);
+      info = new JavassistArrayInfoImpl(this, clazz, null, componentType);
+      
+      //Cache the wildcard type info
+      cache.put(genericName, new WeakReference<TypeInfo>(info));
+      
+      return info;
    }
 
+   private String getArrayCtClass(TypeInfo componentType)
+   {
+      if (componentType instanceof JavassistTypeInfo)
+      {
+         if(compare(((JavassistTypeInfo)componentType).getCtClass(), (ClassInfo) componentType))
+            return ((JavassistTypeInfo)componentType).getCtClass().getName();
+      }
+      else if (componentType instanceof DelegateClassInfo)
+      {
+         ClassInfo info = ((DelegateClassInfo)componentType).getDelegate();
+         if (info instanceof JavassistTypeInfo)
+            return ((JavassistTypeInfo)info).getCtClass().getName();
+      }
+      
+      throw new IllegalArgumentException(componentType + " is not a JavassistType info or a JavassistParameterizedType");
+   }
 }

Modified: projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/test/ClassInfoGenericClassTest.java
===================================================================
--- projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/test/ClassInfoGenericClassTest.java	2010-03-15 17:00:02 UTC (rev 102420)
+++ projects/jboss-reflect/trunk/src/test/java/org/jboss/test/classinfo/test/ClassInfoGenericClassTest.java	2010-03-15 17:44:56 UTC (rev 102421)
@@ -235,20 +235,58 @@
       assertComponentType(ClassInfoGenericExtendsCollectionNotGeneric.class, Object.class);
    }
    
-   public static Collection<String>[] signatureGenericArrayType() 
+   public static Collection<Boolean>[] signatureGenericArrayType() 
    {
       return null;
    }
    
    public void testGenericArrayType() throws Throwable
    {
-      Type type = getGenericReturnType("signatureGenericArrayType");
+      checkGenericArrayType("signatureGenericArrayType", 1);
+   }
+   
+   public static Collection<Boolean>[][] signatureGenericArrayType2() 
+   {
+      return null;
+   }
+   
+   public void testGenericArrayType2() throws Throwable
+   {
+      checkGenericArrayType("signatureGenericArrayType2", 2);
+   }
+
+   public static Collection<Boolean>[][][] signatureGenericArrayType3() 
+   {
+      return null;
+   }
+   
+   public void testGenericArrayType3() throws Throwable
+   {
+      checkGenericArrayType("signatureGenericArrayType3", 3);
+   }
+   
+   private void checkGenericArrayType(String method, int dimensions) throws Throwable
+   {
+      Type type = getGenericReturnType(method);
       TypeInfo info = getTypeInfoFactory().getTypeInfo(type);
-      assertNotNull(info);
-      assertTrue(info.isArray());
       
+      for (int i = 0 ; i < dimensions ; i++)
+      {
+         assertNotNull(info);
+         assertTrue(info.isArray());
+         ClassInfo classInfo = assertInstanceOf(info, ClassInfo.class);
+         info = classInfo.getComponentType();
+         assertNotNull(info);
+      }
+
+      
+      Type typeB = getGenericReturnType("signatureCollectionBoolean");
+      TypeInfo infoB = getTypeInfoFactory().getTypeInfo(typeB);
+      
+      assertEquals(infoB, info);
+      assertSame(infoB, info);
    }
-   
+
    public static Collection<Boolean> signatureCollectionBoolean() 
    {
       return null;




More information about the jboss-cvs-commits mailing list