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=c9726b0e10b1840a20dc74de5b14e1565f65deb4;hb=208f1cbfee1608e0343d09f351082968b9daa9cc;hp=dba66b416e82badc1f7084f8446e57a0e51432bf;hpb=56d25648bc38a480f7058669733210beb14613f7;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..c9726b0e10 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,27 @@ */ 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 +35,20 @@ import org.opendaylight.netconf.sal.rest.doc.swagger.ResourceList; */ public class ApiDocServiceImpl implements ApiDocService { - private static final ApiDocService INSTANCE = new ApiDocServiceImpl(); + private final MountPointSwagger mountPointSwaggerDraft02; + private final MountPointSwagger mountPointSwaggerRFC8040; + private final ApiDocGeneratorDraftO2 apiDocGeneratorDraft02; + private final ApiDocGeneratorRFC8040 apiDocGeneratorRFC8040; - public static ApiDocService getInstance() { - return INSTANCE; + 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 +58,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)) { + rootDoc = apiDocGeneratorRFC8040.getResourceListing(uriInfo); + } else { + rootDoc = apiDocGeneratorDraft02.getResourceListing(uriInfo); + } return Response.ok(rootDoc).build(); } @@ -56,9 +73,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)) { + doc = apiDocGeneratorRFC8040.getApiDeclaration(module, revision, uriInfo); + } else { + doc = apiDocGeneratorDraft02.getApiDeclaration(module, revision, uriInfo); + } - final ApiDeclaration doc = generator.getApiDeclaration(module, revision, uriInfo); return Response.ok(doc).build(); } @@ -67,44 +88,47 @@ 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)) { + 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 (isNew(uriInfo)) { + resourceList = mountPointSwaggerRFC8040.getResourceList(uriInfo, Long.parseLong(instanceNum)); + } else { + resourceList = mountPointSwaggerDraft02.getResourceList(uriInfo, Long.parseLong(instanceNum)); + } 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)) { + api = mountPointSwaggerRFC8040.getMountPointApi(uriInfo, Long.parseLong(instanceNum), module, revision); + } else { + api = mountPointSwaggerDraft02.getMountPointApi(uriInfo, Long.parseLong(instanceNum), module, revision); + } return Response.ok(api).build(); } + private static boolean isNew(final UriInfo uriInfo) { + return uriInfo.getBaseUri().toString().contains("/18/"); + } }