summaryrefslogtreecommitdiff
path: root/BJC-Utils2/src/main/java/bjc/utils/ioutils/SerialBlockReader.java
diff options
context:
space:
mode:
authorbculkin2442 <bjculkin@mix.wvu.edu>2017-03-27 23:25:47 -0400
committerbculkin2442 <bjculkin@mix.wvu.edu>2017-03-27 23:25:47 -0400
commit5b8c57f577151d8de4bd4ef95d9568ec3ba99fc9 (patch)
tree25512cc880b5139742db116b6638a4bf916c9305 /BJC-Utils2/src/main/java/bjc/utils/ioutils/SerialBlockReader.java
parent4da4974456179168125fd78e5bde09c2de81b258 (diff)
Implement more BlockReader types
Adds additional useful block reader types. * LayeredBlockReader, which represents priority * SerialBlockReader, which concatenates readers
Diffstat (limited to 'BJC-Utils2/src/main/java/bjc/utils/ioutils/SerialBlockReader.java')
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/ioutils/SerialBlockReader.java98
1 files changed, 98 insertions, 0 deletions
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<BlockReader> 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