[hibernate-commits] Hibernate SVN: r10972 - in branches/Branch_3_2/HibernateExt/metadata/src: java/org/hibernate/cfg/annotations java/org/hibernate/reflection/java java/org/hibernate/reflection/java/generics test/org/hibernate/test/annotations/generics test/org/hibernate/test/reflection/java/generics/deep

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Mon Dec 11 07:30:43 EST 2006


Author: nusco
Date: 2006-12-11 07:30:20 -0500 (Mon, 11 Dec 2006)
New Revision: 10972

Added:
   branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/EmbeddedGenericsTest.java
   branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/deep/DeepGenericsContainment.java
Modified:
   branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java
   branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/IdBagBinder.java
   branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ListBinder.java
   branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/MapBinder.java
   branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java
   branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java
   branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/ApproximatingTypeEnvironment.java
   branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/CompoundTypeEnvironment.java
   branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/IdentityTypeEnvironment.java
   branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/SimpleTypeEnvironment.java
   branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeEnvironment.java
   branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeEnvironmentFactory.java
Log:
[ANN-494] - Type guessing in @Embedded and @CollectionOfElements

Modified: branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java	2006-12-10 19:39:06 UTC (rev 10971)
+++ branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java	2006-12-11 12:30:20 UTC (rev 10972)
@@ -375,11 +375,10 @@
 		//work on association
 		boolean isMappedBy = ! BinderHelper.isDefault( mappedBy );
 		collection.setInverse( isMappedBy );
-		String collType = getCollectionType().getName();
-
+		
 		//many to many may need some second pass informations
 		if ( ! oneToMany && isMappedBy ) {
-			mappings.addMappedBy( collType, mappedBy, propertyName );
+			mappings.addMappedBy( getCollectionType().getName(), mappedBy, propertyName );
 		}
 		//TODO reducce tableBinder != null and oneToMany
 		//FIXME collection of elements shouldn't be executed as a secondpass
@@ -389,7 +388,7 @@
 				inverseJoinColumns,
 				elementColumns,
 				mapKeyColumns, mapKeyManyToManyColumns, isEmbedded,
-				property, collType,
+				property, getCollectionType(),
 				ignoreNotFound, oneToMany,
 				tableBinder, mappings
 		);
@@ -496,7 +495,7 @@
 			final Ejb3JoinColumn[] inverseColumns,
 			final Ejb3Column[] elementColumns,
 			final Ejb3Column[] mapKeyColumns, final Ejb3JoinColumn[] mapKeyManyToManyColumns, final boolean isEmbedded,
