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.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.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 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.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 CsvMapperIterator(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 CsvMapperIterator(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