From 5b8c57f577151d8de4bd4ef95d9568ec3ba99fc9 Mon Sep 17 00:00:00 2001 From: bculkin2442 Date: Mon, 27 Mar 2017 23:25:47 -0400 Subject: Implement more BlockReader types Adds additional useful block reader types. * LayeredBlockReader, which represents priority * SerialBlockReader, which concatenates readers --- .../java/bjc/utils/ioutils/SerialBlockReader.java | 98 ++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 BJC-Utils2/src/main/java/bjc/utils/ioutils/SerialBlockReader.java (limited to 'BJC-Utils2/src/main/java/bjc/utils/ioutils/SerialBlockReader.java') diff --git a/BJC-Utils2/src/main/java/bjc/utils/ioutils/SerialBlockReader.java b/BJC-Utils2/src/main/java/bjc/utils/ioutils/SerialBlockReader.java new file mode 100644 index 0000000..0ae969d --- /dev/null +++ b/BJC-Utils2/src/main/java/bjc/utils/ioutils/SerialBlockReader.java @@ -0,0 +1,98 @@ +package bjc.utils.ioutils; + +import java.io.IOException; +import java.util.Deque; + +/** + * Provides a means of concatenating two block readers. + * + * @author bjculkin + * + */ +public class SerialBlockReader implements BlockReader { + private Deque readerQueue; + + private int blockNo; + + /** + * Create a new serial block reader. + * + * @param readers + * The readers to pull from, in the order to pull from + * them. + */ + public SerialBlockReader(BlockReader... readers) { + for (BlockReader reader : readers) { + readerQueue.add(reader); + } + } + + @Override + public boolean hasNextBlock() { + if (readerQueue.isEmpty()) return false; + + boolean hasBlock = readerQueue.peek().hasNextBlock(); + + boolean cont = hasBlock || readerQueue.isEmpty(); + + while (!cont) { + try { + readerQueue.pop().close(); + } catch (IOException ioex) { + throw new IllegalStateException("Exception thrown by discarded reader", ioex); + } + + hasBlock = readerQueue.peek().hasNextBlock(); + + cont = hasBlock || readerQueue.isEmpty(); + } + + return hasBlock; + } + + @Override + public Block getBlock() { + if (readerQueue.isEmpty()) + return null; + else return readerQueue.peek().getBlock(); + } + + @Override + public boolean nextBlock() { + if (readerQueue.isEmpty()) return false; + + boolean gotBlock = readerQueue.peek().nextBlock(); + + boolean cont = gotBlock || readerQueue.isEmpty(); + + while (!cont) { + try { + readerQueue.pop().close(); + } catch (IOException ioex) { + throw new IllegalStateException("Exception thrown by discarded reader", ioex); + } + + gotBlock = readerQueue.peek().nextBlock(); + + cont = gotBlock || readerQueue.isEmpty(); + } + + if (cont) blockNo += 1; + + return cont; + } + + @Override + public int getBlockCount() { + return blockNo; + } + + @Override + public void close() throws IOException { + while (!readerQueue.isEmpty()) { + BlockReader reader = readerQueue.pop(); + + reader.close(); + } + } +} \ No newline at end of file -- cgit v1.2.3