org.sfm.jooq.RecordGetterFactory Maven / Gradle / Ivy
package org.sfm.jooq;
import java.lang.reflect.Type;
import org.jooq.Record;
import org.sfm.jooq.getter.EnumRecordNamedGetter;
import org.sfm.jooq.getter.EnumRecordOrdinalGetter;
import org.sfm.jooq.getter.RecordGetter;
import org.sfm.jooq.getter.RecordGetterWithConverter;
import org.sfm.map.impl.GetterFactory;
import org.sfm.reflect.Getter;
import org.sfm.reflect.TypeHelper;
import org.sfm.utils.conv.Converter;
import org.sfm.utils.conv.ConverterFactory;
public class RecordGetterFactory implements
GetterFactory {
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public Getter newGetter(Type genericType, JooqFieldKey key) {
Class propretyClass = TypeHelper.toClass(genericType);
if (Enum.class.isAssignableFrom(propretyClass)) {
Class> columnType = key.getField().getType();
if (TypeHelper.isNumber(columnType)) {
return new EnumRecordOrdinalGetter(key, propretyClass);
} else if (String.class.equals(columnType)){
return new EnumRecordNamedGetter(key, propretyClass);
} else {
return null;
}
}
if (TypeHelper.areCompatible(propretyClass, key.getField().getType())) {
return new RecordGetter(key.getIndex());
} else {
return newRecordGetterWithConverter(key.getField().getType(), genericType, key.getIndex());
}
}
private Getter newRecordGetterWithConverter(Class inType, Type outType, int index) {
Converter converter = ConverterFactory.getConverter(inType, outType);
if (converter != null) {
return new RecordGetterWithConverter(index, converter);
} else {
return null;
}
}
}