import static java.util.Objects.requireNonNull;
import java.io.InputStream;
-import java.net.URI;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.Encoded;
import org.opendaylight.restconf.nb.rfc8040.databind.jaxrs.QueryParams;
import org.opendaylight.restconf.nb.rfc8040.legacy.InstanceIdentifierContext;
import org.opendaylight.restconf.nb.rfc8040.legacy.NormalizedNodePayload;
-import org.opendaylight.restconf.nb.rfc8040.utils.parser.IdentifierCodec;
-import org.opendaylight.yangtools.yang.common.Empty;
+import org.opendaylight.restconf.server.api.DataPostResult.CreateResource;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
-import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
/**
strategy.postData(path, data, insert).addCallback(new JaxRsRestconfCallback<>(ar) {
@Override
- Response transform(final Empty result) {
- return Response.created(resolveLocation(uriInfo, path, modelContext, data)).build();
+ Response transform(final CreateResource result) {
+ return Response.created(uriInfo.getBaseUriBuilder().path("data").path(result.createdPath()).build())
+ .build();
}
});
}
return ret;
}
- /**
- * Get location from {@link YangInstanceIdentifier} and {@link UriInfo}.
- *
- * @param uriInfo uri info
- * @param initialPath data path
- * @param schemaContext reference to {@link SchemaContext}
- * @return {@link URI}
- */
- private static URI resolveLocation(final UriInfo uriInfo, final YangInstanceIdentifier initialPath,
- final EffectiveModelContext schemaContext, final NormalizedNode data) {
- YangInstanceIdentifier path = initialPath;
- if (data instanceof MapNode mapData) {
- final var children = mapData.body();
- if (!children.isEmpty()) {
- path = path.node(children.iterator().next().name());
- }
- }
-
- return uriInfo.getBaseUriBuilder().path("data").path(IdentifierCodec.serialize(path, schemaContext)).build();
- }
-
/**
* Invoke Action operation.
*
import org.opendaylight.restconf.common.patch.PatchStatusContext;
import org.opendaylight.restconf.common.patch.PatchStatusEntity;
import org.opendaylight.restconf.nb.rfc8040.Insert;
+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.spi.OperationInput;
import org.opendaylight.restconf.server.spi.OperationOutput;
* @param insert {@link Insert}
* @return A {@link RestconfFuture}
*/
- public final RestconfFuture<Empty> postData(final YangInstanceIdentifier path, final NormalizedNode data,
- final @Nullable Insert insert) {
+ public final RestconfFuture<CreateResource> postData(final YangInstanceIdentifier path,
+ final NormalizedNode data, final @Nullable Insert insert) {
final ListenableFuture<? extends CommitInfo> future;
if (insert != null) {
final var parentPath = path.coerceParent();
} else {
future = createAndCommit(prepareWriteExecution(), path, data);
}
- final var ret = new SettableRestconfFuture<Empty>();
+ final var ret = new SettableRestconfFuture<CreateResource>();
Futures.addCallback(future, new FutureCallback<CommitInfo>() {
@Override
public void onSuccess(final CommitInfo result) {
- ret.set(Empty.value());
+ ret.set(new CreateResource(IdentifierCodec.serialize(
+ data instanceof MapNode mapData && !mapData.isEmpty()
+ ? path.node(mapData.body().iterator().next().name()) : path,
+ modelContext)));
}
@Override
public void onFailure(final Throwable cause) {
ret.setFailure(TransactionUtil.decodeException(cause, "POST", path, modelContext));
}
- }, MoreExecutors.directExecutor());
+ }, MoreExecutors.directExecutor());
return ret;
}
--- /dev/null
+/*
+ * Copyright (c) 2023 PANTHEON.tech, s.r.o. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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.api;
+
+import static java.util.Objects.requireNonNull;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+
+/**
+ * Result of a {@code POST} request as defined in
+ * <a href="https://www.rfc-editor.org/rfc/rfc8040#section-4.4">RFC8040 section 4.4</a>.
+ */
+@NonNullByDefault
+public sealed interface DataPostResult {
+ /**
+ * Result of a {@code POST} request as defined in
+ * <a href="https://www.rfc-editor.org/rfc/rfc8040#section-4.4.1">RFC8040 Create ResourceMode</a>.
+ *
+ * @param createdPath API path of the newly-created resource
+ */
+ // FIXME: use ApiPath instead of String
+ record CreateResource(String createdPath) implements DataPostResult {
+ public CreateResource {
+ requireNonNull(createdPath);
+ }
+ }
+}