![JAR search and dependency download from the Maven repository](/logo.png)
org.sfm.jdbc.impl.getter.ResultSetGetterFactory Maven / Gradle / Ivy
Show all versions of simpleFlatMapper Show documentation
package org.sfm.jdbc.impl.getter;
import org.sfm.jdbc.JdbcColumnKey;
import org.sfm.jdbc.impl.getter.joda.JodaTimeGetterHelper;
import org.sfm.map.MapperBuildingException;
import org.sfm.map.GetterFactory;
import org.sfm.map.ColumnDefinition;
import org.sfm.reflect.Getter;
import org.sfm.reflect.TypeHelper;
import java.io.InputStream;
import java.io.Reader;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.URL;
import java.sql.*;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
//IFJAVA8_START
import org.sfm.map.column.time.JavaTimeHelper;
import org.sfm.jdbc.impl.getter.time.*;
import java.time.*;
//IFJAVA8_END
public final class ResultSetGetterFactory implements GetterFactory{
public static final GetterFactory DATE_GETTER_FACTORY = new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
switch (key.getSqlType()) {
case JdbcColumnKey.UNDEFINED_TYPE:
return (Getter) new UndefinedDateResultSetGetter(key.getIndex());
case Types.TIMESTAMP:
return (Getter) new TimestampResultSetGetter(key.getIndex());
case Types.DATE:
return (Getter) new DateResultSetGetter(key.getIndex());
case Types.TIME:
return (Getter) new TimeResultSetGetter(key.getIndex());
default:
return null;
}
}
};
public static final class StringResultSetGetterFactory implements
GetterFactory {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
switch(key.getSqlType() ) {
case Types.NCHAR:
case Types.NVARCHAR:
case Types.LONGNVARCHAR:
case Types.NCLOB:
return (Getter) new NStringResultSetGetter(key.getIndex());
default:
return (Getter) new StringResultSetGetter(key.getIndex());
}
}
}
public static final GetterFactory ENUM_GETTER_FACTORY = new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type type, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
@SuppressWarnings("rawtypes")
Class extends Enum> enumClass = TypeHelper.toClass(type);
return (Getter) newEnumGetter(enumClass, key);
}
private > Getter newEnumGetter(Class type, JdbcColumnKey key) {
int column = key.getIndex();
switch (key.getSqlType()) {
case JdbcColumnKey.UNDEFINED_TYPE:
return new EnumResultSetGetter
(column, type);
case Types.BIGINT:
case Types.INTEGER:
case Types.NUMERIC:
case Types.SMALLINT:
case Types.TINYINT:
return new OrdinalEnumResultSetGetter
(column, type);
case Types.CHAR:
case Types.LONGVARCHAR:
case Types.VARCHAR:
case Types.CLOB:
return new StringEnumResultSetGetter
(new StringResultSetGetter(column), type);
case Types.LONGNVARCHAR:
case Types.NCHAR:
case Types.NVARCHAR:
case Types.NCLOB:
return new StringEnumResultSetGetter
(new NStringResultSetGetter(column), type);
default:
throw new MapperBuildingException("Incompatible type " + key.getSqlType() + " with enum");
}
}
};
public static final int UNDEFINED = -99999;
private static final Map, GetterFactory> factoryPerType =
new HashMap, GetterFactory>();
static {
factoryPerType.put(String.class, new StringResultSetGetterFactory());
factoryPerType.put(Date.class, DATE_GETTER_FACTORY);
factoryPerType.put(java.util.Calendar.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
Getter dateGetter = DATE_GETTER_FACTORY.newGetter(Date.class, key, columnDefinition);
return (Getter) new CalendarResultSetGetter(dateGetter);
}
});
factoryPerType.put(java.sql.Date.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new DateResultSetGetter(key.getIndex());
}
});
factoryPerType.put(java.sql.Timestamp.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new TimestampResultSetGetter(key.getIndex());
}
});
factoryPerType.put(java.sql.Time.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new TimeResultSetGetter(key.getIndex());
}
});
factoryPerType.put(Boolean.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new BooleanResultSetGetter(key.getIndex());
}
});
factoryPerType.put(Byte.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new ByteResultSetGetter(key.getIndex());
}
});
factoryPerType.put(Character.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new CharacterResultSetGetter(key.getIndex());
}
});
factoryPerType.put(Short.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new ShortResultSetGetter(key.getIndex());
}
});
factoryPerType.put(Integer.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new IntResultSetGetter(key.getIndex());
}
});
factoryPerType.put(Long.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new LongResultSetGetter(key.getIndex());
}
});
factoryPerType.put(Float.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new FloatResultSetGetter(key.getIndex());
}
});
factoryPerType.put(Double.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new DoubleResultSetGetter(key.getIndex());
}
});
factoryPerType.put(BigInteger.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new BigIntegerResultSetGetter(key.getIndex());
}
});
factoryPerType.put(BigDecimal.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new BigDecimalResultSetGetter(key.getIndex());
}
});
factoryPerType.put(URL.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
if (key.getSqlType() == Types.DATALINK) {
return (Getter) new UrlResultSetGetter(key.getIndex());
} else {
return (Getter) new UrlFromStringResultSetGetter(key.getIndex());
}
}
});
factoryPerType.put(byte[].class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new ByteArrayResultSetGetter(key.getIndex());
}
});
factoryPerType.put(InputStream.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new InputStreamResultSetGetter(key.getIndex());
}
});
factoryPerType.put(Blob.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new BlobResultSetGetter(key.getIndex());
}
});
factoryPerType.put(Reader.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
switch (key.getSqlType()) {
case Types.LONGNVARCHAR:
case Types.NCHAR:
case Types.NVARCHAR:
case Types.NCLOB:
return (Getter) new NReaderResultSetGetter(key.getIndex());
default:
return (Getter) new ReaderResultSetGetter(key.getIndex());
}
}
});
factoryPerType.put(Clob.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new ClobResultSetGetter(key.getIndex());
}
});
factoryPerType.put(NClob.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new NClobResultSetGetter(key.getIndex());
}
});
factoryPerType.put(Ref.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new RefResultSetGetter(key.getIndex());
}
});
factoryPerType.put(RowId.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new RowIdResultSetGetter(key.getIndex());
}
});
factoryPerType.put(SQLXML.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new SQLXMLResultSetGetter(key.getIndex());
}
});
factoryPerType.put(Array.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new SqlArrayResultSetGetter(key.getIndex());
}
});
//IFJAVA8_START
factoryPerType.put(LocalDate.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type target, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new JavaLocalDateResultSetGetter(key, JavaTimeHelper.getZoneId(columnDefinition));
}
});
factoryPerType.put(LocalDateTime.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type target, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new JavaLocalDateTimeResultSetGetter(key, JavaTimeHelper.getZoneId(columnDefinition));
}
});
factoryPerType.put(LocalTime.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type target, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new JavaLocalTimeResultSetGetter(key, JavaTimeHelper.getZoneId(columnDefinition));
}
});
factoryPerType.put(OffsetDateTime.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type target, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new JavaOffsetDateTimeResultSetGetter(key, JavaTimeHelper.getZoneId(columnDefinition));
}
});
factoryPerType.put(OffsetTime.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type target, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new JavaOffsetTimeResultSetGetter(key, JavaTimeHelper.getZoneId(columnDefinition));
}
});
factoryPerType.put(ZonedDateTime.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type target, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new JavaZonedDateTimeResultSetGetter(key, JavaTimeHelper.getZoneId(columnDefinition));
}
});
factoryPerType.put(Instant.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type target, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new JavaInstantResultSetGetter(key);
}
});
factoryPerType.put(Year.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type target, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new JavaYearResultSetGetter(key, JavaTimeHelper.getZoneId(columnDefinition));
}
});
factoryPerType.put(YearMonth.class, new GetterFactory() {
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type target, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
return (Getter) new JavaYearMonthResultSetGetter(key, JavaTimeHelper.getZoneId(columnDefinition));
}
});
//IFJAVA8_END
}
@SuppressWarnings("unchecked")
@Override
public Getter newGetter(Type genericType,
JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
Class> clazz = TypeHelper.wrap(TypeHelper.toClass(genericType));
if (Object.class.equals(clazz)) {
return (Getter) new ObjectResultSetGetter(key.getIndex());
}
if (key.getSqlType() == Types.ARRAY) {
if (clazz.isArray()) {
Class> elementType = clazz.getComponentType();
return (Getter) newArrayGetter(elementType, key, columnDefinition);
} else if (TypeHelper.isAssignable(List.class, genericType)) {
Type elementType = TypeHelper.getComponentType(genericType);
return (Getter) newArrayListGetter(elementType, key, columnDefinition);
}
}
GetterFactory getterFactory;
if (clazz.isEnum()) {
getterFactory = ENUM_GETTER_FACTORY;
} else {
getterFactory = factoryPerType.get(clazz);
}
if (getterFactory == null) {
for(Entry, GetterFactory> e : factoryPerType.entrySet()) {
if (clazz.isAssignableFrom(e.getKey())) {
getterFactory = e.getValue();
break;
}
}
}
Getter getter;
if (getterFactory != null) {
getter = (Getter) getterFactory.newGetter(genericType, key, columnDefinition);
} else {
getter = (Getter) JodaTimeGetterHelper.getGetter(genericType, key, columnDefinition);
}
return getter;
}
private Getter newArrayGetter(Class elementType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
Getter elementGetter = newGetter(elementType, new JdbcColumnKey("elt", 2), columnDefinition);
if (elementGetter != null) {
return new ArrayResultSetGetter(key.getIndex(), elementType, elementGetter);
}
return null;
}
private Getter> newArrayListGetter(Type elementType, JdbcColumnKey key, ColumnDefinition, ?> columnDefinition) {
Getter elementGetter = newGetter(elementType, new JdbcColumnKey("elt", 2), columnDefinition);
if (elementGetter != null) {
return new ArrayToListResultSetGetter(key.getIndex(), elementGetter);
}
return null;
}
}