package com.ldbc.driver.generator; import com.ldbc.driver.util.Function1; import java.util.Arrays; import java.util.Iterator; import java.util.Map; import java.util.NoSuchElementException; import static java.lang.String.format; public class CsvEventStreamReaderTimedTypedCsvReader<BASE_EVENT_TYPE, DECODER_KEY_TYPE> implements Iterator<BASE_EVENT_TYPE> { private final Map<DECODER_KEY_TYPE,EventDecoder<BASE_EVENT_TYPE>> decoders; private final Iterator<String[]> csvRowIterator; private final Function1<String[],DECODER_KEY_TYPE,RuntimeException> decoderKeyExtractor; public CsvEventStreamReaderTimedTypedCsvReader( Iterator<String[]> csvRowIterator, Map<DECODER_KEY_TYPE,EventDecoder<BASE_EVENT_TYPE>> decoders, Function1<String[],DECODER_KEY_TYPE,RuntimeException> decoderKeyExtractor ) { this.csvRowIterator = csvRowIterator; this.decoders = decoders; this.decoderKeyExtractor = decoderKeyExtractor; } @Override public boolean hasNext() { return csvRowIterator.hasNext(); } @Override public BASE_EVENT_TYPE next() { String[] csvRow = csvRowIterator.next(); DECODER_KEY_TYPE decoderKey = decoderKeyExtractor.apply( csvRow ); EventDecoder<BASE_EVENT_TYPE> decoder = decoders.get( decoderKey ); if ( null == decoder ) { throw new NoSuchElementException( format( "No decoder found that matches this column\nROW: %s\nDECODER KEY: %s", Arrays.toString( csvRow ), decoderKey ) ); } return decoder.decodeEvent( csvRow ); } @Override public void remove() { throw new UnsupportedOperationException( format( "%s does not support remove()", getClass().getSimpleName() ) ); } public static interface EventDecoder<BASE_EVENT_TYPE> { BASE_EVENT_TYPE decodeEvent( String[] csvRow ); } }