X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=restconf%2Frestconf-nb-bierman02%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetconf%2Fsal%2Frest%2Fimpl%2FJsonNormalizedNodeBodyReader.java;h=cda7ab71355ee871af4a7545b7544f36771d4b88;hb=0cc245d37ebbe6d9d5933bcb0034a1ed9c5b093a;hp=f90997354b2ab0305313ac8975e6207bd95c3b6a;hpb=61b5bba1c5f1be19252f65f67c43a6e9ba33feb3;p=netconf.git diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/JsonNormalizedNodeBodyReader.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/JsonNormalizedNodeBodyReader.java index f90997354b..cda7ab7135 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/JsonNormalizedNodeBodyReader.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/JsonNormalizedNodeBodyReader.java @@ -7,6 +7,7 @@ */ package org.opendaylight.netconf.sal.rest.impl; +import com.google.common.base.Throwables; import com.google.common.collect.Iterables; import com.google.gson.stream.JsonReader; import java.io.IOException; @@ -31,8 +32,8 @@ import org.opendaylight.restconf.common.context.InstanceIdentifierContext; import org.opendaylight.restconf.common.context.NormalizedNodeContext; import org.opendaylight.restconf.common.errors.RestconfDocumentedException; import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; import org.opendaylight.restconf.common.util.RestUtil; +import org.opendaylight.yangtools.yang.common.ErrorType; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode; import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode; @@ -49,19 +50,22 @@ import org.opendaylight.yangtools.yang.data.impl.schema.ResultAlreadySetExceptio 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.opendaylight.yangtools.yang.model.util.SchemaInferenceStack; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Provider -@Consumes({ Draft02.MediaTypes.DATA + RestconfService.JSON, Draft02.MediaTypes.OPERATION + RestconfService.JSON, - MediaType.APPLICATION_JSON }) +@Consumes({ + Draft02.MediaTypes.DATA + RestconfService.JSON, + Draft02.MediaTypes.OPERATION + RestconfService.JSON, + MediaType.APPLICATION_JSON +}) public class JsonNormalizedNodeBodyReader extends AbstractIdentifierAwareJaxRsProvider implements MessageBodyReader { private static final Logger LOG = LoggerFactory.getLogger(JsonNormalizedNodeBodyReader.class); - public JsonNormalizedNodeBodyReader(ControllerContext controllerContext) { + public JsonNormalizedNodeBodyReader(final ControllerContext controllerContext) { super(controllerContext); } @@ -75,8 +79,8 @@ public class JsonNormalizedNodeBodyReader @Override public NormalizedNodeContext readFrom(final Class type, final Type genericType, final Annotation[] annotations, final MediaType mediaType, - final MultivaluedMap httpHeaders, final InputStream entityStream) throws IOException, - WebApplicationException { + final MultivaluedMap httpHeaders, final InputStream entityStream) throws + WebApplicationException { try { return readFrom(getInstanceIdentifierContext(), entityStream, isPost()); } catch (final Exception e) { @@ -101,55 +105,53 @@ public class JsonNormalizedNodeBodyReader final InputStream entityStream, final boolean isPost) throws IOException { final Optional nonEmptyInputStreamOptional = RestUtil.isInputStreamEmpty(entityStream); - if (!nonEmptyInputStreamOptional.isPresent()) { + if (nonEmptyInputStreamOptional.isEmpty()) { return new NormalizedNodeContext(path, null); } final NormalizedNodeResult resultHolder = new NormalizedNodeResult(); final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder); - final SchemaNode parentSchema; + final SchemaInferenceStack parentSchema; if (isPost) { // FIXME: We need dispatch for RPC. - parentSchema = path.getSchemaNode(); - } else if (path.getSchemaNode() instanceof SchemaContext) { - parentSchema = path.getSchemaContext(); + parentSchema = SchemaInferenceStack.ofSchemaPath(path.getSchemaContext(), path.getSchemaNode().getPath()); + } else if (path.getSchemaNode() instanceof SchemaContext + || SchemaPath.ROOT.equals(path.getSchemaNode().getPath().getParent())) { + parentSchema = SchemaInferenceStack.of(path.getSchemaContext()); } else { - if (SchemaPath.ROOT.equals(path.getSchemaNode().getPath().getParent())) { - parentSchema = path.getSchemaContext(); - } else { - parentSchema = SchemaContextUtil - .findDataSchemaNode(path.getSchemaContext(), path.getSchemaNode().getPath().getParent()); - } + parentSchema = SchemaInferenceStack.ofSchemaPath(path.getSchemaContext(), + path.getSchemaNode().getPath().getParent()); } final JsonParserStream jsonParser = JsonParserStream.create(writer, - JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02.getShared(path.getSchemaContext()), parentSchema); + JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02.getShared(path.getSchemaContext()), + parentSchema.toInference()); final JsonReader reader = new JsonReader(new InputStreamReader(nonEmptyInputStreamOptional.get(), StandardCharsets.UTF_8)); jsonParser.parse(reader); - NormalizedNode result = resultHolder.getResult(); + NormalizedNode result = resultHolder.getResult(); final List iiToDataList = new ArrayList<>(); InstanceIdentifierContext newIIContext; while (result instanceof AugmentationNode || result instanceof ChoiceNode) { - final Object childNode = ((DataContainerNode) result).getValue().iterator().next(); + final Object childNode = ((DataContainerNode) result).body().iterator().next(); if (isPost) { iiToDataList.add(result.getIdentifier()); } - result = (NormalizedNode) childNode; + result = (NormalizedNode) childNode; } if (isPost) { if (result instanceof MapEntryNode) { - iiToDataList.add(new YangInstanceIdentifier.NodeIdentifier(result.getNodeType())); + iiToDataList.add(new YangInstanceIdentifier.NodeIdentifier(result.getIdentifier().getNodeType())); iiToDataList.add(result.getIdentifier()); } else { iiToDataList.add(result.getIdentifier()); } } else { if (result instanceof MapNode) { - result = Iterables.getOnlyElement(((MapNode) result).getValue()); + result = Iterables.getOnlyElement(((MapNode) result).body()); } } @@ -163,19 +165,15 @@ public class JsonNormalizedNodeBodyReader } private static void propagateExceptionAs(final Exception exception) throws RestconfDocumentedException { - if (exception instanceof RestconfDocumentedException) { - throw (RestconfDocumentedException)exception; - } + Throwables.throwIfInstanceOf(exception, RestconfDocumentedException.class); + LOG.debug("Error parsing json input", exception); if (exception instanceof ResultAlreadySetException) { - LOG.debug("Error parsing json input:", exception); - throw new RestconfDocumentedException("Error parsing json input: Failed to create new parse result data. " + "Are you creating multiple resources/subresources in POST request?", exception); } - LOG.debug("Error parsing json input", exception); - + RestconfDocumentedException.throwIfYangError(exception); throw new RestconfDocumentedException("Error parsing input: " + exception.getMessage(), ErrorType.PROTOCOL, ErrorTag.MALFORMED_MESSAGE, exception); }