51 this.constantLookups = constantLookups; |
51 this.constantLookups = constantLookups; |
52 this.timeConverter = timeConverter; |
52 this.timeConverter = timeConverter; |
53 for (Type t : metadata.getTypes()) { |
53 for (Type t : metadata.getTypes()) { |
54 types.put(t.getId(), t); |
54 types.put(t.getId(), t); |
55 } |
55 } |
|
56 // Add to separate list |
|
57 // so createCompositeParser can throw |
|
58 // IOException outside lambda |
56 List<Type> typeList = new ArrayList<>(); |
59 List<Type> typeList = new ArrayList<>(); |
57 types.forEach(typeList::add); |
60 types.forEach(typeList::add); |
58 for (Type t : typeList) { |
61 for (Type t : typeList) { |
59 if (!t.getFields().isEmpty()) { // Avoid primitives |
62 if (!t.getFields().isEmpty()) { // Avoid primitives |
60 CompositeParser cp = createCompositeParser(t, false); |
63 CompositeParser cp = createCompositeParser(t, false); |
61 if (t.isSimpleType()) { // Reduce to nested parser |
64 if (t.isSimpleType()) { // Reduce to nested parser |
62 parsers.put(t.getId(), cp.parsers[0]); |
65 parsers.put(t.getId(), cp.parsers[0]); |
63 } |
66 } |
64 |
|
65 } |
67 } |
66 } |
68 } |
67 // Override event types with event parsers |
69 // Override event types with event parsers |
68 for (EventType t : metadata.getEventTypes()) { |
70 for (EventType t : metadata.getEventTypes()) { |
69 parsers.put(t.getId(), createEventParser(t)); |
71 parsers.put(t.getId(), createEventParser(t)); |
310 elementParser.skip(input); |
312 elementParser.skip(input); |
311 } |
313 } |
312 } |
314 } |
313 } |
315 } |
314 |
316 |
315 final static class CompositeParser extends Parser { |
317 private final static class CompositeParser extends Parser { |
316 private final Parser[] parsers; |
318 private final Parser[] parsers; |
317 |
319 |
318 public CompositeParser(Parser[] valueParsers) { |
320 public CompositeParser(Parser[] valueParsers) { |
319 this.parsers = valueParsers; |
321 this.parsers = valueParsers; |
320 } |
322 } |
334 parsers[i].skip(input); |
336 parsers[i].skip(input); |
335 } |
337 } |
336 } |
338 } |
337 } |
339 } |
338 |
340 |
339 public static final class EventValueConstantParser extends Parser { |
341 private static final class EventValueConstantParser extends Parser { |
340 private final ConstantLookup lookup; |
342 private final ConstantLookup lookup; |
341 private Object lastValue = 0; |
343 private Object lastValue = 0; |
342 private long lastKey = -1; |
344 private long lastKey = -1; |
343 EventValueConstantParser(ConstantLookup lookup) { |
345 EventValueConstantParser(ConstantLookup lookup) { |
344 this.lookup = lookup; |
346 this.lookup = lookup; |
359 public void skip(RecordingInput input) throws IOException { |
361 public void skip(RecordingInput input) throws IOException { |
360 input.readLong(); |
362 input.readLong(); |
361 } |
363 } |
362 } |
364 } |
363 |
365 |
364 public static final class ConstantValueParser extends Parser { |
366 private static final class ConstantValueParser extends Parser { |
365 private final ConstantLookup lookup; |
367 private final ConstantLookup lookup; |
366 ConstantValueParser(ConstantLookup lookup) { |
368 ConstantValueParser(ConstantLookup lookup) { |
367 this.lookup = lookup; |
369 this.lookup = lookup; |
368 } |
370 } |
369 |
371 |