}
private void streamLeaf(final NormalizedNodeStreamWriter writer) throws IOException {
+ startLeaf(writer);
+ endLeaf(writer, readObject());
+ }
+
+ // Leaf inside a MapEntryNode, it can potentially be a key leaf, in which case we want to de-duplicate values.
+ private void streamLeaf(final NormalizedNodeStreamWriter writer, final NodeIdentifierWithPredicates entryId)
+ throws IOException {
+ final NodeIdentifier identifier = startLeaf(writer);
+ final Object value = readObject();
+ final Object entryValue = entryId.getValue(identifier.getNodeType());
+ endLeaf(writer, entryValue == null ? value : entryValue);
+ }
+
+ private NodeIdentifier startLeaf(final NormalizedNodeStreamWriter writer) throws IOException {
final NodeIdentifier identifier = readNodeIdentifier();
LOG.trace("Streaming leaf node {}", identifier);
writer.startLeafNode(identifier);
- writer.scalarValue(readObject());
+ return identifier;
+ }
+
+ private static void endLeaf(final NormalizedNodeStreamWriter writer, final Object value) throws IOException {
+ writer.scalarValue(value);
writer.endNode();
}
final NodeIdentifierWithPredicates entryIdentifier = readNormalizedNodeWithPredicates();
LOG.trace("Streaming map entry node {}", entryIdentifier);
writer.startMapEntryNode(entryIdentifier, NormalizedNodeStreamWriter.UNKNOWN_SIZE);
- commonStreamContainer(writer);
+
+ // Same loop as commonStreamContainer(), but ...
+ for (byte nodeType = input.readByte(); nodeType != NodeTypes.END_NODE; nodeType = input.readByte()) {
+ if (nodeType == NodeTypes.LEAF_NODE) {
+ // ... leaf nodes may need de-duplication
+ streamLeaf(writer, entryIdentifier);
+ } else {
+ streamNormalizedNode(writer, nodeType);
+ }
+ }
+ writer.endNode();
}
private void streamUnkeyedList(final NormalizedNodeStreamWriter writer) throws IOException {