summaryrefslogtreecommitdiff
path: root/dslog/DseventsReader.java
diff options
context:
space:
mode:
Diffstat (limited to 'dslog/DseventsReader.java')
-rw-r--r--dslog/DseventsReader.java106
1 files changed, 84 insertions, 22 deletions
diff --git a/dslog/DseventsReader.java b/dslog/DseventsReader.java
index 1f7afa7..4ae0215 100644
--- a/dslog/DseventsReader.java
+++ b/dslog/DseventsReader.java
@@ -1,42 +1,78 @@
package dslog;
+import java.io.BufferedInputStream;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
-import java.lang.UnsupportedOperationException;
import java.time.Instant;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
-class DseventsReader implements Closeable {
- private final InputStream reader;
+class DseventsReader implements Closeable, Iterator<DseventsReader.Event> {
+ public static class Event {
+ public Instant time;
+ public String message;
+ }
- public final int version;
- public final Instant startTime;
+ /*============================================================*\
+ || Primitive IO ||
+ \*============================================================*/
+ private final InputStream reader;
public DseventsReader(InputStream reader) throws IOException {
+ if (!reader.markSupported()) {
+ reader = new BufferedInputStream(reader);
+ }
this.reader = reader;
- this.version = Read.i32(reader);
- switch (this.version) {
- case 0:
- throw new UnsupportedOperationException("TODO: DSEVENTS v0 support");
- case 1:
- case 2:
- case 3: // 2016-now
- this.startTime = Read.LVTimestamp(reader);
- break;
- default:
- throw new UnsupportedOperationException("DSEVENTS file version ("+this.version+") newer than log reader (3)");
+ }
+
+ private boolean atEOF() throws IOException {
+ reader.mark(2);
+ boolean eof = (reader.read() < 0);
+ reader.reset();
+ return eof;
+ }
+
+ /*============================================================*\
+ || Parsing ||
+ \*============================================================*/
+
+ private int m_version;
+ private boolean m_haveVersion = false;
+ public int version() throws IOException {
+ if (!m_haveVersion) {
+ m_version = Read.i32(reader);
+ m_haveVersion = true;
}
+ return m_version;
}
- public static class Event {
- public Instant time;
- public String message;
+ private Instant m_startTime;
+ public Instant startTime() throws IOException {
+ if (m_startTime == null) {
+ switch (version()) {
+ case 0:
+ throw new UnsupportedVersionException("DSEVENTS (TODO)", 0);
+ case 1:
+ case 2:
+ case 3: // 2016-now
+ m_startTime = Read.LVTimestamp(reader);
+ break;
+ default:
+ throw new UnsupportedVersionException("DSEVENTS", version(), 3);
+ }
+ }
+ return m_startTime;
}
public Event readEvent() throws IOException{
- switch (version) {
+ startTime();
+ if (atEOF()) {
+ return null;
+ }
+ switch (version()) {
case 0:
- throw new UnsupportedOperationException("TODO: DSEVENTS v0 support");
+ throw new UnsupportedVersionException("DSEVENTS (TODO)", 0);
case 1:
case 2:
case 3:
@@ -45,10 +81,36 @@ class DseventsReader implements Closeable {
message = Read.LVString(reader);
}};
default:
- throw new UnsupportedOperationException("DSEVENTS file version newer than log reader");
+ throw new UnsupportedVersionException("DSEVENTS", version(), 3);
}
}
+ /*============================================================*\
+ || Interfaces ||
+ \*============================================================*/
+
+ private IOException m_err;
+ private Event m_next;
+ public boolean hasNext() {
+ if (m_next == null) {
+ try {
+ m_next = readEvent();
+ } catch (IOException e) {
+ m_err = e;
+ }
+ }
+ return m_next != null;
+ }
+ public Event next() {
+ if (!hasNext()) {
+ throw new NoSuchElementException();
+ }
+ return m_next;
+ }
+ public IOException err() {
+ return m_err;
+ }
+
public void close() throws IOException {
reader.close();
}