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

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