OpenAPI: netopeer2 wrong schemas for actions
[netconf.git] / restconf / restconf-openapi / src / main / java / org / opendaylight / restconf / openapi / impl / BaseYangOpenApiGenerator.java
1 /*
2  * Copyright (c) 2014 Brocade Communications Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.restconf.openapi.impl;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.base.Preconditions;
13 import java.io.IOException;
14 import java.time.format.DateTimeParseException;
15 import java.util.List;
16 import java.util.Map;
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;
23
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()));
27
28     private final DOMSchemaService schemaService;
29
30     protected BaseYangOpenApiGenerator(final @NonNull DOMSchemaService schemaService) {
31         this.schemaService = requireNonNull(schemaService);
32     }
33
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,
43             modules, basePath);
44     }
45
46     public OpenApiInputStream getApiDeclaration(final String module, final String revision, final UriInfo uriInfo)
47             throws IOException {
48         final EffectiveModelContext schemaContext = schemaService.getGlobalContext();
49         Preconditions.checkState(schemaContext != null);
50         return getApiDeclaration(module, revision, uriInfo, schemaContext, "", CONTROLLER_RESOURCE_NAME);
51     }
52
53     public OpenApiInputStream getApiDeclaration(final String moduleName, final String revision, final UriInfo uriInfo,
54             final EffectiveModelContext schemaContext, final String urlPrefix, final @NonNull String deviceName)
55             throws IOException {
56         final Optional<Revision> rev;
57
58         try {
59             rev = Revision.ofNullable(revision);
60         } catch (final DateTimeParseException e) {
61             throw new IllegalArgumentException(e);
62         }
63
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);
67
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,
75             modules, basePath);
76     }
77
78     public String createHostFromUriInfo(final UriInfo uriInfo) {
79         String portPart = "";
80         final int port = uriInfo.getBaseUri().getPort();
81         if (port != -1) {
82             portPart = ":" + port;
83         }
84         return uriInfo.getBaseUri().getHost() + portPart;
85     }
86
87     public String createSchemaFromUriInfo(final UriInfo uriInfo) {
88         return uriInfo.getBaseUri().getScheme();
89     }
90
91     public abstract String getBasePath();
92 }