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

org.sfm.csv.impl.DynamicCsvMapper Maven / Gradle / Ivy

Go to download

Java library to map flat record - ResultSet, csv - to java object with minimum configuration and low footprint.

There is a newer version: 1.10.3
Show newest version
package org.sfm.csv.impl;

import org.sfm.csv.*;
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;

	public DynamicCsvMapper(final Type target, final ClassMeta classMeta,
							final FieldMapperErrorHandler fieldMapperErrorHandler,
							final MapperBuilderErrorHandler mapperBuilderErrorHandler, RowHandlerErrorHandler rowHandlerErrorHandler, String defaultDateFormat,
							ColumnDefinitionProvider columnDefinitions,
							PropertyNameMatcherFactory propertyNameMatcherFactory, CellValueReaderFactory cellValueReaderFactory) {
		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;
	}

	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());
	}

	@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
    @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);
		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 - 2024 Weber Informatics LLC | Privacy Policy