44 private final EventType eventType; |
44 private final EventType eventType; |
45 private final TimeConverter timeConverter; |
45 private final TimeConverter timeConverter; |
46 private final boolean hasDuration; |
46 private final boolean hasDuration; |
47 private final List<ValueDescriptor> valueDescriptors; |
47 private final List<ValueDescriptor> valueDescriptors; |
48 private final int startIndex; |
48 private final int startIndex; |
|
49 private final RecordedEvent event; |
49 private long thresholdTicks = -1; |
50 private long thresholdTicks = -1; |
50 private boolean enabled = true; |
51 private boolean enabled = true; |
|
52 private boolean reuse; |
51 |
53 |
52 EventParser(TimeConverter timeConverter, EventType type, Parser[] parsers) { |
54 EventParser(TimeConverter timeConverter, EventType type, Parser[] parsers) { |
53 this.timeConverter = timeConverter; |
55 this.timeConverter = timeConverter; |
54 this.parsers = parsers; |
56 this.parsers = parsers; |
55 this.eventType = type; |
57 this.eventType = type; |
56 this.hasDuration = type.getField(FIELD_DURATION) != null; |
58 this.hasDuration = type.getField(FIELD_DURATION) != null; |
57 this.startIndex = hasDuration ? 2 : 1; |
59 this.startIndex = hasDuration ? 2 : 1; |
58 this.valueDescriptors = type.getFields(); |
60 this.valueDescriptors = type.getFields(); |
|
61 this.event = new RecordedEvent(type, valueDescriptors, new Object[parsers.length], 0L, 0L, timeConverter); |
59 } |
62 } |
60 |
63 |
61 public EventType getEventType() { |
64 public EventType getEventType() { |
62 return eventType; |
65 return eventType; |
63 } |
66 } |
82 durationTicks = input.readLong(); |
85 durationTicks = input.readLong(); |
83 if (durationTicks < thresholdTicks) { |
86 if (durationTicks < thresholdTicks) { |
84 return null; |
87 return null; |
85 } |
88 } |
86 } |
89 } |
87 Object[] values = new Object[parsers.length]; |
90 if (reuse) { |
88 for (int i = startIndex; i < parsers.length; i++) { |
91 Object[] values = event.objects; |
89 values[i] = parsers[i].parse(input); |
92 for (int i = startIndex; i < parsers.length; i++) { |
90 } |
93 values[i] = parsers[i].parse(input); |
91 values[0] = startTicks; |
94 } |
92 if (hasDuration) { |
95 values[0] = startTicks; |
93 values[1] = Long.valueOf(durationTicks); |
96 if (hasDuration) { |
94 } |
97 values[1] = Long.valueOf(durationTicks); |
95 long startTime = timeConverter.convertTimestamp(startTicks); |
98 } |
96 if (hasDuration) { |
99 long startTime = timeConverter.convertTimestamp(startTicks); |
97 long endTime = timeConverter.convertTimestamp(startTicks + durationTicks); |
100 if (hasDuration) { |
98 return new RecordedEvent(eventType, valueDescriptors, values, startTime, endTime, timeConverter); |
101 event.startTime = startTime; |
|
102 event.endTime = timeConverter.convertTimestamp(startTicks + durationTicks); |
|
103 return event; |
|
104 } else { |
|
105 event.startTime = startTime; |
|
106 event.endTime = startTime; |
|
107 return event; |
|
108 } |
99 } else { |
109 } else { |
100 return new RecordedEvent(eventType, valueDescriptors, values, startTime, startTime, timeConverter); |
110 Object[] values = new Object[parsers.length]; |
|
111 for (int i = startIndex; i < parsers.length; i++) { |
|
112 values[i] = parsers[i].parse(input); |
|
113 } |
|
114 values[0] = startTicks; |
|
115 if (hasDuration) { |
|
116 values[1] = Long.valueOf(durationTicks); |
|
117 } |
|
118 long startTime = timeConverter.convertTimestamp(startTicks); |
|
119 if (hasDuration) { |
|
120 long endTime = timeConverter.convertTimestamp(startTicks + durationTicks); |
|
121 return new RecordedEvent(eventType, valueDescriptors, values, startTime, endTime, timeConverter); |
|
122 } else { |
|
123 return new RecordedEvent(eventType, valueDescriptors, values, startTime, startTime, timeConverter); |
|
124 } |
101 } |
125 } |
102 } |
126 } |
103 return null; |
127 return event; |
104 |
|
105 } |
128 } |
106 |
129 |
107 @Override |
130 @Override |
108 public void skip(RecordingInput input) throws IOException { |
131 public void skip(RecordingInput input) throws IOException { |
109 throw new InternalError("Should not call this method. More efficent to read event size and skip ahead"); |
132 throw new InternalError("Should not call this method. More efficent to read event size and skip ahead"); |
110 } |
133 } |
111 |
134 |
|
135 public void setReuse(boolean reuse) { |
|
136 this.reuse = reuse; |
|
137 } |
|
138 |
112 } |
139 } |