import static com.google.common.base.Preconditions.checkState;
import static java.util.Objects.requireNonNull;
-import static org.opendaylight.restconf.openapi.impl.BaseYangOpenApiGenerator.API_VERSION;
import static org.opendaylight.restconf.openapi.impl.BaseYangOpenApiGenerator.BASE_PATH;
-import static org.opendaylight.restconf.openapi.impl.BaseYangOpenApiGenerator.BASIC_AUTH_NAME;
-import static org.opendaylight.restconf.openapi.impl.BaseYangOpenApiGenerator.DESCRIPTION;
-import static org.opendaylight.restconf.openapi.impl.BaseYangOpenApiGenerator.OPEN_API_BASIC_AUTH;
-import static org.opendaylight.restconf.openapi.impl.BaseYangOpenApiGenerator.OPEN_API_VERSION;
import static org.opendaylight.restconf.openapi.impl.BaseYangOpenApiGenerator.SECURITY;
-import static org.opendaylight.restconf.openapi.impl.BaseYangOpenApiGenerator.filterByRange;
-import static org.opendaylight.restconf.openapi.impl.BaseYangOpenApiGenerator.getSortedModules;
-import static org.opendaylight.restconf.openapi.impl.OpenApiServiceImpl.DEFAULT_PAGESIZE;
-import static org.opendaylight.restconf.openapi.model.builder.OperationBuilder.SUMMARY_TEMPLATE;
-import com.google.common.collect.Range;
+import java.io.IOException;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import java.util.concurrent.atomic.AtomicLong;
-import javax.ws.rs.HttpMethod;
-import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.mdsal.dom.api.DOMMountPointListener;
import org.opendaylight.mdsal.dom.api.DOMMountPointService;
import org.opendaylight.mdsal.dom.api.DOMSchemaService;
import org.opendaylight.restconf.openapi.impl.BaseYangOpenApiGenerator;
-import org.opendaylight.restconf.openapi.impl.DefinitionNames;
-import org.opendaylight.restconf.openapi.model.Components;
-import org.opendaylight.restconf.openapi.model.Info;
-import org.opendaylight.restconf.openapi.model.OpenApiObject;
-import org.opendaylight.restconf.openapi.model.Operation;
-import org.opendaylight.restconf.openapi.model.Path;
-import org.opendaylight.restconf.openapi.model.ResponseObject;
-import org.opendaylight.restconf.openapi.model.Schema;
-import org.opendaylight.restconf.openapi.model.Server;
+import org.opendaylight.restconf.openapi.impl.OpenApiInputStream;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
.orElse(null);
}
- public OpenApiObject getMountPointApi(final UriInfo uriInfo, final Long id, final String module,
- final String revision) {
+ public OpenApiInputStream getMountPointApi(final UriInfo uriInfo, final Long id, final String module,
+ final String revision) throws IOException {
final YangInstanceIdentifier iid = getInstanceId(id);
final EffectiveModelContext context = getSchemaContext(iid);
final String urlPrefix = getYangMountUrl(iid);
- final String deviceName = extractDeviceName(iid);
+ final String deviceName = extractDeviceName(iid);
if (context == null) {
return null;
}
if (DATASTORES_LABEL.equals(module) && DATASTORES_REVISION.equals(revision)) {
- return generateDataStoreOpenApi(uriInfo, urlPrefix, deviceName);
+ return generateDataStoreOpenApi(context, uriInfo, urlPrefix, deviceName);
}
return openApiGenerator.getApiDeclaration(module, revision, uriInfo, context, urlPrefix, deviceName);
}
- public OpenApiObject getMountPointApi(final UriInfo uriInfo, final Long id, final @Nullable String strPageNum) {
+ public OpenApiInputStream getMountPointApi(final UriInfo uriInfo, final Long id, final @Nullable String strPageNum)
+ throws IOException {
final var iid = getInstanceId(id);
final var context = getSchemaContext(iid);
final var urlPrefix = getYangMountUrl(iid);
if (context == null) {
return null;
}
- final var definitionNames = new DefinitionNames();
boolean includeDataStore = true;
- Range<Integer> range = Range.all();
if (strPageNum != null) {
final var pageNum = Integer.parseInt(strPageNum);
- final var end = DEFAULT_PAGESIZE * pageNum - 1;
- int start = end - DEFAULT_PAGESIZE;
- if (pageNum == 1) {
- start++;
- } else {
+ if (pageNum != 1) {
includeDataStore = false;
}
- range = Range.closed(start, end);
}
final var schema = openApiGenerator.createSchemaFromUriInfo(uriInfo);
final var host = openApiGenerator.createHostFromUriInfo(uriInfo);
final var title = deviceName + " modules of RESTCONF";
- final var info = new Info(API_VERSION, title, DESCRIPTION);
- final var servers = List.of(new Server(schema + "://" + host + BASE_PATH));
-
- final var modules = getSortedModules(context);
- final var filteredModules = filterByRange(modules, range);
- final var paths = new HashMap<String, Path>();
- final var schemas = new HashMap<String, Schema>();
- for (final var module : filteredModules) {
- LOG.debug("Working on [{},{}]...", module.getName(), module.getQNameModule().getRevision().orElse(null));
- schemas.putAll(openApiGenerator.getSchemas(module, context, definitionNames, false));
- paths.putAll(openApiGenerator.getPaths(module, urlPrefix, deviceName, context, definitionNames, false));
- }
- final var components = new Components(schemas, Map.of(BASIC_AUTH_NAME, OPEN_API_BASIC_AUTH));
- if (includeDataStore) {
- paths.putAll(getDataStoreApiPaths(urlPrefix, deviceName));
- }
- return new OpenApiObject(OPEN_API_VERSION, info, servers, paths, components, SECURITY);
+ final var url = schema + "://" + host + BASE_PATH;
+ final var modules = context.getModules();
+ return new OpenApiInputStream(context, title, url, SECURITY, deviceName, urlPrefix, false, includeDataStore,
+ modules);
}
private static String extractDeviceName(final YangInstanceIdentifier iid) {
.values().getElement().toString();
}
- private OpenApiObject generateDataStoreOpenApi(final UriInfo uriInfo, final String context,
- final String deviceName) {
- final var info = new Info(API_VERSION, context, DESCRIPTION);
+ private OpenApiInputStream generateDataStoreOpenApi(EffectiveModelContext modelContext,
+ final UriInfo uriInfo, final String urlPrefix, final String deviceName) throws IOException {
final var schema = openApiGenerator.createSchemaFromUriInfo(uriInfo);
final var host = openApiGenerator.createHostFromUriInfo(uriInfo);
- final var servers = List.of(new Server(schema + "://" + host + BASE_PATH));
- final var components = new Components(new HashMap<>(), Map.of(BASIC_AUTH_NAME, OPEN_API_BASIC_AUTH));
- final var paths = getDataStoreApiPaths(context, deviceName);
- return new OpenApiObject(OPEN_API_VERSION, info, servers, paths, components, SECURITY);
- }
-
- private Map<String, Path> getDataStoreApiPaths(final String context, final String deviceName) {
- final var dataBuilder = new Path.Builder();
- dataBuilder.get(createGetPathItem("data",
- "Queries the config (startup) datastore on the mounted hosted.", deviceName));
-
- final var operationsBuilder = new Path.Builder();
- operationsBuilder.get(createGetPathItem("operations",
- "Queries the available operations (RPC calls) on the mounted hosted.", deviceName));
-
- return Map.of(openApiGenerator.getResourcePath("data", context), dataBuilder.build(),
- openApiGenerator.getResourcePath("operations", context), operationsBuilder.build());
- }
-
- private static Operation createGetPathItem(final String resourceType, final String description,
- final String deviceName) {
- final String summary = SUMMARY_TEMPLATE.formatted(HttpMethod.GET, deviceName, "datastore", resourceType);
- final List<String> tags = List.of(deviceName + " GET root");
- final ResponseObject okResponse = new ResponseObject.Builder()
- .description(Response.Status.OK.getReasonPhrase())
- .build();
- return new Operation.Builder()
- .tags(tags)
- .responses(Map.of(String.valueOf(Response.Status.OK.getStatusCode()), okResponse))
- .description(description)
- .summary(summary)
- .build();
+ final var url = schema + "://" + host + BASE_PATH;
+ final var modules = modelContext.getModules();
+ return new OpenApiInputStream(modelContext, urlPrefix, url, SECURITY, deviceName, urlPrefix, true, false,
+ modules);
}
@Override