org.sfm.csv.impl.DynamicCsvMapper Maven / Gradle / Ivy
package org.sfm.csv.impl;
import org.sfm.csv.*;
import org.sfm.csv.CsvReader;
import org.sfm.map.FieldMapperErrorHandler;
import org.sfm.map.MapperBuilderErrorHandler;
import org.sfm.map.MappingException;
import org.sfm.map.impl.*;
import org.sfm.reflect.ReflectionService;
import org.sfm.reflect.meta.ClassMeta;
import org.sfm.reflect.meta.PropertyNameMatcherFactory;
import org.sfm.utils.RowHandler;
import java.io.IOException;
import java.io.Reader;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
//IFJAVA8_START
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
//IFJAVA8_END
public final class DynamicCsvMapper implements CsvMapper {
private final ClassMeta classMeta;
private final Type target;
private final FieldMapperErrorHandler fieldMapperErrorHandler;
private final MapperBuilderErrorHandler mapperBuilderErrorHandler;
private final String defaultDateFormat;
private final PropertyNameMatcherFactory propertyNameMatcherFactory;
private MapperCache> mapperCache = new MapperCache>();
private final Map aliases;
private final Map> customReaders;
public DynamicCsvMapper(final Type target, final ClassMeta classMeta,
final FieldMapperErrorHandler fieldMapperErrorHandler,
final MapperBuilderErrorHandler mapperBuilderErrorHandler, String defaultDateFormat,
Map aliases, Map> customReaders,
PropertyNameMatcherFactory propertyNameMatcherFactory) {
this.classMeta = classMeta;
this.target = target;
this.fieldMapperErrorHandler = fieldMapperErrorHandler;
this.mapperBuilderErrorHandler = mapperBuilderErrorHandler;
this.defaultDateFormat = defaultDateFormat;
this.aliases = aliases;
this.customReaders = customReaders;
this.propertyNameMatcherFactory = propertyNameMatcherFactory;
}
public DynamicCsvMapper(Type target, ClassMeta classMeta) {
this(target, classMeta, new RethrowFieldMapperErrorHandler(), new RethrowMapperBuilderErrorHandler(), "yyyy-MM-dd HH:mm:ss",
new HashMap(), new HashMap>(), new DefaultPropertyNameMatcherFactory());
}
@Override
public > H forEach(Reader reader, H handle) throws IOException, MappingException {
return forEach(CsvParser.reader(reader), handle);
}
@Override
public > H forEach(CsvReader csvReader, H handle) throws IOException {
CsvMapperCellConsumer mapperCellConsumer = getDelegateMapper(csvReader).newCellConsumer(handle);
csvReader.parseAll(mapperCellConsumer);
return handle;
}
@Override
public > H forEach(Reader reader, H handle, int skip) throws IOException, MappingException {
return forEach(CsvParser.skip(skip).reader(reader), handle);
}
@Override
public > H forEach(CsvReader csvReader, H handle, int limit) throws IOException {
CsvMapperCellConsumer mapperCellConsumer = getDelegateMapper(csvReader).newCellConsumer(handle);
csvReader.parseRows(mapperCellConsumer, limit);
return handle;
}
@Override
public > H forEach(Reader reader, H handle, int skip, int limit) throws IOException, MappingException {
return forEach(CsvParser.skip(skip).reader(reader), handle, limit);
}
@Override
public Iterator iterate(Reader reader) throws IOException {
CsvReader csvReader = CsvParser.reader(reader);
return iterate(csvReader);
}
@Override
public Iterator iterate(CsvReader csvReader) throws IOException {
CsvMapperImpl mapper = getDelegateMapper(csvReader);
return new CsvMapperIterator(csvReader, mapper);
}
@Override
public Iterator iterate(Reader reader, int skip) throws IOException {
return iterate(CsvParser.skip(skip).reader(reader));
}
private CsvMapperImpl getDelegateMapper(CsvReader reader) throws IOException {
ColumnsMapperKeyBuilderCellConsumer keyBuilderCellConsumer = new ColumnsMapperKeyBuilderCellConsumer();
reader.parseRow(keyBuilderCellConsumer);
return getCsvMapper(keyBuilderCellConsumer.getKey());
}
//IFJAVA8_START
@Override
public Stream stream(Reader reader) throws IOException {
CsvReader csvReader = CsvParser.reader(reader);
return stream(csvReader);
}
@Override
public Stream stream(CsvReader csvReader) throws IOException {
CsvMapperImpl mapper = getDelegateMapper(csvReader);
return StreamSupport.stream(mapper.new CsvSpliterator(csvReader), false);
}
@Override
public Stream stream(Reader reader, int skip) throws IOException {
return stream(CsvParser.skip(skip).reader(reader));
}
//IFJAVA8_END
protected CsvMapperImpl getCsvMapper(ColumnsMapperKey key) {
CsvMapperImpl csvMapperImpl = mapperCache.get(key);
if (csvMapperImpl == null) {
csvMapperImpl = buildeMapper(key);
mapperCache.add(key, csvMapperImpl);
}
return csvMapperImpl;
}
private CsvMapperImpl buildeMapper(ColumnsMapperKey key) {
CsvMapperBuilder builder = new CsvMapperBuilder(target, classMeta, aliases, customReaders, propertyNameMatcherFactory);
builder.fieldMapperErrorHandler(fieldMapperErrorHandler);
builder.mapperBuilderErrorHandler(mapperBuilderErrorHandler);
builder.setDefaultDateFormat(defaultDateFormat);
for(String col : key.getColumns()) {
builder.addMapping(col);
}
return (CsvMapperImpl)builder.mapper();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy