[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