From 0609754a7696b45cd5cc62394b8344f29fc235a4 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 28 Nov 2023 03:14:48 +0100 Subject: [PATCH] Promote OperationOutput to restconf.server.api If we rename this to OperationsPostResult, this goes very nicely with OperationsGetResult. JIRA: NETCONF-773 Change-Id: Idcc8d43fac0a7b0125dad692a70c60c9f7158bcd Signed-off-by: Robert Varga --- .../restconf/nb/jaxrs/JaxRsRestconf.java | 6 +++--- .../rests/transactions/RestconfStrategy.java | 6 +++--- .../OperationsPostResult.java} | 15 +++++++++------ .../restconf/server/api/RestconfServer.java | 5 ++--- .../server/mdsal/MdsalRestconfServer.java | 4 ++-- .../devnotif/SubscribeDeviceNotificationRpc.java | 4 ++-- .../CreateDataChangeEventSubscriptionRpc.java | 4 ++-- .../notif/CreateNotificationStreamRpc.java | 4 ++-- .../restconf/server/spi/OperationInput.java | 9 +++++---- .../restconf/server/spi/RpcImplementation.java | 3 ++- 10 files changed, 32 insertions(+), 28 deletions(-) rename restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/{spi/OperationOutput.java => api/OperationsPostResult.java} (64%) diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/jaxrs/JaxRsRestconf.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/jaxrs/JaxRsRestconf.java index 7b3ae2b4eb..6e4ecc1b8c 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/jaxrs/JaxRsRestconf.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/jaxrs/JaxRsRestconf.java @@ -71,8 +71,8 @@ import org.opendaylight.restconf.server.api.DataPostResult.InvokeOperation; import org.opendaylight.restconf.server.api.DataPutResult; import org.opendaylight.restconf.server.api.ModulesGetResult; import org.opendaylight.restconf.server.api.OperationsGetResult; +import org.opendaylight.restconf.server.api.OperationsPostResult; import org.opendaylight.restconf.server.api.RestconfServer; -import org.opendaylight.restconf.server.spi.OperationOutput; import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.common.Revision; import org.opendaylight.yangtools.yang.common.YangConstants; @@ -749,9 +749,9 @@ public final class JaxRsRestconf implements ParamConverterProvider { private void operationsPOST(final ApiPath identifier, final UriInfo uriInfo, final AsyncResponse ar, final OperationInputBody body) { server.operationsPOST(uriInfo.getBaseUri(), identifier, body) - .addCallback(new JaxRsRestconfCallback(ar) { + .addCallback(new JaxRsRestconfCallback(ar) { @Override - Response transform(final OperationOutput result) { + Response transform(final OperationsPostResult result) { final var body = result.output(); return body == null ? Response.noContent().build() : Response.ok().entity(new NormalizedNodePayload(result.operation(), body)).build(); diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/RestconfStrategy.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/RestconfStrategy.java index 4e5d2b1267..50725a2823 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/RestconfStrategy.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/transactions/RestconfStrategy.java @@ -52,8 +52,8 @@ import org.opendaylight.restconf.nb.rfc8040.utils.parser.IdentifierCodec; import org.opendaylight.restconf.server.api.DataPostResult.CreateResource; import org.opendaylight.restconf.server.api.DataPutResult; import org.opendaylight.restconf.server.api.DatabindContext; +import org.opendaylight.restconf.server.api.OperationsPostResult; import org.opendaylight.restconf.server.spi.OperationInput; -import org.opendaylight.restconf.server.spi.OperationOutput; import org.opendaylight.restconf.server.spi.RpcImplementation; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.with.defaults.rev110601.WithDefaultsMode; import org.opendaylight.yangtools.yang.common.Empty; @@ -1057,7 +1057,7 @@ public abstract class RestconfStrategy { y -> builder.addChild((T) prepareData(y.getValue(), stateMap.get(y.getKey())))); } - public @NonNull RestconfFuture invokeRpc(final URI restconfURI, final QName type, + public @NonNull RestconfFuture invokeRpc(final URI restconfURI, final QName type, final OperationInput input) { final var local = localRpcs.get(type); if (local != null) { @@ -1069,7 +1069,7 @@ public abstract class RestconfStrategy { ErrorType.PROTOCOL, ErrorTag.OPERATION_NOT_SUPPORTED)); } - final var ret = new SettableRestconfFuture(); + final var ret = new SettableRestconfFuture(); Futures.addCallback(rpcService.invokeRpc(requireNonNull(type), input.input()), new FutureCallback() { @Override diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/spi/OperationOutput.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/api/OperationsPostResult.java similarity index 64% rename from restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/spi/OperationOutput.java rename to restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/api/OperationsPostResult.java index 6b191efbcc..b6d6470b2e 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/spi/OperationOutput.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/api/OperationsPostResult.java @@ -5,25 +5,28 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ -package org.opendaylight.restconf.server.spi; +package org.opendaylight.restconf.server.api; import static java.util.Objects.requireNonNull; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.restconf.server.api.DatabindAware; -import org.opendaylight.restconf.server.api.DatabindContext; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference; /** - * Output of {@link RpcImplementation#invoke(java.net.URI, OperationInput)}. + * RESTCONF {@code /operations} content for a {@code POST} operation as per + * RFC8040 Operation Resource. + * + * @param databind Associated {@link DatabindContext} + * @param operation An {@link Inference} pointing to the invoked operation + * @param output Operation output, or {@code null} if output would be empty */ -public record OperationOutput( +public record OperationsPostResult( @NonNull DatabindContext databind, @NonNull Inference operation, @Nullable ContainerNode output) implements DatabindAware { - public OperationOutput { + public OperationsPostResult { requireNonNull(databind); requireNonNull(operation); if (output != null && output.isEmpty()) { diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/api/RestconfServer.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/api/RestconfServer.java index 827c3be02b..5d60fe25f2 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/api/RestconfServer.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/api/RestconfServer.java @@ -22,7 +22,6 @@ import org.opendaylight.restconf.nb.rfc8040.databind.PatchBody; import org.opendaylight.restconf.nb.rfc8040.databind.ResourceBody; import org.opendaylight.restconf.nb.rfc8040.legacy.NormalizedNodePayload; import org.opendaylight.restconf.server.api.DataPostResult.CreateResource; -import org.opendaylight.restconf.server.spi.OperationOutput; import org.opendaylight.yangtools.yang.common.Empty; /** @@ -149,12 +148,12 @@ public interface RestconfServer { * @param restconfURI Base URI of the request * @param operation {@code } path, really an {@link ApiPath} to an {@code rpc} * @param body RPC operation - * @return A {@link RestconfFuture} completing with {@link OperationOutput} + * @return A {@link RestconfFuture} completing with {@link OperationsPostResult} */ // FIXME: 'operation' should really be an ApiIdentifier with non-null module, but we also support ang-ext:mount, // and hence it is a path right now // FIXME: use ApiPath instead of String - RestconfFuture operationsPOST(URI restconfURI, ApiPath operation, OperationInputBody body); + RestconfFuture operationsPOST(URI restconfURI, ApiPath operation, OperationInputBody body); /** * Return the revision of {@code ietf-yang-library} module implemented by this server, as defined in diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/MdsalRestconfServer.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/MdsalRestconfServer.java index 2e0176fe8e..27e3d8f2e9 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/MdsalRestconfServer.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/MdsalRestconfServer.java @@ -76,10 +76,10 @@ import org.opendaylight.restconf.server.api.DataPutResult; import org.opendaylight.restconf.server.api.DatabindContext; import org.opendaylight.restconf.server.api.ModulesGetResult; import org.opendaylight.restconf.server.api.OperationsGetResult; +import org.opendaylight.restconf.server.api.OperationsPostResult; import org.opendaylight.restconf.server.api.RestconfServer; import org.opendaylight.restconf.server.spi.DatabindProvider; import org.opendaylight.restconf.server.spi.OperationInput; -import org.opendaylight.restconf.server.spi.OperationOutput; import org.opendaylight.restconf.server.spi.RpcImplementation; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev170126.YangApi; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev170126.restconf.Restconf; @@ -602,7 +602,7 @@ public final class MdsalRestconfServer } @Override - public RestconfFuture operationsPOST(final URI restconfURI, final ApiPath apiPath, + public RestconfFuture operationsPOST(final URI restconfURI, final ApiPath apiPath, final OperationInputBody body) { final var reqPath = bindRequestPath(localStrategy(), apiPath); final var inference = reqPath.inference(); diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/devnotif/SubscribeDeviceNotificationRpc.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/devnotif/SubscribeDeviceNotificationRpc.java index 65823a2d21..0fe37e185b 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/devnotif/SubscribeDeviceNotificationRpc.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/devnotif/SubscribeDeviceNotificationRpc.java @@ -16,8 +16,8 @@ import org.opendaylight.mdsal.dom.api.DOMMountPointService; import org.opendaylight.restconf.common.errors.RestconfDocumentedException; import org.opendaylight.restconf.common.errors.RestconfFuture; import org.opendaylight.restconf.nb.rfc8040.utils.parser.IdentifierCodec; +import org.opendaylight.restconf.server.api.OperationsPostResult; import org.opendaylight.restconf.server.spi.OperationInput; -import org.opendaylight.restconf.server.spi.OperationOutput; import org.opendaylight.restconf.server.spi.RestconfStream; import org.opendaylight.restconf.server.spi.RpcImplementation; import org.opendaylight.yang.gen.v1.urn.opendaylight.device.notification.rev221106.SubscribeDeviceNotification; @@ -60,7 +60,7 @@ public final class SubscribeDeviceNotificationRpc extends RpcImplementation { } @Override - public RestconfFuture invoke(final URI restconfURI, final OperationInput input) { + public RestconfFuture invoke(final URI restconfURI, final OperationInput input) { final var body = input.input(); final var pathLeaf = body.childByArg(DEVICE_NOTIFICATION_PATH_NODEID); if (pathLeaf == null) { diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/CreateDataChangeEventSubscriptionRpc.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/CreateDataChangeEventSubscriptionRpc.java index bcaff1982c..f651b87ba7 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/CreateDataChangeEventSubscriptionRpc.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/dtcl/CreateDataChangeEventSubscriptionRpc.java @@ -19,9 +19,9 @@ import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService; import org.opendaylight.restconf.common.errors.RestconfDocumentedException; import org.opendaylight.restconf.common.errors.RestconfFuture; import org.opendaylight.restconf.nb.rfc8040.utils.parser.IdentifierCodec; +import org.opendaylight.restconf.server.api.OperationsPostResult; import org.opendaylight.restconf.server.spi.DatabindProvider; import org.opendaylight.restconf.server.spi.OperationInput; -import org.opendaylight.restconf.server.spi.OperationOutput; import org.opendaylight.restconf.server.spi.RestconfStream; import org.opendaylight.restconf.server.spi.RpcImplementation; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.CreateDataChangeEventSubscription; @@ -97,7 +97,7 @@ public final class CreateDataChangeEventSubscriptionRpc extends RpcImplementatio * */ @Override - public RestconfFuture invoke(final URI restconfURI, final OperationInput input) { + public RestconfFuture invoke(final URI restconfURI, final OperationInput input) { final var body = input.input(); final var datastoreName = leaf(body, DATASTORE_NODEID, String.class); final var datastore = datastoreName != null ? LogicalDatastoreType.valueOf(datastoreName) diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/notif/CreateNotificationStreamRpc.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/notif/CreateNotificationStreamRpc.java index ffa53cf552..0c4bc6d547 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/notif/CreateNotificationStreamRpc.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/mdsal/streams/notif/CreateNotificationStreamRpc.java @@ -16,9 +16,9 @@ import javax.inject.Singleton; import org.opendaylight.mdsal.dom.api.DOMNotificationService; import org.opendaylight.restconf.common.errors.RestconfDocumentedException; import org.opendaylight.restconf.common.errors.RestconfFuture; +import org.opendaylight.restconf.server.api.OperationsPostResult; import org.opendaylight.restconf.server.spi.DatabindProvider; import org.opendaylight.restconf.server.spi.OperationInput; -import org.opendaylight.restconf.server.spi.OperationOutput; import org.opendaylight.restconf.server.spi.RestconfStream; import org.opendaylight.restconf.server.spi.RpcImplementation; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.CreateDataChangeEventSubscriptionOutput; @@ -66,7 +66,7 @@ public final class CreateNotificationStreamRpc extends RpcImplementation { } @Override - public RestconfFuture invoke(final URI restconfURI, final OperationInput input) { + public RestconfFuture invoke(final URI restconfURI, final OperationInput input) { final var body = input.input(); final var qnames = ((LeafSetNode) body.getChildByArg(NOTIFICATIONS)).body().stream() .map(LeafSetEntryNode::body) diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/spi/OperationInput.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/spi/OperationInput.java index bbe96663ff..6c5964f3ae 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/spi/OperationInput.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/spi/OperationInput.java @@ -13,6 +13,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.restconf.server.api.DatabindAware; import org.opendaylight.restconf.server.api.DatabindContext; +import org.opendaylight.restconf.server.api.OperationsPostResult; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference; @@ -29,12 +30,12 @@ public record OperationInput(DatabindContext databind, Inference operation, Cont } /** - * Create an {@link OperationOutput} with equal {@link #databind()} and {@link #operation()}. + * Create an {@link OperationsPostResult} with equal {@link #databind()} and {@link #operation()}. * * @param output Output payload - * @return An {@link OperationOutput} + * @return An {@link OperationsPostResult} */ - public OperationOutput newOperationOutput(final @Nullable ContainerNode output) { - return new OperationOutput(databind, operation, output); + public OperationsPostResult newOperationOutput(final @Nullable ContainerNode output) { + return new OperationsPostResult(databind, operation, output); } } \ No newline at end of file diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/spi/RpcImplementation.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/spi/RpcImplementation.java index b3d5688bce..af810b4512 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/spi/RpcImplementation.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/spi/RpcImplementation.java @@ -14,6 +14,7 @@ import java.net.URI; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.restconf.common.errors.RestconfFuture; +import org.opendaylight.restconf.server.api.OperationsPostResult; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; @@ -47,7 +48,7 @@ public abstract class RpcImplementation { * @param input RPC input * @return Future RPC output */ - public abstract RestconfFuture invoke(URI restconfURI, OperationInput input); + public abstract RestconfFuture invoke(URI restconfURI, OperationInput input); @Override public final String toString() { -- 2.36.6