-			final XProperty property, final String collType,
+			final XProperty property, final XClass collType,
 			final boolean ignoreNotFound, final boolean unique,
 			final TableBinder assocTableBinder, final ExtendedMappings mappings
 	) {
@@ -518,13 +517,13 @@
 	 * return true if it's a Fk, false if it's an association table
 	 */
 	protected boolean bindStarToManySecondPass(
-			Map persistentClasses, String collType, Ejb3JoinColumn[] fkJoinColumns,
+			Map persistentClasses, XClass collType, Ejb3JoinColumn[] fkJoinColumns,
 			Ejb3JoinColumn[] keyColumns, Ejb3JoinColumn[] inverseColumns, Ejb3Column[] elementColumns,
 			boolean isEmbedded,
 			XProperty property, boolean unique,
 			TableBinder associationTableBinder, boolean ignoreNotFound, ExtendedMappings mappings
 	) {
-		PersistentClass persistentClass = (PersistentClass) persistentClasses.get( collType );
+		PersistentClass persistentClass = (PersistentClass) persistentClasses.get( collType.getName() );
 		boolean reversePropertyInJoin = false;
 		if ( persistentClass != null && StringHelper.isNotEmpty( this.mappedBy ) ) {
 			try {
@@ -581,7 +580,7 @@
 
 	protected void bindOneToManySecondPass(
 			Collection collection, Map persistentClasses, Ejb3JoinColumn[] fkJoinColumns,
-			String collectionType,
+            XClass collectionType,
 			boolean cascadeDeleteEnabled, boolean ignoreNotFound, String hqlOrderBy, ExtendedMappings extendedMappings
 	) {
 		if ( log.isDebugEnabled() ) {
@@ -591,7 +590,7 @@
 		}
 		org.hibernate.mapping.OneToMany oneToMany = new org.hibernate.mapping.OneToMany( collection.getOwner() );
 		collection.setElement( oneToMany );
-		oneToMany.setReferencedEntityName( collectionType );
+		oneToMany.setReferencedEntityName( collectionType.getName() );
 		oneToMany.setIgnoreNotFound( ignoreNotFound );
 
 		String assocClass = oneToMany.getReferencedEntityName();
@@ -988,14 +987,14 @@
 			Ejb3JoinColumn[] inverseJoinColumns,
 			Ejb3Column[] elementColumns,
 			boolean isEmbedded,
-			String collType,
+            XClass collType,
 			boolean ignoreNotFound, boolean unique,
 			boolean cascadeDeleteEnabled,
 			TableBinder associationTableBinder, XProperty property, PropertyHolder parentPropertyHolder,
 			String hqlOrderBy, ExtendedMappings mappings
 	) throws MappingException {
 
-		PersistentClass collectionEntity = (PersistentClass) persistentClasses.get( collType );
+		PersistentClass collectionEntity = (PersistentClass) persistentClasses.get( collType.getName() );
 		boolean isCollectionOfEntities = collectionEntity != null;
 		if ( log.isDebugEnabled() ) {
 			String path = collValue.getOwnerEntityName() + "." + joinColumns[0].getPropertyName();
@@ -1105,7 +1104,7 @@
 			element =
 					new ManyToOne( collValue.getCollectionTable() );
 			collValue.setElement( element );
-			element.setReferencedEntityName( collType );
+			element.setReferencedEntityName( collType.getName() );
 			//element.setFetchMode( fetchMode );
 			//element.setLazy( fetchMode != FetchMode.JOIN );
 			//make the second join non lazy
@@ -1129,17 +1128,12 @@
 //			);
 			//FIXME the "element" is lost
 			PropertyHolder holder = null;
-			if ( BinderHelper.PRIMITIVE_NAMES.contains( collType ) ) {
+			if ( BinderHelper.PRIMITIVE_NAMES.contains( collType.getName() ) ) {
 				classType = AnnotatedClassType.NONE;
 				elementClass = null;
 			}
 			else {
-				try {
-					elementClass = mappings.getReflectionManager().classForName( collType, CollectionBinder.class );
-				}
-				catch (ClassNotFoundException e) {
-					throw new AnnotationException( "Unable to find class: " + collType, e );
-				}
+				elementClass = collType;
 				classType = mappings.getClassType( elementClass );
 
 				holder = PropertyHolderBuilder.buildPropertyHolder(
@@ -1195,7 +1189,7 @@
 			else {
 				SimpleValueBinder elementBinder = new SimpleValueBinder();
 				elementBinder.setMappings( mappings );
-				elementBinder.setReturnedClassName( collType );
+				elementBinder.setReturnedClassName( collType.getName() );
 				if ( elementColumns == null || elementColumns.length == 0 ) {
 					elementColumns = new Ejb3Column[1];
 					Ejb3Column column = new Ejb3Column();

Modified: branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/IdBagBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/IdBagBinder.java	2006-12-10 19:39:06 UTC (rev 10971)
+++ branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/IdBagBinder.java	2006-12-11 12:30:20 UTC (rev 10972)
@@ -1,25 +1,26 @@
 //$Id: $
 package org.hibernate.cfg.annotations;
 
+import java.util.Collections;
 import java.util.Map;
-import java.util.Collections;
 
+import org.hibernate.AnnotationException;
+import org.hibernate.annotations.CollectionId;
+import org.hibernate.annotations.Type;
+import org.hibernate.cfg.BinderHelper;
+import org.hibernate.cfg.Ejb3Column;
+import org.hibernate.cfg.Ejb3JoinColumn;
+import org.hibernate.cfg.ExtendedMappings;
+import org.hibernate.cfg.PropertyData;
+import org.hibernate.cfg.PropertyInferredData;
+import org.hibernate.cfg.WrappedInferredData;
 import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.IdentifierCollection;
 import org.hibernate.mapping.PersistentClass;
 import org.hibernate.mapping.SimpleValue;
-import org.hibernate.mapping.IdentifierCollection;
 import org.hibernate.mapping.Table;
-import org.hibernate.cfg.Ejb3JoinColumn;
-import org.hibernate.cfg.Ejb3Column;
-import org.hibernate.cfg.ExtendedMappings;
-import org.hibernate.cfg.PropertyData;
-import org.hibernate.cfg.WrappedInferredData;
-import org.hibernate.cfg.PropertyInferredData;
-import org.hibernate.cfg.BinderHelper;
+import org.hibernate.reflection.XClass;
 import org.hibernate.reflection.XProperty;
-import org.hibernate.annotations.CollectionId;
-import org.hibernate.annotations.Type;
-import org.hibernate.AnnotationException;
 import org.hibernate.util.StringHelper;
 
 /**
@@ -32,7 +33,7 @@
 
 	@Override
 	protected boolean bindStarToManySecondPass(
-			Map persistentClasses, String collType, Ejb3JoinColumn[] fkJoinColumns, Ejb3JoinColumn[] keyColumns,
+			Map persistentClasses, XClass collType, Ejb3JoinColumn[] fkJoinColumns, Ejb3JoinColumn[] keyColumns,
 			Ejb3JoinColumn[] inverseColumns, Ejb3Column[] elementColumns, boolean isEmbedded, XProperty property,
 			boolean unique, TableBinder associationTableBinder, boolean ignoreNotFound, ExtendedMappings mappings
 	) {

Modified: branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ListBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ListBinder.java	2006-12-10 19:39:06 UTC (rev 10971)
+++ branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ListBinder.java	2006-12-11 12:30:20 UTC (rev 10972)
@@ -55,7 +55,7 @@
 			final Ejb3JoinColumn[] inverseColumns,
 			final Ejb3Column[] elementColumns,
 			Ejb3Column[] mapKeyColumns, final Ejb3JoinColumn[] mapKeyManyToManyColumns, final boolean isEmbedded,
-			final XProperty property, final String collType,
+			final XProperty property, final XClass collType,
 			final boolean ignoreNotFound, final boolean unique,
 			final TableBinder assocTableBinder, final ExtendedMappings mappings
 	) {

Modified: branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/MapBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/MapBinder.java	2006-12-10 19:39:06 UTC (rev 10971)
+++ branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/MapBinder.java	2006-12-11 12:30:20 UTC (rev 10972)
@@ -70,7 +70,7 @@
 			final Ejb3JoinColumn[] inverseColumns,
 			final Ejb3Column[] elementColumns,
 			final Ejb3Column[] mapKeyColumns, final Ejb3JoinColumn[] mapKeyManyToManyColumns, final boolean isEmbedded,
-			final XProperty property, final String collType,
+			final XProperty property, final XClass collType,
 			final boolean ignoreNotFound, final boolean unique,
 			final TableBinder assocTableBinder, final ExtendedMappings mappings
 	) {
@@ -91,13 +91,13 @@
 	}
 
 	private void bindKeyFromAssociationTable(
-			String collType, Map persistentClasses, String mapKeyPropertyName, XProperty property,
+            XClass collType, Map persistentClasses, String mapKeyPropertyName, XProperty property,
 			boolean isEmbedded, ExtendedMappings mappings, Ejb3Column[] mapKeyColumns,
 			Ejb3JoinColumn[] mapKeyManyToManyColumns, String targetPropertyName
 	) {
 		if ( mapKeyPropertyName != null ) {
 			//this is an EJB3 @MapKey
-			PersistentClass associatedClass = (PersistentClass) persistentClasses.get( collType );
+			PersistentClass associatedClass = (PersistentClass) persistentClasses.get( collType.getName() );
 			if ( associatedClass == null ) throw new AnnotationException( "Associated class not found: " + collType );
 			Property mapProperty = BinderHelper.findPropertyByName( associatedClass, mapKeyPropertyName );
 			if ( mapProperty == null ) {

Modified: branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java	2006-12-10 19:39:06 UTC (rev 10971)
+++ branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXClass.java	2006-12-11 12:30:20 UTC (rev 10972)
@@ -33,9 +33,10 @@
 	}
 
 	public XClass getSuperclass() {
-		//return getFactory().toXClass( toClass().getSuperclass(), getFactory().getTypeEnvironment( toClass() ) );
 		return getFactory().toXClass( toClass().getSuperclass(),
-				new CompoundTypeEnvironment( getTypeEnvironment(), getFactory().getTypeEnvironment( toClass() )
+				CompoundTypeEnvironment.create(
+                        getTypeEnvironment(),
+                        getFactory().getTypeEnvironment( toClass() )
 				)
 		);
 	}
@@ -44,10 +45,11 @@
 		Class[] classes = toClass().getInterfaces();
 		int length = classes.length;
 		XClass[] xClasses = new XClass[length];
-		//TypeEnvironment environment = getFactory().getTypeEnvironment( toClass() );
         if (length != 0) {
-            TypeEnvironment environment =
-                    new CompoundTypeEnvironment( getTypeEnvironment(), getFactory().getTypeEnvironment( toClass() ) );
+            TypeEnvironment environment = CompoundTypeEnvironment.create(
+                    getTypeEnvironment(),
+                    getFactory().getTypeEnvironment( toClass() )
+                    );
             for ( int index = 0; index < length ; index++ ) {
                 xClasses[index] = getFactory().toXClass( classes[index], environment );
             }
@@ -75,7 +77,7 @@
 		List<XProperty> result = new LinkedList<XProperty>();
 		for ( Field f : toClass().getDeclaredFields() ) {
 			if ( JavaXProperty.isProperty( f, getTypeEnvironment().bind( f.getGenericType() ), filter ) ) {
-				result.add( getFactory().getXProperty( f, this ) );
+				result.add( getFactory().getXProperty( f, getTypeEnvironment() ) );
 			}
 		}
 		return result;
@@ -85,7 +87,7 @@
 		List<XProperty> result = new LinkedList<XProperty>();
 		for ( Method m : toClass().getDeclaredMethods() ) {
 			if ( JavaXProperty.isProperty( m, getTypeEnvironment().bind( m.getGenericReturnType() ), filter ) ) {
-				result.add( getFactory().getXProperty( m, this ) );
+				result.add( getFactory().getXProperty( m, getTypeEnvironment() ) );
 			}
 		}
 		return result;
@@ -108,7 +110,7 @@
 	public List<XMethod> getDeclaredMethods() {
 		List<XMethod> result = new LinkedList<XMethod>();
 		for ( Method m : toClass().getDeclaredMethods() ) {
-			result.add( getFactory().getXMethod( m, this ) );
+			result.add( getFactory().getXMethod( m, getTypeEnvironment() ) );
 		}
 		return result;
 	}
@@ -128,4 +130,9 @@
 	TypeEnvironment getTypeEnvironment() {
 		return context;
 	}
+    
+    @Override
+    public String toString() {
+        return getName();
+    }
 }
\ No newline at end of file

Modified: branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java	2006-12-10 19:39:06 UTC (rev 10971)
+++ branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java	2006-12-11 12:30:20 UTC (rev 10972)
@@ -24,6 +24,7 @@
 import org.hibernate.reflection.XMethod;
 import org.hibernate.reflection.XPackage;
 import org.hibernate.reflection.XProperty;
+import org.hibernate.reflection.java.generics.CompoundTypeEnvironment;
 import org.hibernate.reflection.java.generics.IdentityTypeEnvironment;
 import org.hibernate.reflection.java.generics.TypeEnvironment;
 import org.hibernate.reflection.java.generics.TypeEnvironmentFactory;
@@ -102,9 +103,9 @@
 		}
 	}
 
-	private static class MemberKey extends Pair<Member, TypeKey> {
-		MemberKey(Member member, Type owner, TypeEnvironment context) {
-			super( member, new TypeKey( owner, context ) );
+	private static class MemberKey extends Pair<Member, TypeEnvironment> {
+		MemberKey(Member member, TypeEnvironment context) {
+			super( member, context );
 		}
 	}
 
@@ -236,7 +237,9 @@
 
 			@Override
 			public XClass caseParameterizedType(ParameterizedType parameterizedType) {
-				return toXClass( parameterizedType.getRawType(), context );
+				return toXClass( parameterizedType.getRawType(),
+						typeEnvs.getEnvironment( parameterizedType, context )
+				);
 			}
 		}.doSwitch( context.bind( t ) );
 	}
@@ -250,23 +253,23 @@
 		return xPackage;
 	}
 
-	XProperty getXProperty(Member member, JavaXClass owner) {
-		MemberKey key = new MemberKey( member, owner.toClass(), owner.getTypeEnvironment() );
+	XProperty getXProperty(Member member, TypeEnvironment context) {
+		MemberKey key = new MemberKey( member, context );
         //FIXME get is as expensive as create most time spent in hashCode and equals
         JavaXProperty xProperty = xProperties.get( key );
 		if ( xProperty == null ) {
-			xProperty = JavaXProperty.create( member, owner.getTypeEnvironment(), this );
+			xProperty = JavaXProperty.create( member, context, this );
 			xProperties.put( key, xProperty );
 		}
 		return xProperty;
 	}
 
-	XMethod getXMethod(Member member, JavaXClass owner) {
-		MemberKey key = new MemberKey( member, owner.toClass(), owner.getTypeEnvironment() );
+	XMethod getXMethod(Member member, TypeEnvironment context) {
+		MemberKey key = new MemberKey( member, context );
         //FIXME get is as expensive as create most time spent in hashCode and equals
         JavaXMethod xMethod = xMethods.get( key );
 		if ( xMethod == null ) {
-			xMethod = JavaXMethod.create( member, owner.getTypeEnvironment(), this );
+			xMethod = JavaXMethod.create( member, context, this );
 			xMethods.put( key, xMethod );
 		}
 		return xMethod;

Modified: branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/ApproximatingTypeEnvironment.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/ApproximatingTypeEnvironment.java	2006-12-10 19:39:06 UTC (rev 10971)
+++ branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/ApproximatingTypeEnvironment.java	2006-12-11 12:30:20 UTC (rev 10972)
@@ -101,7 +101,7 @@
 		}.doSwitch( type );
 	}
 
-	public Type coarseApproximation(final Type type) {
+	private Type coarseApproximation(final Type type) {
 		Type result = new TypeSwitch<Type>() {
 			public Type caseWildcardType(WildcardType wildcardType) {
 				return approximateTo( wildcardType.getUpperBounds() );
@@ -143,4 +143,9 @@
 		assert TypeUtils.isResolved( result );
 		return result;
 	}
+    
+    @Override
+    public String toString() {
+        return "approximated_types";
+    }
 }

Modified: branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/CompoundTypeEnvironment.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/CompoundTypeEnvironment.java	2006-12-10 19:39:06 UTC (rev 10971)
+++ branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/CompoundTypeEnvironment.java	2006-12-11 12:30:20 UTC (rev 10972)
@@ -13,9 +13,18 @@
 	private final TypeEnvironment f;
 
 	private final TypeEnvironment g;
+    
     private final int hashCode;
 
-    public CompoundTypeEnvironment(TypeEnvironment f, TypeEnvironment g) {
+    public static TypeEnvironment create(TypeEnvironment f, TypeEnvironment g) {
+        if ( g == IdentityTypeEnvironment.INSTANCE )
+            return f;
+        if ( f == IdentityTypeEnvironment.INSTANCE )
+            return g;
+        return new CompoundTypeEnvironment( f, g );
+    }
+    
+    private CompoundTypeEnvironment(TypeEnvironment f, TypeEnvironment g) {
 		this.f = f;
 		this.g = g;
         hashCode = doHashCode();
@@ -53,4 +62,9 @@
         //cached because the inheritance can be big
         return hashCode;
     }
+    
+    @Override
+    public String toString() {
+        return f.toString() + "(" + g.toString() + ")";
+    }
 }

Modified: branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/IdentityTypeEnvironment.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/IdentityTypeEnvironment.java	2006-12-10 19:39:06 UTC (rev 10971)
+++ branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/IdentityTypeEnvironment.java	2006-12-11 12:30:20 UTC (rev 10972)
@@ -18,4 +18,8 @@
 	public Type bind(Type type) {
 		return type;
 	}
+    
+    public String toString() {
+        return "{}";
+    }
 }

Modified: branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/SimpleTypeEnvironment.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/SimpleTypeEnvironment.java	2006-12-10 19:39:06 UTC (rev 10971)
+++ branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/SimpleTypeEnvironment.java	2006-12-11 12:30:20 UTC (rev 10972)
@@ -5,18 +5,17 @@
 import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
 import java.lang.reflect.WildcardType;
+import java.util.HashMap;
 
 /**
  * @author Davide Marchignoli
  * @author Paolo Perrotta
  */
-class SimpleTypeEnvironment implements TypeEnvironment {
+class SimpleTypeEnvironment extends HashMap<Type, Type> implements TypeEnvironment {
 
-	final Type[] formalArguments;
-
-	final Type[] actualArguments;
-
-	private final TypeSwitch<Type> substitute = new TypeSwitch<Type>() {
+	private static final long serialVersionUID = 1L;
+    
+    private final TypeSwitch<Type> substitute = new TypeSwitch<Type>() {
 		@Override
 		public Type caseClass(Class classType) {
 			return classType;
@@ -60,28 +59,22 @@
 
 		@Override
 		public Type caseTypeVariable(TypeVariable typeVariable) {
-			int idx = indexOf( formalArguments, typeVariable );
-			return ( idx >= 0 ) ? actualArguments[idx] : typeVariable;
+            if ( !containsKey( typeVariable )) {
+            	return typeVariable;
+            }
+            return get( typeVariable );
 		}
 
-		private int indexOf(Object[] array, Object o) {
-			for ( int i = 0; i < array.length ; i++ ) {
-				if ( array[i].equals( o ) ) {
-					return i;
-				}
-			}
-			return -1;
-		}
-
 		@Override
 		public Type caseWildcardType(WildcardType wildcardType) {
 			return wildcardType;
 		}
 	};
 
-	public SimpleTypeEnvironment(Type[] formal, Type[] actual) {
-		actualArguments = actual;
-		formalArguments = formal;
+	public SimpleTypeEnvironment(Type[] formalTypeArgs, Type[] actualTypeArgs) {
+        for (int i = 0; i < formalTypeArgs.length; i++) {
+            put( formalTypeArgs[i], actualTypeArgs[i] );
+        }
 	}
 
 	public Type bind(Type type) {

Modified: branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeEnvironment.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeEnvironment.java	2006-12-10 19:39:06 UTC (rev 10971)
+++ branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeEnvironment.java	2006-12-11 12:30:20 UTC (rev 10972)
@@ -40,7 +40,7 @@
 	 * then it's guaranteed to be a regular Java <code>Class</code>. In all
 	 * other cases, this method might return a custom implementation of some
 	 * interface that extends <code>Type</code>. Be sure not to mix these
-	 * objects with with Java's implementations of <code>Type</code> to avoid
+	 * objects with Java's implementations of <code>Type</code> to avoid
 	 * potential identity problems.
 	 * <p/>
 	 * This class does not support bindings involving inner classes or

Modified: branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeEnvironmentFactory.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeEnvironmentFactory.java	2006-12-10 19:39:06 UTC (rev 10971)
+++ branches/Branch_3_2/HibernateExt/metadata/src/java/org/hibernate/reflection/java/generics/TypeEnvironmentFactory.java	2006-12-11 12:30:20 UTC (rev 10972)
@@ -26,12 +26,16 @@
 		return doGetEnvironment( context );
 	}
 
-	public TypeEnvironment getEnvironment(ParameterizedType context) {
+	public TypeEnvironment getEnvironment(Type context) {
 		return doGetEnvironment( context );
 	}
 
+	public TypeEnvironment getEnvironment(Type t, TypeEnvironment context) {
+		return CompoundTypeEnvironment.create( getEnvironment(t), context );
+	}
+
 	public TypeEnvironment toApproximatingEnvironment(TypeEnvironment context) {
-		return new CompoundTypeEnvironment( new ApproximatingTypeEnvironment(), context );
+		return CompoundTypeEnvironment.create( new ApproximatingTypeEnvironment(), context );
 	}
 
 	private TypeEnvironment doGetEnvironment(Type context) {
@@ -50,10 +54,10 @@
 		return new TypeSwitch<TypeEnvironment>() {
 			@Override
 			public TypeEnvironment caseClass(Class classType) {
-				return new CompoundTypeEnvironment(
-						createSuperTypeEnvironment( classType ),
-						getEnvironment( classType.getSuperclass() )
-				);
+				return CompoundTypeEnvironment.create(
+                        createSuperTypeEnvironment( classType ),
+                        getEnvironment( classType.getSuperclass() )
+                        );
 			}
 
 			@Override

Added: branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/EmbeddedGenericsTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/EmbeddedGenericsTest.java	2006-12-10 19:39:06 UTC (rev 10971)
+++ branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/annotations/generics/EmbeddedGenericsTest.java	2006-12-11 12:30:20 UTC (rev 10972)
@@ -0,0 +1,111 @@
+package org.hibernate.test.annotations.generics;
+
+/**
+ * A test case for ANN-494.
+ *
+ * @author Edward Costello
+ * @author Paolo Perrotta
+ */
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Embeddable;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.annotations.CollectionOfElements;
+import org.hibernate.test.annotations.TestCase;
+
+public class EmbeddedGenericsTest extends TestCase {
+
+	Session session;
+	Edition<String> edition;
+
+	public void setUp() throws Exception {
+		super.setUp();
+		session = getSessions().openSession();
+		session.getTransaction().begin();
+		edition = new Edition<String>();
+		edition.name = "Second";
+	}
+
+	public void tearDown() throws Exception {
+		session.close();
+		super.tearDown();
+	}
+
+	public void testWorksWithGenericEmbedded() {
+		Book b = new Book();
+		b.edition = edition;
+		persist( b );
+		
+		Book retrieved = (Book)find( Book.class, b.id );
+		assertEquals( "Second", retrieved.edition.name );
+		
+		clean( Book.class, b.id );
+	}
+
+	public void testWorksWithGenericCollectionOfElements() {
+		PopularBook b = new PopularBook();
+		b.editions.add( edition );
+		persist( b );
+
+		PopularBook retrieved = (PopularBook)find( PopularBook.class, b.id );
+		assertEquals( "Second", retrieved.editions.iterator().next().name );
+
+		clean( PopularBook.class, b.id );
+	}
+
+	protected Class[] getMappings() {
+		return new Class[]{
+				Book.class,
+				PopularBook.class
+		};
+	}
+
+	private void persist(Object data) {
+		session.persist( data );
+		session.getTransaction().commit();
+		session.clear();
+	}
+	
+	private Object find(Class clazz, Long id) {
+		return session.get( clazz, id );
+	}
+
+	private void clean(Class<?> clazz, Long id) {
+		Transaction tx = session.beginTransaction();
+		session.delete( find( clazz, id ) );
+		tx.commit();
+	}
+
+	@Embeddable
+	public static class Edition<T> {
+		T name;
+	}
+	
+	@Entity
+	public static class Book {
+		@Id
+		@GeneratedValue(strategy=GenerationType.AUTO)
+		Long id;
+		
+		@Embedded
+		Edition<String> edition;
+	}
+	
+	@Entity
+	public static class PopularBook {
+		@Id
+		@GeneratedValue(strategy=GenerationType.AUTO)
+		Long id;
+		
+		@CollectionOfElements
+		Set<Edition<String>> editions = new HashSet<Edition<String>>();
+	}
+}

Added: branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/deep/DeepGenericsContainment.java
===================================================================
--- branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/deep/DeepGenericsContainment.java	2006-12-10 19:39:06 UTC (rev 10971)
+++ branches/Branch_3_2/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/generics/deep/DeepGenericsContainment.java	2006-12-11 12:30:20 UTC (rev 10972)
@@ -0,0 +1,48 @@
+//$Id: $
+package org.hibernate.test.reflection.java.generics.deep;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.hibernate.reflection.XClass;
+import org.hibernate.reflection.XProperty;
+import org.hibernate.reflection.java.JavaXFactory;
+
+
+/**
+ * @author Paolo Perrotta
+ */
+public class DeepGenericsContainment extends TestCase {
+
+	public static class Contained<T> {
+	    T generic;
+	}
+	
+	public static class Container {
+		Contained<String> contained;
+	}
+	
+	public static class ContainerWithCollection {
+		List<Contained<String>> contained;
+	}
+
+	public void test2StepsGenerics() throws Exception {
+		JavaXFactory factory = new JavaXFactory();
+		XClass container = factory.toXClass( Container.class );
+		XProperty contained = container.getDeclaredProperties( XClass.ACCESS_FIELD ).get( 0 );
+		assertTrue( contained.isTypeResolved() );
+		XProperty generic = contained.getType().getDeclaredProperties( XClass.ACCESS_FIELD ).get( 0 );
+		assertTrue( generic.isTypeResolved() );
+	}
+
+	public void test2StepsGenericsCollection() throws Exception {
+		JavaXFactory factory = new JavaXFactory();
+		XClass container = factory.toXClass( ContainerWithCollection.class );
+		XProperty collection = container.getDeclaredProperties( XClass.ACCESS_FIELD ).get( 0 );
+		assertTrue( collection.isTypeResolved() );
+		XClass elementClass = collection.getElementClass();
+		XProperty generic = elementClass.getDeclaredProperties( XClass.ACCESS_FIELD ).get( 0 );
+		assertTrue( generic.isTypeResolved() );
+	}
+}




More information about the hibernate-commits mailing list