diff options
| author | bjculkin <bjculkin@mix.wvu.edu> | 2017-04-06 14:14:37 -0400 |
|---|---|---|
| committer | bjculkin <bjculkin@mix.wvu.edu> | 2017-04-06 14:14:37 -0400 |
| commit | 25382427eeafda30aa06a27f37c65fdaf8b67eba (patch) | |
| tree | 109a2c5c4cd74ce47b961710952a26520bc17f90 /BJC-Utils2/src/main/java/bjc/utils/ioutils/blocks/SerialBlockReader.java | |
| parent | 622653daa9e991e9608852210034a4e09cb94167 (diff) | |
Reorganize blocks
Diffstat (limited to 'BJC-Utils2/src/main/java/bjc/utils/ioutils/blocks/SerialBlockReader.java')
| -rw-r--r-- | BJC-Utils2/src/main/java/bjc/utils/ioutils/blocks/SerialBlockReader.java | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/BJC-Utils2/src/main/java/bjc/utils/ioutils/blocks/SerialBlockReader.java b/BJC-Utils2/src/main/java/bjc/utils/ioutils/blocks/SerialBlockReader.java new file mode 100644 index 0000000..2363468 --- /dev/null +++ b/BJC-Utils2/src/main/java/bjc/utils/ioutils/blocks/SerialBlockReader.java @@ -0,0 +1,98 @@ +package bjc.utils.ioutils.blocks; + +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 |
