@SuppressWarnings("unchecked") private void processNextNode() { if (stateStack.isEmpty()) { nextEvent = null; return; } currentItr = stateStack.peek(); if (currentItr.hasNext()) { Object o = currentItr.next(); if (inMap()) { Entry<String, HValue> entry = (Entry<String, HValue>) o; key = entry.getKey(); value = entry.getValue(); } else { key = null; value = HValue.initFromObject(o); } nextEvent = Types.getEventTypeForType(value.getType()); if (!value.getType().isScalar()) { stateStack.push(new IteratorWithType(value)); } } else { IteratorWithType iter = stateStack.pop(); key = null; value = iter.getValue(); nextEvent = (iter.getType() == Type.MAP) ? EventType.END_MAP : EventType.END_ARRAY; currentItr = stateStack.isEmpty() ? null : stateStack.peek(); } }
IteratorWithType(HValue value) { this.value = value; this.i = (value.getType() == Type.MAP) ? ((HDocument) value).iterator() : ((HList) value).listIterator(); }
HDocumentReader(HValue value) { stateStack = new ArrayDeque<>(); this.key = null; this.value = value; Type type = value.getType(); nextEvent = Types.getEventTypeForType(type); if (!type.isScalar()) { stateStack.push(new IteratorWithType(value)); } }
@Override public long getTimestampLong() { checkEventType(EventType.TIMESTAMP); return value.getTimestampAsLong(); }
@Override public ByteBuffer getBinary() { checkEventType(EventType.BINARY); return value.getBinary(); }
@Override public int getInt() { checkEventType(EventType.INT); return value.getInt(); }
@Override public OTime getTime() { checkEventType(EventType.TIME); return value.getTime(); }
@Override public OInterval getInterval() { checkEventType(EventType.INTERVAL); return value.getInterval(); }
@Override public ODate getDate() { checkEventType(EventType.DATE); return value.getDate(); }
@Override public int getTimeInt() { checkEventType(EventType.TIME); return value.getTimeAsInt(); }
@Override public short getShort() { checkEventType(EventType.SHORT); return value.getShort(); }
@Override public int getDateInt() { checkEventType(EventType.DATE); return value.getDateAsInt(); }
@Override public String getString() { checkEventType(EventType.STRING); return value.getString(); }
Type getType() { return value.getType(); }
@Override public boolean getBoolean() { checkEventType(EventType.BOOLEAN); return value.getBoolean(); }
@Override public BigDecimal getDecimal() { checkEventType(EventType.DECIMAL); return value.getDecimal(); }
@Override public double getDouble() { checkEventType(EventType.DOUBLE); return value.getDouble(); }
@Override public float getFloat() { checkEventType(EventType.FLOAT); return value.getFloat(); }
@Override public long getLong() { checkEventType(EventType.LONG); return value.getLong(); }
@Override public OTimestamp getTimestamp() { checkEventType(EventType.TIMESTAMP); return value.getTimestamp(); }
@Override public byte getByte() { checkEventType(EventType.BYTE); return value.getByte(); }