import org.opendaylight.restconf.common.errors.RestconfError;
import org.opendaylight.restconf.common.errors.RestconfFuture;
import org.opendaylight.restconf.common.patch.PatchStatusContext;
-import org.opendaylight.restconf.nb.rfc8040.ReadDataParams;
import org.opendaylight.restconf.nb.rfc8040.URLConstants;
import org.opendaylight.restconf.nb.rfc8040.databind.JsonChildBody;
import org.opendaylight.restconf.nb.rfc8040.databind.JsonDataPostBody;
import org.opendaylight.restconf.nb.rfc8040.databind.jaxrs.QueryParams;
import org.opendaylight.restconf.nb.rfc8040.legacy.ErrorTags;
import org.opendaylight.restconf.nb.rfc8040.legacy.NormalizedNodePayload;
+import org.opendaylight.restconf.server.api.DataGetParams;
import org.opendaylight.restconf.server.api.DataPostResult;
import org.opendaylight.restconf.server.api.DataPostResult.CreateResource;
import org.opendaylight.restconf.server.api.DataPostResult.InvokeOperation;
MediaType.TEXT_XML
})
public void dataGET(@Context final UriInfo uriInfo, @Suspended final AsyncResponse ar) {
- final var readParams = QueryParams.newReadDataParams(uriInfo);
+ final var readParams = QueryParams.newDataGetParams(uriInfo);
completeDataGET(server.dataGET(readParams), readParams, ar);
}
})
public void dataGET(@Encoded @PathParam("identifier") final ApiPath identifier, @Context final UriInfo uriInfo,
@Suspended final AsyncResponse ar) {
- final var readParams = QueryParams.newReadDataParams(uriInfo);
+ final var readParams = QueryParams.newDataGetParams(uriInfo);
completeDataGET(server.dataGET(identifier, readParams), readParams, ar);
}
private static void completeDataGET(final RestconfFuture<NormalizedNodePayload> future,
- final ReadDataParams readParams, final AsyncResponse ar) {
+ final DataGetParams readParams, final AsyncResponse ar) {
future.addCallback(new JaxRsRestconfCallback<>(ar) {
@Override
Response transform(final NormalizedNodePayload result) {
import org.opendaylight.restconf.api.query.WithDefaultsParam;
import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
import org.opendaylight.restconf.common.errors.RestconfError;
-import org.opendaylight.restconf.nb.rfc8040.ReadDataParams;
+import org.opendaylight.restconf.server.api.DataGetParams;
import org.opendaylight.yangtools.yang.common.ErrorTag;
import org.opendaylight.yangtools.yang.common.ErrorType;
/**
* Parse parameters from URI request and check their types and values.
*
- * @param uriInfo URI info
- * @return {@link ReadDataParams}
+ * @param uriInfo URI info
+ * @return {@link DataGetParams}
*/
- public static @NonNull ReadDataParams newReadDataParams(final UriInfo uriInfo) {
+ public static @NonNull DataGetParams newDataGetParams(final UriInfo uriInfo) {
ContentParam content = ContentParam.ALL;
DepthParam depth = null;
FieldsParam fields = null;
}
}
- return new ReadDataParams(content, depth, fields, withDefaults, prettyPrint);
+ return new DataGetParams(content, depth, fields, withDefaults, prettyPrint);
}
private static RestconfDocumentedException unhandledParam(final String operation, final String name) {
import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.restconf.api.query.DepthParam;
import org.opendaylight.restconf.api.query.PrettyPrintParam;
-import org.opendaylight.restconf.nb.rfc8040.ReadDataParams;
+import org.opendaylight.restconf.server.api.DataGetParams;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
@Beta
// FIXME: this probably needs to be renamed back to WriterParams, or somesuch
public final class QueryParameters {
- private static final @NonNull QueryParameters EMPTY = of(ReadDataParams.empty());
+ private static final @NonNull QueryParameters EMPTY = of(DataGetParams.empty());
- private final @NonNull ReadDataParams params;
+ private final @NonNull DataGetParams dataGetParams;
private final List<YangInstanceIdentifier> fieldPaths;
private final List<Set<QName>> fields;
- private QueryParameters(final ReadDataParams params, final List<Set<QName>> fields,
+ private QueryParameters(final DataGetParams params, final List<Set<QName>> fields,
final List<YangInstanceIdentifier> fieldPaths) {
- this.params = requireNonNull(params);
+ this.dataGetParams = requireNonNull(params);
this.fields = fields;
this.fieldPaths = fieldPaths;
}
return EMPTY;
}
- public static @NonNull QueryParameters of(final ReadDataParams params) {
+ public static @NonNull QueryParameters of(final DataGetParams params) {
return new QueryParameters(params, null, null);
}
- public static @NonNull QueryParameters ofFields(final ReadDataParams params, final List<Set<QName>> fields) {
+ public static @NonNull QueryParameters ofFields(final DataGetParams params, final List<Set<QName>> fields) {
return new QueryParameters(params, fields, null);
}
- public static @NonNull QueryParameters ofFieldPaths(final ReadDataParams params,
+ public static @NonNull QueryParameters ofFieldPaths(final DataGetParams params,
final List<YangInstanceIdentifier> fieldPaths) {
return new QueryParameters(params, null, fieldPaths);
}
- public @NonNull ReadDataParams params() {
- return params;
- }
-
public @Nullable DepthParam depth() {
- return params.depth();
+ return dataGetParams.depth();
}
public @Nullable PrettyPrintParam prettyPrint() {
- return params.prettyPrint();
+ return dataGetParams.prettyPrint();
}
public @Nullable List<Set<QName>> fields() {
* 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.nb.rfc8040;
+package org.opendaylight.restconf.server.api;
import static java.util.Objects.requireNonNull;
import org.opendaylight.yangtools.concepts.Immutable;
/**
- * Parser and holder of query parameters from uriInfo for data and datastore read operations.
+ * Supported query parameters of {@code /data} {@code GET} HTTP operation, as defined in
+ * <a href="https://www.rfc-editor.org/rfc/rfc8040#section-4.3">RFC8040 section 4.3</a>.
*/
-public record ReadDataParams(
+public record DataGetParams(
@NonNull ContentParam content,
@Nullable DepthParam depth,
@Nullable FieldsParam fields,
@Nullable WithDefaultsParam withDefaults,
@Nullable PrettyPrintParam prettyPrint) implements Immutable {
- private static final @NonNull ReadDataParams EMPTY =
- new ReadDataParams(ContentParam.ALL, null, null, null, null);
+ private static final @NonNull DataGetParams EMPTY =
+ new DataGetParams(ContentParam.ALL, null, null, null, null);
- public ReadDataParams {
+ public DataGetParams {
requireNonNull(content);
}
- public static @NonNull ReadDataParams empty() {
+ public static @NonNull DataGetParams empty() {
return EMPTY;
}
}
import org.opendaylight.restconf.api.ApiPath;
import org.opendaylight.restconf.common.errors.RestconfFuture;
import org.opendaylight.restconf.common.patch.PatchStatusContext;
-import org.opendaylight.restconf.nb.rfc8040.ReadDataParams;
import org.opendaylight.restconf.nb.rfc8040.databind.ChildBody;
import org.opendaylight.restconf.nb.rfc8040.databind.DataPostBody;
import org.opendaylight.restconf.nb.rfc8040.databind.OperationInputBody;
/**
* Return the content of the datastore.
*
- * @param readParams {@link ReadDataParams} for this request
+ * @param params {@link DataGetParams} for this request
* @return A {@link RestconfFuture} of the {@link NormalizedNodePayload} content
*/
- RestconfFuture<NormalizedNodePayload> dataGET(ReadDataParams readParams);
+ RestconfFuture<NormalizedNodePayload> dataGET(DataGetParams params);
/**
* Return the content of a data resource.
*
* @param identifier resource identifier
- * @param readParams {@link ReadDataParams} for this request
+ * @param params {@link DataGetParams} for this request
* @return A {@link RestconfFuture} of the {@link NormalizedNodePayload} content
*/
- RestconfFuture<NormalizedNodePayload> dataGET(ApiPath identifier, ReadDataParams readParams);
+ RestconfFuture<NormalizedNodePayload> dataGET(ApiPath identifier, DataGetParams params);
/**
* Partially modify the target data resource, as defined in
import org.opendaylight.restconf.common.patch.PatchContext;
import org.opendaylight.restconf.common.patch.PatchStatusContext;
import org.opendaylight.restconf.nb.rfc8040.Insert;
-import org.opendaylight.restconf.nb.rfc8040.ReadDataParams;
import org.opendaylight.restconf.nb.rfc8040.databind.ChildBody;
import org.opendaylight.restconf.nb.rfc8040.databind.DataPostBody;
import org.opendaylight.restconf.nb.rfc8040.databind.OperationInputBody;
import org.opendaylight.restconf.nb.rfc8040.rests.transactions.RestconfStrategy;
import org.opendaylight.restconf.nb.rfc8040.utils.parser.NetconfFieldsTranslator;
import org.opendaylight.restconf.nb.rfc8040.utils.parser.WriterFieldsTranslator;
+import org.opendaylight.restconf.server.api.DataGetParams;
import org.opendaylight.restconf.server.api.DataPatchPath;
import org.opendaylight.restconf.server.api.DataPostPath;
import org.opendaylight.restconf.server.api.DataPostResult;
}
@Override
- public RestconfFuture<NormalizedNodePayload> dataGET(final ReadDataParams readParams) {
- return readData(bindRequestRoot(), readParams);
+ public RestconfFuture<NormalizedNodePayload> dataGET(final DataGetParams params) {
+ return readData(bindRequestRoot(), params);
}
@Override
- public RestconfFuture<NormalizedNodePayload> dataGET(final ApiPath identifier, final ReadDataParams readParams) {
- return readData(bindRequestPath(identifier), readParams);
+ public RestconfFuture<NormalizedNodePayload> dataGET(final ApiPath identifier, final DataGetParams params) {
+ return readData(bindRequestPath(identifier), params);
}
private @NonNull RestconfFuture<NormalizedNodePayload> readData(final InstanceIdentifierContext reqPath,
- final ReadDataParams readParams) {
- final var fields = readParams.fields();
+ final DataGetParams params) {
+ final var fields = params.fields();
final QueryParameters queryParams;
if (fields != null) {
final var modelContext = reqPath.databind().modelContext();
final var schemaNode = (DataSchemaNode) reqPath.getSchemaNode();
if (reqPath.getMountPoint() != null) {
- queryParams = QueryParameters.ofFieldPaths(readParams, NetconfFieldsTranslator.translate(modelContext,
+ queryParams = QueryParameters.ofFieldPaths(params, NetconfFieldsTranslator.translate(modelContext,
schemaNode, fields));
} else {
- queryParams = QueryParameters.ofFields(readParams, WriterFieldsTranslator.translate(modelContext,
+ queryParams = QueryParameters.ofFields(params, WriterFieldsTranslator.translate(modelContext,
schemaNode, fields));
}
} else {
- queryParams = QueryParameters.of(readParams);
+ queryParams = QueryParameters.of(params);
}
final var fieldPaths = queryParams.fieldPaths();
final var strategy = getRestconfStrategy(reqPath.databind(), reqPath.getMountPoint());
final NormalizedNode node;
if (fieldPaths != null && !fieldPaths.isEmpty()) {
- node = strategy.readData(readParams.content(), reqPath.getInstanceIdentifier(), readParams.withDefaults(),
+ node = strategy.readData(params.content(), reqPath.getInstanceIdentifier(), params.withDefaults(),
fieldPaths);
} else {
- node = strategy.readData(readParams.content(), reqPath.getInstanceIdentifier(), readParams.withDefaults());
+ node = strategy.readData(params.content(), reqPath.getInstanceIdentifier(), params.withDefaults());
}
if (node == null) {
return RestconfFuture.failed(new RestconfDocumentedException(
public void checkParametersTypesNegativeTest() {
final var mockDatabind = DatabindContext.ofModel(mock(EffectiveModelContext.class));
assertInvalidIAE(ReceiveEventsParams::ofQueryParameters);
- assertUnknownParam(QueryParams::newReadDataParams);
+ assertUnknownParam(QueryParams::newDataGetParams);
assertInvalidIAE(queryParams -> Insert.ofQueryParameters(mockDatabind, queryParams));
assertInvalidIAE(ReceiveEventsParams::ofQueryParameters, ContentParam.ALL);
- assertInvalidParam(QueryParams::newReadDataParams, InsertParam.LAST);
+ assertInvalidParam(QueryParams::newDataGetParams, InsertParam.LAST);
assertInvalidIAE(queryParams -> Insert.ofQueryParameters(mockDatabind, queryParams), ContentParam.ALL);
}
@Test
public void parseUriParametersDefaultTest() {
// no parameters, default values should be used
- final var params = assertParams(QueryParams::newReadDataParams, new MultivaluedHashMap<>());
+ final var params = assertParams(QueryParams::newDataGetParams, new MultivaluedHashMap<>());
assertEquals(ContentParam.ALL, params.content());
assertNull(params.depth());
assertNull(params.fields());
@Test
public void testInvalidValueReadDataParams() {
- assertInvalidValue(QueryParams::newReadDataParams, ContentParam.uriName);
- assertInvalidValue(QueryParams::newReadDataParams, DepthParam.uriName);
- assertInvalidValue(QueryParams::newReadDataParams, WithDefaultsParam.uriName);
+ assertInvalidValue(QueryParams::newDataGetParams, ContentParam.uriName);
+ assertInvalidValue(QueryParams::newDataGetParams, DepthParam.uriName);
+ assertInvalidValue(QueryParams::newDataGetParams, WithDefaultsParam.uriName);
// inserted value is too high
- assertInvalidValue(QueryParams::newReadDataParams, DepthParam.uriName, "65536");
+ assertInvalidValue(QueryParams::newDataGetParams, DepthParam.uriName, "65536");
// inserted value is too low
- assertInvalidValue(QueryParams::newReadDataParams, DepthParam.uriName, "0");
+ assertInvalidValue(QueryParams::newDataGetParams, DepthParam.uriName, "0");
}
/**
*/
@Test
public void parseUriParametersWithDefaultAndTaggedTest() {
- final var params = assertParams(QueryParams::newReadDataParams, WithDefaultsParam.uriName, "report-all-tagged");
+ final var params = assertParams(QueryParams::newDataGetParams, WithDefaultsParam.uriName, "report-all-tagged");
assertEquals(WithDefaultsParam.REPORT_ALL_TAGGED, params.withDefaults());
}
*/
@Test
public void parseUriParametersWithDefaultAndReportAllTest() {
- final var params = assertParams(QueryParams::newReadDataParams, WithDefaultsParam.uriName, "report-all");
+ final var params = assertParams(QueryParams::newDataGetParams, WithDefaultsParam.uriName, "report-all");
assertEquals(WithDefaultsParam.REPORT_ALL, params.withDefaults());
}
*/
@Test
public void parseUriParametersWithDefaultAndNonTaggedTest() {
- final var params = assertParams(QueryParams::newReadDataParams, WithDefaultsParam.uriName, "explicit");
+ final var params = assertParams(QueryParams::newDataGetParams, WithDefaultsParam.uriName, "explicit");
assertEquals(WithDefaultsParam.EXPLICIT, params.withDefaults());
}
parameters.putSingle("depth", "10");
parameters.putSingle("fields", "container-child");
- final var params = assertParams(QueryParams::newReadDataParams, parameters);
+ final var params = assertParams(QueryParams::newDataGetParams, parameters);
// content
assertEquals(ContentParam.CONFIG, params.content());