Skip to content

Commit fef2366

Browse files
committed
code review
1 parent 8479978 commit fef2366

File tree

20 files changed

+232
-43
lines changed

20 files changed

+232
-43
lines changed

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ Desktop.ini
127127
*.*~
128128
*~
129129
.merge_file*
130+
.java-version
130131

131132
######################
132133
# Gradle Wrapper
@@ -141,4 +142,4 @@ Desktop.ini
141142
######################
142143
# ESLint
143144
######################
144-
.eslintcache
145+
.eslintcache

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

+36-7
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848

4949
import com.fasterxml.jackson.annotation.JsonView;
5050
import com.fasterxml.jackson.core.JsonProcessingException;
51-
import com.fasterxml.jackson.core.type.TypeReference;
5251
import com.fasterxml.jackson.databind.ObjectMapper;
5352
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
5453
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature;
@@ -66,7 +65,6 @@
6665
import io.swagger.v3.oas.models.media.StringSchema;
6766
import io.swagger.v3.oas.models.parameters.Parameter;
6867
import io.swagger.v3.oas.models.responses.ApiResponses;
69-
import io.swagger.v3.oas.models.servers.Server;
7068
import org.apache.commons.lang3.ArrayUtils;
7169
import org.apache.commons.lang3.StringUtils;
7270
import org.slf4j.Logger;
@@ -85,6 +83,7 @@
8583
import org.springdoc.core.customizers.OpenApiCustomiser;
8684
import org.springdoc.core.customizers.OpenApiLocaleCustomizer;
8785
import org.springdoc.core.customizers.OperationCustomizer;
86+
import org.springdoc.core.customizers.RouterOperationCustomizer;
8887
import org.springdoc.core.filters.OpenApiMethodFilter;
8988
import org.springdoc.core.fn.AbstractRouterFunctionVisitor;
9089
import org.springdoc.core.fn.RouterFunctionData;
@@ -120,6 +119,7 @@
120119
* The type Abstract open api resource.
121120
* @author bnasslahsen
122121
* @author kevinraddatz
122+
* @author hyeonisism
123123
*/
124124
public abstract class AbstractOpenApiResource extends SpecFilter {
125125

@@ -178,6 +178,11 @@ public abstract class AbstractOpenApiResource extends SpecFilter {
178178
*/
179179
private final Optional<List<OperationCustomizer>> operationCustomizers;
180180

181+
/**
182+
* The RouterOperation customizers.
183+
*/
184+
private final Optional<List<RouterOperationCustomizer>> routerOperationCustomizers;
185+
181186
/**
182187
* The method filters to use.
183188
*/
@@ -217,6 +222,7 @@ public abstract class AbstractOpenApiResource extends SpecFilter {
217222
* @param operationParser the operation parser
218223
* @param operationCustomizers the operation customizers
219224
* @param openApiCustomisers the open api customisers
225+
* @param routerOperationCustomizers the router operation customisers
220226
* @param methodFilters the method filters
221227
* @param springDocConfigProperties the spring doc config properties
222228
* @param springDocProviders the spring doc providers
@@ -226,6 +232,7 @@ protected AbstractOpenApiResource(String groupName, ObjectFactory<OpenAPIService
226232
GenericResponseService responseBuilder, OperationService operationParser,
227233
Optional<List<OperationCustomizer>> operationCustomizers,
228234
Optional<List<OpenApiCustomiser>> openApiCustomisers,
235+
Optional<List<RouterOperationCustomizer>> routerOperationCustomizers,
229236
Optional<List<OpenApiMethodFilter>> methodFilters,
230237
SpringDocConfigProperties springDocConfigProperties, SpringDocProviders springDocProviders) {
231238
super();
@@ -236,6 +243,7 @@ protected AbstractOpenApiResource(String groupName, ObjectFactory<OpenAPIService
236243
this.responseBuilder = responseBuilder;
237244
this.operationParser = operationParser;
238245
this.openApiCustomisers = openApiCustomisers;
246+
this.routerOperationCustomizers = routerOperationCustomizers;
239247
this.methodFilters = methodFilters;
240248
this.springDocProviders = springDocProviders;
241249
//add the default customizers
@@ -368,6 +376,9 @@ protected synchronized OpenAPI getOpenApi(Locale locale) {
368376
*/
369377
protected void calculatePath(HandlerMethod handlerMethod,
370378
RouterOperation routerOperation, Locale locale, OpenAPI openAPI) {
379+
380+
routerOperation = customizeRouterOperation(routerOperation, handlerMethod);
381+
371382
String operationPath = routerOperation.getPath();
372383
Set<RequestMethod> requestMethods = new HashSet<>(Arrays.asList(routerOperation.getMethods()));
373384
io.swagger.v3.oas.annotations.Operation apiOperation = routerOperation.getOperation();
@@ -468,7 +479,7 @@ protected void calculatePath(HandlerMethod handlerMethod,
468479
buildCallbacks(openAPI, methodAttributes, operation, apiCallbacks);
469480

470481
// allow for customisation
471-
operation = customiseOperation(operation, handlerMethod);
482+
operation = customizeOperation(operation, handlerMethod);
472483

473484
PathItem pathItemObject = buildPathItem(requestMethod, operation, operationPath, paths);
474485
paths.addPathItem(operationPath, pathItemObject);
@@ -595,12 +606,15 @@ protected void calculatePath(RouterOperation routerOperation, Locale locale, Ope
595606
* @param consumes the consumes
596607
* @param produces the produces
597608
* @param headers the headers
609+
* @param params the params
598610
* @param locale the locale
599611
* @param openAPI the open api
600612
*/
601613
protected void calculatePath(HandlerMethod handlerMethod, String operationPath,
602-
Set<RequestMethod> requestMethods, String[] consumes, String[] produces, String[] headers, Locale locale, OpenAPI openAPI) {
603-
this.calculatePath(handlerMethod, new RouterOperation(operationPath, requestMethods.toArray(new RequestMethod[requestMethods.size()]), consumes, produces, headers), locale, openAPI);
614+
Set<RequestMethod> requestMethods, String[] consumes, String[] produces, String[] headers, String[] params, Locale locale, OpenAPI openAPI) {
615+
this.calculatePath(handlerMethod,
616+
new RouterOperation(operationPath, requestMethods.toArray(new RequestMethod[requestMethods.size()]), consumes, produces, headers, params),
617+
locale, openAPI);
604618
}
605619

606620
/**
@@ -781,7 +795,6 @@ public static boolean containsResponseBody(HandlerMethod handlerMethod) {
781795
return responseBodyAnnotation != null;
782796
}
783797

784-
785798
/**
786799
* Is rest controller boolean.
787800
*
@@ -827,7 +840,7 @@ protected Set<RequestMethod> getDefaultAllowedHttpMethods() {
827840
* @param handlerMethod the handler method
828841
* @return the operation
829842
*/
830-
protected Operation customiseOperation(Operation operation, HandlerMethod handlerMethod) {
843+
protected Operation customizeOperation(Operation operation, HandlerMethod handlerMethod) {
831844
if (operationCustomizers.isPresent()) {
832845
List<OperationCustomizer> operationCustomizerList = operationCustomizers.get();
833846
for (OperationCustomizer operationCustomizer : operationCustomizerList)
@@ -836,6 +849,22 @@ protected Operation customiseOperation(Operation operation, HandlerMethod handle
836849
return operation;
837850
}
838851

852+
/**
853+
* Customise router operation
854+
* @param routerOperation
855+
* @param handlerMethod
856+
* @return the router operation
857+
*/
858+
protected RouterOperation customizeRouterOperation(RouterOperation routerOperation, HandlerMethod handlerMethod) {
859+
if (routerOperationCustomizers.isPresent()) {
860+
List<RouterOperationCustomizer> routerOperationCustomizerList = routerOperationCustomizers.get();
861+
for (RouterOperationCustomizer routerOperationCustomizer : routerOperationCustomizerList) {
862+
routerOperation = routerOperationCustomizer.customize(routerOperation, handlerMethod);
863+
}
864+
}
865+
return routerOperation;
866+
}
867+
839868
/**
840869
* Merge routers.
841870
*

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

+32
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.apache.commons.lang3.StringUtils;
3232
import org.springdoc.core.customizers.OpenApiCustomiser;
3333
import org.springdoc.core.customizers.OperationCustomizer;
34+
import org.springdoc.core.customizers.RouterOperationCustomizer;
3435
import org.springdoc.core.filters.OpenApiMethodFilter;
3536

3637
import org.springframework.util.CollectionUtils;
@@ -58,6 +59,11 @@ public class GroupedOpenApi {
5859
*/
5960
private List<OperationCustomizer> operationCustomizers;
6061

62+
/**
63+
* The Router Operation customizers.
64+
*/
65+
private List<RouterOperationCustomizer> routerOperationCustomizers;
66+
6167
/**
6268
* The Paths to match.
6369
*/
@@ -120,6 +126,7 @@ private GroupedOpenApi(Builder builder) {
120126
this.displayName = StringUtils.defaultIfEmpty(builder.displayName, this.group);
121127
this.openApiCustomisers = Objects.requireNonNull(builder.openApiCustomisers);
122128
this.operationCustomizers = Objects.requireNonNull(builder.operationCustomizers);
129+
this.routerOperationCustomizers = Objects.requireNonNull(builder.routerOperationCustomizers);
123130
this.openApiMethodFilters = Objects.requireNonNull(builder.methodFilters);
124131
if (CollectionUtils.isEmpty(this.pathsToMatch)
125132
&& CollectionUtils.isEmpty(this.packagesToScan)
@@ -242,6 +249,15 @@ public List<OpenApiMethodFilter> getOpenApiMethodFilters() {
242249
return openApiMethodFilters;
243250
}
244251

252+
/**
253+
* Gets router operation customizers.
254+
*
255+
* @return the router operation customizers
256+
*/
257+
public List<RouterOperationCustomizer> getRouterOperationCustomizers() {
258+
return routerOperationCustomizers;
259+
}
260+
245261
/**
246262
* Gets display name.
247263
*
@@ -266,6 +282,11 @@ public static class Builder {
266282
*/
267283
private final List<OperationCustomizer> operationCustomizers = new ArrayList<>();
268284

285+
/**
286+
* The Router Operation customizers.
287+
*/
288+
private final List<RouterOperationCustomizer> routerOperationCustomizers = new ArrayList<>();
289+
269290
/**
270291
* The methods filters to apply.
271292
*/
@@ -433,6 +454,17 @@ public Builder addOperationCustomizer(OperationCustomizer operationCustomizer) {
433454
return this;
434455
}
435456

457+
/**
458+
* Add router operation customizer builder
459+
*
460+
* @param routerOperationCustomizer the router operation customizer
461+
* @return the builder
462+
*/
463+
public Builder addRouterOperationCustomizer(RouterOperationCustomizer routerOperationCustomizer) {
464+
this.routerOperationCustomizers.add(routerOperationCustomizer);
465+
return this;
466+
}
467+
436468
/**
437469
* Add method filter.
438470
*

springdoc-openapi-common/src/main/java/org/springdoc/core/annotations/RouterOperation.java

+8
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,14 @@
9595
*/
9696
String[] headers() default {};
9797

98+
/**
99+
* The parameters of the mapped request, narrowing the primary mapping.
100+
* Same format for any environment: a sequence of "myParam=myValue" style expressions,
101+
* with a request only mapped if each such parameter is found to have the given value.
102+
* @return the string [ ]
103+
*/
104+
String[] params() default {};
105+
98106
/**
99107
* The class of the Handler bean.
100108
* @return the class of the Bean
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.springdoc.core.customizers;
2+
3+
import org.springdoc.core.fn.RouterOperation;
4+
5+
import org.springframework.web.method.HandlerMethod;
6+
7+
/**
8+
* Implement and register a bean of type {@link RouterOperationCustomizer} to customize an router operation
9+
* based on the handler method input on default OpenAPI descriptions but not groups
10+
*
11+
* @author hyeonisism
12+
*/
13+
@FunctionalInterface
14+
public interface RouterOperationCustomizer {
15+
16+
/**
17+
* Customize router operation.
18+
*
19+
* @param routerOperation input operation
20+
* @param handlerMethod original handler method
21+
* @return customized router operation
22+
*/
23+
RouterOperation customize(RouterOperation routerOperation, HandlerMethod handlerMethod);
24+
25+
}

springdoc-openapi-common/src/main/java/org/springdoc/core/fn/RouterFunctionData.java

+20
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ public class RouterFunctionData {
6262
*/
6363
private List<String> headers = new ArrayList<>();
6464

65+
/**
66+
* The Params.
67+
*/
68+
private List<String> params = new ArrayList<>();
69+
6570
/**
6671
* The Query params.
6772
*/
@@ -93,6 +98,7 @@ public RouterFunctionData(String nestedOrPath, RouterFunctionData functionData)
9398
this.consumes = Arrays.asList(functionData.getConsumes());
9499
this.produces = Arrays.asList(functionData.getProduces());
95100
this.headers = Arrays.asList(functionData.getHeaders());
101+
this.params = Arrays.asList(functionData.getParams());
96102
this.queryParams = functionData.getQueryParams();
97103
this.methods = functionData.getMethods();
98104
this.attributes = functionData.getAttributes();
@@ -181,6 +187,20 @@ public String[] getConsumes() {
181187
return consumes.toArray(new String[consumes.size()]);
182188
}
183189

190+
/**
191+
* Get params string [ ].
192+
*
193+
* @return the string [ ]
194+
*/
195+
public String[] getParams() { return params.toArray(new String[params.size()]); }
196+
197+
/**
198+
* Add params.
199+
*
200+
* @param params the params
201+
*/
202+
public void addParams(String params) { if(StringUtils.isNotBlank(params)) this.params.add(params); }
203+
184204
/**
185205
* Add consumes.
186206
*

0 commit comments

Comments
 (0)