[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