OpenApi add POST request to device root
[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.LinkedHashMap;
16 import java.util.LinkedHashSet;
17 import java.util.List;
18 import java.util.Map;
19 import java.util.Optional;
20 import java.util.Set;
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;
29
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()));
33
34     private final DOMSchemaService schemaService;
35
36     protected BaseYangOpenApiGenerator(final @NonNull DOMSchemaService schemaService) {
37         this.schemaService = requireNonNull(schemaService);
38     }
39
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,
49             modules, basePath);
50     }
51
52     public OpenApiInputStream getApiDeclaration(final String module, final String revision, final UriInfo uriInfo)
53             throws IOException {
54         final var modelContext = schemaService.getGlobalContext();
55         Preconditions.checkState(modelContext != null);
56         return getApiDeclaration(module, revision, uriInfo, modelContext, "", CONTROLLER_RESOURCE_NAME);
57     }
58
59     public OpenApiInputStream getApiDeclaration(final String moduleName, final String revision, final UriInfo uriInfo,
60             final EffectiveModelContext modelContext, final String urlPrefix, final @NonNull String deviceName)
61             throws IOException {
62         final Optional<Revision> rev;
63
64         try {
65             rev = Revision.ofNullable(revision);
66         } catch (final DateTimeParseException e) {
67             throw new IllegalArgumentException(e);
68         }
69
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);
73
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,
81             modules, basePath);
82     }
83
84     public String createHostFromUriInfo(final UriInfo uriInfo) {
85         String portPart = "";
86         final int port = uriInfo.getBaseUri().getPort();
87         if (port != -1) {
88             portPart = ":" + port;
89         }
90         return uriInfo.getBaseUri().getHost() + portPart;
91     }
92
93     public String createSchemaFromUriInfo(final UriInfo uriInfo) {
94         return uriInfo.getBaseUri().getScheme();
95     }
96
97     public abstract String getBasePath();
98
99     public static Set<Module> getModulesWithoutDuplications(final @NonNull EffectiveModelContext modelContext) {
100         return new LinkedHashSet<>(modelContext.getModules()
101             .stream()
102             .collect(Collectors.toMap(
103                 Module::getName,
104                 Function.identity(),
105                 (module1, module2) -> Revision.compare(
106                     module1.getRevision(), module2.getRevision()) > 0 ? module1 : module2,
107                 LinkedHashMap::new))
108             .values());
109     }
110 }