org.sfm.jdbc.ResultSetGetterFactory Maven / Gradle / Ivy
package org.sfm.jdbc;
import java.lang.reflect.Type;
import java.sql.ResultSet;
import java.sql.Types;
import java.util.Date;
import org.sfm.jdbc.getter.BooleanIndexedResultSetGetter;
import org.sfm.jdbc.getter.BooleanNamedResultSetGetter;
import org.sfm.jdbc.getter.ByteIndexedResultSetGetter;
import org.sfm.jdbc.getter.ByteNamedResultSetGetter;
import org.sfm.jdbc.getter.CharacterIndexedResultSetGetter;
import org.sfm.jdbc.getter.CharacterNamedResultSetGetter;
import org.sfm.jdbc.getter.DoubleIndexedResultSetGetter;
import org.sfm.jdbc.getter.DoubleNamedResultSetGetter;
import org.sfm.jdbc.getter.EnumIndexedResultSetGetter;
import org.sfm.jdbc.getter.EnumNamedResultSetGetter;
import org.sfm.jdbc.getter.FloatIndexedResultSetGetter;
import org.sfm.jdbc.getter.FloatNamedResultSetGetter;
import org.sfm.jdbc.getter.IntIndexedResultSetGetter;
import org.sfm.jdbc.getter.IntNamedResultSetGetter;
import org.sfm.jdbc.getter.LongIndexedResultSetGetter;
import org.sfm.jdbc.getter.LongNamedResultSetGetter;
import org.sfm.jdbc.getter.OrdinalEnumIndexedResultSetGetter;
import org.sfm.jdbc.getter.OrdinalEnumNamedResultSetGetter;
import org.sfm.jdbc.getter.ShortIndexedResultSetGetter;
import org.sfm.jdbc.getter.ShortNamedResultSetGetter;
import org.sfm.jdbc.getter.StringEnumIndexedResultSetGetter;
import org.sfm.jdbc.getter.StringEnumNamedResultSetGetter;
import org.sfm.jdbc.getter.StringIndexedResultSetGetter;
import org.sfm.jdbc.getter.StringNamedResultSetGetter;
import org.sfm.jdbc.getter.TimestampIndexedResultSetGetter;
import org.sfm.jdbc.getter.TimestampNamedResultSetGetter;
import org.sfm.map.GetterFactory;
import org.sfm.map.MapperBuildingException;
import org.sfm.reflect.Getter;
import org.sfm.reflect.TypeHelper;
public final class ResultSetGetterFactory implements GetterFactory{
public static final int UNDEFINED = -99999;
@SuppressWarnings("unchecked")
private Getter newNamedGetter(
final Type genericType, final ColumnKey key) {
Getter getter = null;
Class> type = TypeHelper.toClass(genericType);
final String column = key.getColumnName();
if (String.class.isAssignableFrom(type)) {
getter = (Getter) new StringNamedResultSetGetter(column);
} else if (Date.class.isAssignableFrom(type)) {
getter = (Getter) new TimestampNamedResultSetGetter(column);
} else if (type.equals(Boolean.class) || type.equals(boolean.class)) {
getter = (Getter) new BooleanNamedResultSetGetter(column);
} else if (type.equals(Integer.class) || type.equals(int.class)) {
getter = (Getter) new IntNamedResultSetGetter(column);
} else if (type.equals(Long.class) || type.equals(long.class)) {
getter = (Getter) new LongNamedResultSetGetter(column);
} else if (type.equals(Float.class) || type.equals(float.class)) {
getter = (Getter) new FloatNamedResultSetGetter(column);
} else if (type.equals(Double.class) || type.equals(double.class)) {
getter = (Getter) new DoubleNamedResultSetGetter(column);
} else if (type.equals(Byte.class)|| type.equals(byte.class)) {
getter = (Getter) new ByteNamedResultSetGetter(column);
} else if (type.equals(Character.class) || type.equals(char.class)) {
getter = (Getter) new CharacterNamedResultSetGetter(column);
} else if (type.equals(Short.class) || type.equals(short.class)) {
getter = (Getter) new ShortNamedResultSetGetter(column);
} else if (Enum.class.isAssignableFrom(type)) {
@SuppressWarnings("rawtypes")
Class extends Enum> enumClass = (Class extends Enum>) type;
getter = nameEnumGetter(enumClass, key);
}
return getter;
}
@SuppressWarnings("unchecked")
private Getter newIndexedGetter(
Type genericType, ColumnKey key) {
Getter getter = null;
Class> type = TypeHelper.toClass(genericType);
int column = key.getColumnIndex();
if (String.class.isAssignableFrom(type)) {
getter = (Getter) new StringIndexedResultSetGetter(column);
} else if (Date.class.isAssignableFrom(type)) {
getter = (Getter) new TimestampIndexedResultSetGetter(column);
} else if (type.equals(Boolean.class) || type.equals(boolean.class)) {
getter = (Getter) new BooleanIndexedResultSetGetter(column);
} else if (type.equals(Integer.class) || type.equals(int.class)) {
getter = (Getter) new IntIndexedResultSetGetter(column);
} else if (type.equals(Long.class) || type.equals(long.class)) {
getter = (Getter) new LongIndexedResultSetGetter(column);
} else if (type.equals(Float.class) || type.equals(float.class)) {
getter = (Getter) new FloatIndexedResultSetGetter(column);
} else if (type.equals(Double.class) || type.equals(double.class)) {
getter = (Getter) new DoubleIndexedResultSetGetter(column);
} else if (type.equals(Byte.class) || type.equals(byte.class)) {
getter = (Getter) new ByteIndexedResultSetGetter(column);
} else if (type.equals(Character.class) || type.equals(char.class)) {
getter = (Getter) new CharacterIndexedResultSetGetter(column);
} else if (type.equals(Short.class) || type.equals(short.class)) {
getter = (Getter) new ShortIndexedResultSetGetter(column);
} else if (Enum.class.isAssignableFrom(type)) {
@SuppressWarnings("rawtypes")
Class extends Enum> enumClass = (Class extends Enum>) type;
getter = indexEnumGetter(enumClass, key);
}
return getter;
}
private > Getter indexEnumGetter(Class type, ColumnKey key) {
int column = key.getColumnIndex();
switch(key.getSqlType()) {
case ColumnKey.UNDEFINED_TYPE:
return new EnumIndexedResultSetGetter
(column, type);
case Types.BIGINT:
case Types.INTEGER:
case Types.NUMERIC:
case Types.SMALLINT:
case Types.TINYINT:
return new OrdinalEnumIndexedResultSetGetter
(column, type);
case Types.CHAR:
case Types.LONGNVARCHAR:
case Types.LONGVARCHAR:
case Types.NCHAR:
case Types.NVARCHAR:
case Types.VARCHAR:
return new StringEnumIndexedResultSetGetter
(column, type);
default:
throw new MapperBuildingException("Incompatible type " + key.getSqlType() + " with enum");
}
}
private
> Getter nameEnumGetter(
final Class type, final ColumnKey key) {
String column = key.getColumnName();
switch(key.getSqlType()) {
case ColumnKey.UNDEFINED_TYPE:
return new EnumNamedResultSetGetter
(column, type);
case Types.BIGINT:
case Types.INTEGER:
case Types.NUMERIC:
case Types.SMALLINT:
case Types.TINYINT:
return new OrdinalEnumNamedResultSetGetter
(column, type);
case Types.CHAR:
case Types.LONGNVARCHAR:
case Types.LONGVARCHAR:
case Types.NCHAR:
case Types.NVARCHAR:
case Types.VARCHAR:
return new StringEnumNamedResultSetGetter
(column, type);
default:
throw new MapperBuildingException("Incompatible type " + key.getSqlType() + " with enum");
}
}
@Override
public
Getter newGetter(Type genericType, ColumnKey key) {
if (key.hasColumnIndex()) {
return newIndexedGetter(genericType, key);
} else {
return newNamedGetter(genericType, key);
}
}
}