Innovimax-SARL/QuiXDM

View on GitHub
src/main/java/innovimax/quixproc/datamodel/in/csv/CSVQuiXEventStreamReader.java

Summary

Maintainability
A
25 mins
Test Coverage
/*
 * QuiXProc: efficient evaluation of XProc Pipelines.
 * Copyright (C) 2011-2018 Innovimax
 * All rights reserved.
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  You may obtain a copy of the License at
 *        http://www.apache.org/licenses/LICENSE-2.0*/
package innovimax.quixproc.datamodel.in.csv;

import java.io.IOException;
import java.util.Iterator;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;

import innovimax.quixproc.datamodel.QuiXCharStream;
import innovimax.quixproc.datamodel.QuiXException;
import innovimax.quixproc.datamodel.event.AQuiXEvent;
import innovimax.quixproc.datamodel.in.AQuiXEventBufferStreamReader;
import innovimax.quixproc.datamodel.in.AStreamSource;
import innovimax.quixproc.datamodel.in.AStreamSource.CSVStreamSource;
import innovimax.quixproc.datamodel.in.QuiXEventStreamReader.State;

public class CSVQuiXEventStreamReader extends AQuiXEventBufferStreamReader {

    private CSVParser parser;
    private Iterator<CSVRecord> iter;

    @Override
    protected AQuiXEvent load(final AStreamSource current) {
        return load((CSVStreamSource) current);
    }

    private AQuiXEvent load(final CSVStreamSource source) {

        try {
            this.parser = CSVFormat.EXCEL.parse(source.asReader());
            this.iter = this.parser.iterator();
        } catch (final IOException e) {
            throw new QuiXException(e);
        }
        this.buffer.add(AQuiXEvent.getStartArray());
        return AQuiXEvent.getStartTable();
    }

    @Override
    protected AQuiXEvent process(final CallBack callback) {
        try {
            if (!this.buffer.isEmpty()) {
                return this.buffer.poll();
            }
            if (!this.iter.hasNext() && callback.getState() == State.START_SOURCE) {
                // special case if the buffer is empty but the document has not
                // been closed
                final AQuiXEvent event = AQuiXEvent.getEndArray();
                this.buffer.add(AQuiXEvent.getEndTable());
                callback.setState(State.END_SOURCE);
                return event;
            }
            if (callback.getState() == State.END_SOURCE) {
                return callback.processEndSource();
            }
            // this iter has next
            final CSVRecord next = this.iter.next();
            for (final String cell : next) {
                this.buffer.add(AQuiXEvent.getValueString(QuiXCharStream.fromSequence(cell)));
            }
            this.buffer.add(AQuiXEvent.getEndArray());
            return AQuiXEvent.getStartArray();
        } catch (final Exception e) {
            throw new QuiXException(e);
        }
    }

    @Override
    public void reinitialize(final AStreamSource current) {
        try {
            this.parser.close();
            this.parser = null;
        } catch (final IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void close() {
        try {
            this.parser.close();
        } catch (final IOException e) {
            e.printStackTrace();
        }
    }

}