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

fun.mike.flapjack.pipeline.lab.FlatFileInputChannel Maven / Gradle / Ivy

The newest version!
package fun.mike.flapjack.pipeline.lab;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.stream.Stream;

import fun.mike.flapjack.alpha.Format;
import fun.mike.flapjack.alpha.GetSkipFirstVisitor;
import fun.mike.flapjack.alpha.GetSkipLastVisitor;
import fun.mike.flapjack.alpha.ParseResult;
import fun.mike.io.alpha.IO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FlatFileInputChannel implements InputChannel {
    private final Logger log = LoggerFactory.getLogger(FlatFileInputChannel.class);

    private final String path;
    private final Format format;
    private final String lineKey;
    private final boolean logLines;
    private final int lineCount;
    private final int limit;
    private final int skipFirst;
    private int lineIndex;
    private BufferedReader reader;

    public FlatFileInputChannel(String path, Format format, String lineKey, boolean logLines) {
        this.path = path;
        this.format = format;
        this.lineKey = lineKey;
        this.logLines = logLines;

        this.lineIndex = 0;

        try (Stream stream = IO.streamLines(path)) {
            lineCount = (int) stream.count();
        }

        skipFirst = GetSkipFirstVisitor.visit(format);
        int skipLast = GetSkipLastVisitor.visit(format);
        limit = lineCount - GetSkipLastVisitor.visit(format);

        try {
            this.reader = new BufferedReader(new FileReader(this.path));
        } catch (FileNotFoundException ex) {
            throw new UncheckedIOException(ex);
        }
    }

    @Override
    public InputResult take() {
        while (lineIndex < skipFirst && lineIndex < lineCount) {
            lineIndex++;
            readLine(reader);
        }



        int number = lineIndex + 1;
        lineIndex++;

        String line = readLine(reader);

        if (logLines) {
            log.debug("Processing record #" + number + ": " + line);
        }

        ParseResult parseResult = format.parse(line);

        if (parseResult.hasProblems()) {
            return InputResult.failure(line, ParseFailure.fromResult(number, line, parseResult));
        }

        if(lineKey != null) {
            parseResult.getValue().set(lineKey, line);
        }

        parseResult.getValue().setMetadataProperty("number", number);

        return InputResult.ok(parseResult.getValue(), line);
    }

    private String readLine(BufferedReader reader) {
        try {
            return reader.readLine();
        } catch (IOException ex) {
            throw new UncheckedIOException(ex);
        }
    }

    public boolean hasMore() {
        return lineCount > skipFirst && lineIndex < limit;
    }

    @Override
    public void close() {
        try {
            reader.close();
        } catch (IOException ex) {
            throw new UncheckedIOException(ex);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy