[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