diff options
Diffstat (limited to 'BJC-Utils2/src/main/java/bjc/utils/ioutils/BlockReader.java')
| -rw-r--r-- | BJC-Utils2/src/main/java/bjc/utils/ioutils/BlockReader.java | 127 |
1 files changed, 34 insertions, 93 deletions
diff --git a/BJC-Utils2/src/main/java/bjc/utils/ioutils/BlockReader.java b/BJC-Utils2/src/main/java/bjc/utils/ioutils/BlockReader.java index 33bbbd5..fed74fe 100644 --- a/BJC-Utils2/src/main/java/bjc/utils/ioutils/BlockReader.java +++ b/BJC-Utils2/src/main/java/bjc/utils/ioutils/BlockReader.java @@ -2,6 +2,7 @@ package bjc.utils.ioutils; import java.io.LineNumberReader; import java.io.Reader; +import java.util.Iterator; import java.util.NoSuchElementException; import java.util.Scanner; import java.util.function.Consumer; @@ -10,7 +11,7 @@ import java.util.regex.Pattern; /** * Implements reading numbered blocks from a source. * - * A block is a series of characters, seperated by some regular expression. + * A block is a series of characters, separated by some regular expression. * * NOTE: The EOF marker is always treated as a delimiter. You are expected to * handle blocks that may be shorter than you expect. @@ -18,93 +19,7 @@ import java.util.regex.Pattern; * @author EVE * */ -public class BlockReader implements AutoCloseable { - /** - * Represents a block of text read in from a source. - * - * @author EVE - * - */ - public static class Block { - /** - * The contents of this block. - */ - public final String contents; - - /** - * The line of the source this block started on. - */ - public final int startLine; - - /** - * The line of the source this block ended on. - */ - public final int endLine; - - /** - * The number of this block. - */ - public final int blockNo; - - /** - * Create a new block. - * - * @param blockNo - * The number of this block. - * @param contents - * The contents of this block. - * @param startLine - * The line this block started on. - * @param endLine - * The line this block ended. - */ - public Block(int blockNo, String contents, int startLine, int endLine) { - this.contents = contents; - this.startLine = startLine; - this.endLine = endLine; - this.blockNo = blockNo; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - - result = prime * result + blockNo; - result = prime * result + ((contents == null) ? 0 : contents.hashCode()); - result = prime * result + endLine; - result = prime * result + startLine; - - return result; - } - - @Override - public boolean equals(Object obj) { - if(this == obj) return true; - if(obj == null) return false; - if(!(obj instanceof Block)) return false; - - Block other = (Block) obj; - - if(blockNo != other.blockNo) return false; - - if(contents == null) { - if(other.contents != null) return false; - } else if(!contents.equals(other.contents)) return false; - - if(endLine != other.endLine) return false; - if(startLine != other.startLine) return false; - - return true; - } - - @Override - public String toString() { - return String.format("Block #%d (from lines %d to %d) length: %d characters", blockNo, startLine, - endLine, contents.length()); - } - } - +public class BlockReader implements AutoCloseable, Iterator<Block> { /* * I/O source for blocks. */ @@ -131,10 +46,10 @@ public class BlockReader implements AutoCloseable { lnReader = new LineNumberReader(source); blockReader = new Scanner(lnReader); - + String pattern = String.format("(?:%s)|\\Z", blockDelim); Pattern pt = Pattern.compile(pattern, Pattern.MULTILINE); - + blockReader.useDelimiter(pt); } @@ -159,7 +74,7 @@ public class BlockReader implements AutoCloseable { /** * Move to the next block. * - * @return Whether or not the next block was succesfully read. + * @return Whether or not the next block was successfully read. */ public boolean nextBlock() { try { @@ -171,7 +86,7 @@ public class BlockReader implements AutoCloseable { currBlock = new Block(blockNo, blockContents, blockStartLine, blockEndLine); return true; - } catch(NoSuchElementException nseex) { + } catch (NoSuchElementException nseex) { return false; } } @@ -183,7 +98,7 @@ public class BlockReader implements AutoCloseable { * The action to execute for each block */ public void forEachBlock(Consumer<Block> action) { - while(hasNextBlock()) { + while (hasNextBlock()) { nextBlock(); action.accept(currBlock); @@ -205,4 +120,30 @@ public class BlockReader implements AutoCloseable { lnReader.close(); } + + /** + * Set the delimiter used to separate blocks. + * + * @param delim + * The delimiter used to separate blocks. + */ + public void setDelimiter(String delim) { + blockReader.useDelimiter(delim); + } + + /* + * Iterator implementation. + */ + + @Override + public boolean hasNext() { + return blockReader.hasNext(); + } + + @Override + public Block next() { + nextBlock(); + + return getBlock(); + } } |
