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.LinkedHashMap;
16 import java.util.LinkedHashSet;
17 import java.util.List;
19 import java.util.Optional;
21 import java.util.function.Function;
22 import java.util.stream.Collectors;
23 import javax.ws.rs.core.UriInfo;
24 import org.eclipse.jdt.annotation.NonNull;
25 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
26 import org.opendaylight.yangtools.yang.common.Revision;
27 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
28 import org.opendaylight.yangtools.yang.model.api.Module;
30 public abstract class BaseYangOpenApiGenerator {
31 private static final String CONTROLLER_RESOURCE_NAME = "Controller";
32 public static final List<Map<String, List<String>>> SECURITY = List.of(Map.of("basicAuth", List.of()));
34 private final DOMSchemaService schemaService;
36 protected BaseYangOpenApiGenerator(final @NonNull DOMSchemaService schemaService) {
37 this.schemaService = requireNonNull(schemaService);
40 public OpenApiInputStream getControllerModulesDoc(final UriInfo uriInfo) throws IOException {
41 final var modelContext = requireNonNull(schemaService.getGlobalContext());
42 final var schema = createSchemaFromUriInfo(uriInfo);
43 final var host = createHostFromUriInfo(uriInfo);
44 final var title = "Controller modules of RESTCONF";
45 final var url = schema + "://" + host + "/";
46 final var basePath = getBasePath();
47 final var modules = getModulesWithoutDuplications(modelContext);
48 return new OpenApiInputStream(modelContext, title, url, SECURITY, CONTROLLER_RESOURCE_NAME, "",false, true,
52 public OpenApiInputStream getApiDeclaration(final String module, final String revision, final UriInfo uriInfo)
54 final var modelContext = schemaService.getGlobalContext();
55 Preconditions.checkState(modelContext != null);
56 return getApiDeclaration(module, revision, uriInfo, modelContext, "", CONTROLLER_RESOURCE_NAME);
59 public OpenApiInputStream getApiDeclaration(final String moduleName, final String revision, final UriInfo uriInfo,
60 final EffectiveModelContext modelContext, final String urlPrefix, final @NonNull String deviceName)
62 final Optional<Revision> rev;
65 rev = Revision.ofNullable(revision);
66 } catch (final DateTimeParseException e) {
67 throw new IllegalArgumentException(e);
70 final var module = modelContext.findModule(moduleName, rev).orElse(null);
71 Preconditions.checkArgument(module != null,
72 "Could not find module by name,revision: " + moduleName + "," + revision);
74 final var schema = createSchemaFromUriInfo(uriInfo);
75 final var host = createHostFromUriInfo(uriInfo);
76 final var title = module.getName();
77 final var url = schema + "://" + host + "/";
78 final var basePath = getBasePath();
79 final var modules = List.of(module);
80 return new OpenApiInputStream(modelContext, title, url, SECURITY, deviceName, urlPrefix, true, false,
84 public String createHostFromUriInfo(final UriInfo uriInfo) {
86 final int port = uriInfo.getBaseUri().getPort();
88 portPart = ":" + port;
90 return uriInfo.getBaseUri().getHost() + portPart;
93 public String createSchemaFromUriInfo(final UriInfo uriInfo) {
94 return uriInfo.getBaseUri().getScheme();
97 public abstract String getBasePath();
99 public static Set<Module> getModulesWithoutDuplications(final @NonNull EffectiveModelContext modelContext) {
100 return new LinkedHashSet<>(modelContext.getModules()
102 .collect(Collectors.toMap(
105 (module1, module2) -> Revision.compare(
106 module1.getRevision(), module2.getRevision()) > 0 ? module1 : module2,