blob: 0bbf4d7b5b959bb6521d9c3fde9370d5002b0a5b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
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;
public class DseventsReader implements Versioned, Closeable, Iterator<DseventsReader.Event> {
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: // ????-???? 2014
case 2: // ????-2015
case 3: // 2016-2017
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();
}
Event ret = m_next;
m_next = null;
return ret;
}
public IOException err() {
return m_err;
}
public void close() throws IOException {
reader.close();
}
}
|