*/
package org.opendaylight.restconf.nb.rfc8040.jersey.providers;
+import com.google.common.base.Throwables;
import com.google.common.collect.Iterables;
import com.google.gson.stream.JsonReader;
import java.io.InputStream;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.Provider;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.mdsal.dom.api.DOMMountPointService;
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.nb.rfc8040.Rfc8040;
-import org.opendaylight.restconf.nb.rfc8040.handlers.DOMMountPointServiceHandler;
+import org.opendaylight.restconf.nb.rfc8040.MediaTypes;
import org.opendaylight.restconf.nb.rfc8040.handlers.SchemaContextHandler;
-import org.opendaylight.restconf.nb.rfc8040.jersey.providers.spi.AbstractNormalizedNodeBodyReader;
-import org.opendaylight.restconf.nb.rfc8040.utils.RestconfConstants;
+import org.opendaylight.restconf.nb.rfc8040.legacy.NormalizedNodePayload;
+import org.opendaylight.yangtools.yang.common.ErrorTag;
+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;
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.EffectiveStatementInference;
+import org.opendaylight.yangtools.yang.model.api.OperationDefinition;
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.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Provider
-@Consumes({ Rfc8040.MediaTypes.DATA + RestconfConstants.JSON, MediaType.APPLICATION_JSON })
+@Consumes({ MediaTypes.APPLICATION_YANG_DATA_JSON, MediaType.APPLICATION_JSON })
public class JsonNormalizedNodeBodyReader extends AbstractNormalizedNodeBodyReader {
private static final Logger LOG = LoggerFactory.getLogger(JsonNormalizedNodeBodyReader.class);
- public JsonNormalizedNodeBodyReader(SchemaContextHandler schemaContextHandler,
- DOMMountPointServiceHandler mountPointServiceHandler) {
- super(schemaContextHandler, mountPointServiceHandler);
+ public JsonNormalizedNodeBodyReader(final SchemaContextHandler schemaContextHandler,
+ final DOMMountPointService mountPointService) {
+ super(schemaContextHandler, mountPointService);
}
@SuppressWarnings("checkstyle:IllegalCatch")
@Override
- protected NormalizedNodeContext readBody(final InstanceIdentifierContext<?> path, final InputStream entityStream)
+ protected NormalizedNodePayload readBody(final InstanceIdentifierContext path, final InputStream entityStream)
throws WebApplicationException {
try {
return readFrom(path, entityStream, isPost());
}
}
- public static NormalizedNodeContext readFrom(
- final InstanceIdentifierContext<?> path, final InputStream entityStream, final boolean isPost) {
+ public static NormalizedNodePayload readFrom(
+ final InstanceIdentifierContext path, final InputStream entityStream, final boolean isPost) {
final NormalizedNodeResult resultHolder = new NormalizedNodeResult();
final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder);
- final SchemaNode parentSchema;
+ final EffectiveStatementInference parentSchema;
if (isPost) {
- parentSchema = path.getSchemaNode();
- } else if (path.getSchemaNode() instanceof SchemaContext) {
- parentSchema = path.getSchemaContext();
+ parentSchema = SchemaInferenceStack.ofSchemaPath(path.getSchemaContext(),
+ path.getSchemaNode().getPath()).toInference();
+ } else if (path.getSchemaNode() instanceof SchemaContext
+ || SchemaPath.ROOT.equals(path.getSchemaNode().getPath().getParent())) {
+ parentSchema = SchemaInferenceStack.of(path.getSchemaContext()).toInference();
} 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()).toInference();
}
final JsonParserStream jsonParser = JsonParserStream.create(writer,
final JsonReader reader = new JsonReader(new InputStreamReader(entityStream, StandardCharsets.UTF_8));
jsonParser.parse(reader);
- NormalizedNode<?, ?> result = resultHolder.getResult();
+ NormalizedNode result = resultHolder.getResult();
final List<YangInstanceIdentifier.PathArgument> iiToDataList = new ArrayList<>();
- InstanceIdentifierContext<? extends SchemaNode> newIIContext;
+ 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());
+ final List<? extends @NonNull EffectiveStatement<?, ?>> parentPath = parentSchema.statementPath();
+ if (parentPath.isEmpty() || !(parentPath.get(parentPath.size() - 1) instanceof OperationDefinition)) {
+ iiToDataList.add(result.getIdentifier());
+ }
}
} else {
if (result instanceof MapNode) {
- result = Iterables.getOnlyElement(((MapNode) result).getValue());
+ result = Iterables.getOnlyElement(((MapNode) result).body());
}
}
final YangInstanceIdentifier fullIIToData = YangInstanceIdentifier.create(Iterables.concat(
path.getInstanceIdentifier().getPathArguments(), iiToDataList));
- newIIContext = new InstanceIdentifierContext<>(fullIIToData, path.getSchemaNode(), path.getMountPoint(),
+ newIIContext = new InstanceIdentifierContext(fullIIToData, path.getSchemaNode(), path.getMountPoint(),
path.getSchemaContext());
- return new NormalizedNodeContext(newIIContext, result);
+ // FIXME: can result really be null?
+ return NormalizedNodePayload.ofNullable(newIIContext, result);
}
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);
+ ErrorTag.MALFORMED_MESSAGE, exception);
}
}