
org.sfm.csv.impl.CellSetterFactory Maven / Gradle / Ivy
Show all versions of simpleFlatMapper Show documentation
package org.sfm.csv.impl;
import org.sfm.csv.CellValueReader;
import org.sfm.csv.CellValueReaderFactory;
import org.sfm.csv.CsvColumnDefinition;
import org.sfm.csv.CsvColumnKey;
import org.sfm.csv.impl.cellreader.*;
import org.sfm.csv.impl.primitive.*;
import org.sfm.csv.ParsingContextFactoryBuilder;
import org.sfm.reflect.Getter;
import org.sfm.reflect.Setter;
import org.sfm.reflect.SetterFactory;
import org.sfm.reflect.TypeHelper;
import java.lang.reflect.Constructor;
import java.lang.reflect.Type;
public final class CellSetterFactory {
private final CellValueReaderFactory cellValueReaderFactory;
public CellSetterFactory(CellValueReaderFactory cellValueReaderFactory) {
this.cellValueReaderFactory = cellValueReaderFactory;
}
public CellSetter getPrimitiveCellSetter(Class> clazz, CellValueReader reader, Setter setter) {
if (boolean.class.equals(clazz)) {
return new BooleanCellSetter(SetterFactory.toBooleanSetter(setter), booleanReader(reader));
} else if (byte.class.equals(clazz)) {
return new ByteCellSetter(SetterFactory.toByteSetter(setter), byteReader(reader));
} else if (char.class.equals(clazz)) {
return new CharCellSetter(SetterFactory.toCharacterSetter(setter), charReader(reader));
} else if (short.class.equals(clazz)) {
return new ShortCellSetter(SetterFactory.toShortSetter(setter), shortReader(reader));
} else if (int.class.equals(clazz)) {
return new IntCellSetter(SetterFactory.toIntSetter(setter), intReader(reader));
} else if (long.class.equals(clazz)) {
return new LongCellSetter(SetterFactory.toLongSetter(setter), longReader(reader));
} else if (float.class.equals(clazz)) {
return new FloatCellSetter(SetterFactory.toFloatSetter(setter), floatReader(reader));
} else if (double.class.equals(clazz)) {
return new DoubleCellSetter(SetterFactory.toDoubleSetter(setter), doubleReader(reader));
}
throw new IllegalArgumentException("Invalid primitive type " + clazz);
}
@SuppressWarnings("unchecked")
private DoubleCellValueReader doubleReader(CellValueReader> reader) {
if (reader instanceof DoubleCellValueReader) {
return (DoubleCellValueReader) reader;
} else {
return new DoubleCellValueReaderUnbox((CellValueReader) reader);
}
}
@SuppressWarnings("unchecked")
private FloatCellValueReader floatReader(CellValueReader> reader) {
if (reader instanceof FloatCellValueReader) {
return (FloatCellValueReader) reader;
} else {
return new FloatCellValueReaderUnbox((CellValueReader) reader);
}
}
@SuppressWarnings("unchecked")
private LongCellValueReader longReader(CellValueReader> reader) {
if (reader instanceof LongCellValueReader) {
return (LongCellValueReader) reader;
} else {
return new LongCellValueReaderUnbox((CellValueReader) reader);
}
}
@SuppressWarnings("unchecked")
private IntegerCellValueReader intReader(CellValueReader> reader) {
if (reader instanceof IntegerCellValueReader) {
return (IntegerCellValueReader) reader;
} else {
return new IntegerCellValueReaderUnbox((CellValueReader) reader);
}
}
@SuppressWarnings("unchecked")
private ShortCellValueReader shortReader(CellValueReader> reader) {
if (reader instanceof ShortCellValueReader) {
return (ShortCellValueReader) reader;
} else {
return new ShortCellValueReaderUnbox((CellValueReader) reader);
}
}
@SuppressWarnings("unchecked")
private CharCellValueReader charReader(CellValueReader> reader) {
if (reader instanceof CharCellValueReader) {
return (CharCellValueReader) reader;
} else {
return new CharCellValueReaderUnbox((CellValueReader) reader);
}
}
@SuppressWarnings("unchecked")
private ByteCellValueReader byteReader(CellValueReader> reader) {
if (reader instanceof ByteCellValueReader) {
return (ByteCellValueReader) reader;
} else {
return new ByteCellValueReaderUnbox((CellValueReader) reader);
}
}
@SuppressWarnings("unchecked")
private BooleanCellValueReader booleanReader(CellValueReader> reader) {
if (reader instanceof BooleanCellValueReader) {
return (BooleanCellValueReader) reader;
} else {
return new BooleanCellValueReaderUnbox((CellValueReader) reader);
}
}
@SuppressWarnings("unchecked")
public DelayedCellSetterFactory getPrimitiveDelayedCellSetter(Class> clazz, CellValueReader reader, Setter setter) {
if (boolean.class.equals(clazz)) {
return (DelayedCellSetterFactory) new BooleanDelayedCellSetterFactory(SetterFactory.toBooleanSetter(setter), booleanReader(reader));
} else if (byte.class.equals(clazz)) {
return (DelayedCellSetterFactory) new ByteDelayedCellSetterFactory(SetterFactory.toByteSetter(setter), byteReader(reader));
} else if (char.class.equals(clazz)) {
return (DelayedCellSetterFactory) new CharDelayedCellSetterFactory(SetterFactory.toCharacterSetter(setter), charReader(reader));
} else if (short.class.equals(clazz)) {
return (DelayedCellSetterFactory) new ShortDelayedCellSetterFactory(SetterFactory.toShortSetter(setter), shortReader(reader));
} else if (int.class.equals(clazz)) {
return (DelayedCellSetterFactory) new IntDelayedCellSetterFactory(SetterFactory.toIntSetter(setter), intReader(reader));
} else if (long.class.equals(clazz)) {
return (DelayedCellSetterFactory) new LongDelayedCellSetterFactory(SetterFactory.toLongSetter(setter), longReader(reader));
} else if (float.class.equals(clazz)) {
return (DelayedCellSetterFactory) new FloatDelayedCellSetterFactory(SetterFactory.toFloatSetter(setter), floatReader(reader));
} else if (double.class.equals(clazz)) {
return (DelayedCellSetterFactory) new DoubleDelayedCellSetterFactory(SetterFactory.toDoubleSetter(setter), doubleReader(reader));
}
throw new IllegalArgumentException("Invalid primitive type " + clazz);
}
public Getter[], ?> newDelayedGetter(CsvColumnKey key, Type type) {
Class> clazz = TypeHelper.toClass(type);
Getter[], ?> getter;
int columnIndex = key.getIndex();
if (clazz.isPrimitive()) {
if (boolean.class.equals(clazz)) {
getter = new BooleanDelayedGetter(columnIndex);
} else if (byte.class.equals(clazz)) {
getter = new ByteDelayedGetter(columnIndex);
} else if (char.class.equals(clazz)) {
getter = new CharDelayedGetter(columnIndex);
} else if (short.class.equals(clazz)) {
getter = new ShortDelayedGetter(columnIndex);
} else if (int.class.equals(clazz)) {
getter = new IntDelayedGetter(columnIndex);
} else if (long.class.equals(clazz)) {
getter = new LongDelayedGetter(columnIndex);
} else if (float.class.equals(clazz)) {
getter = new FloatDelayedGetter(columnIndex);
} else if (double.class.equals(clazz)) {
getter = new DoubleDelayedGetter(columnIndex);
} else {
throw new IllegalArgumentException("Unexpected primitive " + clazz);
}
} else {
getter = new DelayedGetter(columnIndex);
}
return getter;
}
@SuppressWarnings({"unchecked" })
private CellValueReader
getReader(Class extends P> propertyType, int index, CsvColumnDefinition columnDefinition, ParsingContextFactoryBuilder parsingContextFactoryBuilder) {
CellValueReader
reader = null;
if (columnDefinition.hasCustomSource()) {
reader = (CellValueReader
) columnDefinition.getCustomReader();
}
CellValueReaderFactory factory = cellValueReaderFactory;
if (columnDefinition.hasCustomReaderFactory()) {
factory = columnDefinition.getCustomCellValueReaderFactory();
}
if (reader == null) {
reader = factory.
getReader(propertyType, index, columnDefinition, parsingContextFactoryBuilder);
}
if (reader == null) {
// check if has a one arg construct
final Constructor>[] constructors = propertyType.getConstructors();
if (constructors != null && constructors.length == 1 && constructors[0].getParameterTypes().length == 1) {
final Constructor
constructor = (Constructor
) constructors[0];
CellValueReader> innerReader = factory.
getReader(constructor.getParameterTypes()[0], index, columnDefinition, parsingContextFactoryBuilder);
if (innerReader != null) {
reader = new ConstructorOnReader
(constructor, innerReader);
}
}
}
if (reader == null) {
throw new ParsingException("No cell reader for " + propertyType);
}
return reader;
}
@SuppressWarnings("unchecked")
public CellSetter getCellSetter(Type propertyType, Setter setter, int index, CsvColumnDefinition columnDefinition, ParsingContextFactoryBuilder parsingContextFactoryBuilder) {
Class extends P> propertyClass = (Class extends P>) TypeHelper.toClass(propertyType);
CellValueReader reader = getReader(propertyClass, index, columnDefinition, parsingContextFactoryBuilder);
if (propertyClass.isPrimitive()) {
return getPrimitiveCellSetter(propertyClass, reader, setter);
} else {
return new CellSetterImpl(reader, setter);
}
}
public DelayedCellSetterFactory getDelayedCellSetter(Type propertyType, Setter setter, int index, CsvColumnDefinition columnDefinition, ParsingContextFactoryBuilder parsingContextFactoryBuilder) {
Class extends P> propertyClass = TypeHelper.toClass(propertyType);
CellValueReader reader = getReader(propertyClass, index, columnDefinition, parsingContextFactoryBuilder);
if (propertyClass.isPrimitive()) {
return getPrimitiveDelayedCellSetter(propertyClass, reader, setter);
} else {
return new DelayedCellSetterFactoryImpl(reader, setter);
}
}
@SuppressWarnings("unchecked")
public DelayedCellSetterFactory getDelayedCellSetter(Type type, int index, CsvColumnDefinition columnDefinition, ParsingContextFactoryBuilder parsingContextFactoryBuilder) {
Class> propertyClass = TypeHelper.toClass(type);
CellValueReader reader = getReader((Class
) TypeHelper.toClass(type), index, columnDefinition, parsingContextFactoryBuilder);
if (propertyClass.isPrimitive()) {
return getPrimitiveDelayedCellSetter(propertyClass, reader, null);
} else {
return new DelayedCellSetterFactoryImpl(reader, null);
}
}
}