Skip to content

Commit de9cd7e

Browse files
committed
saving work
1 parent 3c870c3 commit de9cd7e

File tree

83 files changed

+7084
-47
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

83 files changed

+7084
-47
lines changed

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

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@
9393
import org.springframework.web.bind.annotation.RequestMethod;
9494
import org.springframework.web.method.HandlerMethod;
9595

96+
import static org.springdoc.core.Constants.OPERATION_ATTRIBUTE;
97+
import static org.springdoc.core.Constants.ROUTER_ATTRIBUTE;
9698
import static org.springdoc.core.converters.SchemaPropertyDeprecatingConverter.isDeprecated;
9799

98100
/**
@@ -515,23 +517,32 @@ protected void calculatePath(HandlerMethod handlerMethod, String operationPath,
515517
* @param routerFunctionVisitor the router function visitor
516518
*/
517519
protected void getRouterFunctionPaths(String beanName, AbstractRouterFunctionVisitor routerFunctionVisitor) {
518-
List<org.springdoc.core.annotations.RouterOperation> routerOperationList = new ArrayList<>();
519-
ApplicationContext applicationContext = openAPIBuilder.getContext();
520-
RouterOperations routerOperations = applicationContext.findAnnotationOnBean(beanName, RouterOperations.class);
521-
if (routerOperations == null) {
522-
org.springdoc.core.annotations.RouterOperation routerOperation = applicationContext.findAnnotationOnBean(beanName, org.springdoc.core.annotations.RouterOperation.class);
523-
if (routerOperation != null)
524-
routerOperationList.add(routerOperation);
520+
boolean withRouterOperation = routerFunctionVisitor.getRouterFunctionDatas().stream()
521+
.anyMatch(routerFunctionData -> routerFunctionData.getAttributes().containsKey(ROUTER_ATTRIBUTE) || routerFunctionData.getAttributes().containsKey(OPERATION_ATTRIBUTE));
522+
if (withRouterOperation) {
523+
List<RouterOperation> operationList = routerFunctionVisitor.getRouterFunctionDatas().stream().map(RouterOperation::new).collect(Collectors.toList());
524+
calculatePath(operationList);
525525
}
526-
else
527-
routerOperationList.addAll(Arrays.asList(routerOperations.value()));
528-
if (routerOperationList.size() == 1)
529-
calculatePath(routerOperationList.stream().map(routerOperation -> new RouterOperation(routerOperation, routerFunctionVisitor.getRouterFunctionDatas().get(0))).collect(Collectors.toList()));
530526
else {
531-
List<RouterOperation> operationList = routerOperationList.stream().map(RouterOperation::new).collect(Collectors.toList());
532-
mergeRouters(routerFunctionVisitor.getRouterFunctionDatas(), operationList);
533-
calculatePath(operationList);
527+
List<org.springdoc.core.annotations.RouterOperation> routerOperationList = new ArrayList<>();
528+
ApplicationContext applicationContext = openAPIBuilder.getContext();
529+
RouterOperations routerOperations = applicationContext.findAnnotationOnBean(beanName, RouterOperations.class);
530+
if (routerOperations == null) {
531+
org.springdoc.core.annotations.RouterOperation routerOperation = applicationContext.findAnnotationOnBean(beanName, org.springdoc.core.annotations.RouterOperation.class);
532+
if (routerOperation != null)
533+
routerOperationList.add(routerOperation);
534+
}
535+
else
536+
routerOperationList.addAll(Arrays.asList(routerOperations.value()));
537+
if (routerOperationList.size() == 1)
538+
calculatePath(routerOperationList.stream().map(routerOperation -> new RouterOperation(routerOperation, routerFunctionVisitor.getRouterFunctionDatas().get(0))).collect(Collectors.toList()));
539+
else {
540+
List<RouterOperation> operationList = routerOperationList.stream().map(RouterOperation::new).collect(Collectors.toList());
541+
mergeRouters(routerFunctionVisitor.getRouterFunctionDatas(), operationList);
542+
calculatePath(operationList);
543+
}
534544
}
545+
535546
}
536547

537548
/**

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,10 @@ public final class Constants {
270270
*/
271271
public static final String CSRF_DEFAULT_HEADER_NAME= "X-XSRF-TOKEN";
272272

273+
public static final String OPERATION_ATTRIBUTE = Constants.class.getName() + ".operation";
274+
275+
public static final String ROUTER_ATTRIBUTE = Constants.class.getName() + ".router";
276+
273277
/**
274278
* Instantiates a new Constants.
275279
*/

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

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222

2323
import java.util.ArrayList;
2424
import java.util.Arrays;
25+
import java.util.HashMap;
2526
import java.util.List;
27+
import java.util.Map;
2628
import java.util.Set;
2729

2830
import org.apache.commons.lang3.StringUtils;
@@ -76,6 +78,8 @@ public class AbstractRouterFunctionVisitor {
7678
*/
7779
protected RouterFunctionData routerFunctionData;
7880

81+
protected Map<String,Object> attributes = new HashMap<>();
82+
7983
/**
8084
* Method.
8185
*
@@ -223,18 +227,18 @@ protected void computeNested() {
223227
List<RouterFunctionData> routerFunctionDatasClone = new ArrayList<>();
224228
for (RouterFunctionData functionData : routerFunctionDatas) {
225229
for (String nestedOrPath : nestedOrPaths) {
226-
RouterFunctionData routerFunctionDataClone = new RouterFunctionData(nestedOrPath + functionData.getPath(), functionData.getConsumes(), functionData.getProduces(), functionData.getHeaders(), functionData.getQueryParams(), functionData.getMethods());
230+
RouterFunctionData routerFunctionDataClone = new RouterFunctionData(nestedOrPath , functionData);
227231
routerFunctionDatasClone.add(routerFunctionDataClone);
228232
}
229233
}
230234
this.routerFunctionDatas = routerFunctionDatasClone;
231235
nestedAndPaths.clear();
232236
}
233-
if (!nestedAcceptHeaders.isEmpty()){
237+
if (!nestedAcceptHeaders.isEmpty()) {
234238
routerFunctionDatas.forEach(existingRouterFunctionData -> existingRouterFunctionData.addProduces(nestedAcceptHeaders));
235239
nestedAcceptHeaders.clear();
236240
}
237-
if (!nestedContentTypeHeaders.isEmpty()){
241+
if (!nestedContentTypeHeaders.isEmpty()) {
238242
routerFunctionDatas.forEach(existingRouterFunctionData -> existingRouterFunctionData.addConsumes(nestedContentTypeHeaders));
239243
nestedContentTypeHeaders.clear();
240244
}
@@ -284,4 +288,14 @@ private void calculateAccept(String value) {
284288
}
285289
}
286290

291+
protected void attributes(Map<String, Object> attributes) {
292+
this.attributes = attributes;
293+
}
294+
295+
protected void route() {
296+
this.routerFunctionData = new RouterFunctionData();
297+
routerFunctionDatas.add(this.routerFunctionData);
298+
this.routerFunctionData.addAttributes(this.attributes);
299+
}
300+
287301
}

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

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -70,28 +70,21 @@ public class RouterFunctionData {
7070
*/
7171
private RequestMethod[] methods;
7272

73+
private Map<String,Object> attributes = new HashMap<>();
74+
7375
/**
7476
* Instantiates a new Router function data.
7577
*/
7678
public RouterFunctionData() { }
7779

78-
/**
79-
* Instantiates a new Router function data.
80-
*
81-
* @param path the path
82-
* @param consumes the consumes
83-
* @param produces the produces
84-
* @param headers the headers
85-
* @param queryParams the query params
86-
* @param methods the methods
87-
*/
88-
public RouterFunctionData(String path, String[] consumes, String[] produces, String[] headers, Map<String, String> queryParams, RequestMethod[] methods) {
89-
this.path = path;
90-
this.consumes = Arrays.asList(consumes);
91-
this.produces = Arrays.asList(produces);
92-
this.headers = Arrays.asList(headers);
93-
this.queryParams = queryParams;
94-
this.methods = methods;
80+
public RouterFunctionData(String nestedOrPath, RouterFunctionData functionData) {
81+
this.path = nestedOrPath + functionData.getPath();
82+
this.consumes = Arrays.asList(functionData.getConsumes());
83+
this.produces = Arrays.asList(functionData.getProduces());
84+
this.headers = Arrays.asList(functionData.getHeaders());
85+
this.queryParams = functionData.getQueryParams();
86+
this.methods = functionData.getMethods();
87+
this.attributes = functionData.getAttributes();
9588
}
9689

9790
/**
@@ -273,4 +266,12 @@ private RequestMethod getRequestMethod(HttpMethod httpMethod) {
273266
}
274267
return requestMethod;
275268
}
269+
270+
public Map<String, Object> getAttributes() {
271+
return attributes;
272+
}
273+
274+
public void addAttributes(Map<String, Object> attributes) {
275+
this.attributes.putAll(attributes);
276+
}
276277
}

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

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,13 @@
2727
import io.swagger.v3.oas.annotations.Operation;
2828
import org.apache.commons.lang3.ArrayUtils;
2929
import org.apache.commons.lang3.StringUtils;
30+
import org.springdoc.core.fn.builders.OperationBuilder;
3031

3132
import org.springframework.web.bind.annotation.RequestMethod;
3233

34+
import static org.springdoc.core.Constants.OPERATION_ATTRIBUTE;
35+
import static org.springdoc.core.Constants.ROUTER_ATTRIBUTE;
36+
3337

3438
/**
3539
* The type Router operation.
@@ -92,6 +96,9 @@ public class RouterOperation implements Comparable<RouterOperation> {
9296
*/
9397
private io.swagger.v3.oas.models.Operation operationModel;
9498

99+
private RouterOperation() {
100+
}
101+
95102
/**
96103
* Instantiates a new Router operation.
97104
*
@@ -139,6 +146,32 @@ public RouterOperation(String path, RequestMethod[] methods) {
139146
this.methods = methods;
140147
}
141148

149+
public RouterOperation(RouterFunctionData routerFunctionData) {
150+
this.path = routerFunctionData.getPath();
151+
this.methods = routerFunctionData.getMethods();
152+
this.consumes = routerFunctionData.getConsumes();
153+
this.produces = routerFunctionData.getProduces();
154+
this.headers = routerFunctionData.getHeaders();
155+
this.queryParams = routerFunctionData.getQueryParams();
156+
157+
Map<String, Object> attributes = routerFunctionData.getAttributes();
158+
if (attributes.containsKey(ROUTER_ATTRIBUTE)) {
159+
RouterOperation routerOperation = (RouterOperation) attributes.get(ROUTER_ATTRIBUTE);
160+
this.beanClass = routerOperation.getBeanClass();
161+
this.beanMethod = routerOperation.getBeanMethod();
162+
this.parameterTypes = routerOperation.getParameterTypes();
163+
this.operation = routerOperation.getOperation();
164+
}
165+
else if (attributes.containsKey(OPERATION_ATTRIBUTE)) {
166+
this.operation = (Operation) attributes.get(OPERATION_ATTRIBUTE);
167+
}
168+
}
169+
170+
171+
public static RouterOperationBuilder builder() {
172+
return new RouterOperationBuilder();
173+
}
174+
142175
/**
143176
* Gets path.
144177
*
@@ -377,4 +410,60 @@ public int hashCode() {
377410
result = 31 * result + Arrays.hashCode(parameterTypes);
378411
return result;
379412
}
413+
414+
415+
public static final class RouterOperationBuilder {
416+
private Class<?> beanClass;
417+
418+
private String beanMethod;
419+
420+
private Class<?>[] parameterTypes;
421+
422+
private Operation operation;
423+
424+
private RouterOperationBuilder() {
425+
}
426+
427+
public static RouterOperationBuilder builder() {
428+
return new RouterOperationBuilder();
429+
}
430+
431+
public RouterOperationBuilder beanClass(Class<?> beanClass) {
432+
this.beanClass = beanClass;
433+
return this;
434+
}
435+
436+
public RouterOperationBuilder beanMethod(String beanMethod) {
437+
this.beanMethod = beanMethod;
438+
return this;
439+
}
440+
441+
public RouterOperationBuilder parameterTypes(Class<?>[] parameterTypes) {
442+
this.parameterTypes = parameterTypes;
443+
return this;
444+
}
445+
446+
public RouterOperationBuilder operation(OperationBuilder operationBuilder) {
447+
this.operation = operationBuilder.build();
448+
return this;
449+
}
450+
451+
public RouterOperation build() {
452+
if (operation == null && (beanClass == null && beanMethod == null && parameterTypes == null))
453+
throw new IllegalStateException("You should either fill, the Operation or at least the bean class and the bean method");
454+
455+
if (beanClass != null && beanMethod == null)
456+
throw new IllegalStateException("The bean method, should not null");
457+
458+
if (operation != null && StringUtils.isEmpty(operation.operationId()))
459+
throw new IllegalStateException("operationId can not be empty");
460+
461+
RouterOperation routerOperation = new RouterOperation();
462+
routerOperation.setBeanClass(beanClass);
463+
routerOperation.setBeanMethod(beanMethod);
464+
routerOperation.setParameterTypes(parameterTypes);
465+
routerOperation.setOperation(operation);
466+
return routerOperation;
467+
}
468+
}
380469
}

0 commit comments

Comments
 (0)