Revert "Convert anyxml nodes lazily"
[netconf.git] / restconf / restconf-nb-bierman02 / src / main / java / org / opendaylight / netconf / sal / restconf / impl / RestconfImpl.java
index 60fcfff5189d859942bf981ea74bc8bc8da22367..fd012b56ed5e87d41b1fecac60e2c53c9fdf3008 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.netconf.sal.restconf.impl;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.CharMatcher;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicates;
 import com.google.common.base.Splitter;
@@ -44,6 +43,7 @@ import java.util.concurrent.CancellationException;
 import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
+import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.ResponseBuilder;
@@ -97,9 +97,9 @@ import org.opendaylight.yangtools.yang.data.api.schema.tree.ModifiedNodeDoesNotE
 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder;
-import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.ListNodeBuilder;
-import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeAttrBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeBuilder;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
@@ -206,7 +206,7 @@ public final class RestconfImpl implements RestconfService {
                 restconfModule, Draft02.RestConfModule.MODULES_CONTAINER_SCHEMA_NODE);
         Preconditions.checkState(modulesSchemaNode instanceof ContainerSchemaNode);
 
-        final DataContainerNodeAttrBuilder<NodeIdentifier, ContainerNode> moduleContainerBuilder =
+        final DataContainerNodeBuilder<NodeIdentifier, ContainerNode> moduleContainerBuilder =
                 Builders.containerBuilder((ContainerSchemaNode) modulesSchemaNode);
         moduleContainerBuilder.withChild(allModuleMap);
 
@@ -238,7 +238,7 @@ public final class RestconfImpl implements RestconfService {
                 restconfModule, Draft02.RestConfModule.MODULES_CONTAINER_SCHEMA_NODE);
         Preconditions.checkState(modulesSchemaNode instanceof ContainerSchemaNode);
 
-        final DataContainerNodeAttrBuilder<NodeIdentifier, ContainerNode> moduleContainerBuilder =
+        final DataContainerNodeBuilder<NodeIdentifier, ContainerNode> moduleContainerBuilder =
                 Builders.containerBuilder((ContainerSchemaNode) modulesSchemaNode);
         moduleContainerBuilder.withChild(mountPointModulesMap);
 
@@ -306,7 +306,7 @@ public final class RestconfImpl implements RestconfService {
                 restconfModule, Draft02.RestConfModule.STREAMS_CONTAINER_SCHEMA_NODE);
         Preconditions.checkState(streamsContainerSchemaNode instanceof ContainerSchemaNode);
 
-        final DataContainerNodeAttrBuilder<NodeIdentifier, ContainerNode> streamsContainerBuilder =
+        final DataContainerNodeBuilder<NodeIdentifier, ContainerNode> streamsContainerBuilder =
                 Builders.containerBuilder((ContainerSchemaNode) streamsContainerSchemaNode);
         streamsContainerBuilder.withChild(listStreamsBuilder.build());
 
@@ -370,7 +370,7 @@ public final class RestconfImpl implements RestconfService {
         }
 
         final ContainerSchemaNode fakeCont = new FakeContainerSchemaNode(fakeRpcSchema);
