X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=restconf%2Fsal-rest-docgen%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetconf%2Fsal%2Frest%2Fdoc%2Fimpl%2FApiDocServiceImpl.java;h=377059638658c421454b4f34298b42b0cc8096bb;hb=f402dcd49a468e018192c96151bef3a0cdf70d62;hp=dba66b416e82badc1f7084f8446e57a0e51432bf;hpb=15047776c449b6043e85047466c2215ed31036f1;p=netconf.git diff --git a/restconf/sal-rest-docgen/src/main/java/org/opendaylight/netconf/sal/rest/doc/impl/ApiDocServiceImpl.java b/restconf/sal-rest-docgen/src/main/java/org/opendaylight/netconf/sal/rest/doc/impl/ApiDocServiceImpl.java index dba66b416e..3770596386 100644 --- a/restconf/sal-rest-docgen/src/main/java/org/opendaylight/netconf/sal/rest/doc/impl/ApiDocServiceImpl.java +++ b/restconf/sal-rest-docgen/src/main/java/org/opendaylight/netconf/sal/rest/doc/impl/ApiDocServiceImpl.java @@ -7,24 +7,25 @@ */ package org.opendaylight.netconf.sal.rest.doc.impl; -import java.io.ByteArrayOutputStream; -import java.io.OutputStreamWriter; -import java.util.Map.Entry; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; -import org.json.JSONWriter; import org.opendaylight.netconf.sal.rest.doc.api.ApiDocService; import org.opendaylight.netconf.sal.rest.doc.mountpoints.MountPointSwagger; import org.opendaylight.netconf.sal.rest.doc.swagger.ApiDeclaration; +import org.opendaylight.netconf.sal.rest.doc.swagger.MountPointInstance; import org.opendaylight.netconf.sal.rest.doc.swagger.ResourceList; /** - * This service generates swagger (See https://helloreverb.com/developers/swagger) compliant documentation for * RESTCONF APIs. The output of this is used by embedded Swagger UI. * - *

NOTE: These API's need to be synchronized due to bug 1198. Thread access to + *

+ * NOTE: These API's need to be synchronized due to bug 1198. Thread access to * the SchemaContext is not synchronized properly and thus you can end up with * missing definitions without this synchronization. There are likely otherways * to work around this limitation, but given that this API is a dev only tool @@ -32,10 +33,27 @@ import org.opendaylight.netconf.sal.rest.doc.swagger.ResourceList; */ public class ApiDocServiceImpl implements ApiDocService { - private static final ApiDocService INSTANCE = new ApiDocServiceImpl(); + public static final int DEFAULT_PAGESIZE = 20; + // Query parameter + private static final String TOTAL_PAGES = "totalPages"; + private static final String PAGE_NUM = "pageNum"; - public static ApiDocService getInstance() { - return INSTANCE; + public enum URIType { RFC8040, DRAFT02 } + + private final MountPointSwagger mountPointSwaggerDraft02; + private final MountPointSwagger mountPointSwaggerRFC8040; + private final ApiDocGeneratorDraftO2 apiDocGeneratorDraft02; + private final ApiDocGeneratorRFC8040 apiDocGeneratorRFC8040; + + public ApiDocServiceImpl(MountPointSwaggerGeneratorDraft02 mountPointSwaggerGeneratorDraft02, + MountPointSwaggerGeneratorRFC8040 mountPointSwaggerGeneratorRFC8040, + ApiDocGeneratorDraftO2 apiDocGeneratorDraft02, ApiDocGeneratorRFC8040 apiDocGeneratorRFC8040) { + this.mountPointSwaggerDraft02 = + Objects.requireNonNull(mountPointSwaggerGeneratorDraft02).getMountPointSwagger(); + this.mountPointSwaggerRFC8040 = + Objects.requireNonNull(mountPointSwaggerGeneratorRFC8040).getMountPointSwagger(); + this.apiDocGeneratorDraft02 = Objects.requireNonNull(apiDocGeneratorDraft02); + this.apiDocGeneratorRFC8040 = Objects.requireNonNull(apiDocGeneratorRFC8040); } /** @@ -45,8 +63,12 @@ public class ApiDocServiceImpl implements ApiDocService { */ @Override public synchronized Response getRootDoc(final UriInfo uriInfo) { - final ApiDocGenerator generator = ApiDocGenerator.getInstance(); - final ResourceList rootDoc = generator.getResourceListing(uriInfo); + final ResourceList rootDoc; + if (isNew(uriInfo).equals(URIType.RFC8040)) { + rootDoc = apiDocGeneratorRFC8040.getResourceListing(uriInfo, URIType.RFC8040); + } else { + rootDoc = apiDocGeneratorDraft02.getResourceListing(uriInfo, URIType.DRAFT02); + } return Response.ok(rootDoc).build(); } @@ -56,9 +78,13 @@ public class ApiDocServiceImpl implements ApiDocService { */ @Override public synchronized Response getDocByModule(final String module, final String revision, final UriInfo uriInfo) { - final ApiDocGenerator generator = ApiDocGenerator.getInstance(); + final ApiDeclaration doc; + if (isNew(uriInfo).equals(URIType.RFC8040)) { + doc = apiDocGeneratorRFC8040.getApiDeclaration(module, revision, uriInfo, URIType.RFC8040); + } else { + doc = apiDocGeneratorDraft02.getApiDeclaration(module, revision, uriInfo, URIType.DRAFT02); + } - final ApiDeclaration doc = generator.getApiDeclaration(module, revision, uriInfo); return Response.ok(doc).build(); } @@ -67,44 +93,70 @@ public class ApiDocServiceImpl implements ApiDocService { */ @Override public synchronized Response getApiExplorer(final UriInfo uriInfo) { - return Response - .seeOther(uriInfo.getBaseUriBuilder().path("../explorer/index.html").build()) - .build(); + return Response.seeOther(uriInfo.getBaseUriBuilder().path("../explorer/index.html").build()).build(); } @Override public synchronized Response getListOfMounts(final UriInfo uriInfo) { - final ByteArrayOutputStream baos = new ByteArrayOutputStream(); - try (OutputStreamWriter streamWriter = new OutputStreamWriter(baos)) { - final JSONWriter writer = new JSONWriter(streamWriter); - writer.array(); - for (final Entry entry : MountPointSwagger.getInstance() - .getInstanceIdentifiers().entrySet()) { - writer.object(); - writer.key("instance").value(entry.getKey()); - writer.key("id").value(entry.getValue()); - writer.endObject(); - } - writer.endArray(); - } catch (final Exception e) { - return Response.status(500).entity(e.getMessage()).build(); + final MountPointSwagger mountPointSwagger; + if (isNew(uriInfo).equals(URIType.RFC8040)) { + mountPointSwagger = mountPointSwaggerRFC8040; + } else { + mountPointSwagger = mountPointSwaggerDraft02; } - return Response.status(200).entity(baos.toString()).build(); + final List entity = mountPointSwagger + .getInstanceIdentifiers().entrySet().stream() + .map(MountPointInstance::new).collect(Collectors.toList()); + return Response.ok(entity).build(); } @Override public synchronized Response getMountRootDoc(final String instanceNum, final UriInfo uriInfo) { - final ResourceList resourceList = MountPointSwagger.getInstance().getResourceList(uriInfo, - Long.parseLong(instanceNum)); + final ResourceList resourceList; + + if (uriInfo.getQueryParameters().getFirst(TOTAL_PAGES) != null) { + if (isNew(uriInfo).equals(URIType.RFC8040)) { + resourceList = mountPointSwaggerRFC8040.getResourceList(uriInfo, Long.parseLong(instanceNum), + URIType.RFC8040); + } else { + resourceList = mountPointSwaggerDraft02.getResourceList(uriInfo, Long.parseLong(instanceNum), + URIType.DRAFT02); + } + int size = resourceList.getApis().size(); + return Response.ok(size % DEFAULT_PAGESIZE == 0 ? size / DEFAULT_PAGESIZE + : size / DEFAULT_PAGESIZE + 1).build(); + } + + final int pageNum = Integer.parseInt(uriInfo.getQueryParameters().getFirst(PAGE_NUM)); + + if (isNew(uriInfo).equals(URIType.RFC8040)) { + resourceList = mountPointSwaggerRFC8040.getResourceList(uriInfo, Long.parseLong(instanceNum), pageNum, + false, URIType.RFC8040); + } else { + resourceList = mountPointSwaggerDraft02.getResourceList(uriInfo, Long.parseLong(instanceNum), pageNum, + false, URIType.DRAFT02); + } return Response.ok(resourceList).build(); } @Override public synchronized Response getMountDocByModule(final String instanceNum, final String module, - final String revision, final UriInfo uriInfo) { - final ApiDeclaration api = MountPointSwagger.getInstance().getMountPointApi(uriInfo, - Long.parseLong(instanceNum), module, revision); + final String revision, final UriInfo uriInfo) { + final ApiDeclaration api; + if (isNew(uriInfo).equals(URIType.RFC8040)) { + api = mountPointSwaggerRFC8040 + .getMountPointApi(uriInfo, Long.parseLong(instanceNum), module, revision, URIType.RFC8040); + } else { + api = mountPointSwaggerDraft02 + .getMountPointApi(uriInfo, Long.parseLong(instanceNum), module, revision, URIType.DRAFT02); + } return Response.ok(api).build(); } + private static URIType isNew(final UriInfo uriInfo) { + if (uriInfo.getBaseUri().toString().contains("/18/")) { + return URIType.RFC8040; + } + return URIType.DRAFT02; + } }