From: Tony Tkacik Date: Mon, 1 Sep 2014 19:56:45 +0000 (+0200) Subject: Bug 1441: Added proper handling of reading JSON list items. X-Git-Tag: release/helium~163 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=58a7bfd897607524c746d3adf65517b72f8ead06 Bug 1441: Added proper handling of reading JSON list items. Fixed handling of reading nested data in JSON codec. Initial integration contained bug, which did use JSON codec correctly, which ended in 500 for reading list item. Change-Id: I38ef0b40cea1a22e313d22f64db3806c293d67d6 Signed-off-by: Tony Tkacik --- diff --git a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/NormalizedNodeJsonBodyWriter.java b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/NormalizedNodeJsonBodyWriter.java index cebd3268ce..af21db8bc6 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/NormalizedNodeJsonBodyWriter.java +++ b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/NormalizedNodeJsonBodyWriter.java @@ -13,6 +13,7 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.lang.annotation.Annotation; import java.lang.reflect.Type; +import java.net.URI; import javax.ws.rs.Produces; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; @@ -25,9 +26,15 @@ import org.opendaylight.controller.sal.rest.api.RestconfService; import org.opendaylight.controller.sal.restconf.impl.InstanceIdentifierContext; import org.opendaylight.controller.sal.restconf.impl.NormalizedNodeContext; import org.opendaylight.controller.sal.restconf.impl.RestconfDocumentedException; +import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter; import org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamWriter; +import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; +import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.SchemaPath; @Provider @Produces({ Draft02.MediaTypes.API + RestconfService.JSON, Draft02.MediaTypes.DATA + RestconfService.JSON, @@ -48,16 +55,35 @@ public class NormalizedNodeJsonBodyWriter implements MessageBodyWriter type, final Type genericType, final Annotation[] annotations, final MediaType mediaType, final MultivaluedMap httpHeaders, final OutputStream entityStream) throws IOException, WebApplicationException { - if (t.getData() == null) { + NormalizedNode data = t.getData(); + InstanceIdentifierContext context = t.getInstanceIdentifierContext(); + DataSchemaNode schema = context.getSchemaNode(); + SchemaPath path = context.getSchemaNode().getPath(); + OutputStreamWriter outputWriter = new OutputStreamWriter(entityStream, Charsets.UTF_8); + if (data == null) { throw new RestconfDocumentedException(Response.Status.NOT_FOUND); } - InstanceIdentifierContext pathContext = t.getInstanceIdentifierContext(); - OutputStreamWriter ouWriter = new OutputStreamWriter(entityStream, Charsets.UTF_8); - NormalizedNodeStreamWriter jsonWriter = JSONNormalizedNodeStreamWriter.create(pathContext.getSchemaContext(),ouWriter); - NormalizedNodeWriter nnWriter = NormalizedNodeWriter.forStreamWriter(jsonWriter); - nnWriter.write(t.getData()); + URI initialNs = null; + outputWriter.write('{'); + if (!SchemaPath.ROOT.equals(path)) { + path = path.getParent(); + // FIXME: Add proper handling of reading root. + } + if(data instanceof MapEntryNode) { + data = ImmutableNodes.mapNodeBuilder(data.getNodeType()).withChild(((MapEntryNode) data)).build(); + } + if(!schema.isAugmenting() && !(schema instanceof SchemaContext)) { + initialNs = schema.getQName().getNamespace(); + } + NormalizedNodeStreamWriter jsonWriter = JSONNormalizedNodeStreamWriter.create(context.getSchemaContext(),path,initialNs,outputWriter); + NormalizedNodeWriter nnWriter = NormalizedNodeWriter.forStreamWriter(jsonWriter); + nnWriter.write(data); nnWriter.flush(); + + outputWriter.write('}'); + outputWriter.flush(); } + }