Update of /cvsroot/hibernate/HibernateExt/metadata/src/java/org/hibernate/reflection/java In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18882/metadata/src/java/org/hibernate/reflection/java Modified Files: JavaXFactory.java JavaXProperty.java JavaXArrayProperty.java Added Files: Pair.java Removed Files: Couplet.java Log Message: Better support for generic arrays in reflection layer --- NEW FILE: Pair.java --- package org.hibernate.reflection.java; /** * A pair of objects that can be used as a key in a Map. * * @author Paolo Perrotta * @author Davide Marchignoli */ abstract class Pair<T, U> { private final T o1; private final U o2; Pair( T o1, U o2 ) { this.o1 = o1; this.o2 = o2; } @Override public boolean equals(Object obj) { Pair other = (Pair) obj; return safeEquals( o1, other.o1 ) && safeEquals( o2, other.o2 ); } @Override public int hashCode() { return safeHashCode( o1 ) ^ safeHashCode( o2 ); } private int safeHashCode(Object o) { if( o == null ) return 0; return o.hashCode(); } private boolean safeEquals(Object obj1, Object obj2) { if ( obj1 == null ) return obj2 == null; boolean result = obj1.equals( obj2 ); return result; } } Index: JavaXFactory.java =================================================================== RCS file: /cvsroot/hibernate/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXFactory.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- JavaXFactory.java 13 Feb 2006 19:14:35 -0000 1.1 +++ JavaXFactory.java 15 Feb 2006 18:37:27 -0000 1.2 @@ -25,13 +25,13 @@ */ public class JavaXFactory implements ReflectionManager { - private static class PropertyKey extends Couplet<Member, XClass> { + private static class PropertyKey extends Pair<Member, XClass> { PropertyKey( Member member, XClass owner ) { super( member, owner ); } } - private static class TypeKey extends Couplet<Type, TypeEnvironment> { + private static class TypeKey extends Pair<Type, TypeEnvironment> { TypeKey( Type t, TypeEnvironment context ) { super( t, context ); } Index: JavaXProperty.java =================================================================== RCS file: /cvsroot/hibernate/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXProperty.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- JavaXProperty.java 13 Feb 2006 19:14:35 -0000 1.3 +++ JavaXProperty.java 15 Feb 2006 18:37:28 -0000 1.4 @@ -132,7 +132,7 @@ } public XClass getType() { - return getFactory().toXClass( env.bind( type ), env ); + return getFactory().toXClass( getJavaType(), env ); } public String getName() { @@ -162,7 +162,7 @@ } protected Type getJavaType() { - return type; + return env.bind( type ); } protected TypeEnvironment getTypeEnvironment() { Index: JavaXArrayProperty.java =================================================================== RCS file: /cvsroot/hibernate/HibernateExt/metadata/src/java/org/hibernate/reflection/java/JavaXArrayProperty.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- JavaXArrayProperty.java 13 Feb 2006 19:14:35 -0000 1.1 +++ JavaXArrayProperty.java 15 Feb 2006 18:37:28 -0000 1.2 @@ -1,5 +1,6 @@ package org.hibernate.reflection.java; +import java.lang.reflect.Array; import java.lang.reflect.GenericArrayType; import java.lang.reflect.Member; import java.lang.reflect.Type; @@ -30,24 +31,39 @@ } public XClass getElementClass() { - return new TypeSwitch<XClass>() { + return getFactory().toXClass( getElementType(), getTypeEnvironment() ); + } + + private Type getElementType() { + return new TypeSwitch<Type>() { @Override - public XClass caseClass(Class classType) { - return getFactory().toXClass( classType.getComponentType(), getTypeEnvironment() ); + public Type caseClass(Class classType) { + return classType.getComponentType(); } @Override - public XClass caseGenericArrayType(GenericArrayType genericArrayType) { - return getFactory().toXClass( genericArrayType.getGenericComponentType(), getTypeEnvironment() ); + public Type caseGenericArrayType(GenericArrayType genericArrayType) { + return genericArrayType.getGenericComponentType(); } @Override - public XClass defaultCase(Type t) { + public Type defaultCase(Type t) { throw new IllegalArgumentException( t + " is not an array type" ); } }.doSwitch( getJavaType() ); } + public XClass getType() { + Type boundType = getElementType(); + if( boundType instanceof Class ) + boundType = arrayTypeOf( (Class) boundType ); + return getFactory().toXClass( boundType, getTypeEnvironment() ); + } + + private Class<? extends Object> arrayTypeOf(Class componentType) { + return Array.newInstance( componentType, 0 ).getClass(); + } + public XClass getClassOrElementClass() { return getElementClass(); } --- Couplet.java DELETED --- |