Adapt API to OpenApiObject removal
[netconf.git] / restconf / restconf-openapi / src / main / java / org / opendaylight / restconf / openapi / mountpoints / MountPointOpenApi.java
index 2da154bae6cc06a0533062918bdfe6580f9ed8c9..dd6d5649f6d5e2531414808e80bb00ec14e6a8d3 100644 (file)
@@ -9,42 +9,22 @@ package org.opendaylight.restconf.openapi.mountpoints;
 
 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;
@@ -159,24 +139,25 @@ public class MountPointOpenApi implements DOMMountPointListener, AutoCloseable {
             .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);
@@ -185,42 +166,22 @@ public class MountPointOpenApi implements DOMMountPointListener, AutoCloseable {
         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) {
@@ -228,43 +189,14 @@ public class MountPointOpenApi implements DOMMountPointListener, AutoCloseable {
                 .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