
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.reflect.meta.PropertyNameMatcherFactory;
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
public final class DynamicCsvMapper implements CsvMapper {
private final ClassMeta classMeta;
private final Type target;
private final FieldMapperErrorHandler fieldMapperErrorHandler;
private final MapperBuilderErrorHandler mapperBuilderErrorHandler;
private final RowHandlerErrorHandler rowHandlerErrorHandler;
private final String defaultDateFormat;
private final PropertyNameMatcherFactory propertyNameMatcherFactory;
private final MapperCache> mapperCache = new MapperCache>();
private final ColumnDefinitionProvider columnDefinitions;
private final CellValueReaderFactory cellValueReaderFactory;
private final boolean failOnAsm;
private final int asmMapperNbFieldsLimit;
private final int maxMethodSize;
public DynamicCsvMapper(final Type target, final ClassMeta classMeta,
final FieldMapperErrorHandler fieldMapperErrorHandler,
final MapperBuilderErrorHandler mapperBuilderErrorHandler, RowHandlerErrorHandler rowHandlerErrorHandler, String defaultDateFormat,
ColumnDefinitionProvider columnDefinitions,
PropertyNameMatcherFactory propertyNameMatcherFactory, CellValueReaderFactory cellValueReaderFactory,
boolean failOnAsm, int asmMapperNbFieldsLimit, int maxMethodSize
) {
if (classMeta == null) {
throw new NullPointerException("classMeta is null");
}
if (target == null) {
throw new NullPointerException("classMeta is null");
}
this.classMeta = classMeta;
this.target = target;
this.fieldMapperErrorHandler = fieldMapperErrorHandler;
this.mapperBuilderErrorHandler = mapperBuilderErrorHandler;
this.rowHandlerErrorHandler = rowHandlerErrorHandler;
this.defaultDateFormat = defaultDateFormat;
this.columnDefinitions = columnDefinitions;
this.propertyNameMatcherFactory = propertyNameMatcherFactory;
this.cellValueReaderFactory = cellValueReaderFactory;
this.asmMapperNbFieldsLimit = asmMapperNbFieldsLimit;
this.failOnAsm = failOnAsm;
this.maxMethodSize = maxMethodSize;
}
public DynamicCsvMapper(Type target, ClassMeta classMeta, ColumnDefinitionProvider columnDefinitionProvider) {
this(target, classMeta, new RethrowFieldMapperErrorHandler(), new RethrowMapperBuilderErrorHandler(), new RethrowRowHandlerErrorHandler(), "yyyy-MM-dd HH:mm:ss",
columnDefinitionProvider, new DefaultPropertyNameMatcherFactory(), new CellValueReaderFactoryImpl(), false, CsvMapperBuilder.NO_ASM_CSV_HANDLER_THRESHOLD, CsvMapperBuilder.CSV_MAX_METHOD_SIZE);
}
@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
@Deprecated
@SuppressWarnings("deprecation")
public Iterator iterate(Reader reader) throws IOException {
CsvReader csvReader = CsvParser.reader(reader);
return iterate(csvReader);
}
@Override
@Deprecated
@SuppressWarnings("deprecation")
public Iterator iterate(CsvReader csvReader) throws IOException {
CsvMapperImpl mapper = getDelegateMapper(csvReader);
return new CsvMapperIterator(csvReader, mapper);
}
@Override
@Deprecated
@SuppressWarnings("deprecation")
public Iterator iterate(Reader reader, int skip) throws IOException {
return iterate(CsvParser.skip(skip).reader(reader));
}
@SuppressWarnings("deprecation")
@Override
public Iterator iterator(Reader reader) throws IOException {
return iterate(reader);
}
@SuppressWarnings("deprecation")
@Override
public Iterator iterator(CsvReader csvReader) throws IOException {
return iterate(csvReader);
}
@SuppressWarnings("deprecation")
@Override
public Iterator iterator(Reader reader, int skip) throws IOException {
return iterate(reader, skip);
}
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 = buildMapper(key);
mapperCache.add(key, csvMapperImpl);
}
return csvMapperImpl;
}
private CsvMapperImpl buildMapper(ColumnsMapperKey key) {
CsvMapperBuilder builder = new CsvMapperBuilder(target, classMeta, mapperBuilderErrorHandler,
columnDefinitions, propertyNameMatcherFactory, cellValueReaderFactory, 0,
failOnAsm, asmMapperNbFieldsLimit, maxMethodSize);
builder.fieldMapperErrorHandler(fieldMapperErrorHandler);
builder.setDefaultDateFormat(defaultDateFormat);
builder.rowHandlerErrorHandler(rowHandlerErrorHandler);
for(String col : key.getColumns()) {
builder.addMapping(col);
}
return (CsvMapperImpl)builder.mapper();
}
@Override
public String toString() {
return "DynamicCsvMapper{" +
"target=" + target +
", mapperCache=" + mapperCache +
'}';
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy