From: <hib...@li...> - 2006-03-07 21:13:13
|
Author: nusco Date: 2006-03-07 16:12:50 -0500 (Tue, 07 Mar 2006) New Revision: 9569 Added: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXArrayType.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXCollectionType.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXSimpleType.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXType.java Removed: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/PropertyTypeExtractor.java Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XClass.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMember.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMethod.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XProperty.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMember.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMethod.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXProperty.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/ApproximatingTypeEnvironment.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeEnvironmentFactory.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeUtils.java trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXPropertyTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/BigBlob.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/TypeUtilsTest.java Log: Approximation of generic types Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -575,7 +575,7 @@ do { current = state.clazz; if ( current.isAnnotationPresent( IdClass.class) ) { - idClass = (IdClass) current.getAnnotation( IdClass.class ); + idClass = current.getAnnotation( IdClass.class ); break; } state = InheritanceState.getSuperclassInheritanceState( current, inheritanceStatePerClass ); @@ -706,7 +706,7 @@ explicitAccessType = superEntityState != null ? superEntityState.accessType : null; } else { - AccessType access = (AccessType) clazzToProcess.getAnnotation( AccessType.class ); + AccessType access = clazzToProcess.getAnnotation( AccessType.class ); explicitAccessType = access != null ? access.value() : null; if ( "property".equals( explicitAccessType ) ) { isExplicitPropertyAnnotated = Boolean.TRUE; @@ -847,7 +847,7 @@ String propertyAccessor, final XClass annotatedClass ) { boolean hasIdentifier = false; - AccessType access = (AccessType) annotatedClass.getAnnotation( AccessType.class ); + AccessType access = annotatedClass.getAnnotation( AccessType.class ); String localPropertyAccessor = access != null ? access.value() : null; String accessType = null; if ( "property".equals( localPropertyAccessor ) || "field".equals( localPropertyAccessor ) ) { @@ -869,6 +869,8 @@ log.debug( "Processing " + propertyHolder.getEntityName() + " " + accessType + " annotation" ); List<XProperty> properties = annotatedClass.getDeclaredProperties(accessType); for ( XProperty p : properties ) { + if( !p.isTypeResolved() ) + throw new IllegalStateException( "Couldn't bind the type for property " + p ); final boolean currentHasIdentifier = addProperty( p, elements, localPropertyAccessor ); hasIdentifier = hasIdentifier || currentHasIdentifier; } @@ -944,8 +946,8 @@ } } if ( property.isAnnotationPresent( Column.class ) || property.isAnnotationPresent( Formula.class ) ) { - Column ann = (Column) property.getAnnotation( Column.class ); - Formula formulaAnn = (Formula) property.getAnnotation( Formula.class ); + Column ann = property.getAnnotation( Column.class ); + Formula formulaAnn = property.getAnnotation( Formula.class ); columns = Ejb3Column.buildColumnFromAnnotation( new Column[]{ann}, formulaAnn, nullability, propertyHolder, inferredData, entityBinder.getSecondaryTables(), mappings @@ -985,7 +987,7 @@ else if ( joinColumns == null && ( property.isAnnotationPresent( OneToMany.class ) || property.isAnnotationPresent( CollectionOfElements.class ) ) ) { - OneToMany oneToMany = (OneToMany) property.getAnnotation( OneToMany.class ); + OneToMany oneToMany = property.getAnnotation( OneToMany.class ); String mappedBy = oneToMany != null ? oneToMany.mappedBy() : ""; @@ -1038,7 +1040,7 @@ localGenerators.putAll( buildLocalGenerators( property, mappings ) ); //manage composite related metadata - Embeddable embeddableAnn = (Embeddable) returnedClass.getAnnotation( Embeddable.class ); + Embeddable embeddableAnn = returnedClass.getAnnotation( Embeddable.class ); //guess if its a component and find id data access (property, field etc) final boolean isComponent = embeddableAnn != null || property.isAnnotationPresent( EmbeddedId.class ); boolean propertyAnnotated = entityBinder.isPropertyAnnotated( returnedClass ); @@ -1117,7 +1119,7 @@ boolean onDeleteCascade = onDeleteAnn != null && OnDeleteAction.CASCADE.equals( onDeleteAnn.action() ); bindManyToOne( getCascadeStrategy( ann.cascade(), hibernateCascade ), - (Ejb3JoinColumn[]) joinColumns, + joinColumns, ann.optional(), getFetchMode( ann.fetch() ), ignoreNotFound, onDeleteCascade, inferredData.getPropertyName(), @@ -1138,7 +1140,7 @@ boolean onDeleteCascade = onDeleteAnn != null && OnDeleteAction.CASCADE.equals( onDeleteAnn.action() ); bindOneToOne( getCascadeStrategy( ann.cascade(), hibernateCascade ), - (Ejb3JoinColumn[]) joinColumns, + joinColumns, ann.optional(), getFetchMode( ann.fetch() ), ignoreNotFound, onDeleteCascade, inferredData.getPropertyName(), @@ -1207,8 +1209,8 @@ if ( property.isAnnotationPresent( Column.class ) || property.isAnnotationPresent( Formula.class ) ) { - Column ann = (Column) property.getAnnotation( Column.class ); - Formula formulaAnn = (Formula) property.getAnnotation( Formula.class ); + Column ann = property.getAnnotation( Column.class ); + Formula formulaAnn = property.getAnnotation( Formula.class ); elementColumns = Ejb3Column.buildColumnFromAnnotation( new Column[]{ann}, formulaAnn, @@ -1309,7 +1311,7 @@ boolean optional = true; boolean lazy = false; if ( property.isAnnotationPresent( Basic.class ) ) { - Basic ann = (Basic) property.getAnnotation( Basic.class ); + Basic ann = property.getAnnotation( Basic.class ); optional = ann.optional(); lazy = ann.fetch() == FetchType.LAZY; } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XClass.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XClass.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XClass.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -41,7 +41,7 @@ boolean isPrimitive(); boolean isEnum(); - + boolean isAssignableFrom(XClass c); List<XProperty> getDeclaredProperties(String accessType); Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMember.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMember.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMember.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -8,7 +8,6 @@ */ public abstract interface XMember extends XAnnotatedElement { - String getName(); boolean isCollection(); @@ -36,6 +35,11 @@ * The type of this property's elements for arrays, the type of the property itself for everything else. */ XClass getClassOrElementClass(); + + /** + * The type of this map's key, or null for anything that is not a map. + */ + XClass getMapKey(); /** * Same modifiers as java.lang.Member#getModifiers() @@ -46,4 +50,6 @@ void setAccessible(boolean accessible); public Object invoke(Object target, Object... parameters); + + boolean isTypeResolved(); } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMethod.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMethod.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XMethod.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -10,6 +10,4 @@ * * @author Emmanuel Bernard */ -public interface XMethod extends XMember { - Object invoke(Object target, Object... parameters); -} +public interface XMethod extends XMember {} Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XProperty.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XProperty.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/XProperty.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -18,6 +18,4 @@ * Unqualify the getter name */ String getName(); - - boolean isTypeResolved(); } Added: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXArrayType.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXArrayType.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXArrayType.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -0,0 +1,76 @@ +package org.hibernate.reflection.java; + +import java.lang.reflect.Array; +import java.lang.reflect.GenericArrayType; +import java.lang.reflect.Type; +import java.util.Collection; + +import org.hibernate.reflection.XClass; +import org.hibernate.reflection.java.generics.TypeEnvironment; +import org.hibernate.reflection.java.generics.TypeSwitch; + +/** + * @author Emmanuel Bernard + * @author Paolo Perrotta + */ +class JavaXArrayType extends JavaXType { + + public JavaXArrayType(Type type, TypeEnvironment context, JavaXFactory factory) { + super( type, context, factory ); + } + + public boolean isArray() { + return true; + } + + public boolean isCollection() { + return false; + } + + public XClass getElementClass() { + return toXClass( getElementType() ); + } + + private Type getElementType() { + return new TypeSwitch<Type>() { + @Override + public Type caseClass(Class classType) { + return classType.getComponentType(); + } + + @Override + public Type caseGenericArrayType(GenericArrayType genericArrayType) { + return genericArrayType.getGenericComponentType(); + } + + @Override + public Type defaultCase(Type t) { + throw new IllegalArgumentException( t + " is not an array type" ); + } + }.doSwitch( resolve() ); + } + + public XClass getClassOrElementClass() { + return getElementClass(); + } + + public Class<? extends Collection> getCollectionClass() { + return null; + } + + public XClass getMapKey() { + return null; + } + + public XClass getType() { + Type boundType = getElementType(); + if ( boundType instanceof Class ) { + boundType = arrayTypeOf( (Class) boundType ); + } + return toXClass( boundType ); + } + + private Class<? extends Object> arrayTypeOf(Class componentType) { + return Array.newInstance( componentType, 0 ).getClass(); + } +} \ No newline at end of file Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -1,16 +1,15 @@ package org.hibernate.reflection.java; import java.lang.reflect.Field; -import java.lang.reflect.Member; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.LinkedList; import java.util.List; +import org.hibernate.reflection.Filter; import org.hibernate.reflection.XClass; -import org.hibernate.reflection.XProperty; import org.hibernate.reflection.XMethod; -import org.hibernate.reflection.Filter; +import org.hibernate.reflection.XProperty; import org.hibernate.reflection.java.generics.TypeEnvironment; /** @@ -65,7 +64,7 @@ List<XProperty> result = new LinkedList<XProperty>(); for ( Field f : toClass().getDeclaredFields() ) if ( JavaXProperty.isProperty( f, getTypeEnvironment().bind( f.getGenericType() ), filter ) ) - maybeAdd( result, f ); + result.add( getFactory().getXProperty( f, this ) ); return result; } @@ -73,17 +72,10 @@ List<XProperty> result = new LinkedList<XProperty>(); for ( Method m : toClass().getDeclaredMethods() ) if ( JavaXProperty.isProperty( m, getTypeEnvironment().bind( m.getGenericReturnType() ), filter ) ) - maybeAdd( result, m ); + result.add( getFactory().getXProperty( m, this ) ); return result; } - // TODO: remove to allow properties with unresolved types - private void maybeAdd(List<XProperty> result, Member m) { - XProperty property = getFactory().getXProperty( m, this ); - if( property.isTypeResolved() ) - result.add( property ); - } - public List<XProperty> getDeclaredProperties(String accessType) { return getDeclaredProperties( accessType, XClass.DEFAULT_FILTER ); } @@ -96,6 +88,14 @@ throw new IllegalArgumentException( "Unknown access type " + accessType ); } + public List<XMethod> getDeclaredMethods() { + List<XMethod> result = new LinkedList<XMethod>(); + for ( Method m : toClass().getDeclaredMethods() ) { + result.add( getFactory().getXMethod( m, this ) ); + } + return result; + } + public Class<?> toClass() { return (Class) toAnnotatedElement(); } @@ -108,17 +108,7 @@ return toClass().isArray(); } - public List<XMethod> getDeclaredMethods() { - List<XMethod> result = new LinkedList<XMethod>(); - for ( Method m : toClass().getDeclaredMethods() ) { - // if ( JavaXProperty.isProperty( m, getTypeEnvironment().bind( m.getGenericReturnType() ) ) ) - XMethod p = getFactory().getXMethod( m, this ); - if (p != null) result.add(p); - } - return result; - } - TypeEnvironment getTypeEnvironment() { return context; } -} +} \ No newline at end of file Added: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXCollectionType.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXCollectionType.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXCollectionType.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -0,0 +1,71 @@ +package org.hibernate.reflection.java; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Collection; +import java.util.Map; + +import org.hibernate.reflection.XClass; +import org.hibernate.reflection.java.generics.TypeEnvironment; +import org.hibernate.reflection.java.generics.TypeSwitch; +import org.hibernate.reflection.java.generics.TypeUtils; + +/** + * @author Emmanuel Bernard + * @author Paolo Perrotta + */ +class JavaXCollectionType extends JavaXType { + + public JavaXCollectionType(Type type, TypeEnvironment context, JavaXFactory factory) { + super( type, context, factory ); + } + + public boolean isArray() { + return false; + } + + public boolean isCollection() { + return true; + } + + public XClass getElementClass() { + return new TypeSwitch<XClass>() { + @Override + public XClass caseParameterizedType(ParameterizedType parameterizedType) { + Type[] args = parameterizedType.getActualTypeArguments(); + Type componentType; + if ( getCollectionClass().isAssignableFrom( Map.class ) ) { + componentType = args[1]; + } + else { + componentType = args[0]; + } + return toXClass( componentType ); + } + }.doSwitch( resolve() ); + } + + public XClass getMapKey() { + return new TypeSwitch<XClass>() { + @Override + public XClass caseParameterizedType(ParameterizedType parameterizedType) { + if ( getCollectionClass().isAssignableFrom( Map.class ) ) { + return toXClass( parameterizedType.getActualTypeArguments()[0] ); + } + return null; + } + }.doSwitch( resolve() ); + } + + public XClass getClassOrElementClass() { + return toXClass( resolve() ); + } + + public Class<? extends Collection> getCollectionClass() { + return TypeUtils.getCollectionClass( resolve() ); + } + + public XClass getType() { + return toXClass( resolve() ); + } +} \ No newline at end of file Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -1,11 +1,8 @@ package org.hibernate.reflection.java; -import java.lang.reflect.Array; -import java.lang.reflect.GenericArrayType; import java.lang.reflect.Member; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; -import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -56,6 +53,7 @@ private final Map<Package, JavaXPackage> packagesToXPackages = new HashMap<Package, JavaXPackage>(); private final Map<PropertyKey, JavaXProperty> xProperties = new HashMap<PropertyKey, JavaXProperty>(); + private final Map<PropertyKey, JavaXMethod> xMethods = new HashMap<PropertyKey, JavaXMethod>(); private final TypeEnvironmentFactory typeEnvs = new TypeEnvironmentFactory(); @@ -108,7 +106,7 @@ public XClass caseParameterizedType(ParameterizedType parameterizedType) { return toXClass( parameterizedType.getRawType(), context ); } - }.doSwitch( t ); + }.doSwitch( context.bind( t ) ); } XPackage getXAnnotatedElement(Package pkg) { @@ -142,141 +140,6 @@ return xMethod; } - private PropertyTypeExtractor buildArrayTypeExtractor(final TypeEnvironment context, final Type propType) { - return new PropertyTypeExtractor() { - - public boolean isArray() { - return true; - } - - public boolean isCollection() { - return false; - } - - public XClass getElementClass() { - return JavaXFactory.this.toXClass( getElementType(), context ); - } - - private Type getElementType() { - return new TypeSwitch<Type>() { - @Override - public Type caseClass(Class classType) { - return classType.getComponentType(); - } - - @Override - public Type caseGenericArrayType(GenericArrayType genericArrayType) { - return genericArrayType.getGenericComponentType(); - } - - @Override - public Type defaultCase(Type t) { - throw new IllegalArgumentException( t + " is not an array type" ); - } - }.doSwitch( propType ); - } - - public XClass getClassOrElementClass() { - return getElementClass(); - } - - public Class<? extends Collection> getCollectionClass() { - return null; - } - - public XClass getType() { - Type boundType = getElementType(); - if ( boundType instanceof Class ) { - boundType = arrayTypeOf( (Class) boundType ); - } - return JavaXFactory.this.toXClass( boundType, context ); - } - - private Class<? extends Object> arrayTypeOf(Class componentType) { - return Array.newInstance( componentType, 0 ).getClass(); - } - }; - } - - private PropertyTypeExtractor buildCollectionTypeExtractor(final TypeEnvironment context, final Type propType) { - return new PropertyTypeExtractor() { - - public boolean isArray() { - return false; - } - - public boolean isCollection() { - return true; - } - - public XClass getElementClass() { - return new TypeSwitch<XClass>() { - @Override - public XClass caseParameterizedType(ParameterizedType parameterizedType) { - Type[] args = parameterizedType.getActualTypeArguments(); - Type componentType; - if ( getCollectionClass().isAssignableFrom( Map.class ) ) { - componentType = args[1]; - } - else { - componentType = args[0]; - } - return JavaXFactory.this.toXClass( componentType, context ); - } - }.doSwitch( propType ); - } - - public XClass getClassOrElementClass() { - return JavaXFactory.this.toXClass( context.bind( propType ), context ); - } - - public Class<? extends Collection> getCollectionClass() { - return TypeUtils.getCollectionClass( propType ); - } - - public XClass getType() { - return JavaXFactory.this.toXClass( getJavaType(), context ); - } - - private Type getJavaType() { - return context.bind( propType ); - } - }; - } - - private PropertyTypeExtractor buildSimpleTypeExtractor(final TypeEnvironment context, final Type propType) { - return new PropertyTypeExtractor() { - - public boolean isArray() { - return false; - } - - public boolean isCollection() { - return false; - } - - public XClass getElementClass() { - return JavaXFactory.this.toXClass( context.bind( propType ), context ); - } - - public XClass getClassOrElementClass() { - return getElementClass(); - } - - public Class<? extends Collection> getCollectionClass() { - return null; - } - - public XClass getType() { - return JavaXFactory.this.toXClass( getJavaType(), context ); - } - - private Type getJavaType() { - return context.bind( propType ); - } - }; - } - TypeEnvironment getTypeEnvironment(final Type t) { return new TypeSwitch<TypeEnvironment>() { @Override @@ -296,15 +159,16 @@ }.doSwitch( t ); } - public PropertyTypeExtractor buildTypeExtractor(TypeEnvironment context, Type propType) { - if ( TypeUtils.isArray( propType ) ) - return buildArrayTypeExtractor( context, propType ); - if ( TypeUtils.isCollection( propType ) ) - return buildCollectionTypeExtractor( context, propType ); - if ( TypeUtils.isBase( propType ) ) - return buildSimpleTypeExtractor( context, propType ); - // TODO: manage unresolved types and void.class - return buildSimpleTypeExtractor( context, propType ); + public JavaXType toXType(TypeEnvironment context, Type propType) { + Type boundType = toApproximatingEnvironment( context ).bind( propType ); + if ( TypeUtils.isArray( boundType ) ) + return new JavaXArrayType( propType, context, this ); + if ( TypeUtils.isCollection( boundType ) ) + return new JavaXCollectionType( propType, context, this ); + if ( TypeUtils.isBase( boundType ) ) + return new JavaXSimpleType( propType, context, this ); + assert TypeUtils.isVoid( boundType ); + throw new IllegalArgumentException( "No PropertyTypeExtractor available for type void "); } public boolean equals(XClass class1, Class class2) { @@ -314,6 +178,10 @@ return ( (JavaXClass) class1 ).toClass().equals( class2 ); } + public TypeEnvironment toApproximatingEnvironment(TypeEnvironment context) { + return typeEnvs.toApproximatingEnvironment( context ); + } + XMLContext getXMLContext() { return xmlContext; } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMember.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMember.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMember.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -17,9 +17,9 @@ * @author Emmanuel Bernard */ public abstract class JavaXMember extends JavaXAnnotatedElement implements XMember { - protected final Type type; - protected final TypeEnvironment env; - protected final PropertyTypeExtractor propertyTypeExtractor; + private final Type type; + private final TypeEnvironment env; + private final JavaXType xType; protected static Type typeOf(Member member, TypeEnvironment env) { if ( member instanceof Field ) @@ -29,15 +29,15 @@ throw new IllegalArgumentException( "Member " + member + " is neither a field nor a method" ); } - protected JavaXMember(Member member, Type type, TypeEnvironment env, JavaXFactory factory, PropertyTypeExtractor propertyTypeExtractor) { + protected JavaXMember(Member member, Type type, TypeEnvironment env, JavaXFactory factory, JavaXType xType) { super( (AnnotatedElement) member, factory ); this.type = type; this.env = env; - this.propertyTypeExtractor = propertyTypeExtractor; + this.xType = xType; } public XClass getType() { - return propertyTypeExtractor.getType(); + return xType.getType(); } public abstract String getName(); @@ -55,29 +55,37 @@ } public Class<? extends Collection> getCollectionClass() { - return propertyTypeExtractor.getCollectionClass(); + return xType.getCollectionClass(); } public XClass getClassOrElementClass() { - return propertyTypeExtractor.getClassOrElementClass(); + return xType.getClassOrElementClass(); } public XClass getElementClass() { - return propertyTypeExtractor.getElementClass(); + return xType.getElementClass(); } + public XClass getMapKey() { + return xType.getMapKey(); + } + public boolean isArray() { - return propertyTypeExtractor.isArray(); + return xType.isArray(); } public boolean isCollection() { - return propertyTypeExtractor.isCollection(); + return xType.isCollection(); } public int getModifiers() { return getMember().getModifiers(); } + public final boolean isTypeResolved() { + return xType.isResolved(); + } + public void setAccessible(boolean accessible) { ( (AccessibleObject) getMember() ).setAccessible( accessible ); } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMethod.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMethod.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXMethod.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -15,14 +15,12 @@ static JavaXMethod create(Member member, TypeEnvironment context, JavaXFactory factory) { final Type propType = typeOf( member, context ); - PropertyTypeExtractor typeExtractor = factory.buildTypeExtractor( context, propType ); - if( typeExtractor == null ) - return null; - return new JavaXMethod( member, propType, context, factory, typeExtractor); + JavaXType xType = factory.toXType( context, propType ); + return new JavaXMethod( member, propType, context, factory, xType); } - private JavaXMethod(Member member, Type type, TypeEnvironment env, JavaXFactory factory, PropertyTypeExtractor propertyTypeExtractor) { - super(member, type, env, factory, propertyTypeExtractor); + private JavaXMethod(Member member, Type type, TypeEnvironment env, JavaXFactory factory, JavaXType xType) { + super(member, type, env, factory, xType); assert member instanceof Method; } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXProperty.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXProperty.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXProperty.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -42,12 +42,12 @@ static JavaXProperty create(Member member, final TypeEnvironment context, final JavaXFactory factory) { final Type propType = typeOf( member, context ); - PropertyTypeExtractor typeExtractor = factory.buildTypeExtractor( context, propType ); - return new JavaXProperty( member, propType, context, factory, typeExtractor ); + JavaXType xType = factory.toXType( context, propType ); + return new JavaXProperty( member, propType, context, factory, xType ); } - private JavaXProperty(Member member, Type type, TypeEnvironment env, JavaXFactory factory, PropertyTypeExtractor propertyTypeExtractor) { - super(member, type, env, factory, propertyTypeExtractor); + private JavaXProperty(Member member, Type type, TypeEnvironment env, JavaXFactory factory, JavaXType xType) { + super(member, type, env, factory, xType); assert member instanceof Field || member instanceof Method; } @@ -84,8 +84,9 @@ throw new IllegalStateException( "Unable to invoke " + getName(), e ); } } - - public boolean isTypeResolved() { - return TypeUtils.isFullyResolved( env.bind( type ) ); + + @Override + public String toString() { + return getName(); } } \ No newline at end of file Added: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXSimpleType.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXSimpleType.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXSimpleType.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -0,0 +1,46 @@ +package org.hibernate.reflection.java; + +import java.lang.reflect.Type; +import java.util.Collection; + +import org.hibernate.reflection.XClass; +import org.hibernate.reflection.java.generics.TypeEnvironment; + +/** + * @author Emmanuel Bernard + * @author Paolo Perrotta + */ +class JavaXSimpleType extends JavaXType { + + public JavaXSimpleType(Type type, TypeEnvironment context, JavaXFactory factory) { + super( type, context, factory ); + } + + public boolean isArray() { + return false; + } + + public boolean isCollection() { + return false; + } + + public XClass getElementClass() { + return toXClass( resolve() ); + } + + public XClass getClassOrElementClass() { + return getElementClass(); + } + + public Class<? extends Collection> getCollectionClass() { + return null; + } + + public XClass getType() { + return toXClass( resolve() ); + } + + public XClass getMapKey() { + return null; + } +} \ No newline at end of file Added: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXType.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXType.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXType.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -0,0 +1,50 @@ +//$Id: PropertyTypeExtractor.java 9316 2006-02-22 20:47:31Z epbernard $ +package org.hibernate.reflection.java; + +import java.lang.reflect.Type; +import java.util.Collection; + +import org.hibernate.reflection.XClass; +import org.hibernate.reflection.java.generics.TypeEnvironment; +import org.hibernate.reflection.java.generics.TypeUtils; + +/** + * The Java X-layer equivalent to a Java <code>Type</code>. + * + * @author Emmanuel Bernard + * @author Paolo Perrotta + */ +abstract class JavaXType { + + private final Type unboundType; + private final TypeEnvironment context; + private final TypeEnvironment approximatingContext; + private final JavaXFactory factory; + + protected JavaXType( Type unboundType, TypeEnvironment context, JavaXFactory factory ) { + this.unboundType = unboundType; + this.context = context; + this.approximatingContext = factory.toApproximatingEnvironment( context ); + this.factory = factory; + } + + abstract public boolean isArray(); + abstract public boolean isCollection(); + abstract public XClass getElementClass(); + abstract public XClass getClassOrElementClass(); + abstract public Class<? extends Collection> getCollectionClass(); + abstract public XClass getMapKey(); + abstract public XClass getType(); + + public boolean isResolved() { + return TypeUtils.isResolved( context.bind( unboundType ) ); + } + + protected Type resolve() { + return approximatingContext.bind( unboundType ); + } + + protected XClass toXClass(Type type) { + return factory.toXClass( type, context ); + } +} Deleted: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/PropertyTypeExtractor.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/PropertyTypeExtractor.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/PropertyTypeExtractor.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -1,18 +0,0 @@ -//$Id$ -package org.hibernate.reflection.java; - -import java.util.Collection; - -import org.hibernate.reflection.XClass; - -/** - * @author Emmanuel Bernard - */ -interface PropertyTypeExtractor { - boolean isArray(); - boolean isCollection(); - XClass getElementClass(); - XClass getClassOrElementClass(); - Class<? extends Collection> getCollectionClass(); - XClass getType(); -} Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/ApproximatingTypeEnvironment.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/ApproximatingTypeEnvironment.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/ApproximatingTypeEnvironment.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -8,8 +8,7 @@ import java.lang.reflect.WildcardType; /** - * A <code>TypeEnvironment</code> decorator that always binds all the generic components of the given type. - * When this is not possible, it approximates the "unbindable" components to their nearest upper binding. + * A <code>TypeEnvironment</code> that approximates the unresolved components of a <code>Type</code> to their nearest upper binding. * <p> * For example:<br> * <code>T</code> becomes <code>Object</code>.<br> @@ -20,23 +19,17 @@ * If a wildcard or type variable has multiple upper bounds, it will be approximated to Object. * Information on lower bounds is discarded during approximation.<p> * - * Array of a generic type is approximated to an array of <code>Object</code>s. Example:<br> - * <code>List<T>[]</code> becomes <code>Object[]</code>. + * An generic array is always approximated to an array of <code>Object</code>s. Example:<br> + * <code>List<T>[]</code> becomes <code>Object[]</code>. This is sub-optimal, but a finer + * approximations has implementation problems. * * @return a type where the generic arguments have been replaced by raw classes. * * @author Paolo Perrotta */ -public class ApproximatingTypeEnvironment implements TypeEnvironment { +class ApproximatingTypeEnvironment implements TypeEnvironment { - private final TypeEnvironment decoratedTypeEnvironment; - - public ApproximatingTypeEnvironment(TypeEnvironment decoratedTypeEnvironment) { - this.decoratedTypeEnvironment = decoratedTypeEnvironment; - } - public Type bind(final Type type) { - Type unboundResult = decoratedTypeEnvironment.bind( type ); Type result = new TypeSwitch<Type>() { public Type caseWildcardType(WildcardType wildcardType) { return collapseToUpperBound( wildcardType.getUpperBounds() ); @@ -49,7 +42,7 @@ @Override public Type caseGenericArrayType(GenericArrayType genericArrayType) { - if( TypeUtils.isFullyResolved( genericArrayType ) ) + if( TypeUtils.isResolved( genericArrayType ) ) return genericArrayType; Type componentType = genericArrayType.getGenericComponentType(); Type boundComponentType = bind( componentType ); @@ -60,7 +53,7 @@ @Override public Type caseParameterizedType(ParameterizedType parameterizedType) { - if( TypeUtils.isFullyResolved( parameterizedType ) ) + if( TypeUtils.isResolved( parameterizedType ) ) return parameterizedType; Type[] typeArguments = parameterizedType.getActualTypeArguments(); Type[] boundTypeArguments = new Type[typeArguments.length]; @@ -84,8 +77,8 @@ public Type defaultCase(Type t) { throw new IllegalArgumentException( "Unknown subclass of Type: " + t.getClass() ); } - }.doSwitch( unboundResult ); - assert TypeUtils.isFullyResolved( result ); + }.doSwitch( type ); + assert TypeUtils.isResolved( result ); return result; } } Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeEnvironmentFactory.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeEnvironmentFactory.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeEnvironmentFactory.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -30,6 +30,10 @@ return doGetEnvironment( context ); } + public TypeEnvironment toApproximatingEnvironment(TypeEnvironment context) { + return new CompoundTypeEnvironment( new ApproximatingTypeEnvironment(), context ); + } + private TypeEnvironment doGetEnvironment(Type context) { if ( context == null ) return IdentityTypeEnvironment.INSTANCE; Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeUtils.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeUtils.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeUtils.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -7,9 +7,12 @@ import java.lang.reflect.WildcardType; import java.util.Collection; +/** + * @author Paolo Perrotta + */ public class TypeUtils { - public static boolean isFullyResolved(Type t) { + public static boolean isResolved(Type t) { return new TypeSwitch<Boolean>() { @Override public Boolean caseClass(Class classType) { @@ -18,16 +21,16 @@ @Override public Boolean caseGenericArrayType(GenericArrayType genericArrayType) { - return isFullyResolved( genericArrayType.getGenericComponentType() ); + return isResolved( genericArrayType.getGenericComponentType() ); } @Override public Boolean caseParameterizedType(ParameterizedType parameterizedType) { Type[] typeArgs = parameterizedType.getActualTypeArguments(); for ( Type arg : typeArgs ) - if( !isFullyResolved( arg )) + if( !isResolved( arg )) return false; - return isFullyResolved( parameterizedType.getRawType() ); + return isResolved( parameterizedType.getRawType() ); } @Override Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/validator/ClassValidator.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -171,6 +171,8 @@ } } ); for ( XProperty field : fields ) { + if( !field.isTypeResolved() ) + throw new IllegalStateException( "Couldn't bind the type of property field " + field ); createMemberValidator( field ); createChildValidator( resourceBundle, field, field.getType() ); } Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -63,11 +63,10 @@ assertEquals( 1, fieldProperties.size() ); } - // TODO: uncomment ASAP -// public void testExtractsPublicMethodsAsProperties() { -// List<XProperty> methodProperties = clazz.getDeclaredProperties( "property" ); -// assertEquals( 7, methodProperties.size() ); -// } + public void testExtractsPublicMethodsAsProperties() { + List<XProperty> methodProperties = clazz.getDeclaredProperties( "property" ); + assertEquals( 7, methodProperties.size() ); + } public void testCanBeAbstract() { assertFalse( clazz.isAbstract() ); Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXPropertyTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXPropertyTest.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXPropertyTest.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -43,21 +43,20 @@ assertEquals( "fieldProperty", field.getName() ); } - // TODO: uncomment ASAP -// public void testReturnsPropertiesWithUnresolvedParametricTypes() { -// assertEquals( 7, dadAsSeenFromItself.getDeclaredProperties( "property" ).size() ); -// } -// -// public void testKnowsWhetherItsTypesAreFullyResolved() { -// XProperty notFullyResolvedProperty = getPropertyNamed_from( "collectionProperty", dadAsSeenFromItself -// .getDeclaredProperties( "property" ) ); -// assertFalse( notFullyResolvedProperty.isTypeResolved() ); -// XProperty fullyResolvedProperty = getPropertyNamed_from( "collectionProperty", dadAsSeenFromSon -// .getDeclaredProperties( "property" ) ); -// assertTrue( fullyResolvedProperty.isTypeResolved() ); -// } + public void testReturnsPropertiesWithUnresolvedParametricTypes() { + assertEquals( 7, dadAsSeenFromItself.getDeclaredProperties( "property" ).size() ); + } - public void testPropertiesFiltered() { + public void testKnowsWhetherItsTypeIsFullyResolved() { + XProperty notFullyResolvedProperty = getPropertyNamed_from( "collectionProperty", dadAsSeenFromItself + .getDeclaredProperties( "property" ) ); + assertFalse( notFullyResolvedProperty.isTypeResolved() ); + XProperty fullyResolvedProperty = getPropertyNamed_from( "collectionProperty", dadAsSeenFromSon + .getDeclaredProperties( "property" ) ); + assertTrue( fullyResolvedProperty.isTypeResolved() ); + } + + public void testCanBeFiltered() { assertEquals( 8, dadAsSeenFromSon.getDeclaredProperties( "property", new Filter() { public boolean returnStatic() { @@ -88,6 +87,7 @@ assertTrue( factory.equals( p.getElementClass(), String.class ) ); assertTrue( factory.equals( p.getClassOrElementClass(), String.class ) ); assertNull( p.getCollectionClass() ); + assertNull( p.getMapKey() ); assertFalse( p.isArray() ); assertFalse( p.isCollection() ); } @@ -99,6 +99,7 @@ assertTrue( factory.equals( p.getElementClass(), String.class ) ); assertTrue( factory.equals( p.getClassOrElementClass(), String.class ) ); assertNull( p.getCollectionClass() ); + assertNull( p.getMapKey() ); assertTrue( p.isArray() ); assertFalse( p.isCollection() ); } @@ -110,17 +111,18 @@ assertTrue( factory.equals( p.getElementClass(), int.class ) ); assertTrue( factory.equals( p.getClassOrElementClass(), int.class ) ); assertNull( p.getCollectionClass() ); + assertNull( p.getMapKey() ); assertTrue( p.isArray() ); assertFalse( p.isCollection() ); } public void testCanBeACollection() { - // TODO we'll need to have access to the XClass key of a map either List<XProperty> declaredProperties = dadAsSeenFromSon.getDeclaredProperties( "property" ); XProperty p = getPropertyNamed_from( "collectionProperty", declaredProperties ); assertTrue( factory.equals( p.getType(), Map.class ) ); assertTrue( factory.equals( p.getElementClass(), String.class ) ); assertTrue( factory.equals( p.getClassOrElementClass(), Map.class ) ); + assertTrue( factory.equals( p.getMapKey(), Double.class ) ); assertEquals( Map.class, p.getCollectionClass() ); assertFalse( p.isArray() ); assertTrue( p.isCollection() ); Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -6,17 +6,17 @@ import junit.framework.TestCase; -import org.hibernate.reflection.java.generics.ApproximatingTypeEnvironment; import org.hibernate.reflection.java.generics.TypeEnvironment; import org.hibernate.reflection.java.generics.TypeEnvironmentFactory; public class ApproximatingTypeEnvironmentTest extends TestCase { - TypeEnvironment unboundContext = new TypeEnvironmentFactory().getEnvironment( BigBlob.class ); - TypeEnvironment approximatingUnboundContext = new ApproximatingTypeEnvironment( unboundContext ); + TypeEnvironmentFactory teFactory = new TypeEnvironmentFactory(); + TypeEnvironment unboundContext = teFactory.getEnvironment( BigBlob.class ); + TypeEnvironment approximatingUnboundContext = teFactory.toApproximatingEnvironment( unboundContext ); - TypeEnvironment boundContext = new TypeEnvironmentFactory().getEnvironment( SonOfBlob.class ); - TypeEnvironment approximatingBoundContext = new ApproximatingTypeEnvironment( boundContext ); + TypeEnvironment boundContext = teFactory.getEnvironment( SonOfBlob.class ); + TypeEnvironment approximatingBoundContext = teFactory.toApproximatingEnvironment( boundContext ); public void testDoesNothingOnClasses() throws SecurityException, NoSuchMethodException { assertEquals( String[].class, approximatingUnboundContext.bind( String[].class ) ); @@ -37,8 +37,8 @@ assertEquals( Object[].class, approximatingUnboundContext.bind( type ) ); } - public void testApproximatesUnboundParameterizedTypes() throws Exception { - Type type = BigBlob.class.getMethod( "genTypeWithWildcards", new Class[0] ).getGenericReturnType(); + public void testApproximatesWildcardsToTheirUpperBound() throws Exception { + Type type = BigBlob.class.getMethod( "genTypeContainingWildcardsWithUpperBounds", new Class[0] ).getGenericReturnType(); ParameterizedType approxType = (ParameterizedType)approximatingUnboundContext.bind( type ); assertEquals( Map.class, approxType.getRawType() ); assertNull( approxType.getOwnerType() ); @@ -46,4 +46,13 @@ assertEquals( Object.class, approxType.getActualTypeArguments()[0] ); assertEquals( Comparable.class, approxType.getActualTypeArguments()[1] ); } + + public void testApproximatesWildcardsWithoutUpperBoundsToObject() throws Exception { + Type type = BigBlob.class.getMethod( "genTypeContainingWildcardsWithoutUpperBounds", new Class[0] ).getGenericReturnType(); + ParameterizedType approxType = (ParameterizedType)approximatingUnboundContext.bind( type ); + assertEquals( Class.class, approxType.getRawType() ); + assertNull( approxType.getOwnerType() ); + assertEquals( 1, approxType.getActualTypeArguments().length ); + assertEquals( Object.class, approxType.getActualTypeArguments()[0] ); + } } Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/BigBlob.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/BigBlob.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/BigBlob.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -7,7 +7,9 @@ public List<T> genTypeWithoutWildcards() { return null; } - public Map<T, ? extends Comparable> genTypeWithWildcards() { return null; } + public Map<T, ? extends Comparable> genTypeContainingWildcardsWithUpperBounds() { return null; } + public Class<?> genTypeContainingWildcardsWithoutUpperBounds() { return null; } + public List<T>[] genArrayType() { return null; } } Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/TypeUtilsTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/TypeUtilsTest.java 2006-03-07 17:34:26 UTC (rev 9568) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/TypeUtilsTest.java 2006-03-07 21:12:50 UTC (rev 9569) @@ -15,18 +15,18 @@ TypeEnvironment sonContext = env.getEnvironment( Son.class ); public void testAClassIsAlwaysFullyResolved() throws Exception { - assertTrue( TypeUtils.isFullyResolved( Dad.class )); + assertTrue( TypeUtils.isResolved( Dad.class )); } public void testKnowsIfAParametricTypeIsFullyResolved() throws Exception { Type simpleType = Dad.class.getMethod( "returnsGeneric", new Class[0] ).getGenericReturnType(); - assertFalse( TypeUtils.isFullyResolved( dadContext.bind( simpleType )) ); - assertTrue( TypeUtils.isFullyResolved( sonContext.bind( simpleType )) ); + assertFalse( TypeUtils.isResolved( dadContext.bind( simpleType )) ); + assertTrue( TypeUtils.isResolved( sonContext.bind( simpleType )) ); } public void testKnowsIfAnArrayTypeIsFullyResolved() throws Exception { Type arrayType = Dad.class.getMethod( "getArrayProperty", new Class[0] ).getGenericReturnType(); - assertFalse( TypeUtils.isFullyResolved( dadContext.bind( arrayType )) ); - assertTrue( TypeUtils.isFullyResolved( sonContext.bind( arrayType )) ); + assertFalse( TypeUtils.isResolved( dadContext.bind( arrayType )) ); + assertTrue( TypeUtils.isResolved( sonContext.bind( arrayType )) ); } } |