[YANGTOOLS-1029] Attempting to emit multiple leave nodes in JSON causes nesting problem Created: 07/Oct/19  Updated: 03/Dec/19  Resolved: 07/Oct/19

Status: Resolved
Project: yangtools
Component/s: codecs
Affects Version/s: None
Fix Version/s: 3.0.6, 2.1.13, 4.0.2

Type: Bug Priority: Medium
Reporter: Robert Varga Assignee: Robert Varga
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Relates
relates to YANGTOOLS-1046 The generated Json is missing a closi... Resolved

 Description   

This was discovered during YANGTOOLS-1027 backport to 2.1.x. On that branch leaf nodes do not emit an endNode() event, hence when they are written out and the stream is closed, we get:

java.io.IOException: Incomplete document
	at com.google.gson.stream.JsonWriter.close(JsonWriter.java:559)
	at org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamWriter.closeWriter(JSONNormalizedNodeStreamWriter.java:319)
	at org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamWriter$Exclusive.close(JSONNormalizedNodeStreamWriter.java:53)
	at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.close(NormalizedNodeWriter.java:116)
	at org.opendaylight.yangtools.yang.data.codec.gson.AbstractYT1027Test.toJSON(AbstractYT1027Test.java:158)
	at org.opendaylight.yangtools.yang.data.codec.gson.AbstractYT1027Test.testUint64Serialization(AbstractYT1027Test.java:116)

which we're not getting on 3.0.x or 4.0.x. Those newer branches emit a single leaf, whose endNode() event ends up also closing the root, hence masking the above.

An attempt to emit two leaf nodes, though, will result in:

java.lang.IllegalStateException: Nesting problem.
	at com.google.gson.stream.JsonWriter.beforeName(JsonWriter.java:616)
	at com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:401)
	at com.google.gson.stream.JsonWriter.value(JsonWriter.java:527)
	at org.opendaylight.yangtools.yang.data.codec.gson.NumberJSONCodec.writeValue(NumberJSONCodec.java:26)
	at org.opendaylight.yangtools.yang.data.codec.gson.NumberJSONCodec.writeValue(NumberJSONCodec.java:1)
	at org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamWriter.writeValue(JSONNormalizedNodeStreamWriter.java:377)
	at org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamWriter.scalarValue(JSONNormalizedNodeStreamWriter.java:359)
	at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.wasProcessAsSimpleNode(NormalizedNodeWriter.java:147)
	at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.write(NormalizedNodeWriter.java:107)
	at org.opendaylight.yangtools.yang.data.codec.gson.AbstractYT1027Test.toJSON(AbstractYT1027Test.java:157)
	at org.opendaylight.yangtools.yang.data.codec.gson.AbstractYT1027Test.testDecimalSerialization(AbstractYT1027Test.java:106)

Generated at Wed Feb 07 20:54:59 UTC 2024 using Jira 8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d.