Allow no payload for RPCs with no input
[netconf.git] / restconf / restconf-nb-bierman02 / src / main / java / org / opendaylight / netconf / sal / restconf / impl / RestconfImpl.java
index 0276d558d960fcf4f92c2660d21d559b8830c1da..299247214e722d7cceb870b01e4ee79454f2808c 100644 (file)
@@ -42,6 +42,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 +118,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 +178,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 +433,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;
@@ -1394,7 +1409,7 @@ public final class RestconfImpl implements RestconfService {
         return listModuleBuilder.build();
     }
 
-    protected MapEntryNode toModuleEntryNode(final Module module, final DataSchemaNode moduleSchemaNode) {
+    private MapEntryNode toModuleEntryNode(final Module module, final DataSchemaNode moduleSchemaNode) {
         Preconditions.checkArgument(moduleSchemaNode instanceof ListSchemaNode,
                 "moduleSchemaNode has to be of type ListSchemaNode");
         final ListSchemaNode listModuleSchemaNode = (ListSchemaNode) moduleSchemaNode;
@@ -1408,22 +1423,22 @@ public final class RestconfImpl implements RestconfService {
         moduleNodeValues
                 .withChild(Builders.leafBuilder((LeafSchemaNode) nameSchemaNode).withValue(module.getName()).build());
 
+        final QNameModule qNameModule = module.getQNameModule();
+
         instanceDataChildrenByName =
                 ControllerContext.findInstanceDataChildrenByName(listModuleSchemaNode, "revision");
         final DataSchemaNode revisionSchemaNode = Iterables.getFirst(instanceDataChildrenByName, null);
         Preconditions.checkState(revisionSchemaNode instanceof LeafSchemaNode);
-        final java.util.Optional<Revision> revision = module.getQNameModule().getRevision();
-        if (revision.isPresent()) {
-            moduleNodeValues.withChild(Builders.leafBuilder((LeafSchemaNode) revisionSchemaNode)
-                .withValue(revision.get().toString()).build());
-        }
+        final java.util.Optional<Revision> revision = qNameModule.getRevision();
+        moduleNodeValues.withChild(Builders.leafBuilder((LeafSchemaNode) revisionSchemaNode)
+                .withValue(revision.map(Revision::toString).orElse("")).build());
 
         instanceDataChildrenByName =
                 ControllerContext.findInstanceDataChildrenByName(listModuleSchemaNode, "namespace");
         final DataSchemaNode namespaceSchemaNode = Iterables.getFirst(instanceDataChildrenByName, null);
         Preconditions.checkState(namespaceSchemaNode instanceof LeafSchemaNode);
         moduleNodeValues.withChild(Builders.leafBuilder((LeafSchemaNode) namespaceSchemaNode)
-                .withValue(module.getNamespace().toString()).build());
+                .withValue(qNameModule.getNamespace().toString()).build());
 
         instanceDataChildrenByName =
                 ControllerContext.findInstanceDataChildrenByName(listModuleSchemaNode, "feature");
@@ -1465,7 +1480,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");