From 2c9c848ae275705ce315b6061cd06640834c9d9d Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Mon, 13 Mar 2017 18:16:25 -0400 Subject: lazy-parse the version and startTime --- dslog/DseventsReader.java | 106 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 84 insertions(+), 22 deletions(-) (limited to 'dslog/DseventsReader.java') 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 { + 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(); } -- cgit v1.2.3