org.sfm.csv.impl.DynamicCsvMapper Maven / Gradle / Ivy
package org.sfm.csv.impl;
import org.sfm.csv.*;
import org.sfm.csv.parser.CsvReader;
import org.sfm.map.FieldMapperErrorHandler;
import org.sfm.map.MapperBuilderErrorHandler;
import org.sfm.map.MappingException;
import org.sfm.map.impl.ColumnsMapperKey;
import org.sfm.map.impl.MapperCache;
import org.sfm.reflect.ReflectionService;
import org.sfm.reflect.meta.ClassMeta;
import org.sfm.utils.RowHandler;
import java.io.IOException;
import java.io.Reader;
import java.util.Iterator;
import java.util.Map;
/*IFJAVA8_START
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
IFJAVA8_END*/
public final class DynamicCsvMapper implements CsvMapper {
private final ClassMeta classMeta;
private final Class target;
private final CsvParser csvParser;
private final FieldMapperErrorHandler fieldMapperErrorHandler;
private final MapperBuilderErrorHandler mapperBuilderErrorHandler;
private final String defaultDateFormat;
private MapperCache> mapperCache = new MapperCache>();
private final Map aliases;
private final Map> customReaders;
public DynamicCsvMapper(final Class target, final ReflectionService reflectionService,
final FieldMapperErrorHandler fieldMapperErrorHandler,
final MapperBuilderErrorHandler mapperBuilderErrorHandler, String defaultDateFormat,
Map aliases, Map> customReaders) {
this.classMeta = reflectionService.getClassMeta(target);
this.target = target;
this.fieldMapperErrorHandler = fieldMapperErrorHandler;
this.mapperBuilderErrorHandler = mapperBuilderErrorHandler;
this.csvParser = new CsvParser();
this.defaultDateFormat = defaultDateFormat;
this.aliases = aliases;
this.customReaders = customReaders;
}
@Override
public > H forEach(Reader reader, H handle) throws IOException, MappingException {
CsvReader csvReader = CsvParser.newCsvReader(reader);
CsvMapperCellConsumer mapperCellConsumer = getDelegateMapper(csvReader).newCellConsumer(handle);
csvReader.parseAll(mapperCellConsumer);
return handle;
}
@Override
public > H forEach(Reader reader, H handle, int skip) throws IOException, MappingException {
CsvReader csvReader = CsvParser.newCsvReader(reader);
csvReader.skipLines(skip);
CsvMapperCellConsumer mapperCellConsumer = getDelegateMapper(csvReader).newCellConsumer(handle);
csvReader.parseAll(mapperCellConsumer);
return handle;
}
@Override
public > H forEach(Reader reader, H handle, int skip, int limit) throws IOException, MappingException {
CsvReader csvReader = CsvParser.newCsvReader(reader);
csvReader.skipLines(skip);
CsvMapperCellConsumer mapperCellConsumer = getDelegateMapper(csvReader).newCellConsumer(handle);
csvReader.parseLines(mapperCellConsumer, limit);
return handle;
}
@Override
public Iterator iterate(Reader reader) throws IOException {
CsvReader csvReader = CsvParser.newCsvReader(reader);
CsvMapperImpl mapper = getDelegateMapper(csvReader);
return new CsvIterator(csvReader, mapper);
}
@Override
public Iterator iterate(Reader reader, int skip) throws IOException {
CsvReader csvReader = CsvParser.newCsvReader(reader);
csvReader.skipLines(skip);
CsvMapperImpl mapper = getDelegateMapper(csvReader);
return new CsvIterator(csvReader, mapper);
}
private CsvMapperImpl getDelegateMapper(CsvReader reader) throws IOException {
ColumnsMapperKeyBuilderCellConsumer keyBuilderCellConsumer = new ColumnsMapperKeyBuilderCellConsumer();
reader.parseLine(keyBuilderCellConsumer);
return getCsvMapper(keyBuilderCellConsumer.getKey());
}
/*IFJAVA8_START
@Override
public Stream stream(Reader reader) throws IOException {
CsvReader csvReader = CsvParser.newCsvReader(reader);
CsvMapperImpl mapper = getDelegateMapper(csvReader);
return StreamSupport.stream(mapper.new CsvSpliterator(csvReader), false);
}
@Override
public Stream stream(Reader reader, int skip) throws IOException {
CsvReader csvReader = CsvParser.newCsvReader(reader);
csvReader.skipLines(skip);
CsvMapperImpl mapper = getDelegateMapper(csvReader);
return StreamSupport.stream(mapper.new CsvSpliterator(csvReader), false);
}
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);
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