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

org.sfm.csv.CellSetterFactory Maven / Gradle / Ivy

package org.sfm.csv;

import java.lang.reflect.Type;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.sfm.csv.cell.BooleanCellValueReader;
import org.sfm.csv.cell.ByteCellValueReader;
import org.sfm.csv.cell.CellSetterImpl;
import org.sfm.csv.cell.CharCellValueReader;
import org.sfm.csv.cell.DateCellValueReader;
import org.sfm.csv.cell.DelayedCellSetterFactoryImpl;
import org.sfm.csv.cell.DoubleCellValueReader;
import org.sfm.csv.cell.EnumCellValueReader;
import org.sfm.csv.cell.FloatCellValueReader;
import org.sfm.csv.cell.IntegerCellValueReader;
import org.sfm.csv.cell.LongCellValueReader;
import org.sfm.csv.cell.ParsingException;
import org.sfm.csv.cell.ShortCellValueReader;
import org.sfm.csv.cell.StringCellValueReader;
import org.sfm.csv.primitive.BooleanCellSetter;
import org.sfm.csv.primitive.BooleanDelayedCellSetterFactory;
import org.sfm.csv.primitive.ByteCellSetter;
import org.sfm.csv.primitive.ByteDelayedCellSetterFactory;
import org.sfm.csv.primitive.CharCellSetter;
import org.sfm.csv.primitive.CharDelayedCellSetterFactory;
import org.sfm.csv.primitive.DoubleCellSetter;
import org.sfm.csv.primitive.DoubleDelayedCellSetterFactory;
import org.sfm.csv.primitive.FloatCellSetter;
import org.sfm.csv.primitive.FloatDelayedCellSetterFactory;
import org.sfm.csv.primitive.IntCellSetter;
import org.sfm.csv.primitive.IntDelayedCellSetterFactory;
import org.sfm.csv.primitive.LongCellSetter;
import org.sfm.csv.primitive.LongDelayedCellSetterFactory;
import org.sfm.csv.primitive.ShortCellSetter;
import org.sfm.csv.primitive.ShortDelayedCellSetterFactory;
import org.sfm.reflect.Setter;
import org.sfm.reflect.SetterFactory;
import org.sfm.reflect.TypeHelper;

public class CellSetterFactory {

	@SuppressWarnings("serial")
	private static final Map, CellValueReader> transformers = new HashMap, CellValueReader>(){{
		put(boolean.class,   new BooleanCellValueReader());
		put(byte.class,      new ByteCellValueReader());
		put(char.class, new CharCellValueReader());
		put(short.class,     new ShortCellValueReader());
		put(int.class,   new IntegerCellValueReader());
		put(long.class,      new LongCellValueReader());
		put(float.class,     new FloatCellValueReader());
		put(double.class,    new DoubleCellValueReader());
		put(Boolean.class,   new BooleanCellValueReader());
		put(Byte.class,      new ByteCellValueReader());
		put(Character.class, new CharCellValueReader());
		put(Short.class,     new ShortCellValueReader());
		put(Integer.class,   new IntegerCellValueReader());
		put(Long.class,      new LongCellValueReader());
		put(Float.class,     new FloatCellValueReader());
		put(Double.class,    new DoubleCellValueReader());
		put(String.class,    new StringCellValueReader());
	}};
	
	private Map> customReaders;
	
	public CellSetterFactory(Map> customReaders) {
		this.customReaders = customReaders;
	}

	public  CellSetter getCellSetter(Setter setter, int index, String columnName) {
		Class propertyClass = TypeHelper.toClass(setter.getPropertyType());
		
		if (propertyClass.isPrimitive() && !customReaders.containsKey(columnName)) {
			return getPrimitiveCellSetter(propertyClass, setter);
		}
		
		return new CellSetterImpl(getReaderForSetter(setter, index, columnName), setter) ;
	}
	
	public  CellSetter getPrimitiveCellSetter(Class clazz, Setter setter) {
		if (boolean.class.equals(clazz)) {
			return new BooleanCellSetter(SetterFactory.toBooleanSetter(setter));
		} else if (byte.class.equals(clazz)) {
			return new ByteCellSetter(SetterFactory.toByteSetter(setter));
		} else if (char.class.equals(clazz)) {
			return new CharCellSetter(SetterFactory.toCharacterSetter(setter));
		} else if (short.class.equals(clazz)) {
			return new ShortCellSetter(SetterFactory.toShortSetter(setter));
		} else if (int.class.equals(clazz)) {
			return new IntCellSetter(SetterFactory.toIntSetter(setter));
		} else if (long.class.equals(clazz)) {
			return new LongCellSetter(SetterFactory.toLongSetter(setter));
		} else if (float.class.equals(clazz)) {
			return new FloatCellSetter(SetterFactory.toFloatSetter(setter));
		} else if (double.class.equals(clazz)) {
			return new DoubleCellSetter(SetterFactory.toDoubleSetter(setter));
		} 
		throw new IllegalArgumentException("Invalid primitive type " + clazz);
	}
	
	@SuppressWarnings("unchecked")
	public  DelayedCellSetterFactory getPrimitiveDelayedCellSetter(Class clazz, Setter setter) {
		if (boolean.class.equals(clazz)) {
			return (DelayedCellSetterFactory) new BooleanDelayedCellSetterFactory(SetterFactory.toBooleanSetter(setter));
		} else if (byte.class.equals(clazz)) {
			return (DelayedCellSetterFactory) new ByteDelayedCellSetterFactory(SetterFactory.toByteSetter(setter));
		} else if (char.class.equals(clazz)) {
			return (DelayedCellSetterFactory) new CharDelayedCellSetterFactory(SetterFactory.toCharacterSetter(setter));
		} else if (short.class.equals(clazz)) {
			return (DelayedCellSetterFactory) new ShortDelayedCellSetterFactory(SetterFactory.toShortSetter(setter));
		} else if (int.class.equals(clazz)) {
			return (DelayedCellSetterFactory) new IntDelayedCellSetterFactory(SetterFactory.toIntSetter(setter));
		} else if (long.class.equals(clazz)) {
			return (DelayedCellSetterFactory) new LongDelayedCellSetterFactory(SetterFactory.toLongSetter(setter));
		} else if (float.class.equals(clazz)) {
			return (DelayedCellSetterFactory) new FloatDelayedCellSetterFactory(SetterFactory.toFloatSetter(setter));
		} else if (double.class.equals(clazz)) {
			return (DelayedCellSetterFactory) new DoubleDelayedCellSetterFactory(SetterFactory.toDoubleSetter(setter));
		} 
		throw new IllegalArgumentException("Invalid primitive type " + clazz);
	}

	private  CellValueReader

getReaderForSetter(Setter setter, int index, String colunn) { Class

propertyType = TypeHelper.toClass(setter.getPropertyType()); CellValueReader

reader = getReader(propertyType, index, colunn); return reader; } @SuppressWarnings({ "rawtypes", "unchecked" }) private

CellValueReader

getReader(Class

propertyType, int index, String column) { CellValueReader

reader = null; reader = (CellValueReader

) customReaders.get(column); if (reader == null) { if (Date.class.isAssignableFrom(propertyType)) { reader = (CellValueReader

) new DateCellValueReader(index); } else if (Enum.class.isAssignableFrom(propertyType)) { reader = new EnumCellValueReader(propertyType); } else { reader = getCellValueTransformer(propertyType); } } if (reader == null) { throw new ParsingException("No cell reader for " + propertyType); } return reader; } @SuppressWarnings("unchecked") private

CellValueReader

getCellValueTransformer(Class

propertyType) { return (CellValueReader

) transformers.get(propertyType); } public DelayedCellSetterFactory getDelayedCellSetter(Setter setter, int index, String columnName) { Class propertyClass = TypeHelper.toClass(setter.getPropertyType()); if (propertyClass.isPrimitive() && !customReaders.containsKey(columnName)) { return getPrimitiveDelayedCellSetter(propertyClass, setter); } return new DelayedCellSetterFactoryImpl(getReaderForSetter(setter, index, columnName), setter); } @SuppressWarnings("unchecked") public DelayedCellSetterFactory getDelayedCellSetter(Type type, int index, String columnName) { Class propertyClass = TypeHelper.toClass(type); if (propertyClass.isPrimitive() && !customReaders.containsKey(columnName)) { return getPrimitiveDelayedCellSetter(propertyClass, null); } return new DelayedCellSetterFactoryImpl(getReader((Class

)TypeHelper.toClass(type), index, columnName), null); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy