
org.sfm.csv.impl.DynamicCsvMapper Maven / Gradle / Ivy
package org.sfm.csv.impl;
import org.sfm.csv.*;
import org.sfm.csv.parser.CellConsumer;
import org.sfm.map.*;
import org.sfm.map.impl.*;
import org.sfm.reflect.meta.ClassMeta;
import org.sfm.utils.RowHandler;
import java.io.IOException;
import java.io.Reader;
import java.lang.reflect.Type;
import java.util.Iterator;
//IFJAVA8_START
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
//IFJAVA8_END
import static org.sfm.utils.Asserts.requireNonNull;
public final class DynamicCsvMapper implements CsvMapper {
private final ClassMeta classMeta;
private final Type target;
private final String defaultDateFormat;
private final CellValueReaderFactory cellValueReaderFactory;
private final MapperConfig mapperConfig;
private final MapperCache> mapperCache = new MapperCache>();
public DynamicCsvMapper(final Type target,
final ClassMeta classMeta,
String defaultDateFormat,
CellValueReaderFactory cellValueReaderFactory,
MapperConfig mapperConfig
) {
this.classMeta = requireNonNull("classMeta", classMeta);
this.target = requireNonNull("target", target);
this.defaultDateFormat = defaultDateFormat;
this.mapperConfig = mapperConfig;
this.cellValueReaderFactory = cellValueReaderFactory;
}
public DynamicCsvMapper(Type target, ClassMeta classMeta, ColumnDefinitionProvider columnDefinitionProvider) {
this(target, classMeta, "yyyy-MM-dd HH:mm:ss", new CellValueReaderFactoryImpl(), MapperConfig.config(columnDefinitionProvider));
}
@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 {
CellConsumer 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 {
CellConsumer 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 iterator(Reader reader) throws IOException {
CsvReader csvReader = CsvParser.reader(reader);
return iterator(csvReader);
}
@Override
public Iterator iterator(CsvReader csvReader) throws IOException {
CsvMapperImpl mapper = getDelegateMapper(csvReader);
return new CsvMapperIterator(csvReader, mapper);
}
@Override
public Iterator iterator(Reader reader, int skip) throws IOException {
return iterator(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(MapperKey key) {
CsvMapperImpl csvMapperImpl = mapperCache.get(key);
if (csvMapperImpl == null) {
csvMapperImpl = buildMapper(key);
mapperCache.add(key, csvMapperImpl);
}
return csvMapperImpl;
}
private CsvMapperImpl buildMapper(MapperKey key) {
CsvMapperBuilder builder = new CsvMapperBuilder(target, classMeta, 0, cellValueReaderFactory, mapperConfig);
builder.setDefaultDateFormat(defaultDateFormat);
for(CsvColumnKey col : key.getColumns()) {
builder.addMapping(col, CsvColumnDefinition.identity());
}
return (CsvMapperImpl)builder.mapper();
}
@Override
public String toString() {
return "DynamicCsvMapper{" +
"target=" + target +
", mapperCache=" + mapperCache +
'}';
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy