private <P, J> ContextualGetter<? super S, ? extends P> lookForAlternativeGetter(ClassMeta<P> classMeta, K key, ColumnDefinition<K, ?> columnDefinition, Collection<Type> types, MappingContextFactoryBuilder<?, K> mappingContextFactoryBuilder) { // look for converter Type propertyType = classMeta.getType(); Type sourceType = key.getType(propertyType); Object[] properties = columnDefinition.properties(); ContextualConverter<? super J, ? extends P> converter = converterService.findConverter(sourceType, propertyType, mappingContextFactoryBuilder, properties); if (converter != null) { ContextualGetter<? super S, ? extends J> getter = getterFactory.newGetter(sourceType, key, mappingContextFactoryBuilder, properties); return new FieldMapperGetterWithConverter<S, J, P>(converter, getter); } return lookForInstantiatorGetter(classMeta, key, columnDefinition, types, mappingContextFactoryBuilder); }
@Test public void testGet() throws Exception { FieldMapperGetterWithConverter<String, Long, Integer> g = new FieldMapperGetterWithConverter<String, Long, Integer>( new ContextualConverter<Long, Integer>() { @Override public Integer convert(Long in, Context context) throws Exception { return 25; } }, new ContextualGetter<String, Long>() { @Override public Long get(String s, Context context) throws Exception { return 3l; } } ); assertEquals(new Integer(25), g.get(null, null)); } }
private <P, J> ContextualGetter<? super S, ? extends P> lookForAlternativeGetter(ClassMeta<P> classMeta, K key, ColumnDefinition<K, ?> columnDefinition, Collection<Type> types, MappingContextFactoryBuilder<?, K> mappingContextFactoryBuilder) { // look for converter Type propertyType = classMeta.getType(); Type sourceType = key.getType(propertyType); Object[] properties = columnDefinition.properties(); ContextualConverter<? super J, ? extends P> converter = converterService.findConverter(sourceType, propertyType, mappingContextFactoryBuilder, properties); if (converter != null) { ContextualGetter<? super S, ? extends J> getter = getterFactory.newGetter(sourceType, key, mappingContextFactoryBuilder, properties); return new FieldMapperGetterWithConverter<S, J, P>(converter, getter); } return lookForInstantiatorGetter(classMeta, key, columnDefinition, types, mappingContextFactoryBuilder); }
return null; return new FieldMapperGetterWithConverter(converterProperty.function, getter);
return null; return new FieldMapperGetterWithConverter(converterProperty.function, getter);
private <T, P> ContextualGetter<? super S, ? extends P> getGetterInstantiator( ClassMeta<P> classMeta, InstantiatorDefinition id, K key, ColumnDefinition<K, ?> columnDefinition, Collection<Type> types, MappingContextFactoryBuilder<?, K> mappingContextFactoryBuilder) { Instantiator<? super T, ? extends P> instantiator = classMeta.getReflectionService().getInstantiatorFactory().getOneArgIdentityInstantiator(id, classMeta.getReflectionService().builderIgnoresNullValues()); final Type paramType = id.getParameters()[0].getGenericType(); ContextualGetter<? super S, ? extends T> subGetter = getterFactory.newGetter(paramType, key, mappingContextFactoryBuilder, columnDefinition ); if (subGetter == null) { if (types.contains(paramType)) { // loop circuit cutter return null; } types.add(paramType); // converter? Type sourceType = key.getType(paramType); ContextualConverter converter = converterService.findConverter(sourceType, paramType, mappingContextFactoryBuilder, columnDefinition.properties()); if (converter != null) { ContextualGetter sourceTypeGetter = getterFactory.newGetter(sourceType, key, mappingContextFactoryBuilder, columnDefinition); subGetter = new FieldMapperGetterWithConverter(converter, sourceTypeGetter); } else { subGetter = lookForInstantiatorGetter(classMeta.getReflectionService().<T>getClassMeta(paramType), key, columnDefinition, types, mappingContextFactoryBuilder); } } if (subGetter != null) { return new InstantiatorContextualGetter<T, S, P>(instantiator, subGetter); } else return null; }
private <T, P> ContextualGetter<? super S, ? extends P> getGetterInstantiator( ClassMeta<P> classMeta, InstantiatorDefinition id, K key, ColumnDefinition<K, ?> columnDefinition, Collection<Type> types, MappingContextFactoryBuilder<?, K> mappingContextFactoryBuilder) { Instantiator<? super T, ? extends P> instantiator = classMeta.getReflectionService().getInstantiatorFactory().getOneArgIdentityInstantiator(id, classMeta.getReflectionService().builderIgnoresNullValues()); final Type paramType = id.getParameters()[0].getGenericType(); ContextualGetter<? super S, ? extends T> subGetter = getterFactory.newGetter(paramType, key, mappingContextFactoryBuilder, columnDefinition ); if (subGetter == null) { if (types.contains(paramType)) { // loop circuit cutter return null; } types.add(paramType); // converter? Type sourceType = key.getType(paramType); ContextualConverter converter = converterService.findConverter(sourceType, paramType, mappingContextFactoryBuilder, columnDefinition.properties()); if (converter != null) { ContextualGetter sourceTypeGetter = getterFactory.newGetter(sourceType, key, mappingContextFactoryBuilder, columnDefinition); subGetter = new FieldMapperGetterWithConverter(converter, sourceTypeGetter); } else { subGetter = lookForInstantiatorGetter(classMeta.getReflectionService().<T>getClassMeta(paramType), key, columnDefinition, types, mappingContextFactoryBuilder); } } if (subGetter != null) { return new InstantiatorContextualGetter<T, S, P>(instantiator, subGetter); } else return null; }
private <P> PlaceHolderValueGetter<T> build(JdbcColumnKey key, PropertyMapping<T, P, JdbcColumnKey> pm) { if (pm != null) { int parameterType = getParameterType(pm); ContextualGetter<T, ? extends P> getter = ContextualGetterAdapter.of(pm.getPropertyMeta().getGetter()); // need conversion ? final DefaultContextFactoryBuilder contextFactoryBuilder = new DefaultContextFactoryBuilder(); Type propertyType = pm.getPropertyMeta().getPropertyType(); Class<?> sqlType = JdbcTypeHelper.toJavaType(parameterType, propertyType); if (!TypeHelper.isAssignable(sqlType, propertyType)) { ContextualConverter<? super Object, ?> converter = ConverterService.getInstance().findConverter(propertyType, sqlType, contextFactoryBuilder); if (converter != null) { getter = new FieldMapperGetterWithConverter(converter, getter); } } return new PlaceHolderValueGetter<T>(pm.getColumnKey().getOrginalName(), parameterType, null, getter, contextFactoryBuilder.build()); } else { return new PlaceHolderValueGetter<T>(key.getOrginalName(), key.getSqlType(null), null, NullContextualGetter.<T, P>getter(), EmptyContextFactory.INSTANCE); } }