2 * Copyright (c) 2014 Brocade Communications Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.restconf.openapi.impl;
10 import static java.util.Objects.requireNonNull;
12 import com.google.common.base.Preconditions;
13 import java.io.IOException;
14 import java.time.format.DateTimeParseException;
15 import java.util.List;
17 import java.util.Optional;
18 import javax.ws.rs.core.UriInfo;
19 import org.eclipse.jdt.annotation.NonNull;
20 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
21 import org.opendaylight.yangtools.yang.common.Revision;
22 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
24 public abstract class BaseYangOpenApiGenerator {
25 private static final String CONTROLLER_RESOURCE_NAME = "Controller";
26 public static final List<Map<String, List<String>>> SECURITY = List.of(Map.of("basicAuth", List.of()));
28 private final DOMSchemaService schemaService;
30 protected BaseYangOpenApiGenerator(final @NonNull DOMSchemaService schemaService) {
31 this.schemaService = requireNonNull(schemaService);
34 public OpenApiInputStream getControllerModulesDoc(final UriInfo uriInfo) throws IOException {
35 final var context = requireNonNull(schemaService.getGlobalContext());
36 final var schema = createSchemaFromUriInfo(uriInfo);
37 final var host = createHostFromUriInfo(uriInfo);
38 final var title = "Controller modules of RESTCONF";
39 final var url = schema + "://" + host + "/";
40 final var basePath = getBasePath();
41 final var modules = context.getModules();
42 return new OpenApiInputStream(context, title, url, SECURITY, CONTROLLER_RESOURCE_NAME, "",false, false,
46 public OpenApiInputStream getApiDeclaration(final String module, final String revision, final UriInfo uriInfo)
48 final EffectiveModelContext schemaContext = schemaService.getGlobalContext();
49 Preconditions.checkState(schemaContext != null);
50 return getApiDeclaration(module, revision, uriInfo, schemaContext, "", CONTROLLER_RESOURCE_NAME);
53 public OpenApiInputStream getApiDeclaration(final String moduleName, final String revision, final UriInfo uriInfo,
54 final EffectiveModelContext schemaContext, final String urlPrefix, final @NonNull String deviceName)
56 final Optional<Revision> rev;
59 rev = Revision.ofNullable(revision);
60 } catch (final DateTimeParseException e) {
61 throw new IllegalArgumentException(e);
64 final var module = schemaContext.findModule(moduleName, rev).orElse(null);
65 Preconditions.checkArgument(module != null,
66 "Could not find module by name,revision: " + moduleName + "," + revision);
68 final var schema = createSchemaFromUriInfo(uriInfo);
69 final var host = createHostFromUriInfo(uriInfo);
70 final var title = module.getName();
71 final var url = schema + "://" + host + "/";
72 final var basePath = getBasePath();
73 final var modules = List.of(module);
74 return new OpenApiInputStream(schemaContext, title, url, SECURITY, deviceName, urlPrefix, true, false,
78 public String createHostFromUriInfo(final UriInfo uriInfo) {
80 final int port = uriInfo.getBaseUri().getPort();
82 portPart = ":" + port;
84 return uriInfo.getBaseUri().getHost() + portPart;
87 public String createSchemaFromUriInfo(final UriInfo uriInfo) {
88 return uriInfo.getBaseUri().getScheme();
91 public abstract String getBasePath();