From cab753c95c227ed8b1ac216f535b6ff34892603c Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 1 Apr 2024 23:31:21 +0200 Subject: [PATCH] Turn ApiPath into a record Expose the canonical constructor and adjust callers to use ApiPath.of(). JIRA: NETCONF-1264 Change-Id: I74f0e17b15d363f096cb7d4a369519a7ba879e7a Signed-off-by: Robert Varga --- .../opendaylight/restconf/api/ApiPath.java | 24 ++++++++----------- .../rests/transactions/RestconfStrategy.java | 11 ++++----- .../server/spi/ApiPathNormalizer.java | 7 +++--- 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/protocol/restconf-api/src/main/java/org/opendaylight/restconf/api/ApiPath.java b/protocol/restconf-api/src/main/java/org/opendaylight/restconf/api/ApiPath.java index 635e397cec..9c4c41c766 100644 --- a/protocol/restconf-api/src/main/java/org/opendaylight/restconf/api/ApiPath.java +++ b/protocol/restconf-api/src/main/java/org/opendaylight/restconf/api/ApiPath.java @@ -22,6 +22,7 @@ import java.io.ObjectOutputStream; import java.io.ObjectStreamException; import java.text.ParseException; import java.util.HexFormat; +import java.util.List; import java.util.Objects; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -36,7 +37,7 @@ import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified; * as a series of {@link Step}s. */ @NonNullByDefault -public final class ApiPath implements HierarchicalIdentifier { +public record ApiPath(ImmutableList steps) implements HierarchicalIdentifier { @java.io.Serial private static final long serialVersionUID = 1L; @@ -173,10 +174,8 @@ public final class ApiPath implements HierarchicalIdentifier { private static final ApiPath EMPTY = new ApiPath(ImmutableList.of()); - private final ImmutableList steps; - - private ApiPath(final ImmutableList steps) { - this.steps = requireNonNull(steps); + public ApiPath { + requireNonNull(steps); } /** @@ -188,6 +187,10 @@ public final class ApiPath implements HierarchicalIdentifier { return EMPTY; } + public static ApiPath of(final List steps) { + return steps.isEmpty() ? EMPTY : new ApiPath(ImmutableList.copyOf(steps)); + } + /** * Parse an {@link ApiPath} from a raw Request URI fragment or another source. The string is expected to contain * percent-encoded bytes. Any sequence of such bytes is interpreted as a {@code UTF-8}-encoded string. Invalid @@ -279,13 +282,7 @@ public final class ApiPath implements HierarchicalIdentifier { public ApiPath subPath(final int fromIndex, final int toIndex) { final var subList = steps.subList(fromIndex, toIndex); - if (subList == steps) { - return this; - } else if (subList.isEmpty()) { - return EMPTY; - } else { - return new ApiPath(subList); - } + return subList == steps ? this : of(subList); } @Override @@ -341,7 +338,6 @@ public final class ApiPath implements HierarchicalIdentifier { } private static ApiPath parseString(final ApiPathParser parser, final String str) throws ParseException { - final var steps = parser.parseSteps(str); - return steps.isEmpty() ? EMPTY : new ApiPath(steps); + return of(parser.parseSteps(str)); } } 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 6f277134e2..cb175b55d4 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 @@ -92,7 +92,7 @@ import org.opendaylight.restconf.server.api.PatchBody; import org.opendaylight.restconf.server.api.ResourceBody; import org.opendaylight.restconf.server.spi.ApiPathNormalizer; import org.opendaylight.restconf.server.spi.ApiPathNormalizer.InstanceReference; -import org.opendaylight.restconf.server.spi.ApiPathNormalizer.OperationPath; +import org.opendaylight.restconf.server.spi.ApiPathNormalizer.Path.Action; import org.opendaylight.restconf.server.spi.ApiPathNormalizer.Path.Data; import org.opendaylight.restconf.server.spi.ApiPathNormalizer.Path.Rpc; import org.opendaylight.restconf.server.spi.OperationInput; @@ -1289,7 +1289,7 @@ public abstract class RestconfStrategy { public @NonNull RestconfFuture operationsPOST(final URI restconfURI, final ApiPath apiPath, final OperationInputBody body) { - final OperationPath.Rpc path; + final Rpc path; try { path = pathNormalizer.normalizeRpcPath(apiPath); } catch (RestconfDocumentedException e) { @@ -1421,7 +1421,7 @@ public abstract class RestconfStrategy { resourceBody, queryParameters); } } - if (path instanceof OperationPath.Action actionPath) { + if (path instanceof Action actionPath) { try (var inputBody = body.toOperationInput()) { return dataInvokePOST(actionPath, inputBody); } @@ -1460,8 +1460,7 @@ public abstract class RestconfStrategy { return ret; } - private @NonNull RestconfFuture dataInvokePOST(final OperationPath.Action path, - final OperationInputBody body) { + private @NonNull RestconfFuture dataInvokePOST(final Action path, final OperationInputBody body) { final var inference = path.inference(); final ContainerNode input; try { @@ -1493,7 +1492,7 @@ public abstract class RestconfStrategy { * @return {@link DOMActionResult} */ private static RestconfFuture dataInvokePOST(final DOMActionService actionService, - final OperationPath.Action path, final @NonNull ContainerNode input) { + final Action path, final @NonNull ContainerNode input) { final var ret = new SettableRestconfFuture(); Futures.addCallback(actionService.invokeAction( diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/spi/ApiPathNormalizer.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/spi/ApiPathNormalizer.java index 3a7acd415e..d2841c4343 100644 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/spi/ApiPathNormalizer.java +++ b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/server/spi/ApiPathNormalizer.java @@ -22,6 +22,7 @@ import org.opendaylight.restconf.api.ApiPath.ListInstance; import org.opendaylight.restconf.common.errors.RestconfDocumentedException; import org.opendaylight.restconf.nb.rfc8040.Insert.PointNormalizer; import org.opendaylight.restconf.server.api.DatabindContext; +import org.opendaylight.restconf.server.spi.ApiPathNormalizer.Path.Action; import org.opendaylight.restconf.server.spi.ApiPathNormalizer.Path.Data; import org.opendaylight.restconf.server.spi.ApiPathNormalizer.Path.Rpc; import org.opendaylight.yangtools.yang.common.ErrorTag; @@ -232,7 +233,7 @@ public final class ApiPathNormalizer implements PointNormalizer { final var stack = SchemaInferenceStack.of(modelContext); final var stmt = stack.enterSchemaTree(rpc.argument()); verify(rpc.equals(stmt), "Expecting %s, inferred %s", rpc, stmt); - return new OperationPath.Rpc(stack.toInference(), rpc); + return new Rpc(stack.toInference(), rpc); } final var stack = SchemaInferenceStack.of(modelContext); @@ -259,7 +260,7 @@ public final class ApiPathNormalizer implements PointNormalizer { final var actionStmt = action.asEffectiveStatement(); verify(actionStmt.equals(stmt), "Expecting %s, inferred %s", actionStmt, stmt); - return new OperationPath.Action(stack.toInference(), YangInstanceIdentifier.of(path), actionStmt); + return new Action(stack.toInference(), YangInstanceIdentifier.of(path), actionStmt); } } @@ -386,7 +387,7 @@ public final class ApiPathNormalizer implements PointNormalizer { if (path instanceof Data dataPath) { return dataPath; } - if (path instanceof OperationPath.Action actionPath) { + if (path instanceof Action actionPath) { return actionPath; } throw new RestconfDocumentedException("Unexpected path " + path, ErrorType.PROTOCOL, ErrorTag.DATA_MISSING); -- 2.36.6