All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.sfm.jdbc.ResultSetMapperBuilderImpl Maven / Gradle / Ivy

package org.sfm.jdbc;

import java.lang.reflect.Type;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Map;

import org.sfm.map.AbstractMapperBuilderImpl;
import org.sfm.map.FieldMapper;
import org.sfm.map.MapperBuildingException;
import org.sfm.map.RethrowRowHandlerErrorHandler;
import org.sfm.map.RowHandlerErrorHandler;
import org.sfm.reflect.ReflectionService;
import org.sfm.reflect.meta.ClassMeta;

public final class ResultSetMapperBuilderImpl extends AbstractMapperBuilderImpl, ResultSetMapperBuilder> implements ResultSetMapperBuilder {

	private final Map aliases;
	private int columnIndex = 1;
	protected final Map> customMappings;
	private RowHandlerErrorHandler jdbcMapperErrorHandler = new RethrowRowHandlerErrorHandler();

	public ResultSetMapperBuilderImpl(final Type target) throws MapperBuildingException {
		this(target, new ReflectionService());
	}
	public ResultSetMapperBuilderImpl(final Type target, ReflectionService reflectService) throws MapperBuildingException {
		this(target, reflectService, null, null);
	}
	@SuppressWarnings("unchecked")
	public ResultSetMapperBuilderImpl(final Type target, ReflectionService reflectService, final Map aliases, Map> customMappings) throws MapperBuildingException {
		this(target, (ClassMeta) reflectService.getClassMeta(target), aliases, customMappings);
	}
	
	public ResultSetMapperBuilderImpl(final Type target, final ClassMeta classMeta, final Map aliases, Map> customMappings) throws MapperBuildingException {
		super(target, ResultSet.class, classMeta, new ResultSetGetterFactory(), new ResultSetFieldMapperFactory(new ResultSetGetterFactory()));
		this.aliases = aliases;
		this.customMappings = customMappings;
	}


	@Override
	public final ResultSetMapperBuilder addNamedColumn(final String column) {
		return addNamedColumn(column, ResultSetGetterFactory.UNDEFINED);
	}

	@Override
	public final ResultSetMapperBuilder addIndexedColumn(final String column) {
		return addIndexedColumn(column, columnIndex ++);
	}

	@Override
	public final ResultSetMapperBuilder addIndexedColumn(final String column, final int columnIndex) {
		return addIndexedColumn(column, columnIndex, ResultSetGetterFactory.UNDEFINED);
	}
	
	@Override
	public final ResultSetMapperBuilder addMapping(final String property, final String column) {
		return addMapping(property, column, ResultSetGetterFactory.UNDEFINED);
	}
	
	@Override
	public final ResultSetMapperBuilder addMapping(final String property, final int column) {
		return addMapping(property, column, ResultSetGetterFactory.UNDEFINED);
	}
	
	@Override
	public final ResultSetMapperBuilder addNamedColumn(final String column, final int sqlType) {
		return addMapping(columnToPropertyName(column), column, sqlType);
	}
	
	private String columnToPropertyName(String column) {
		if (aliases == null || aliases.isEmpty()) {
			return column;
		} 
		String alias = aliases.get(column.toUpperCase());
		if (alias == null) {
			return column;
		}
		return alias;
	}
	
	@Override
	public final ResultSetMapperBuilder addIndexedColumn(final String column, final int columnIndex, final int sqlType) {
		return addMapping(columnToPropertyName(column), new ColumnKey(column, columnIndex, sqlType));
	}

	@Override
	public final ResultSetMapperBuilder addMapping(final String propertyName, final int columnIndex, final int sqlType) {
		return addMapping(propertyName, new ColumnKey("column:"+ columnIndex, columnIndex, sqlType));
	}
	
	@Override
	public ResultSetMapperBuilder addMapping(String propertyName, String column,
			int sqlType) {
		return addMapping(propertyName, new ColumnKey(column, -1, sqlType));
	}
	
	@Override
	public final ResultSetMapperBuilder addMapping(final ResultSetMetaData metaData) throws SQLException {
		for(int i = 1; i <= metaData.getColumnCount(); i++) {
			addIndexedColumn(metaData.getColumnLabel(i), i, metaData.getColumnType(i));
		}
		
		return this;
	}
	
	@Override
	@SuppressWarnings("unchecked")
	protected FieldMapper getCustomMapper(final ColumnKey columnKey) {
		return customMappings != null ? (FieldMapper) customMappings.get(columnKey.getColumnName().toUpperCase()) : null;
	}
	@Override
	public JdbcMapper mapper() {
		if (reflectionService.isAsmActivated()) {
			try {
				return reflectionService.getAsmFactory().createJdbcMapper(fields(), getInstantiator(), getTargetClass(), jdbcMapperErrorHandler);
			} catch(Exception e) {
				return new JdbcMapperImpl(fields(), getInstantiator(), jdbcMapperErrorHandler);
			}
		} else {
			return new JdbcMapperImpl(fields(), getInstantiator(), jdbcMapperErrorHandler);
		}
	}
	@Override
	protected MapperBuilder newMapperBuilder(Type type, ClassMeta classMeta) {
		return new  ResultSetMapperBuilderImpl(type, classMeta, aliases, customMappings);
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy