X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-rest-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Frest%2Fimpl%2FJsonNormalizedNodeBodyReader.java;h=5d63c9c01162733a2b0734f17f5e0890a3346370;hp=9594c34b6ef49140fd03e473ac8efbab7efab676;hb=ae1583bfe01bdc3f43fdb6d590ab7c6a32e0be5a;hpb=874a18a9ce5dc09bc49922754bf8fb3e981fffb9 diff --git a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/JsonNormalizedNodeBodyReader.java b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/JsonNormalizedNodeBodyReader.java index 9594c34b6e..5d63c9c011 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/JsonNormalizedNodeBodyReader.java +++ b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/rest/impl/JsonNormalizedNodeBodyReader.java @@ -27,14 +27,19 @@ import org.opendaylight.controller.sal.restconf.impl.NormalizedNodeContext; import org.opendaylight.controller.sal.restconf.impl.RestconfDocumentedException; import org.opendaylight.controller.sal.restconf.impl.RestconfError.ErrorTag; import org.opendaylight.controller.sal.restconf.impl.RestconfError.ErrorType; +import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode; +import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode; +import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.MapNode; 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.codec.gson.JsonParserStream; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult; +import org.opendaylight.yangtools.yang.data.impl.schema.ResultAlreadySetException; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaNode; +import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -58,7 +63,10 @@ public class JsonNormalizedNodeBodyReader extends AbstractIdentifierAwareJaxRsPr final MultivaluedMap httpHeaders, final InputStream entityStream) throws IOException, WebApplicationException { try { - final InstanceIdentifierContext path = getIdentifierWithSchema().get(); + final InstanceIdentifierContext path = getInstanceIdentifierContext(); + if (entityStream.available() < 1) { + return new NormalizedNodeContext(path, null); + } final NormalizedNodeResult resultHolder = new NormalizedNodeResult(); final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder); @@ -66,24 +74,44 @@ public class JsonNormalizedNodeBodyReader extends AbstractIdentifierAwareJaxRsPr if(isPost()) { // FIXME: We need dispatch for RPC. parentSchema = path.getSchemaNode(); - } else if(path.getSchemaContext() instanceof SchemaContext) { + } else if(path.getSchemaNode() instanceof SchemaContext) { parentSchema = path.getSchemaContext(); } else { - parentSchema = SchemaContextUtil.findDataSchemaNode(path.getSchemaContext(), path.getSchemaNode().getPath().getParent()); + if (SchemaPath.ROOT.equals(path.getSchemaNode().getPath().getParent())) { + parentSchema = path.getSchemaContext(); + } else { + parentSchema = SchemaContextUtil.findDataSchemaNode(path.getSchemaContext(), path.getSchemaNode().getPath().getParent()); + } } final JsonParserStream jsonParser = JsonParserStream.create(writer, path.getSchemaContext(), parentSchema); final JsonReader reader = new JsonReader(new InputStreamReader(entityStream)); jsonParser.parse(reader); - final NormalizedNode partialResult = resultHolder.getResult(); + NormalizedNode partialResult = resultHolder.getResult(); final NormalizedNode result; - if(partialResult instanceof MapNode) { + + // FIXME: Also II should be updated unwrap result from augmentation and choice nodes on PUT + if (!isPost()) { + while (partialResult instanceof AugmentationNode || partialResult instanceof ChoiceNode) { + final Object childNode = ((DataContainerNode) partialResult).getValue().iterator().next(); + partialResult = (NormalizedNode) childNode; + } + } + + if (partialResult instanceof MapNode && !isPost()) { result = Iterables.getOnlyElement(((MapNode) partialResult).getValue()); } else { result = partialResult; } return new NormalizedNodeContext(path,result); + } catch (final RestconfDocumentedException e) { + throw e; + } catch (final ResultAlreadySetException e) { + LOG.debug("Error parsing json input:", e); + + throw new RestconfDocumentedException("Error parsing json input: Failed to create new parse result data. " + + "Are you creating multiple resources/subresources in POST request?"); } catch (final Exception e) { LOG.debug("Error parsing json input", e);