[jboss-cvs] JBossAS SVN: r58838 - in projects/microcontainer/trunk/container/src: main/org/jboss main/org/jboss/beans/info/plugins main/org/jboss/reflect/plugins main/org/jboss/reflect/plugins/introspection main/org/jboss/reflect/plugins/javassist main/org/jboss/reflect/spi main/org/jboss/util main/org/jboss/util/collection main/org/jboss/util/collection/temp tests/org/jboss/test/classinfo/support tests/org/jboss/test/classinfo/test
Sacha Labourey
sacha.labourey.ml at jboss.org
Mon Dec 4 10:08:17 EST 2006
Adrian is on fire! (as always :) )
jboss-cvs-commits at lists.jboss.org wrote:
> Author: adrian at jboss.org
> Date: 2006-12-04 09:40:50 -0500 (Mon, 04 Dec 2006)
> New Revision: 58838
>
> Added:
> projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/introspection/ParameterizedArrayInfo.java
> projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/introspection/ParameterizedClassInfo.java
> projects/microcontainer/trunk/container/src/main/org/jboss/util/
> projects/microcontainer/trunk/container/src/main/org/jboss/util/collection/
> projects/microcontainer/trunk/container/src/main/org/jboss/util/collection/temp/
> projects/microcontainer/trunk/container/src/main/org/jboss/util/collection/temp/FIXME
> projects/microcontainer/trunk/container/src/main/org/jboss/util/collection/temp/WeakTypeCache.java
> projects/microcontainer/trunk/container/src/main/org/jboss/util/collection/temp/WeakValueHashMap.java
> projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericClass.java
> projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericConstructorsClass.java
> projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericFieldsClass.java
> projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericFieldsInterface.java
> projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericInterface.java
> projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericMethodsClass.java
> projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericMethodsInterface.java
> projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericSuperClassEmptyClass.java
> projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericSuperClassString.java
> projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericSuperInterfaceEmptyClass.java
> projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericSuperInterfaceString.java
> projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/ClassInfoGenericClassTest.java
> projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/ClassInfoGenericInterfaceTest.java
> projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/IntrospectionGenericClassUnitTestCase.java
> projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/IntrospectionGenericInterfaceUnitTestCase.java
> Modified:
> projects/microcontainer/trunk/container/src/main/org/jboss/beans/info/plugins/AbstractBeanInfoFactory.java
> projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/ArrayInfoImpl.java
> projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/ClassInfoHelper.java
> projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/ClassInfoImpl.java
> projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/introspection/IntrospectionTypeInfoFactory.java
> projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/introspection/IntrospectionTypeInfoFactoryImpl.java
> projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/javassist/JavassistArrayInfoImpl.java
> projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/javassist/JavassistTypeInfo.java
> projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactory.java
> projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactoryImpl.java
> projects/microcontainer/trunk/container/src/main/org/jboss/reflect/spi/ClassInfo.java
> projects/microcontainer/trunk/container/src/main/org/jboss/reflect/spi/TypeInfoFactory.java
> projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/AbstractClassInfoTest.java
> projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/ClassInfoTestSuite.java
> Log:
> Generification of the TypeInfo api.
>
> TODO:
> * Complete the support for TypeVariable and GenericArray
> * Implement this for the javassist version
> * Move the org.jboss.util.collection.temp to the common-core project once
> it properly supports JDK5
>
> Modified: projects/microcontainer/trunk/container/src/main/org/jboss/beans/info/plugins/AbstractBeanInfoFactory.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/main/org/jboss/beans/info/plugins/AbstractBeanInfoFactory.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/main/org/jboss/beans/info/plugins/AbstractBeanInfoFactory.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -42,7 +42,7 @@
> import org.jboss.reflect.spi.PrimitiveInfo;
> import org.jboss.reflect.spi.TypeInfo;
> import org.jboss.util.JBossStringBuilder;
> -import org.jboss.util.collection.WeakValueHashMap;
> +import org.jboss.util.collection.temp.WeakValueHashMap;
>
> /**
> * A bean info factory.
> @@ -140,7 +140,7 @@
> BeanInfo result = createBeanInfo(classAdapter, properties, constructors, methods, events);
> if (map == null)
> {
> - map = new WeakValueHashMap();
> + map = new WeakValueHashMap<String, BeanInfo>();
> cache.put(cl, map);
> }
> map.put(className, result);
>
> Modified: projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/ArrayInfoImpl.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/ArrayInfoImpl.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/ArrayInfoImpl.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -21,7 +21,6 @@
> */
> package org.jboss.reflect.plugins;
>
> -import org.jboss.reflect.spi.AnnotatedInfo;
> import org.jboss.reflect.spi.AnnotationValue;
> import org.jboss.reflect.spi.ArrayInfo;
> import org.jboss.reflect.spi.TypeInfo;
>
> Modified: projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/ClassInfoHelper.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/ClassInfoHelper.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/ClassInfoHelper.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -21,6 +21,8 @@
> */
> package org.jboss.reflect.plugins;
>
> +import org.jboss.reflect.plugins.introspection.ParameterizedClassInfo;
> +import org.jboss.reflect.spi.ClassInfo;
> import org.jboss.reflect.spi.InterfaceInfo;
> import org.jboss.reflect.spi.TypeInfo;
>
> @@ -41,6 +43,14 @@
> ClassInfoImpl getSuperClass(ClassInfoImpl classInfo);
>
> /**
> + * Get the generic super class
> + *
> + * @param classInfo the class info
> + * @return the super class info
> + */
> + ClassInfo getGenericSuperClass(ClassInfoImpl classInfo);
> +
> + /**
> * Get the interfaces
> *
> * @param classInfo the class info
> @@ -49,6 +59,14 @@
> InterfaceInfo[] getInterfaces(ClassInfoImpl classInfo);
>
> /**
> + * Get the generic interfaces
> + *
> + * @param classInfo the class info
> + * @return the interface info
> + */
> + InterfaceInfo[] getGenericInterfaces(ClassInfoImpl classInfo);
> +
> + /**
> * Get the constructors
> *
> * @param classInfo the class info
> @@ -79,4 +97,20 @@
> * @return the type info
> */
> TypeInfo getTypeInfo(Class clazz);
> +
> + /**
> + * Get the actual type parameters
> + *
> + * @param classInfo the parameterized class info
> + * @return the type parameters
> + */
> + TypeInfo[] getActualTypeArguments(ParameterizedClassInfo classInfo);
> +
> + /**
> + * Get the owner type
> + *
> + * @param classInfo the parameterized class info
> + * @return the owner type
> + */
> + TypeInfo getOwnerType(ParameterizedClassInfo classInfo);
> }
>
> Modified: projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/ClassInfoImpl.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/ClassInfoImpl.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/ClassInfoImpl.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -48,19 +48,28 @@
> private static final long serialVersionUID = 3545798779904340792L;
>
> /** Marker for generation */
> - static final ClassInfo UNKNOWN_CLASS = new UnknownClassInfo();
> + public static final ClassInfo UNKNOWN_CLASS = new UnknownClassInfo();
>
> /** Marker for generation */
> - static final InterfaceInfo[] UNKNOWN_INTERFACES = new InterfaceInfo[0];
> + public static final ClassInfo[] UNKNOWN_CLASSES = new UnknownClassInfo[0];
>
> /** Marker for generation */
> - static final ConstructorInfo[] UNKNOWN_CONSTRUCTORS = new ConstructorInfo[0];
> + public static final TypeInfo UNKNOWN_TYPE = new UnknownTypeInfo();
>
> /** Marker for generation */
> - static final MethodInfo[] UNKNOWN_METHODS = new MethodInfo[0];
> + public static final TypeInfo[] UNKNOWN_TYPES = new UnknownTypeInfo[0];
>
> /** Marker for generation */
> - private static final FieldInfo[] UNKNOWN_FIELDS = new FieldInfo[0];
> + public static final InterfaceInfo[] UNKNOWN_INTERFACES = new InterfaceInfo[0];
> +
> + /** Marker for generation */
> + public static final ConstructorInfo[] UNKNOWN_CONSTRUCTORS = new ConstructorInfo[0];
> +
> + /** Marker for generation */
> + public static final MethodInfo[] UNKNOWN_METHODS = new MethodInfo[0];
> +
> + /** Marker for generation */
> + public static final FieldInfo[] UNKNOWN_FIELDS = new FieldInfo[0];
>
> /** The class name */
> protected String name;
> @@ -71,6 +80,9 @@
> /** The interfaces */
> protected InterfaceInfo[] interfaces = UNKNOWN_INTERFACES;
>
> + /** The generic interfaces */
> + protected InterfaceInfo[] genericInterfaces = UNKNOWN_INTERFACES;
> +
> /** The methods */
> protected MethodInfo[] methods = UNKNOWN_METHODS;
>
> @@ -83,6 +95,9 @@
> /** The super class */
> protected ClassInfo superclass = UNKNOWN_CLASS;
>
> + /** The generic super class */
> + protected ClassInfo genericSuperclass = UNKNOWN_CLASS;
> +
> /** The constructor info */
> protected ConstructorInfo[] constructors = UNKNOWN_CONSTRUCTORS;
>
> @@ -243,6 +258,16 @@
> {
> this.interfaces = interfaces;
> }
> +
> + /**
> + * Set the generic interfaces
> + *
> + * @param interfaces the interfaces
> + */
> + public void setGenericInterfaces(InterfaceInfo[] interfaces)
> + {
> + this.genericInterfaces = interfaces;
> + }
>
> /**
> * Set the declared methods
> @@ -303,6 +328,15 @@
> this.superclass = superInfo;
> }
>
> + /**
> + * Set the generic super class
> + *
> + * @param superInfo the super class
> + */
> + public void setGenericSuperclass(ClassInfo superInfo)
> + {
> + this.genericSuperclass = superInfo;
> + }
>
> public boolean isInterface()
> {
> @@ -315,6 +349,13 @@
> setInterfaces(classInfoHelper.getInterfaces(this));
> return interfaces;
> }
> +
> + public InterfaceInfo[] getGenericInterfaces()
> + {
> + if (genericInterfaces == UNKNOWN_INTERFACES)
> + setGenericInterfaces(classInfoHelper.getGenericInterfaces(this));
> + return genericInterfaces;
> + }
>
> public MethodInfo getDeclaredMethod(String name, TypeInfo[] parameters)
> {
> @@ -366,6 +407,13 @@
> setSuperclass(classInfoHelper.getSuperClass(this));
> return superclass;
> }
> +
> + public ClassInfo getGenericSuperclass()
> + {
> + if (genericSuperclass == UNKNOWN_CLASS)
> + setGenericSuperclass(classInfoHelper.getGenericSuperClass(this));
> + return genericSuperclass;
> + }
>
> public int getModifiers()
> {
> @@ -426,6 +474,21 @@
> return (Object[]) Array.newInstance(clazz.getComponentType(), size);
> }
>
> + public TypeInfo[] getActualTypeArguments()
> + {
> + return null;
> + }
> +
> + public TypeInfo getOwnerType()
> + {
> + return null;
> + }
> +
> + public ClassInfo getRawType()
> + {
> + return this;
> + }
> +
> protected InheritableAnnotationHolder getSuperHolder()
> {
> return (ClassInfoImpl) getSuperclass();
> @@ -456,121 +519,137 @@
> return (name != null ? name.hashCode() : 0);
> }
>
> - static class UnknownClassInfo implements ClassInfo
> + public static class UnknownTypeInfo implements TypeInfo
> {
> /** The serialVersionUID */
> private static final long serialVersionUID = 1L;
>
> - public ConstructorInfo[] getDeclaredConstructors()
> + public Object convertValue(Object value) throws Throwable
> {
> throw new UnreachableStatementException();
> }
>
> - public ConstructorInfo getDeclaredConstructor(TypeInfo[] parameters)
> + public TypeInfo getArrayType(int depth)
> {
> throw new UnreachableStatementException();
> }
>
> - public FieldInfo getDeclaredField(String name)
> + public String getName()
> {
> throw new UnreachableStatementException();
> }
>
> - public FieldInfo[] getDeclaredFields()
> + public Class getType()
> {
> throw new UnreachableStatementException();
> }
>
> - public MethodInfo getDeclaredMethod(String name, TypeInfo[] parameters)
> + public boolean isArray()
> {
> throw new UnreachableStatementException();
> }
>
> - public MethodInfo[] getDeclaredMethods()
> + public boolean isEnum()
> {
> throw new UnreachableStatementException();
> }
>
> - public InterfaceInfo[] getInterfaces()
> + public boolean isPrimitive()
> {
> throw new UnreachableStatementException();
> }
>
> - public String getName()
> + public Object[] newArrayInstance(int size) throws Throwable
> {
> throw new UnreachableStatementException();
> }
> + }
> +
> + static class UnknownClassInfo extends UnknownTypeInfo implements ClassInfo
> + {
> + /** The serialVersionUID */
> + private static final long serialVersionUID = 1L;
>
> - public ClassInfo getSuperclass()
> + public ConstructorInfo[] getDeclaredConstructors()
> {
> throw new UnreachableStatementException();
> }
>
> - public boolean isInterface()
> + public ConstructorInfo getDeclaredConstructor(TypeInfo[] parameters)
> {
> throw new UnreachableStatementException();
> }
>
> - public AnnotationValue getAnnotation(String name)
> + public FieldInfo getDeclaredField(String name)
> {
> throw new UnreachableStatementException();
> }
>
> - public AnnotationValue[] getAnnotations()
> + public FieldInfo[] getDeclaredFields()
> {
> throw new UnreachableStatementException();
> }
>
> - public boolean isAnnotationPresent(String name)
> + public MethodInfo getDeclaredMethod(String name, TypeInfo[] parameters)
> {
> throw new UnreachableStatementException();
> }
>
> - public String toShortString()
> + public MethodInfo[] getDeclaredMethods()
> {
> throw new UnreachableStatementException();
> }
>
> - public void toShortString(JBossStringBuilder buffer)
> + public InterfaceInfo[] getInterfaces()
> {
> throw new UnreachableStatementException();
> }
>
> - public Class getType()
> + public InterfaceInfo[] getGenericInterfaces()
> {
> throw new UnreachableStatementException();
> }
>
> - public Object convertValue(Object value) throws Throwable
> + public ClassInfo getSuperclass()
> {
> throw new UnreachableStatementException();
> }
>
> - public TypeInfo getArrayType(int depth)
> + public ClassInfo getGenericSuperclass()
> {
> throw new UnreachableStatementException();
> }
>
> - public boolean isArray()
> + public boolean isInterface()
> {
> throw new UnreachableStatementException();
> }
>
> - public boolean isEnum()
> + public AnnotationValue getAnnotation(String name)
> {
> throw new UnreachableStatementException();
> }
>
> - public boolean isPrimitive()
> + public AnnotationValue[] getAnnotations()
> {
> throw new UnreachableStatementException();
> }
>
> - public Object[] newArrayInstance(int size) throws Throwable
> + public boolean isAnnotationPresent(String name)
> {
> throw new UnreachableStatementException();
> }
>
> + public String toShortString()
> + {
> + throw new UnreachableStatementException();
> + }
> +
> + public void toShortString(JBossStringBuilder buffer)
> + {
> + throw new UnreachableStatementException();
> + }
> +
> public int getModifiers()
> {
> throw new UnreachableStatementException();
> @@ -590,5 +669,20 @@
> {
> throw new UnreachableStatementException();
> }
> +
> + public TypeInfo[] getActualTypeArguments()
> + {
> + throw new UnreachableStatementException();
> + }
> +
> + public TypeInfo getOwnerType()
> + {
> + throw new UnreachableStatementException();
> + }
> +
> + public ClassInfo getRawType()
> + {
> + throw new UnreachableStatementException();
> + }
> }
> }
>
> Modified: projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/introspection/IntrospectionTypeInfoFactory.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/introspection/IntrospectionTypeInfoFactory.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/introspection/IntrospectionTypeInfoFactory.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -21,6 +21,8 @@
> */
> package org.jboss.reflect.plugins.introspection;
>
> +import java.lang.reflect.Type;
> +
> import org.jboss.reflect.spi.TypeInfo;
> import org.jboss.reflect.spi.TypeInfoFactory;
>
> @@ -46,4 +48,9 @@
> {
> return delegate.getTypeInfo(name, cl);
> }
> +
> + public TypeInfo getTypeInfo(Type type)
> + {
> + return delegate.getTypeInfo(type);
> + }
> }
>
> Modified: projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/introspection/IntrospectionTypeInfoFactoryImpl.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/introspection/IntrospectionTypeInfoFactoryImpl.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/introspection/IntrospectionTypeInfoFactoryImpl.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -26,6 +26,8 @@
> import java.lang.reflect.Constructor;
> import java.lang.reflect.Field;
> import java.lang.reflect.Method;
> +import java.lang.reflect.ParameterizedType;
> +import java.lang.reflect.Type;
> import java.security.AccessController;
> import java.security.PrivilegedAction;
>
> @@ -43,20 +45,20 @@
> import org.jboss.reflect.plugins.MethodInfoImpl;
> 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.InterfaceInfo;
> import org.jboss.reflect.spi.PrimitiveInfo;
> import org.jboss.reflect.spi.TypeInfo;
> import org.jboss.reflect.spi.TypeInfoFactory;
> -import org.jboss.util.collection.WeakClassCache;
> +import org.jboss.util.collection.temp.WeakTypeCache;
>
> /**
> * An introspection type factory.
> *
> - * FIXME: use lazy loading to avoid reading the entire class model
> * @author <a href="mailto:adrian at jboss.org">Adrian Brock</a>
> */
> -public class IntrospectionTypeInfoFactoryImpl extends WeakClassCache implements TypeInfoFactory, AnnotationHelper, ClassInfoHelper
> +public class IntrospectionTypeInfoFactoryImpl extends WeakTypeCache<TypeInfo> implements TypeInfoFactory, AnnotationHelper, ClassInfoHelper
> {
> final static AnnotationValue[] NO_ANNOTATIONS = new AnnotationValue[0];
>
> @@ -84,6 +86,19 @@
> return superType;
> }
>
> + public ClassInfo getGenericSuperClass(ClassInfoImpl classInfo)
> + {
> + Class clazz = classInfo.getType();
> + ClassInfo superType = null;
> + if (clazz.isInterface() == false)
> + {
> + Type superClazz = clazz.getGenericSuperclass();
> + if (superClazz != null)
> + superType = (ClassInfo) getTypeInfo(superClazz);
> + }
> + return superType;
> + }
> +
> public AnnotationValue[] getAnnotations(Object obj)
> {
> Annotation[] annotations;
> @@ -132,7 +147,7 @@
> for (int i = 0; i < constructors.length; ++i)
> {
> AnnotationValue[] annotations = getAnnotations(constructors[i]);
> - infos[i] = new ReflectConstructorInfoImpl(annotations, getTypeInfos(constructors[i].getParameterTypes()), getParameterAnnotations(constructors[i].getParameterAnnotations()), getClassInfos(constructors[i].getExceptionTypes()), constructors[i].getModifiers(), (ClassInfo) getTypeInfo(constructors[i].getDeclaringClass()));
> + infos[i] = new ReflectConstructorInfoImpl(annotations, getTypeInfos(constructors[i].getGenericParameterTypes()), getParameterAnnotations(constructors[i].getParameterAnnotations()), getClassInfos(constructors[i].getGenericExceptionTypes()), constructors[i].getModifiers(), (ClassInfo) getTypeInfo(constructors[i].getDeclaringClass()));
> infos[i].setConstructor(constructors[i]);
> }
> }
> @@ -151,7 +166,7 @@
> for (int i = 0; i < fields.length; ++i)
> {
> AnnotationValue[] annotations = getAnnotations(fields[i]);
> - infos[i] = new ReflectFieldInfoImpl(annotations, fields[i].getName(), getTypeInfo(fields[i].getType()), fields[i].getModifiers(), (ClassInfo) getTypeInfo(fields[i].getDeclaringClass()));
> + infos[i] = new ReflectFieldInfoImpl(annotations, fields[i].getName(), getTypeInfo(fields[i].getGenericType()), fields[i].getModifiers(), (ClassInfo) getTypeInfo(fields[i].getDeclaringClass()));
> infos[i].setField(fields[i]);
> }
>
> @@ -169,7 +184,7 @@
> for (int i = 0; i < methods.length; ++i)
> {
> AnnotationValue[] annotations = getAnnotations(methods[i]);
> - infos[i] = new ReflectMethodInfoImpl(annotations, methods[i].getName(), getTypeInfo(methods[i].getReturnType()), getTypeInfos(methods[i].getParameterTypes()), getParameterAnnotations(methods[i].getParameterAnnotations()), getClassInfos(methods[i].getExceptionTypes()), methods[i].getModifiers(), (ClassInfo) getTypeInfo(methods[i].getDeclaringClass()));
> + infos[i] = new ReflectMethodInfoImpl(annotations, methods[i].getName(), getTypeInfo(methods[i].getGenericReturnType()), getTypeInfos(methods[i].getGenericParameterTypes()), getParameterAnnotations(methods[i].getParameterAnnotations()), getClassInfos(methods[i].getGenericExceptionTypes()), methods[i].getModifiers(), (ClassInfo) getTypeInfo(methods[i].getDeclaringClass()));
> infos[i].setMethod(methods[i]);
> }
> return infos;
> @@ -189,13 +204,27 @@
> return infos;
> }
>
> + public InterfaceInfo[] getGenericInterfaces(ClassInfoImpl classInfo)
> + {
> + Class clazz = classInfo.getType();
> + Type[] interfaces = clazz.getGenericInterfaces();
> + if (interfaces == null || interfaces.length == 0)
> + return null;
> +
> + InterfaceInfo[] infos = new InterfaceInfo[interfaces.length];
> + for (int i = 0; i < interfaces.length; ++i)
> + infos[i] = (InterfaceInfo) getTypeInfo(interfaces[i]);
> +
> + return infos;
> + }
> +
> /**
> * Get the type infos for some classes
> *
> * @param classes the classes
> * @return the type infos
> */
> - public TypeInfo[] getTypeInfos(Class[] classes)
> + public TypeInfo[] getTypeInfos(Type[] classes)
> {
> if (classes == null || classes.length == 0)
> return null;
> @@ -212,7 +241,7 @@
> * @param classes the classes
> * @return the class infos
> */
> - public ClassInfo[] getClassInfos(Class[] classes)
> + public ClassInfo[] getClassInfos(Type[] classes)
> {
> if (classes == null || classes.length == 0)
> return null;
> @@ -232,9 +261,27 @@
> if (primitive != null)
> return primitive;
>
> - return (TypeInfo) get(clazz);
> + return get(clazz);
> }
>
> + public TypeInfo getTypeInfo(Type type)
> + {
> + if (type == null)
> + throw new IllegalArgumentException("Null type");
> +
> + String name = null;
> + if (type instanceof Class)
> + name = ((Class) type).getName();
> + if (name != null)
> + {
> + TypeInfo primitive = PrimitiveInfo.valueOf(((Class) type).getName());
> + if (primitive != null)
> + return primitive;
> + }
> +
> + return get(type);
> + }
> +
> public TypeInfo getTypeInfo(String name, ClassLoader cl) throws ClassNotFoundException
> {
> if (name == null)
> @@ -251,7 +298,7 @@
> return getTypeInfo(clazz);
> }
>
> - protected Object instantiate(Class clazz)
> + protected TypeInfo instantiate(Class<?> clazz)
> {
> ClassInfoImpl result;
> if (clazz.isArray())
> @@ -295,11 +342,25 @@
> return result;
> }
>
> - protected void generate(Class clazz, Object result)
> + protected TypeInfo instantiate(ParameterizedType type)
> {
> + Class rawType = (Class) type.getRawType();
> + ClassInfo rawTypeInfo = (ClassInfo) getTypeInfo(rawType);
> + if (rawTypeInfo instanceof ArrayInfo)
> + return new ParameterizedArrayInfo(this, (ArrayInfo) rawTypeInfo, type);
> + return new ParameterizedClassInfo(this, rawTypeInfo, type);
> + }
> +
> + protected void generate(Class<?> clazz, TypeInfo result)
> + {
> generateTypeInfo(clazz, (ClassInfoImpl) result);
> }
>
> + protected void generate(ParameterizedType type, TypeInfo result)
> + {
> + // Everything is lazy
> + }
> +
> protected Constructor[] getDeclaredConstructors(final Class clazz)
> {
> if (System.getSecurityManager() == null)
> @@ -402,4 +463,27 @@
> return annotationValues;
> }
>
> + public TypeInfo[] getActualTypeArguments(ParameterizedClassInfo classInfo)
> + {
> + ParameterizedType type = classInfo.parameterizedType;
> + Type[] types = type.getActualTypeArguments();
> + if (types == null)
> + return null;
> +
> + TypeInfo[] result = new TypeInfo[types.length];
> + for (int i = 0; i < types.length; ++i)
> + result[i] = getTypeInfo(types[i]);
> +
> + return result;
> + }
> +
> + public TypeInfo getOwnerType(ParameterizedClassInfo classInfo)
> + {
> + ParameterizedType type = classInfo.parameterizedType;
> + Type owner = type.getOwnerType();
> + if (owner == null)
> + return null;
> +
> + return getTypeInfo(owner);
> + }
> }
>
> Added: projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/introspection/ParameterizedArrayInfo.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/introspection/ParameterizedArrayInfo.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/introspection/ParameterizedArrayInfo.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -0,0 +1,57 @@
> +/*
> +* JBoss, Home of Professional Open Source
> +* Copyright 2006, JBoss Inc., and individual contributors as indicated
> +* by the @authors tag. See the copyright.txt 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.reflect.plugins.introspection;
> +
> +import java.lang.reflect.ParameterizedType;
> +
> +import org.jboss.reflect.plugins.ClassInfoHelper;
> +import org.jboss.reflect.spi.ArrayInfo;
> +import org.jboss.reflect.spi.TypeInfo;
> +
> +/**
> + * ParameterizedArrayInfo.
> + *
> + * @author <a href="adrian at jboss.com">Adrian Brock</a>
> + * @version $Revision: 1.1 $
> + */
> +public class ParameterizedArrayInfo extends ParameterizedClassInfo implements ArrayInfo
> +{
> + /** The serialVersionUID */
> + private static final long serialVersionUID = -2126867826240682161L;
> +
> + /**
> + * Create a new ParameterizedArrayInfo.
> + *
> + * @param helper the helper
> + * @param delegate the raw array info
> + * @param parameterizedType the parameterized type
> + */
> + public ParameterizedArrayInfo(ClassInfoHelper helper, ArrayInfo delegate, ParameterizedType parameterizedType)
> + {
> + super(helper, delegate, parameterizedType);
> + }
> +
> + public TypeInfo getComponentType()
> + {
> + return ((ArrayInfo) delegate).getComponentType();
> + }
> +}
>
> Added: projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/introspection/ParameterizedClassInfo.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/introspection/ParameterizedClassInfo.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/introspection/ParameterizedClassInfo.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -0,0 +1,251 @@
> +/*
> +* JBoss, Home of Professional Open Source
> +* Copyright 2006, JBoss Inc., and individual contributors as indicated
> +* by the @authors tag. See the copyright.txt 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.reflect.plugins.introspection;
> +
> +import java.lang.reflect.ParameterizedType;
> +
> +import org.jboss.reflect.plugins.ClassInfoHelper;
> +import org.jboss.reflect.plugins.ClassInfoImpl;
> +import org.jboss.reflect.spi.AnnotationValue;
> +import org.jboss.reflect.spi.ClassInfo;
> +import org.jboss.reflect.spi.ConstructorInfo;
> +import org.jboss.reflect.spi.FieldInfo;
> +import org.jboss.reflect.spi.InterfaceInfo;
> +import org.jboss.reflect.spi.MethodInfo;
> +import org.jboss.reflect.spi.TypeInfo;
> +import org.jboss.util.JBossObject;
> +import org.jboss.util.JBossStringBuilder;
> +
> +/**
> + * ParameterizedClassInfo.
> + *
> + * @author <a href="adrian at jboss.com">Adrian Brock</a>
> + * @version $Revision: 1.1 $
> + */
> +public class ParameterizedClassInfo extends JBossObject implements ClassInfo, InterfaceInfo
> +{
> + /** The serialVersionUID */
> + private static final long serialVersionUID = -8739806147734002603L;
> +
> + /** The helper */
> + protected ClassInfoHelper helper;
> +
> + /** The raw class info */
> + protected ClassInfo delegate;
> +
> + /** The parameterized type */
> + ParameterizedType parameterizedType;
> +
> + /** The owner type */
> + private TypeInfo ownerType = ClassInfoImpl.UNKNOWN_TYPE;
> +
> + /** The type arguments */
> + private TypeInfo[] typeArguments = ClassInfoImpl.UNKNOWN_TYPES;
> +
> + /**
> + * Create a new ParameterizedClassInfo.
> + *
> + * @param helper the helper
> + * @param delegate the raw array info
> + * @param parameterizedType the parameterized type
> + */
> + public ParameterizedClassInfo(ClassInfoHelper helper, ClassInfo delegate, ParameterizedType parameterizedType)
> + {
> + this.helper = helper;
> + this.delegate = delegate;
> + this.parameterizedType = parameterizedType;
> + }
> +
> + public ConstructorInfo getDeclaredConstructor(TypeInfo[] parameters)
> + {
> + return delegate.getDeclaredConstructor(parameters);
> + }
> +
> + public ConstructorInfo[] getDeclaredConstructors()
> + {
> + return delegate.getDeclaredConstructors();
> + }
> +
> + public FieldInfo getDeclaredField(String name)
> + {
> + return delegate.getDeclaredField(name);
> + }
> +
> + public FieldInfo[] getDeclaredFields()
> + {
> + return delegate.getDeclaredFields();
> + }
> +
> + public MethodInfo getDeclaredMethod(String name, TypeInfo[] parameters)
> + {
> + return delegate.getDeclaredMethod(name, parameters);
> + }
> +
> + public MethodInfo[] getDeclaredMethods()
> + {
> + return delegate.getDeclaredMethods();
> + }
> +
> + public InterfaceInfo[] getGenericInterfaces()
> + {
> + return delegate.getGenericInterfaces();
> + }
> +
> + public ClassInfo getGenericSuperclass()
> + {
> + return delegate.getGenericSuperclass();
> + }
> +
> + public InterfaceInfo[] getInterfaces()
> + {
> + return delegate.getInterfaces();
> + }
> +
> + public String getName()
> + {
> + return delegate.getName();
> + }
> +
> + public ClassInfo getSuperclass()
> + {
> + return delegate.getSuperclass();
> + }
> +
> + public boolean isInterface()
> + {
> + return delegate.isInterface();
> + }
> +
> + public AnnotationValue getAnnotation(String name)
> + {
> + return delegate.getAnnotation(name);
> + }
> +
> + public AnnotationValue[] getAnnotations()
> + {
> + return delegate.getAnnotations();
> + }
> +
> + public boolean isAnnotationPresent(String name)
> + {
> + return delegate.isAnnotationPresent(name);
> + }
> +
> + public int getModifiers()
> + {
> + return delegate.getModifiers();
> + }
> +
> + public boolean isPublic()
> + {
> + return delegate.isPublic();
> + }
> +
> + public boolean isStatic()
> + {
> + return delegate.isStatic();
> + }
> +
> + public Object convertValue(Object value) throws Throwable
> + {
> + return delegate.convertValue(value);
> + }
> +
> + public TypeInfo getArrayType(int depth)
> + {
> + return delegate.getArrayType(depth);
> + }
> +
> + public Class getType()
> + {
> + return delegate.getType();
> + }
> +
> + public boolean isArray()
> + {
> + return delegate.isArray();
> + }
> +
> + public boolean isEnum()
> + {
> + return delegate.isEnum();
> + }
> +
> + public boolean isPrimitive()
> + {
> + return delegate.isPrimitive();
> + }
> +
> + public Object[] newArrayInstance(int size) throws Throwable
> + {
> + return delegate.newArrayInstance(size);
> + }
> +
> + public TypeInfo[] getActualTypeArguments()
> + {
> + if (typeArguments == ClassInfoImpl.UNKNOWN_TYPES)
> + typeArguments = helper.getActualTypeArguments(this);
> + return typeArguments;
> + }
> +
> + public TypeInfo getOwnerType()
> + {
> + if (ownerType == ClassInfoImpl.UNKNOWN_TYPE)
> + ownerType = helper.getOwnerType(this);
> + return ownerType;
> + }
> +
> + public ClassInfo getRawType()
> + {
> + return delegate;
> + }
> +
> + protected int getHashCode()
> + {
> + return delegate.hashCode();
> + }
> +
> + public boolean equals(Object obj)
> + {
> + if (obj == this)
> + return true;
> +
> + if (obj == null || obj instanceof ClassInfo == false)
> + return false;
> +
> + ClassInfo other = (ClassInfo) obj;
> + if (other instanceof ParameterizedClassInfo)
> + other = ((ParameterizedClassInfo) other).delegate;
> +
> + return delegate.equals(other);
> + }
> +
> + public void toShortString(JBossStringBuilder buffer)
> + {
> + buffer.append(parameterizedType);
> + }
> +
> + protected void toString(JBossStringBuilder buffer)
> + {
> + buffer.append(parameterizedType);
> + }
> +}
>
> Modified: projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/javassist/JavassistArrayInfoImpl.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/javassist/JavassistArrayInfoImpl.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/javassist/JavassistArrayInfoImpl.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -23,7 +23,6 @@
>
> import javassist.CtClass;
>
> -import org.jboss.reflect.spi.AnnotatedInfo;
> import org.jboss.reflect.spi.AnnotationValue;
> import org.jboss.reflect.spi.ArrayInfo;
> import org.jboss.reflect.spi.TypeInfo;
>
> Modified: projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/javassist/JavassistTypeInfo.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/javassist/JavassistTypeInfo.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/javassist/JavassistTypeInfo.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -156,6 +156,12 @@
> }
> }
>
> + public ClassInfo getGenericSuperclass()
> + {
> + // TODO getGenericSuperclass
> + throw new org.jboss.util.NotImplementedException("getGenericSuperclass");
> + }
> +
> public InterfaceInfo[] getInterfaces()
> {
> try
> @@ -174,6 +180,12 @@
> }
> }
>
> + public InterfaceInfo[] getGenericInterfaces()
> + {
> + // TODO getGenericInterfaces
> + throw new org.jboss.util.NotImplementedException("getGenericInterfaces");
> + }
> +
> public ConstructorInfo[] getDeclaredConstructors()
> {
> if (constructorArray == null)
> @@ -542,4 +554,19 @@
> }
> }
>
> + public TypeInfo[] getActualTypeArguments()
> + {
> + return null;
> + }
> +
> + public TypeInfo getOwnerType()
> + {
> + return null;
> + }
> +
> + public ClassInfo getRawType()
> + {
> + return this;
> + }
> +
> }
>
> Modified: projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactory.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactory.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactory.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -21,6 +21,8 @@
> */
> package org.jboss.reflect.plugins.javassist;
>
> +import java.lang.reflect.Type;
> +
> import org.jboss.reflect.spi.TypeInfo;
> import org.jboss.reflect.spi.TypeInfoFactory;
>
> @@ -46,4 +48,10 @@
> {
> return delegate.getTypeInfo(name, cl);
> }
> +
> + public TypeInfo getTypeInfo(Type type)
> + {
> + return delegate.getTypeInfo(type);
> + }
> +
> }
>
> Modified: projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactoryImpl.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactoryImpl.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/main/org/jboss/reflect/plugins/javassist/JavassistTypeInfoFactoryImpl.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -22,6 +22,7 @@
> package org.jboss.reflect.plugins.javassist;
>
> import java.lang.annotation.Annotation;
> +import java.lang.reflect.Type;
>
> import javassist.ClassPool;
> import javassist.CtClass;
> @@ -273,6 +274,15 @@
> return getTypeInfo(clazz);
> }
>
> + public TypeInfo getTypeInfo(Type type)
> + {
> + if (type instanceof Class)
> + return getTypeInfo((Class) type);
> +
> + // TODO getTypeInfo
> + throw new org.jboss.util.NotImplementedException("getTypeInfo");
> + }
> +
> public AnnotationValue[] getAnnotations(Object obj)
> {
> try
>
> Modified: projects/microcontainer/trunk/container/src/main/org/jboss/reflect/spi/ClassInfo.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/main/org/jboss/reflect/spi/ClassInfo.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/main/org/jboss/reflect/spi/ClassInfo.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -51,6 +51,13 @@
> InterfaceInfo[] getInterfaces();
>
> /**
> + * Get the generic interfaces
> + *
> + * @return the generic interfaces
> + */
> + InterfaceInfo[] getGenericInterfaces();
> +
> + /**
> * Get the declared method
> *
> * @param name the method name
> @@ -102,4 +109,32 @@
> * @return the super class
> */
> ClassInfo getSuperclass();
> +
> + /**
> + * Get the generic super class
> + *
> + * @return the super class
> + */
> + ClassInfo getGenericSuperclass();
> +
> + /**
> + * Get the actual type parameters
> + *
> + * @return the type parameters
> + */
> + TypeInfo[] getActualTypeArguments();
> +
> + /**
> + * Get the raw type
> + *
> + * @return the raw type
> + */
> + ClassInfo getRawType();
> +
> + /**
> + * Get the owner type
> + *
> + * @return the owner type
> + */
> + TypeInfo getOwnerType();
> }
>
> Modified: projects/microcontainer/trunk/container/src/main/org/jboss/reflect/spi/TypeInfoFactory.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/main/org/jboss/reflect/spi/TypeInfoFactory.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/main/org/jboss/reflect/spi/TypeInfoFactory.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -21,6 +21,8 @@
> */
> package org.jboss.reflect.spi;
>
> +import java.lang.reflect.Type;
> +
> /**
> * A type info factory.
> *
> @@ -45,4 +47,12 @@
> * @return the type info
> */
> TypeInfo getTypeInfo(Class clazz);
> +
> + /**
> + * Get a type info
> + *
> + * @param type the type
> + * @return the type info
> + */
> + TypeInfo getTypeInfo(Type type);
> }
>
> Added: projects/microcontainer/trunk/container/src/main/org/jboss/util/collection/temp/FIXME
> ===================================================================
> --- projects/microcontainer/trunk/container/src/main/org/jboss/util/collection/temp/FIXME 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/main/org/jboss/util/collection/temp/FIXME 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -0,0 +1 @@
> +THESE CLASSES NEED TO BE MOVED TO COMMON WHEN IT SUPPORTS JDK5 + JBOSS RETRO
> \ No newline at end of file
>
> Added: projects/microcontainer/trunk/container/src/main/org/jboss/util/collection/temp/WeakTypeCache.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/main/org/jboss/util/collection/temp/WeakTypeCache.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/main/org/jboss/util/collection/temp/WeakTypeCache.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -0,0 +1,283 @@
> +/*
> + * JBoss, Home of Professional Open Source
> + * Copyright 2006, JBoss Inc., and individual contributors as indicated
> + * by the @authors tag. See the copyright.txt 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.util.collection.temp;
> +
> +import java.lang.reflect.GenericArrayType;
> +import java.lang.reflect.ParameterizedType;
> +import java.lang.reflect.Type;
> +import java.lang.reflect.TypeVariable;
> +import java.util.Map;
> +import java.util.WeakHashMap;
> +
> +/**
> + * A weak class cache that instantiates does not a hold a
> + * strong reference to either the classloader or class.<p>
> + *
> + * It creates the class specific data in two stages
> + * to avoid recursion.<p>
> + *
> + * instantiate - creates the data<br>
> + * generate - fills in the details
> + *
> + * @param <T> the cached type
> + * @author <a href="mailto:adrian at jboss.org">Adrian Brock</a>
> + */
> +public abstract class WeakTypeCache<T>
> +{
> + /** The cache */
> + private Map<ClassLoader, Map<String, T>> cache = new WeakHashMap<ClassLoader, Map<String, T>>();
> +
> + /**
> + * Get the information for a type
> + *
> + * @param type the type
> + * @return the info
> + */
> + public T get(Type type)
> + {
> + if (type == null)
> + throw new IllegalArgumentException("Null type");
> +
> + if (type instanceof ParameterizedType)
> + return getParameterizedType((ParameterizedType) type);
> + else if (type instanceof Class)
> + return getClass((Class<?>) type);
> + else if (type instanceof TypeVariable)
> + return getTypeVariable((TypeVariable) type);
> + else if (type instanceof GenericArrayType)
> + return getGenericArrayType((GenericArrayType) type);
> + else
> + throw new UnsupportedOperationException("Unknown type: " + type + " class=" + type.getClass());
> + }
> +
> + /**
> + * Get the information for a class
> + *
> + * @param name the name
> + * @param cl the classloader
> + * @return the info
> + * @throws ClassNotFoundException when the class cannot be found
> + */
> + public T get(String name, ClassLoader cl) throws ClassNotFoundException
> + {
> + if (name == null)
> + throw new IllegalArgumentException("Null name");
> + if (cl == null)
> + throw new IllegalArgumentException("Null classloader");
> +
> + Class<?> clazz = cl.loadClass(name);
> + return get(clazz);
> + }
> +
> + /**
> + * Instantiate for a class
> + *
> + * @param clazz the class
> + * @return the result
> + */
> + protected abstract T instantiate(Class<?> clazz);
> +
> + /**
> + * Fill in the result
> + *
> + * @param clazz the class
> + * @param result the result
> + */
> + protected abstract void generate(Class<?> clazz, T result);
> +
> + /**
> + * Instantiate for a parameterized type
> + *
> + * @param type the parameterized type
> + * @return the result
> + */
> + protected abstract T instantiate(ParameterizedType type);
> +
> + /**
> + * Fill in the result
> + *
> + * @param type the parameterized type
> + * @param result the result
> + */
> + protected abstract void generate(ParameterizedType type, T result);
> +
> + /**
> + * Get the information for a parameterized type
> + *
> + * @param type the paremeterized type
> + * @return the info
> + */
> + private T getParameterizedType(ParameterizedType type)
> + {
> + // First check if we already have it
> + T result = peek(type);
> + if (result != null)
> + return result;
> +
> + // Instantiate
> + result = instantiate(type);
> +
> + // Put the perlimanary result into the cache
> + put(type, result);
> +
> + // Generate the details
> + generate(type, result);
> +
> + return result;
> + }
> +
> + /**
> + * Get the information for a type variable
> + *
> + * @param type the type variable
> + * @return the info
> + */
> + private T getTypeVariable(TypeVariable type)
> + {
> + // TODO improve this
> + return get(type.getBounds()[0]);
> + }
> +
> + /**
> + * Get the information for an array type
> + *
> + * @param type the array type
> + * @return the info
> + */
> + private T getGenericArrayType(GenericArrayType type)
> + {
> + // TODO this needs implementing properly
> + return get(Object[].class);
> + }
> +
> + /**
> + * Peek into the cache
> + *
> + * @param type the type
> + * @return the value
> + */
> + private T peek(ParameterizedType type)
> + {
> + Class<?> rawType = (Class<?>) type.getRawType();
> + Map<String, T> classLoaderCache = getClassLoaderCache(rawType.getClassLoader());
> +
> + synchronized (classLoaderCache)
> + {
> + return classLoaderCache.get(type.toString());
> + }
> + }
> +
> + /**
> + * Put a result into the cache
> + *
> + * @param clazz the class
> + * @param result the value
> + */
> + private void put(ParameterizedType type, T result)
> + {
> + Class<?> rawType = (Class<?>) type.getRawType();
> + Map<String, T> classLoaderCache = getClassLoaderCache(rawType.getClassLoader());
> +
> + synchronized (classLoaderCache)
> + {
> + // TODO something better than toString()?
> + classLoaderCache.put(type.toString(), result);
> + }
> + }
> +
> + /**
> + * Get the information for a class
> + *
> + * @param clazz the class
> + * @return the info
> + */
> + private T getClass(Class<?> clazz)
> + {
> + // First check if we already have it
> + T result = peek(clazz);
> + if (result != null)
> + return result;
> +
> + // Instantiate
> + result = instantiate(clazz);
> +
> + // Put the perlimanary result into the cache
> + put(clazz, result);
> +
> + // Generate the details
> + generate(clazz, result);
> +
> + return result;
> + }
> +
> + /**
> + * Peek into the cache
> + *
> + * @param clazz the class
> + * @return the value
> + */
> + private T peek(Class<?> clazz)
> + {
> + Map<String, T> classLoaderCache = getClassLoaderCache(clazz.getClassLoader());
> +
> + synchronized (classLoaderCache)
> + {
> + return classLoaderCache.get(clazz.getName());
> + }
> + }
> +
> + /**
> + * Put a result into the cache
> + *
> + * @param clazz the class
> + * @param result the value
> + */
> + private void put(Class<?> clazz, T result)
> + {
> + Map<String, T> classLoaderCache = getClassLoaderCache(clazz.getClassLoader());
> +
> + synchronized (classLoaderCache)
> + {
> + classLoaderCache.put(clazz.getName(), result);
> + }
> + }
> +
> + /**
> + * Get the cache for the classloader
> + *
> + * @param cl the classloader
> + * @return the map
> + */
> + private Map<String, T> getClassLoaderCache(ClassLoader cl)
> + {
> + synchronized (cache)
> + {
> + Map<String, T> result = cache.get(cl);
> + if (result == null)
> + {
> + result = new WeakValueHashMap<String, T>();
> + cache.put(cl, result);
> + }
> + return result;
> + }
> + }
> +}
>
> Added: projects/microcontainer/trunk/container/src/main/org/jboss/util/collection/temp/WeakValueHashMap.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/main/org/jboss/util/collection/temp/WeakValueHashMap.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/main/org/jboss/util/collection/temp/WeakValueHashMap.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -0,0 +1,293 @@
> +/*
> + * JBoss, Home of Professional Open Source
> + * Copyright 2005, JBoss Inc., and individual contributors as indicated
> + * by the @authors tag. See the copyright.txt 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.util.collection.temp;
> +
> +import java.lang.ref.ReferenceQueue;
> +import java.lang.ref.WeakReference;
> +import java.util.AbstractMap;
> +import java.util.AbstractSet;
> +import java.util.HashMap;
> +import java.util.Iterator;
> +import java.util.Map;
> +import java.util.Set;
> +
> +
> +/**
> + * This Map will remove entries when the value in the map has been
> + * cleaned from garbage collection
> + *
> + * @param <K> the key type
> + * @param <V> the value type
> + * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
> + * @author <a href="mailto:adrian at jboss.org">Adrian Brock</a>
> + * @version <tt>$Revision: 1958 $</tt>
> + */
> +public class WeakValueHashMap<K, V> extends AbstractMap<K, V>
> +{
> + /** Hash table mapping keys to weak values */
> + private Map<K, WeakValueRef<K, V>> hash;
> +
> + /** Reference queue for cleared WeakKeys */
> + private ReferenceQueue<V> queue = new ReferenceQueue<V>();
> +
> + /**
> + * Constructs a new, empty <code>WeakHashMap</code> with the given
> + * initial capacity and the given load factor.
> + *
> + * @param initialCapacity The initial capacity of the
> + * <code>WeakHashMap</code>
> + *
> + * @param loadFactor The load factor of the <code>WeakHashMap</code>
> + *
> + * @throws IllegalArgumentException If the initial capacity is less than
> + * zero, or if the load factor is
> + * nonpositive
> + */
> + public WeakValueHashMap(int initialCapacity, float loadFactor)
> + {
> + hash = new HashMap<K, WeakValueRef<K, V>>(initialCapacity, loadFactor);
> + }
> +
> + /**
> + * Constructs a new, empty <code>WeakHashMap</code> with the given
> + * initial capacity and the default load factor, which is
> + * <code>0.75</code>.
> + *
> + * @param initialCapacity The initial capacity of the
> + * <code>WeakHashMap</code>
> + *
> + * @throws IllegalArgumentException If the initial capacity is less than
> + * zero
> + */
> + public WeakValueHashMap(int initialCapacity)
> + {
> + hash = new HashMap<K, WeakValueRef<K, V>>(initialCapacity);
> + }
> +
> + /**
> + * Constructs a new, empty <code>WeakHashMap</code> with the default
> + * initial capacity and the default load factor, which is
> + * <code>0.75</code>.
> + */
> + public WeakValueHashMap()
> + {
> + hash = new HashMap<K, WeakValueRef<K, V>>();
> + }
> +
> + /**
> + * Constructs a new <code>WeakHashMap</code> with the same mappings as the
> + * specified <tt>Map</tt>. The <code>WeakHashMap</code> is created with an
> + * initial capacity of twice the number of mappings in the specified map
> + * or 11 (whichever is greater), and a default load factor, which is
> + * <tt>0.75</tt>.
> + *
> + * @param t the map whose mappings are to be placed in this map.
> + * @since 1.3
> + */
> + public WeakValueHashMap(Map<K, V> t)
> + {
> + this(Math.max(2*t.size(), 11), 0.75f);
> + putAll(t);
> + }
> +
> + @Override
> + public int size()
> + {
> + processQueue();
> + return hash.size();
> + }
> +
> + @Override
> + public boolean containsKey(Object key)
> + {
> + processQueue();
> + return hash.containsKey(key);
> + }
> +
> + @Override
> + public V get(Object key)
> + {
> + processQueue();
> + WeakValueRef<K, V> ref = hash.get(key);
> + if (ref != null)
> + return ref.get();
> + return null;
> + }
> +
> + @Override
> + public V put(K key, V value)
> + {
> + processQueue();
> + WeakValueRef<K, V> ref = WeakValueRef.create(key, value, queue);
> + WeakValueRef<K, V> result = hash.put(key, ref);
> + if (result != null)
> + return result.get();
> + return null;
> + }
> +
> + @Override
> + public V remove(Object key)
> + {
> + processQueue();
> + WeakValueRef<K, V> result = hash.remove(key);
> + if (result != null)
> + return result.get();
> + return null;
> + }
> +
> + @Override
> + public Set<Entry<K,V>> entrySet()
> + {
> + processQueue();
> + return new EntrySet();
> + }
> +
> + @Override
> + public void clear()
> + {
> + processQueue();
> + hash.clear();
> + }
> +
> + /**
> + * Remove all entries whose values have been discarded.
> + */
> + @SuppressWarnings("unchecked")
> + private void processQueue()
> + {
> + WeakValueRef<K, V> ref = (WeakValueRef<K, V>) queue.poll();
> + while (ref != null)
> + {
> + // only remove if it is the *exact* same WeakValueRef
> + if (ref == hash.get(ref.key))
> + hash.remove(ref.key);
> +
> + ref = (WeakValueRef<K, V>) queue.poll();
> + }
> + }
> +
> + /**
> + * EntrySet.
> + */
> + private class EntrySet extends AbstractSet<Entry<K, V>>
> + {
> + @Override
> + public Iterator<Entry<K, V>> iterator()
> + {
> + return new EntrySetIterator(hash.entrySet().iterator());
> + }
> +
> + @Override
> + public int size()
> + {
> + return WeakValueHashMap.this.size();
> + }
> + }
> +
> + /**
> + * EntrySet iterator
> + */
> + private class EntrySetIterator implements Iterator<Entry<K, V>>
> + {
> + /** The delegate */
> + private Iterator<Entry<K, WeakValueRef<K, V>>> delegate;
> +
> + /**
> + * Create a new EntrySetIterator.
> + *
> + * @param delegate the delegate
> + */
> + public EntrySetIterator(Iterator<Entry<K, WeakValueRef<K, V>>> delegate)
> + {
> + this.delegate = delegate;
> + }
> +
> + public boolean hasNext()
> + {
> + return delegate.hasNext();
> + }
> +
> + public Entry<K, V> next()
> + {
> + Entry<K, WeakValueRef<K, V>> next = delegate.next();
> + return next.getValue();
> + }
> +
> + public void remove()
> + {
> + throw new UnsupportedOperationException("remove");
> + }
> + }
> +
> + /**
> + * WeakValueRef.
> + */
> + private static class WeakValueRef<K, V> extends WeakReference<V> implements Map.Entry<K, V>
> + {
> + /** The key */
> + public K key;
> +
> + /**
> + * Safely create a new WeakValueRef
> + *
> + * @param key the key
> + * @param val the value
> + * @param q the reference queue
> + * @return the reference or null if the value is null
> + */
> + private static <K, V> WeakValueRef<K, V> create(K key, V val, ReferenceQueue<V> q)
> + {
> + if (val == null)
> + return null;
> + else
> + return new WeakValueRef<K, V>(key, val, q);
> + }
> +
> + /**
> + * Create a new WeakValueRef.
> + *
> + * @param key the key
> + * @param val the value
> + * @param q the reference queue
> + */
> + private WeakValueRef(K key, V val, ReferenceQueue<V> q)
> + {
> + super(val, q);
> + this.key = key;
> + }
> +
> + public K getKey()
> + {
> + return key;
> + }
> +
> + public V getValue()
> + {
> + return get();
> + }
> +
> + public V setValue(V value)
> + {
> + throw new UnsupportedOperationException("setValue");
> + }
> + }
> +}
>
> Added: projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericClass.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericClass.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericClass.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -0,0 +1,33 @@
> +/*
> +* JBoss, Home of Professional Open Source
> +* Copyright 2006, JBoss Inc., and individual contributors as indicated
> +* by the @authors tag. See the copyright.txt 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;
> +
> +/**
> + * ClassInfoGenericClass
> + *
> + * @param <T> the generic type
> + * @author <a href="adrian at jboss.com">Adrian Brock</a>
> + * @version $Revision: 1.1 $
> + */
> +public class ClassInfoGenericClass<T>
> +{
> +}
>
> Added: projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericConstructorsClass.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericConstructorsClass.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericConstructorsClass.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -0,0 +1,34 @@
> +/*
> +* JBoss, Home of Professional Open Source
> +* Copyright 2006, JBoss Inc., and individual contributors as indicated
> +* by the @authors tag. See the copyright.txt 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;
> +
> +/**
> + * ClassInfoGenericConstructors
> + *
> + * @author <a href="adrian at jboss.com">Adrian Brock</a>
> + * @version $Revision: 1.1 $
> + */
> +public class ClassInfoGenericConstructorsClass
> +{
> + ClassInfoGenericConstructorsClass(ClassInfoGenericClass<String> p1) {};
> + ClassInfoGenericConstructorsClass(ClassInfoGenericClass<String> p1, ClassInfoGenericClass<ClassInfoEmptyClass> p2) {};
> +}
>
> Added: projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericFieldsClass.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericFieldsClass.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericFieldsClass.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -0,0 +1,34 @@
> +/*
> +* JBoss, Home of Professional Open Source
> +* Copyright 2006, JBoss Inc., and individual contributors as indicated
> +* by the @authors tag. See the copyright.txt 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;
> +
> +/**
> + * ClassInfoGenericField
> + *
> + * @author <a href="adrian at jboss.com">Adrian Brock</a>
> + * @version $Revision: 1.1 $
> + */
> +public class ClassInfoGenericFieldsClass
> +{
> + ClassInfoGenericClass<String> fieldString;
> + ClassInfoGenericClass<ClassInfoEmptyClass> fieldClass;
> +}
>
> Added: projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericFieldsInterface.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericFieldsInterface.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericFieldsInterface.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -0,0 +1,34 @@
> +/*
> +* JBoss, Home of Professional Open Source
> +* Copyright 2006, JBoss Inc., and individual contributors as indicated
> +* by the @authors tag. See the copyright.txt 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;
> +
> +/**
> + * ClassInfoGenericFieldsInterface
> + *
> + * @author <a href="adrian at jboss.com">Adrian Brock</a>
> + * @version $Revision: 1.1 $
> + */
> +public interface ClassInfoGenericFieldsInterface
> +{
> + ClassInfoGenericClass<String> fieldString = null;
> + ClassInfoGenericClass<ClassInfoEmptyClass> fieldClass = null;
> +}
>
> Added: projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericInterface.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericInterface.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericInterface.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -0,0 +1,33 @@
> +/*
> +* JBoss, Home of Professional Open Source
> +* Copyright 2006, JBoss Inc., and individual contributors as indicated
> +* by the @authors tag. See the copyright.txt 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;
> +
> +/**
> + * ClassInfoGenericInterface
> + *
> + * @param <T> the generic type
> + * @author <a href="adrian at jboss.com">Adrian Brock</a>
> + * @version $Revision: 1.1 $
> + */
> +public interface ClassInfoGenericInterface<T>
> +{
> +}
>
> Added: projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericMethodsClass.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericMethodsClass.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericMethodsClass.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -0,0 +1,38 @@
> +/*
> +* JBoss, Home of Professional Open Source
> +* Copyright 2006, JBoss Inc., and individual contributors as indicated
> +* by the @authors tag. See the copyright.txt 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;
> +
> +/**
> + * ClassInfoGenericMethods
> + *
> + * @author <a href="adrian at jboss.com">Adrian Brock</a>
> + * @version $Revision: 1.1 $
> + */
> +public class ClassInfoGenericMethodsClass
> +{
> + void doSomething(ClassInfoGenericClass<String> p1) {};
> + void doSomething(ClassInfoGenericClass<String> p1, ClassInfoGenericClass<ClassInfoEmptyClass> p2) {};
> + ClassInfoGenericClass<String> doSomething2(ClassInfoGenericClass<Integer> p1) {return null;};
> + ClassInfoGenericClass<String> doSomething2(ClassInfoGenericClass<Integer> p1, ClassInfoGenericClass<ClassInfoEmptyClass> p2) {return null;};
> + ClassInfoGenericClass<ClassInfoEmptyClass> doSomething3(ClassInfoGenericClass<Integer> p1) {return null;};
> + ClassInfoGenericClass<ClassInfoEmptyClass> doSomething3(ClassInfoGenericClass<Integer> p1, ClassInfoGenericClass<ClassInfoEmptyClass> p2) {return null;};
> +}
>
> Added: projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericMethodsInterface.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericMethodsInterface.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericMethodsInterface.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -0,0 +1,38 @@
> +/*
> +* JBoss, Home of Professional Open Source
> +* Copyright 2006, JBoss Inc., and individual contributors as indicated
> +* by the @authors tag. See the copyright.txt 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;
> +
> +/**
> + * ClassInfoGenericMethods
> + *
> + * @author <a href="adrian at jboss.com">Adrian Brock</a>
> + * @version $Revision: 1.1 $
> + */
> +public interface ClassInfoGenericMethodsInterface
> +{
> + void doSomething(ClassInfoGenericClass<String> p1);
> + void doSomething(ClassInfoGenericClass<String> p1, ClassInfoGenericClass<ClassInfoEmptyClass> p2);
> + ClassInfoGenericClass<String> doSomething2(ClassInfoGenericClass<Integer> p1);
> + ClassInfoGenericClass<String> doSomething2(ClassInfoGenericClass<Integer> p1, ClassInfoGenericClass<ClassInfoEmptyClass> p2);
> + ClassInfoGenericClass<ClassInfoEmptyClass> doSomething3(ClassInfoGenericClass<Integer> p1);
> + ClassInfoGenericClass<ClassInfoEmptyClass> doSomething3(ClassInfoGenericClass<Integer> p1, ClassInfoGenericClass<ClassInfoEmptyClass> p2);
> +}
>
> Added: projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericSuperClassEmptyClass.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericSuperClassEmptyClass.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericSuperClassEmptyClass.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -0,0 +1,32 @@
> +/*
> +* JBoss, Home of Professional Open Source
> +* Copyright 2006, JBoss Inc., and individual contributors as indicated
> +* by the @authors tag. See the copyright.txt 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;
> +
> +/**
> + * ClassInfoSuperClass
> + *
> + * @author <a href="adrian at jboss.com">Adrian Brock</a>
> + * @version $Revision: 1.1 $
> + */
> +public class ClassInfoGenericSuperClassEmptyClass extends ClassInfoGenericClass<ClassInfoEmptyClass>
> +{
> +}
>
> Added: projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericSuperClassString.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericSuperClassString.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericSuperClassString.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -0,0 +1,32 @@
> +/*
> +* JBoss, Home of Professional Open Source
> +* Copyright 2006, JBoss Inc., and individual contributors as indicated
> +* by the @authors tag. See the copyright.txt 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;
> +
> +/**
> + * ClassInfoSuperClass
> + *
> + * @author <a href="adrian at jboss.com">Adrian Brock</a>
> + * @version $Revision: 1.1 $
> + */
> +public class ClassInfoGenericSuperClassString extends ClassInfoGenericClass<String>
> +{
> +}
>
> Added: projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericSuperInterfaceEmptyClass.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericSuperInterfaceEmptyClass.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericSuperInterfaceEmptyClass.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -0,0 +1,32 @@
> +/*
> +* JBoss, Home of Professional Open Source
> +* Copyright 2006, JBoss Inc., and individual contributors as indicated
> +* by the @authors tag. See the copyright.txt 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;
> +
> +/**
> + * ClassInfoGenericSuperInterfaceEmptyClass.
> + *
> + * @author <a href="adrian at jboss.com">Adrian Brock</a>
> + * @version $Revision: 1.1 $
> + */
> +public class ClassInfoGenericSuperInterfaceEmptyClass implements ClassInfoGenericInterface<ClassInfoEmptyClass>
> +{
> +}
>
> Added: projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericSuperInterfaceString.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericSuperInterfaceString.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/support/ClassInfoGenericSuperInterfaceString.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -0,0 +1,32 @@
> +/*
> +* JBoss, Home of Professional Open Source
> +* Copyright 2006, JBoss Inc., and individual contributors as indicated
> +* by the @authors tag. See the copyright.txt 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;
> +
> +/**
> + * ClassInfoGenericSuperInterfaceString.
> + *
> + * @author <a href="adrian at jboss.com">Adrian Brock</a>
> + * @version $Revision: 1.1 $
> + */
> +public class ClassInfoGenericSuperInterfaceString implements ClassInfoGenericInterface<String>
> +{
> +}
>
> Modified: projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/AbstractClassInfoTest.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/AbstractClassInfoTest.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/AbstractClassInfoTest.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -26,6 +26,7 @@
> import java.lang.reflect.Constructor;
> import java.lang.reflect.Field;
> import java.lang.reflect.Method;
> +import java.lang.reflect.Type;
> import java.util.Arrays;
> import java.util.HashMap;
> import java.util.HashSet;
> @@ -187,7 +188,7 @@
> Set<FieldInfo> expected = new HashSet<FieldInfo>();
> for (Field field : clazz.getDeclaredFields())
> {
> - TypeInfo type = factory.getTypeInfo(field.getType());
> + TypeInfo type = factory.getTypeInfo(field.getGenericType());
> FieldInfo f = new FieldInfoImpl(null, field.getName(), type, field.getModifiers(), classInfo);
> expected.add(f);
> }
> @@ -218,8 +219,8 @@
>
> FieldInfo fieldInfo = classInfo.getDeclaredField(field.getName());
> assertNotNull(field.getName(), fieldInfo);
> - TypeInfo type = factory.getTypeInfo(field.getType());
> - assertEquals(type, fieldInfo.getType());
> + TypeInfo type = factory.getTypeInfo(field.getGenericType());
> + assertTypeEquals(field.getName(), type, fieldInfo.getType());
> assertEquals(classInfo, fieldInfo.getDeclaringClass());
> assertEquals(field.getModifiers(), fieldInfo.getModifiers());
> assertFieldAnnotations(field, fieldInfo);
> @@ -266,24 +267,24 @@
>
> TypeInfoFactory factory = getTypeInfoFactory();
>
> - Class[] paramClasses = method.getParameterTypes();
> + Type[] paramClasses = method.getGenericParameterTypes();
> TypeInfo[] paramTypes = new TypeInfo[paramClasses.length];
> for (int i = 0; i < paramClasses.length; ++i)
> paramTypes[i] = factory.getTypeInfo(paramClasses[i]);
> MethodInfo methodInfo = classInfo.getDeclaredMethod(method.getName(), paramTypes);
> assertNotNull(method.getName(), methodInfo);
> - TypeInfo returnType = factory.getTypeInfo(method.getReturnType());
> + TypeInfo returnType = factory.getTypeInfo(method.getGenericReturnType());
> TypeInfo[] actualParamTypes = methodInfo.getParameterTypes();
> for (int i = 0; i < paramTypes.length; ++i)
> - assertEquals(paramTypes[i], actualParamTypes[i]);
> + assertTypeEquals(method.getName() + " param" + i, paramTypes[i], actualParamTypes[i]);
> Class[] exceptionClasses = method.getExceptionTypes();
> TypeInfo[] expectedExceptionTypes = new TypeInfo[exceptionClasses.length];
> for (int i = 0; i < exceptionClasses.length; ++i)
> expectedExceptionTypes[i] = factory.getTypeInfo(exceptionClasses[i]);
> TypeInfo[] actualExceptionTypes = methodInfo.getExceptionTypes();
> for (int i = 0; i < exceptionClasses.length; ++i)
> - assertEquals(expectedExceptionTypes[i], actualExceptionTypes[i]);
> - assertEquals(returnType, methodInfo.getReturnType());
> + assertTypeEquals(method.getName() + " exception" + i, expectedExceptionTypes[i], actualExceptionTypes[i]);
> + assertTypeEquals(method.getName() + " returnType", returnType, methodInfo.getReturnType());
> assertEquals(classInfo, methodInfo.getDeclaringClass());
> assertEquals(method.getModifiers(), methodInfo.getModifiers());
> assertMethodAnnotations(method, methodInfo);
> @@ -330,7 +331,7 @@
>
> TypeInfoFactory factory = getTypeInfoFactory();
>
> - Class[] paramClasses = constructor.getParameterTypes();
> + Type[] paramClasses = constructor.getGenericParameterTypes();
> TypeInfo[] paramTypes = new TypeInfo[paramClasses.length];
> for (int i = 0; i < paramClasses.length; ++i)
> paramTypes[i] = factory.getTypeInfo(paramClasses[i]);
> @@ -338,14 +339,14 @@
> assertNotNull(constructorInfo);
> TypeInfo[] actualParamTypes = constructorInfo.getParameterTypes();
> for (int i = 0; i < paramTypes.length; ++i)
> - assertEquals(paramTypes[i], actualParamTypes[i]);
> + assertTypeEquals(clazz + " constructorParameter" + i, paramTypes[i], actualParamTypes[i]);
> Class[] exceptionClasses = constructor.getExceptionTypes();
> TypeInfo[] expectedExceptionTypes = new TypeInfo[exceptionClasses.length];
> for (int i = 0; i < exceptionClasses.length; ++i)
> expectedExceptionTypes[i] = factory.getTypeInfo(exceptionClasses[i]);
> TypeInfo[] actualExceptionTypes = constructorInfo.getExceptionTypes();
> for (int i = 0; i < exceptionClasses.length; ++i)
> - assertEquals(expectedExceptionTypes[i], actualExceptionTypes[i]);
> + assertTypeEquals(clazz + " constructorException" + i, expectedExceptionTypes[i], actualExceptionTypes[i]);
> assertEquals(classInfo, constructorInfo.getDeclaringClass());
> assertEquals(constructor.getModifiers(), constructorInfo.getModifiers());
> assertConstructorAnnotations(constructor, constructorInfo);
> @@ -476,6 +477,30 @@
> }
> return expected;
> }
> +
> + protected void assertTypeEquals(String context, TypeInfo expected, TypeInfo actual) throws Exception
> + {
> + assertEquals(expected, actual);
> + if (expected instanceof ClassInfo)
> + {
> + ClassInfo expectedClassInfo = (ClassInfo) expected;
> + ClassInfo actualClassInfo = (ClassInfo) actual;
> + assertEquals(context, expectedClassInfo.getOwnerType(), actualClassInfo.getOwnerType());
> + assertEquals(context, expectedClassInfo.getRawType(), actualClassInfo.getRawType());
> + TypeInfo[] expectedTypeArgs = expectedClassInfo.getActualTypeArguments();
> + TypeInfo[] actualTypeArgs = expectedClassInfo.getActualTypeArguments();
> + if (expectedTypeArgs == null)
> + assertNull(context, actualTypeArgs);
> + else
> + {
> + assertNotNull(context, actualTypeArgs);
> + getLog().debug("Checking type args for " + context + " expected: " + Arrays.asList(expectedTypeArgs) + " actual: " + Arrays.asList(actualTypeArgs));
> + assertEquals(expectedTypeArgs.length, actualTypeArgs.length);
> + for (int i = 0; i < expectedTypeArgs.length; ++i)
> + assertTypeEquals(context + "arg" + i, expectedTypeArgs[i], actualTypeArgs[i]);
> + }
> + }
> + }
>
> protected abstract TypeInfoFactory getTypeInfoFactory();
>
>
> Added: projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/ClassInfoGenericClassTest.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/ClassInfoGenericClassTest.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/ClassInfoGenericClassTest.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -0,0 +1,145 @@
> +/*
> +* JBoss, Home of Professional Open Source
> +* Copyright 2006, JBoss Inc., and individual contributors as indicated
> +* by the @authors tag. See the copyright.txt 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.test;
> +
> +import java.lang.reflect.Modifier;
> +import java.util.Arrays;
> +
> +import org.jboss.reflect.plugins.ClassInfoImpl;
> +import org.jboss.reflect.spi.ClassInfo;
> +import org.jboss.reflect.spi.InterfaceInfo;
> +import org.jboss.reflect.spi.TypeInfo;
> +import org.jboss.reflect.spi.TypeInfoFactory;
> +import org.jboss.test.classinfo.support.ClassInfoEmptyClass;
> +import org.jboss.test.classinfo.support.ClassInfoGenericClass;
> +import org.jboss.test.classinfo.support.ClassInfoGenericConstructorsClass;
> +import org.jboss.test.classinfo.support.ClassInfoGenericFieldsClass;
> +import org.jboss.test.classinfo.support.ClassInfoGenericInterface;
> +import org.jboss.test.classinfo.support.ClassInfoGenericMethodsClass;
> +import org.jboss.test.classinfo.support.ClassInfoGenericSuperClassEmptyClass;
> +import org.jboss.test.classinfo.support.ClassInfoGenericSuperClassString;
> +import org.jboss.test.classinfo.support.ClassInfoGenericSuperInterfaceEmptyClass;
> +import org.jboss.test.classinfo.support.ClassInfoGenericSuperInterfaceString;
> +
> +
> +/**
> + * ClassInfoGenericClassTest.
> + *
> + * @author <a href="adrian at jboss.com">Adrian Brock</a>
> + * @version $Revision: 1.1 $
> + */
> +public abstract class ClassInfoGenericClassTest extends AbstractClassInfoTest
> +{
> + public ClassInfoGenericClassTest(String name)
> + {
> + super(name);
> + }
> +
> + public void testGenericSuperClassString()
> + {
> + testGenericSuperClass(ClassInfoGenericSuperClassString.class, ClassInfoGenericClass.class, new Class[] { String.class });
> + }
> +
> + public void testGenericSuperClassEmptyClass()
> + {
> + testGenericSuperClass(ClassInfoGenericSuperClassEmptyClass.class, ClassInfoGenericClass.class, new Class[] { ClassInfoEmptyClass.class });
> + }
> +
> + public void testGenericSuperInterfaceString()
> + {
> + testGenericSuperInterface(ClassInfoGenericSuperInterfaceString.class, ClassInfoGenericInterface.class, new Class[] { String.class });
> + }
> +
> + public void testGenericSuperInterfaceEmptyClass()
> + {
> + testGenericSuperInterface(ClassInfoGenericSuperInterfaceEmptyClass.class, ClassInfoGenericInterface.class, new Class[] { ClassInfoEmptyClass.class });
> + }
> +
> + public void testGenericSuperClass(Class clazz, Class genericClass, Class[] genericTypes)
> + {
> + TypeInfoFactory factory = getTypeInfoFactory();
> + ClassInfo typeInfo = (ClassInfo) factory.getTypeInfo(clazz);
> + ClassInfo superClassInfo = typeInfo.getGenericSuperclass();
> + ClassInfo genericClassInfo = (ClassInfo) factory.getTypeInfo(genericClass);
> + getLog().debug("Checking superClass: " + genericClass + " against " + superClassInfo);
> + assertEquals(genericClassInfo, superClassInfo);
> +
> + TypeInfo[] types = new TypeInfo[genericTypes.length];
> + for (int i = 0; i < types.length; ++i)
> + types[i] = factory.getTypeInfo(genericTypes[i]);
> + TypeInfo[] actualTypes = superClassInfo.getActualTypeArguments();
> + getLog().debug("Checking superClass types: " + Arrays.asList(genericTypes) + " against " + Arrays.asList(actualTypes));
> + assertEquals(types.length, actualTypes.length);
> + for (int i = 0; i < types.length; ++i)
> + assertEquals(types[i], actualTypes[i]);
> + }
> +
> + public void testGenericSuperInterface(Class clazz, Class genericClass, Class[] genericTypes)
> + {
> + TypeInfoFactory factory = getTypeInfoFactory();
> + ClassInfo typeInfo = (ClassInfo) factory.getTypeInfo(clazz);
> + InterfaceInfo[] superInterfaces = typeInfo.getGenericInterfaces();
> + assertNotNull(superInterfaces);
> + assertEquals(1, superInterfaces.length);
> + InterfaceInfo superInterface = superInterfaces[0];
> + getLog().debug("Checking superInterface: " + genericClass + " against " + superInterface);
> + ClassInfo genericClassInfo = (ClassInfo) factory.getTypeInfo(genericClass);
> + assertEquals(genericClassInfo, superInterface);
> +
> + TypeInfo[] types = new TypeInfo[genericTypes.length];
> + for (int i = 0; i < types.length; ++i)
> + types[i] = factory.getTypeInfo(genericTypes[i]);
> + TypeInfo[] actualTypes = superInterface.getActualTypeArguments();
> + getLog().debug("Checking superInterface types: " + Arrays.asList(genericTypes) + " against " + Arrays.asList(actualTypes));
> + assertEquals(types.length, actualTypes.length);
> + for (int i = 0; i < types.length; ++i)
> + assertEquals(types[i], actualTypes[i]);
> + }
> +
> + public void testGenericMethodsClass() throws Throwable
> + {
> + testGenericClass(ClassInfoGenericMethodsClass.class);
> + }
> +
> + public void testGenericConstructorsClass() throws Throwable
> + {
> + testGenericClass(ClassInfoGenericConstructorsClass.class);
> + }
> +
> + public void testGenericFieldsClass() throws Throwable
> + {
> + testGenericClass(ClassInfoGenericFieldsClass.class);
> + }
> +
> + private void testGenericClass(Class clazz) throws Throwable
> + {
> + ClassInfoImpl expected = new ClassInfoImpl(clazz.getName(), Modifier.PUBLIC);
> + TypeInfo info = testBasics(clazz, expected);
> +
> + assertFalse(info.isArray());
> + assertFalse(info.isEnum());
> + assertFalse(info.isPrimitive());
> +
> + ClassInfo classInfo = (ClassInfo) info;
> + assertClassInfo(classInfo, clazz);
> + }
> +}
>
> Added: projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/ClassInfoGenericInterfaceTest.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/ClassInfoGenericInterfaceTest.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/ClassInfoGenericInterfaceTest.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -0,0 +1,67 @@
> +/*
> +* JBoss, Home of Professional Open Source
> +* Copyright 2006, JBoss Inc., and individual contributors as indicated
> +* by the @authors tag. See the copyright.txt 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.test;
> +
> +import java.lang.reflect.Modifier;
> +
> +import org.jboss.reflect.plugins.ClassInfoImpl;
> +import org.jboss.reflect.spi.ClassInfo;
> +import org.jboss.reflect.spi.TypeInfo;
> +import org.jboss.test.classinfo.support.ClassInfoGenericFieldsInterface;
> +import org.jboss.test.classinfo.support.ClassInfoGenericMethodsInterface;
> +
> +/**
> + * ClassInfoInterfaceTest.
> + *
> + * @author <a href="adrian at jboss.com">Adrian Brock</a>
> + * @version $Revision: 1.1 $
> + */
> +public abstract class ClassInfoGenericInterfaceTest extends AbstractClassInfoTest
> +{
> + public ClassInfoGenericInterfaceTest(String name)
> + {
> + super(name);
> + }
> +
> + public void testGenericMethodsInterface() throws Throwable
> + {
> + testGenericInterface(ClassInfoGenericMethodsInterface.class);
> + }
> +
> + public void testGenericFieldsInterface() throws Throwable
> + {
> + testGenericInterface(ClassInfoGenericFieldsInterface.class);
> + }
> +
> + private void testGenericInterface(Class clazz) throws Throwable
> + {
> + ClassInfoImpl expected = new ClassInfoImpl(clazz.getName(), Modifier.PUBLIC);
> + TypeInfo info = testBasics(clazz, expected);
> +
> + assertFalse(info.isArray());
> + assertFalse(info.isEnum());
> + assertFalse(info.isPrimitive());
> +
> + ClassInfo classInfo = (ClassInfo) info;
> + assertClassInfo(classInfo, clazz);
> + }
> +}
>
> Modified: projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/ClassInfoTestSuite.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/ClassInfoTestSuite.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/ClassInfoTestSuite.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -56,6 +56,8 @@
> suite.addTest(JavassistClassInfoTestCase.suite());
> suite.addTest(IntrospectionAnnotatedClassInfoTestCase.suite());
> suite.addTest(JavassistAnnotatedClassInfoTestCase.suite());
> + suite.addTest(IntrospectionGenericInterfaceUnitTestCase.suite());
> + suite.addTest(IntrospectionGenericClassUnitTestCase.suite());
>
> return suite;
> }
>
> Added: projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/IntrospectionGenericClassUnitTestCase.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/IntrospectionGenericClassUnitTestCase.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/IntrospectionGenericClassUnitTestCase.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -0,0 +1,52 @@
> +/*
> +* JBoss, Home of Professional Open Source
> +* Copyright 2005, JBoss Inc., and individual contributors as indicated
> +* by the @authors tag. See the copyright.txt 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.test;
> +
> +import junit.framework.Test;
> +
> +import org.jboss.reflect.plugins.introspection.IntrospectionTypeInfoFactory;
> +import org.jboss.reflect.spi.TypeInfoFactory;
> +
> +/**
> + * Introspection ClassInfo Test Case.
> + *
> + * @author <a href="adrian at jboss.com">Adrian Brock</a>
> + * @version $Revision: 45663 $
> + */
> +public class IntrospectionGenericClassUnitTestCase extends ClassInfoGenericClassTest
> +{
> + public static Test suite()
> + {
> + return suite(IntrospectionGenericClassUnitTestCase.class);
> + }
> +
> + public IntrospectionGenericClassUnitTestCase(String name)
> + {
> + super(name);
> + }
> +
> + protected TypeInfoFactory getTypeInfoFactory()
> + {
> + return new IntrospectionTypeInfoFactory();
> + }
> +
> +}
> \ No newline at end of file
>
> Added: projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/IntrospectionGenericInterfaceUnitTestCase.java
> ===================================================================
> --- projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/IntrospectionGenericInterfaceUnitTestCase.java 2006-12-04 14:20:46 UTC (rev 58837)
> +++ projects/microcontainer/trunk/container/src/tests/org/jboss/test/classinfo/test/IntrospectionGenericInterfaceUnitTestCase.java 2006-12-04 14:40:50 UTC (rev 58838)
> @@ -0,0 +1,51 @@
> +/*
> +* JBoss, Home of Professional Open Source
> +* Copyright 2006, JBoss Inc., and individual contributors as indicated
> +* by the @authors tag. See the copyright.txt 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.test;
> +
> +import junit.framework.Test;
> +
> +import org.jboss.reflect.plugins.introspection.IntrospectionTypeInfoFactory;
> +import org.jboss.reflect.spi.TypeInfoFactory;
> +
> +/**
> + * IntrospectionGenericInterfaceUnitTestCase.
> + *
> + * @author <a href="adrian at jboss.com">Adrian Brock</a>
> + * @version $Revision: 1.1 $
> + */
> +public class IntrospectionGenericInterfaceUnitTestCase extends ClassInfoGenericInterfaceTest
> +{
> + public IntrospectionGenericInterfaceUnitTestCase(String name)
> + {
> + super(name);
> + }
> +
> + public static Test suite()
> + {
> + return suite(IntrospectionGenericInterfaceUnitTestCase.class);
> + }
> +
> + protected TypeInfoFactory getTypeInfoFactory()
> + {
> + return new IntrospectionTypeInfoFactory();
> + }
> +}
>
> _______________________________________________
> jboss-cvs-commits mailing list
> jboss-cvs-commits at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/jboss-cvs-commits
>
>
>
More information about the jboss-cvs-commits
mailing list