package org.etk.orm.plugins.bean.type; import java.util.HashMap; import java.util.Map; import org.etk.orm.plugins.bean.mapping.jcr.PropertyMetaType; import org.etk.reflect.api.ClassTypeInfo; import org.etk.reflect.api.TypeInfo; import org.etk.reflect.api.TypeVariableInfo; class SimpleTypeMappingImpl<I> implements SimpleTypeMapping { /** . */ private static final Map<ClassTypeInfo, PropertyMetaType<?>> propertyMetaTypes; static { // Map<ClassTypeInfo, PropertyMetaType<?>> _jcrTypes = new HashMap<ClassTypeInfo, PropertyMetaType<?>>(); _jcrTypes.put((ClassTypeInfo)SimpleTypeResolver.typeDomain.resolve(SimpleTypeProvider.STRING.class), PropertyMetaType.STRING); _jcrTypes.put((ClassTypeInfo)SimpleTypeResolver.typeDomain.resolve(SimpleTypeProvider.PATH.class), PropertyMetaType.PATH); _jcrTypes.put((ClassTypeInfo)SimpleTypeResolver.typeDomain.resolve(SimpleTypeProvider.NAME.class), PropertyMetaType.NAME); _jcrTypes.put((ClassTypeInfo)SimpleTypeResolver.typeDomain.resolve(SimpleTypeProvider.LONG.class), PropertyMetaType.LONG); _jcrTypes.put((ClassTypeInfo)SimpleTypeResolver.typeDomain.resolve(SimpleTypeProvider.DOUBLE.class), PropertyMetaType.DOUBLE); _jcrTypes.put((ClassTypeInfo)SimpleTypeResolver.typeDomain.resolve(SimpleTypeProvider.BOOLEAN.class), PropertyMetaType.BOOLEAN); _jcrTypes.put((ClassTypeInfo)SimpleTypeResolver.typeDomain.resolve(SimpleTypeProvider.BINARY.class), PropertyMetaType.BINARY); _jcrTypes.put((ClassTypeInfo)SimpleTypeResolver.typeDomain.resolve(SimpleTypeProvider.DATE.class), PropertyMetaType.DATE); propertyMetaTypes = _jcrTypes; } /** . */ private SimpleTypeProvider<I, ?> instance; /** . */ private final PropertyMetaType<I> propertyMetaType; /** . */ final ClassTypeInfo typeInfo; /** . */ final TypeInfo external; SimpleTypeMappingImpl(ClassTypeInfo typeInfo) { // Find the right subclass ClassTypeInfo current = typeInfo; while (!current.getSuperClass().getName().equals(SimpleTypeProvider.class.getName())) { current = current.getSuperClass(); } // ClassTypeInfo stp = (ClassTypeInfo)SimpleTypeResolver.typeDomain.resolve(SimpleTypeProvider.class); TypeVariableInfo tvi = stp.getTypeParameters().get(1); // <E> TypeInfo aaa = typeInfo.resolve(tvi); // if (!aaa.equals(typeInfo)) { // throw new AssertionError(aaa + " should be equals to " + typeInfo); // } // PropertyMetaType aaaaa = propertyMetaTypes.get(current); // this.propertyMetaType = aaaaa; this.typeInfo = typeInfo; this.external = aaa; } SimpleTypeMappingImpl(ClassTypeInfo typeInfo, PropertyMetaType<I> propertyMetaType) { ClassTypeInfo stp = (ClassTypeInfo)SimpleTypeResolver.typeDomain.resolve(SimpleTypeProvider.class); TypeVariableInfo tvi = stp.getTypeParameters().get(1); // <E> TypeInfo aaa = typeInfo.resolve(tvi); // this.propertyMetaType = propertyMetaType; this.typeInfo = typeInfo; this.external = aaa; } SimpleTypeMappingImpl(Class<? extends SimpleTypeProvider<I, ?>> type, PropertyMetaType<I> propertyMetaType) { this((ClassTypeInfo)SimpleTypeResolver.typeDomain.resolve(type), propertyMetaType); } public PropertyMetaType<I> getPropertyMetaType() { return propertyMetaType; } public SimpleTypeProvider<I, ?> create() { if (instance == null) { Class type = (Class)typeInfo.unwrap(); try { instance = (SimpleTypeProvider<I,?>)type.newInstance(); } catch (InstantiationException e) { throw new AssertionError(e); } catch (IllegalAccessException e) { throw new AssertionError(e); } } return instance; } }