use of org.simpleflatmapper.map.getter.ContextualGetter in project SimpleFlatMapper by arnaudroger.
the class ConstantSourceFieldMapperFactoryImpl method getGetterInstantiator.
private <T, P> ContextualGetter<? super S, ? extends P> getGetterInstantiator(ClassMeta<P> classMeta, InstantiatorDefinition id, K key, ColumnDefinition<K, ?> columnDefinition, Collection<Type> types, MappingContextFactoryBuilder<?, ? extends FieldKey<?>> 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;
}
use of org.simpleflatmapper.map.getter.ContextualGetter in project SimpleFlatMapper by arnaudroger.
the class DefaultConstantSourceMapperBuilder method getConstructorFieldMappersAndInstantiator.
@SuppressWarnings("unchecked")
private InstantiatorAndFieldMappers<S, T> getConstructorFieldMappersAndInstantiator(ConstructorInjections<S, T> constructorInjections) throws MapperBuildingException {
InstantiatorFactory instantiatorFactory = reflectionService.getInstantiatorFactory();
try {
Map<Parameter, ContextualGetter<? super S, ?>> injections = constructorInjections.parameterGetterMap;
MapperBiInstantiatorFactory mapperBiInstantiatorFactory = new MapperBiInstantiatorFactory(instantiatorFactory);
ContextualGetterFactory<? super S, K> getterFactory = fieldMapperAsGetterFactory();
BiInstantiator<S, MappingContext<?>, T> instantiator = mapperBiInstantiatorFactory.<S, T, K>getBiInstantiator(mapperSource.source(), target, propertyMappingsBuilder, injections, getterFactory, reflectionService.builderIgnoresNullValues(), mappingContextFactoryBuilder);
return new InstantiatorAndFieldMappers(constructorInjections, instantiator);
} catch (Exception e) {
return ErrorHelper.rethrow(e);
}
}
use of org.simpleflatmapper.map.getter.ContextualGetter in project SimpleFlatMapper by arnaudroger.
the class JdbcTemplateMapperFactoryTest method testIssue618OverrideEnum.
@Test
public void testIssue618OverrideEnum() throws SQLException {
JdbcTemplateMapperFactory config = JdbcTemplateMapperFactory.newInstance().addGetterForType(new Predicate<Type>() {
@Override
public boolean test(Type type) {
return TypeHelper.isAssignable(LookupValue.class, type);
}
}, new ContextualGetterFactory<ResultSet, JdbcColumnKey>() {
@Override
public <P> ContextualGetter<ResultSet, P> newGetter(Type target, JdbcColumnKey key, MappingContextFactoryBuilder<?, ? extends FieldKey<?>> mappingContextFactoryBuilder, Object... properties) {
Class enumClass = TypeHelper.toClass(target);
final Enum[] values = EnumHelper.getValues(enumClass);
final int index = key.getIndex();
return new ContextualGetter<ResultSet, P>() {
@Override
public P get(ResultSet resultSet, Context context) throws Exception {
int i = resultSet.getInt(index);
for (Enum e : values) {
if (((LookupValue) e).lookupValue() == i) {
return (P) e;
}
}
return null;
}
};
}
});
ResultSetExtractorImpl<Issue618> rse = JdbcTemplateMapperFactory.newInstance(config).newResultSetExtractor(Issue618.class);
Connection conn = DbHelper.getDbConnection(DbHelper.TargetDB.POSTGRESQL);
Statement st = null;
ResultSet rs = null;
if (conn == null)
return;
try {
st = conn.createStatement();
rs = st.executeQuery("SELECT * FROM (VALUES (1, 1), (2, 2)) AS t (id, enum618) ");
List<Issue618> issue618s = rse.extractData(rs);
assertEquals(Arrays.asList(new Issue618(1, Enum618.A), new Issue618(2, Enum618.B)), issue618s);
} finally {
if (rs != null)
rs.close();
if (st != null)
st.close();
conn.close();
}
}
Aggregations