Get rid of string payload RestconfService#invokeRpc
[netconf.git] / restconf / restconf-nb-bierman02 / src / main / java / org / opendaylight / netconf / sal / restconf / impl / RestconfImpl.java
index 95010cff19a18baef51440411ac18610a3dbc248..e6cb1c16dadb38a6cfd58ebcea4a4931be618db2 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;
@@ -42,6 +41,8 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.ExecutionException;
+import javax.inject.Inject;
+import javax.inject.Singleton;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.ResponseBuilder;
@@ -116,6 +117,7 @@ import org.opendaylight.yangtools.yang.model.util.SimpleSchemaContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@Singleton
 public final class RestconfImpl implements RestconfService {
     /**
      * Notifications are served on port 8181.
@@ -175,11 +177,18 @@ public final class RestconfImpl implements RestconfService {
 
     private final ControllerContext controllerContext;
 
-    private RestconfImpl(final BrokerFacade broker, final ControllerContext controllerContext) {
+    @Inject
+    public RestconfImpl(final BrokerFacade broker, final ControllerContext controllerContext) {
         this.broker = broker;
         this.controllerContext = controllerContext;
     }
 
+    /**
+     * Factory method.
+     *
+     * @deprecated Just use {@link #RestconfImpl(BrokerFacade, ControllerContext)} constructor instead.
+     */
+    @Deprecated
     public static RestconfImpl newInstance(final BrokerFacade broker, final ControllerContext controllerContext) {
         return new RestconfImpl(broker, controllerContext);
     }
@@ -423,6 +432,11 @@ public final class RestconfImpl implements RestconfService {
     @Override
     public NormalizedNodeContext invokeRpc(final String identifier, final NormalizedNodeContext payload,
             final UriInfo uriInfo) {
+        if (payload == null) {
+            // no payload specified, reroute this to no payload invokeRpc implementation
+            return invokeRpc(identifier, uriInfo);
+        }
+
         final SchemaPath type = payload.getInstanceIdentifierContext().getSchemaNode().getPath();
         final URI namespace = payload.getInstanceIdentifierContext().getSchemaNode().getQName().getNamespace();
         final ListenableFuture<DOMRpcResult> response;
@@ -470,14 +484,10 @@ public final class RestconfImpl implements RestconfService {
                 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.
@@ -501,7 +511,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 {
@@ -514,9 +524,9 @@ public final class RestconfImpl implements RestconfService {
         }
 
         if (!rpc.getInput().getChildNodes().isEmpty()) {
-            LOG.debug("RPC {} does not need input value.", rpc);
-            throw new RestconfDocumentedException("RPC " + rpc + " does not take any input value.",
-                    ErrorType.RPC, ErrorTag.INVALID_VALUE);
+            LOG.debug("No input specified for RPC {} with an input section", rpc);
+            throw new RestconfDocumentedException("No input specified for RPC " + rpc
+                    + " with an input section defined", ErrorType.RPC, ErrorTag.MISSING_ELEMENT);
         }
 
         final ListenableFuture<DOMRpcResult> response;
@@ -1465,7 +1475,7 @@ public final class RestconfImpl implements RestconfService {
         final DataSchemaNode replaySupportSchemaNode = Iterables.getFirst(instanceDataChildrenByName, null);
         Preconditions.checkState(replaySupportSchemaNode instanceof LeafSchemaNode);
         streamNodeValues.withChild(Builders.leafBuilder((LeafSchemaNode) replaySupportSchemaNode)
-                .withValue(Boolean.valueOf(true)).build());
+                .withValue(Boolean.TRUE).build());
 
         instanceDataChildrenByName =
                 ControllerContext.findInstanceDataChildrenByName(listStreamSchemaNode, "replay-log-creation-time");