-        final DataContainerNodeAttrBuilder<NodeIdentifier, ContainerNode> containerBuilder =
+        final DataContainerNodeBuilder<NodeIdentifier, ContainerNode> containerBuilder =
                 Builders.containerBuilder(fakeCont);
 
         for (final LeafSchemaNode leaf : fakeRpcSchema) {
@@ -435,7 +435,7 @@ public final class RestconfImpl implements RestconfService {
             final UriInfo uriInfo) {
         if (payload == null) {
             // no payload specified, reroute this to no payload invokeRpc implementation
-            return invokeRpc(identifier, "", uriInfo);
+            return invokeRpc(identifier, uriInfo);
         }
 
         final SchemaPath type = payload.getInstanceIdentifierContext().getSchemaNode().getPath();
@@ -480,19 +480,19 @@ public final class RestconfImpl implements RestconfService {
             resultData = null;
         }
 
-        return new NormalizedNodeContext(
-                new InstanceIdentifierContext<>(null, resultNodeSchema, mountPoint, schemaContext),
-                resultData, QueryParametersParser.parseWriterParameters(uriInfo));
+        if (resultData != null && ((ContainerNode) resultData).getValue().isEmpty()) {
+            throw new WebApplicationException(Response.Status.NO_CONTENT);
+        } else {
+            return new NormalizedNodeContext(
+                    new InstanceIdentifierContext<>(null, resultNodeSchema, mountPoint, schemaContext),
+                    resultData, QueryParametersParser.parseWriterParameters(uriInfo));
+        }
     }
 
-    @Override
-    public NormalizedNodeContext invokeRpc(final String identifier, final String noPayload, final UriInfo uriInfo) {
-        if (noPayload != null && !CharMatcher.whitespace().matchesAllOf(noPayload)) {
-            throw new RestconfDocumentedException("Content must be empty.", ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE);
-        }
+    private NormalizedNodeContext invokeRpc(final String identifier, final UriInfo uriInfo) {
 
-        String identifierEncoded = null;
         DOMMountPoint mountPoint = null;
+        final String identifierEncoded;
         final SchemaContext schemaContext;
         if (identifier.contains(ControllerContext.MOUNT)) {
             // mounted RPC call - look up mount instance.
@@ -516,7 +516,7 @@ public final class RestconfImpl implements RestconfService {
 
         final String identifierDecoded = this.controllerContext.urlPathArgDecode(identifierEncoded);
 
-        RpcDefinition rpc = null;
+        RpcDefinition rpc;
         if (mountPoint == null) {
             rpc = this.controllerContext.getRpcDefinition(identifierDecoded);
         } else {
@@ -547,8 +547,12 @@ public final class RestconfImpl implements RestconfService {
 
         final DOMRpcResult result = checkRpcResponse(response);
 
-        return new NormalizedNodeContext(new InstanceIdentifierContext<>(null, rpc, mountPoint, schemaContext),
-                result.getResult(), QueryParametersParser.parseWriterParameters(uriInfo));
+        if (result.getResult() != null && ((ContainerNode) result.getResult()).getValue().isEmpty()) {
+            throw new WebApplicationException(Response.Status.NO_CONTENT);
+        } else {
+            return new NormalizedNodeContext(new InstanceIdentifierContext<>(null, rpc, mountPoint, schemaContext),
+                    result.getResult(), QueryParametersParser.parseWriterParameters(uriInfo));
+        }
     }
 
     @SuppressWarnings("checkstyle:avoidHidingCauseException")
@@ -608,7 +612,7 @@ public final class RestconfImpl implements RestconfService {
     private ListenableFuture<DOMRpcResult> invokeSalRemoteRpcSubscribeRPC(final NormalizedNodeContext payload) {
         final ContainerNode value = (ContainerNode) payload.getData();
         final QName rpcQName = payload.getInstanceIdentifierContext().getSchemaNode().getQName();
-        final java.util.Optional<DataContainerChild<? extends PathArgument, ?>> path = value.getChild(
+        final Optional<DataContainerChild<? extends PathArgument, ?>> path = value.getChild(
             new NodeIdentifier(QName.create(payload.getInstanceIdentifierContext().getSchemaNode().getQName(),
                 "path")));
         final Object pathValue = path.isPresent() ? path.get().getValue() : null;
@@ -1134,7 +1138,7 @@ public final class RestconfImpl implements RestconfService {
         if (response != null) {
             // prepare node with value of location
             final InstanceIdentifierContext<?> iid = prepareIIDSubsStreamOutput();
-            final NormalizedNodeAttrBuilder<NodeIdentifier, Object, LeafNode<Object>> builder =
+            final NormalizedNodeBuilder<NodeIdentifier, Object, LeafNode<Object>> builder =
                     ImmutableLeafNodeBuilder.create().withValue(response.toString());
             builder.withNodeIdentifier(
                     NodeIdentifier.create(QName.create("subscribe:to:notification", "2016-10-28", "location")));
@@ -1212,8 +1216,7 @@ public final class RestconfImpl implements RestconfService {
 
         for (final NotificationListenerAdapter listener : listeners) {
             this.broker.registerToListenNotification(listener);
-            listener.setQueryParams(start,
-                    java.util.Optional.ofNullable(stop), java.util.Optional.ofNullable(filter), false);
+            listener.setQueryParams(start, Optional.ofNullable(stop), Optional.ofNullable(filter), false);
         }
 
         final UriBuilder uriBuilder = uriInfo.getAbsolutePathBuilder();
@@ -1263,8 +1266,7 @@ public final class RestconfImpl implements RestconfService {
             throw new RestconfDocumentedException("Stream was not found.", ErrorType.PROTOCOL,
                     ErrorTag.UNKNOWN_ELEMENT);
         }
-        listener.setQueryParams(start, java.util.Optional.ofNullable(stop),
-                java.util.Optional.ofNullable(filter), leafNodesOnly);
+        listener.setQueryParams(start, Optional.ofNullable(stop), Optional.ofNullable(filter), leafNodesOnly);
 
         final Map<String, String> paramToValues = resolveValuesFromUri(identifier);
         final LogicalDatastoreType datastore =
@@ -1333,7 +1335,7 @@ public final class RestconfImpl implements RestconfService {
      */
     private static <T> T parseEnumTypeParameter(final ContainerNode value, final Class<T> classDescriptor,
             final String paramName) {
-        final java.util.Optional<DataContainerChild<? extends PathArgument, ?>> optAugNode = value.getChild(
+        final Optional<DataContainerChild<? extends PathArgument, ?>> optAugNode = value.getChild(
             SAL_REMOTE_AUG_IDENTIFIER);
         if (!optAugNode.isPresent()) {
             return null;
@@ -1342,8 +1344,8 @@ public final class RestconfImpl implements RestconfService {
         if (!(augNode instanceof AugmentationNode)) {
             return null;
         }
-        final java.util.Optional<DataContainerChild<? extends PathArgument, ?>> enumNode = ((AugmentationNode) augNode)
-            .getChild(new NodeIdentifier(QName.create(SAL_REMOTE_AUGMENT, paramName)));
+        final Optional<DataContainerChild<? extends PathArgument, ?>> enumNode = ((AugmentationNode) augNode).getChild(
+                new NodeIdentifier(QName.create(SAL_REMOTE_AUGMENT, paramName)));
         if (!enumNode.isPresent()) {
             return null;
         }
@@ -1413,7 +1415,7 @@ public final class RestconfImpl implements RestconfService {
         Preconditions.checkArgument(moduleSchemaNode instanceof ListSchemaNode,
                 "moduleSchemaNode has to be of type ListSchemaNode");
         final ListSchemaNode listModuleSchemaNode = (ListSchemaNode) moduleSchemaNode;
-        final DataContainerNodeAttrBuilder<NodeIdentifierWithPredicates, MapEntryNode> moduleNodeValues =
+        final DataContainerNodeBuilder<NodeIdentifierWithPredicates, MapEntryNode> moduleNodeValues =
                 Builders.mapEntryBuilder(listModuleSchemaNode);
 
         List<DataSchemaNode> instanceDataChildrenByName =
@@ -1429,7 +1431,7 @@ public final class RestconfImpl implements RestconfService {
                 ControllerContext.findInstanceDataChildrenByName(listModuleSchemaNode, "revision");
         final DataSchemaNode revisionSchemaNode = Iterables.getFirst(instanceDataChildrenByName, null);
         Preconditions.checkState(revisionSchemaNode instanceof LeafSchemaNode);
-        final java.util.Optional<Revision> revision = qNameModule.getRevision();
+        final Optional<Revision> revision = qNameModule.getRevision();
         moduleNodeValues.withChild(Builders.leafBuilder((LeafSchemaNode) revisionSchemaNode)
                 .withValue(revision.map(Revision::toString).orElse("")).build());
 
@@ -1459,7 +1461,7 @@ public final class RestconfImpl implements RestconfService {
         Preconditions.checkArgument(streamSchemaNode instanceof ListSchemaNode,
                 "streamSchemaNode has to be of type ListSchemaNode");
         final ListSchemaNode listStreamSchemaNode = (ListSchemaNode) streamSchemaNode;
-        final DataContainerNodeAttrBuilder<NodeIdentifierWithPredicates, MapEntryNode> streamNodeValues =
+        final DataContainerNodeBuilder<NodeIdentifierWithPredicates, MapEntryNode> streamNodeValues =
                 Builders.mapEntryBuilder(listStreamSchemaNode);
 
         List<DataSchemaNode> instanceDataChildrenByName =