package dslog; import java.io.BufferedInputStream; import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.time.Instant; import java.util.Iterator; import java.util.NoSuchElementException; class DseventsReader implements Closeable, Iterator { public static class Event { public Instant time; public String message; } /*============================================================*\ || Primitive IO || \*============================================================*/ private final InputStream reader; public DseventsReader(InputStream reader) throws IOException { if (!reader.markSupported()) { reader = new BufferedInputStream(reader); } this.reader = reader; } 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; } 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{ startTime(); if (atEOF()) { return null; } switch (version()) { case 0: throw new UnsupportedVersionException("DSEVENTS (TODO)", 0); case 1: case 2: case 3: return new Event() {{ time = Read.LVTimestamp(reader); message = Read.LVString(reader); }}; default: 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(); } }