Skip to content

Commit 56344f2

Browse files
author
bnasslahsen
committed
Merge branch 'builder-customizer1' of https://github.com/ptahchiev/springdoc-openapi into ptahchiev-builder-customizer1
2 parents f8fef19 + 7b77925 commit 56344f2

File tree

4 files changed

+51
-17
lines changed

4 files changed

+51
-17
lines changed

springdoc-openapi-common/src/main/java/org/springdoc/api/AbstractOpenApiResource.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,7 @@ protected synchronized OpenAPI getOpenApi() {
114114
if (!computeDone || springDocConfigProperties.getCache().isDisabled()) {
115115
Instant start = Instant.now();
116116
openAPIBuilder.build();
117-
Map<String, Object> restControllersMap = openAPIBuilder.getRestControllersMap();
118-
Map<String, Object> requestMappingMap = openAPIBuilder.getRequestMappingMap();
119-
Map<String, Object> controllerMap = openAPIBuilder.getControllersMap();
120-
Map<String, Object> restControllers = Stream.of(restControllersMap, requestMappingMap, controllerMap)
121-
.flatMap(mapEl -> mapEl.entrySet().stream())
117+
Map<String, Object> mappingsMap = openAPIBuilder.getMappingsMap().entrySet().stream()
122118
.filter(controller -> (AnnotationUtils.findAnnotation(controller.getValue().getClass(),
123119
Hidden.class) == null))
124120
.filter(controller -> !isHiddenRestControllers(controller.getValue().getClass()))
@@ -128,7 +124,7 @@ protected synchronized OpenAPI getOpenApi() {
128124
// calculate generic responses
129125
responseBuilder.buildGenericResponse(openAPIBuilder.getComponents(), findControllerAdvice);
130126

131-
getPaths(restControllers);
127+
getPaths(mappingsMap);
132128
openApi = openAPIBuilder.getCalculatedOpenAPI();
133129

134130
// run the optional customisers

springdoc-openapi-common/src/main/java/org/springdoc/core/OpenAPIBuilder.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import org.slf4j.Logger;
5050
import org.slf4j.LoggerFactory;
5151

52+
import org.springdoc.core.customizers.OpenApiBuilderCustomiser;
5253
import org.springframework.beans.factory.config.BeanDefinition;
5354
import org.springframework.boot.autoconfigure.AutoConfigurationPackages;
5455
import org.springframework.context.ApplicationContext;
@@ -81,18 +82,24 @@ public class OpenAPIBuilder {
8182

8283
private final SecurityParser securityParser;
8384

85+
private final Map<String, Object> mappingsMap = new HashMap<>();
86+
8487
private final Map<HandlerMethod, io.swagger.v3.oas.models.tags.Tag> springdocTags = new HashMap<>();
8588

8689
private final Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider;
8790

91+
private final List<OpenApiBuilderCustomiser> openApiBuilderCustomisers;
92+
8893
private boolean isServersPresent;
8994

9095
private String serverBaseUrl;
9196

9297
private final SpringDocConfigProperties springDocConfigProperties;
9398

9499
@SuppressWarnings("WeakerAccess")
95-
OpenAPIBuilder(Optional<OpenAPI> openAPI, ApplicationContext context, SecurityParser securityParser, Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider, SpringDocConfigProperties springDocConfigProperties) {
100+
OpenAPIBuilder(Optional<OpenAPI> openAPI, ApplicationContext context, SecurityParser securityParser,
101+
Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider, SpringDocConfigProperties springDocConfigProperties,
102+
List<OpenApiBuilderCustomiser> openApiBuilderCustomisers) {
96103
if (openAPI.isPresent()) {
97104
this.openAPI = openAPI.get();
98105
if (this.openAPI.getComponents() == null)
@@ -106,6 +113,7 @@ public class OpenAPIBuilder {
106113
this.securityParser = securityParser;
107114
this.springSecurityOAuth2Provider = springSecurityOAuth2Provider;
108115
this.springDocConfigProperties = springDocConfigProperties;
116+
this.openApiBuilderCustomisers = openApiBuilderCustomisers;
109117
}
110118

111119
private static String splitCamelCase(String str) {
@@ -146,12 +154,18 @@ else if (calculatedOpenAPI.getInfo() == null) {
146154
Info infos = new Info().title(DEFAULT_TITLE).version(DEFAULT_VERSION);
147155
calculatedOpenAPI.setInfo(infos);
148156
}
157+
// Set default mappings
158+
this.mappingsMap.putAll(context.getBeansWithAnnotation(RestController.class));
159+
this.mappingsMap.putAll(context.getBeansWithAnnotation(RequestMapping.class));
160+
this.mappingsMap.putAll(context.getBeansWithAnnotation(Controller.class));
161+
149162
// default server value
150163
if (CollectionUtils.isEmpty(calculatedOpenAPI.getServers()) || !isServersPresent) {
151164
this.updateServers(calculatedOpenAPI);
152165
}
153166
// add security schemes
154167
this.calculateSecuritySchemes(calculatedOpenAPI.getComponents());
168+
Optional.ofNullable(this.openApiBuilderCustomisers).ifPresent(customisers -> customisers.forEach(customiser -> customiser.customise(this)));
155169
}
156170

157171
public void updateServers(OpenAPI openAPI) {
@@ -397,16 +411,12 @@ public void addTag(Set<HandlerMethod> handlerMethods, io.swagger.v3.oas.models.t
397411
handlerMethods.forEach(handlerMethod -> springdocTags.put(handlerMethod, tag));
398412
}
399413

400-
public Map<String, Object> getRestControllersMap() {
401-
return context.getBeansWithAnnotation(RestController.class);
402-
}
403-
404-
public Map<String, Object> getRequestMappingMap() {
405-
return context.getBeansWithAnnotation(RequestMapping.class);
414+
public Map<String, Object> getMappingsMap() {
415+
return this.mappingsMap;
406416
}
407417

408-
public Map<String, Object> getControllersMap() {
409-
return context.getBeansWithAnnotation(Controller.class);
418+
public void addMappings(Map<String, Object> mappings) {
419+
this.mappingsMap.putAll(mappings);
410420
}
411421

412422
public Map<String, Object> getControllerAdviceMap() {

springdoc-openapi-common/src/main/java/org/springdoc/core/SpringDocConfiguration.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.springdoc.core.converters.ModelConverterRegistrar;
3131
import org.springdoc.core.converters.PropertyCustomizingConverter;
3232
import org.springdoc.core.converters.ResponseSupportConverter;
33+
import org.springdoc.core.customizers.OpenApiBuilderCustomiser;
3334
import org.springdoc.core.customizers.PropertyCustomizer;
3435

3536
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
@@ -82,8 +83,10 @@ IgnoredParameterAnnotationsDefault ignoredParameterAnnotationsDefault() {
8283
}
8384

8485
@Bean
85-
public OpenAPIBuilder openAPIBuilder(Optional<OpenAPI> openAPI, ApplicationContext context, SecurityParser securityParser, Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider,SpringDocConfigProperties springDocConfigProperties) {
86-
return new OpenAPIBuilder(openAPI, context, securityParser, springSecurityOAuth2Provider,springDocConfigProperties);
86+
public OpenAPIBuilder openAPIBuilder(Optional<OpenAPI> openAPI, ApplicationContext context, SecurityParser securityParser,
87+
Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider, SpringDocConfigProperties springDocConfigProperties,
88+
List<OpenApiBuilderCustomiser> openApiBuilderCustomisers) {
89+
return new OpenAPIBuilder(openAPI, context, securityParser, springSecurityOAuth2Provider,springDocConfigProperties, openApiBuilderCustomisers);
8790
}
8891

8992
@Bean
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
*
3+
* * Copyright 2019-2020 the original author or authors.
4+
* *
5+
* * Licensed under the Apache License, Version 2.0 (the "License");
6+
* * you may not use this file except in compliance with the License.
7+
* * You may obtain a copy of the License at
8+
* *
9+
* * https://www.apache.org/licenses/LICENSE-2.0
10+
* *
11+
* * Unless required by applicable law or agreed to in writing, software
12+
* * distributed under the License is distributed on an "AS IS" BASIS,
13+
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* * See the License for the specific language governing permissions and
15+
* * limitations under the License.
16+
*
17+
*/
18+
19+
package org.springdoc.core.customizers;
20+
21+
import org.springdoc.core.OpenAPIBuilder;
22+
23+
public interface OpenApiBuilderCustomiser {
24+
void customise(OpenAPIBuilder openApiBuilder);
25+
}

0 commit comments

Comments
 (0)