Skip to content

Commit 10147ac

Browse files
committed
code refactoring
1 parent 25900e9 commit 10147ac

21 files changed

Lines changed: 253 additions & 347 deletions

File tree

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
/*
2+
*
3+
* *
4+
* * *
5+
* * * *
6+
* * * * *
7+
* * * * * * Copyright 2019-2025 the original author or authors.
8+
* * * * * *
9+
* * * * * * Licensed under the Apache License, Version 2.0 (the "License");
10+
* * * * * * you may not use this file except in compliance with the License.
11+
* * * * * * You may obtain a copy of the License at
12+
* * * * * *
13+
* * * * * * https://www.apache.org/licenses/LICENSE-2.0
14+
* * * * * *
15+
* * * * * * Unless required by applicable law or agreed to in writing, software
16+
* * * * * * distributed under the License is distributed on an "AS IS" BASIS,
17+
* * * * * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18+
* * * * * * See the License for the specific language governing permissions and
19+
* * * * * * limitations under the License.
20+
* * * * *
21+
* * * *
22+
* * *
23+
* *
24+
*
25+
*/
26+
27+
package org.springdoc.api;
28+
29+
import java.util.List;
30+
import java.util.Map;
31+
import java.util.stream.Collectors;
32+
33+
import org.springdoc.core.customizers.SpringDocCustomizers;
34+
import org.springdoc.core.models.GroupedOpenApi;
35+
import org.springdoc.core.properties.SpringDocConfigProperties;
36+
import org.springdoc.core.properties.SpringDocConfigProperties.GroupConfig;
37+
import org.springdoc.core.providers.SpringDocProviders;
38+
import org.springdoc.core.service.AbstractRequestService;
39+
import org.springdoc.core.service.GenericResponseService;
40+
import org.springdoc.core.service.OpenAPIService;
41+
import org.springdoc.core.service.OperationService;
42+
43+
import org.springframework.beans.factory.InitializingBean;
44+
import org.springframework.beans.factory.ObjectFactory;
45+
46+
/**
47+
* The type Abstract multiple open api resource.
48+
*
49+
* @param <R> the platform-specific open api resource type
50+
* @author bnasslahsen
51+
*/
52+
public abstract class AbstractMultipleOpenApiResource<R extends AbstractOpenApiResource> implements InitializingBean {
53+
54+
/**
55+
* The Grouped open apis.
56+
*/
57+
private final List<GroupedOpenApi> groupedOpenApis;
58+
59+
/**
60+
* The Default open api builder.
61+
*/
62+
protected final ObjectFactory<OpenAPIService> defaultOpenAPIBuilder;
63+
64+
/**
65+
* The Request builder.
66+
*/
67+
protected final AbstractRequestService requestBuilder;
68+
69+
/**
70+
* The Response builder.
71+
*/
72+
protected final GenericResponseService responseBuilder;
73+
74+
/**
75+
* The Operation parser.
76+
*/
77+
protected final OperationService operationParser;
78+
79+
/**
80+
* The Spring doc config properties.
81+
*/
82+
protected final SpringDocConfigProperties springDocConfigProperties;
83+
84+
/**
85+
* The Spring doc providers.
86+
*/
87+
protected final SpringDocProviders springDocProviders;
88+
89+
/**
90+
* The Spring doc customizers.
91+
*/
92+
private final SpringDocCustomizers springDocCustomizers;
93+
94+
/**
95+
* The Grouped open api resources.
96+
*/
97+
private Map<String, R> groupedOpenApiResources;
98+
99+
/**
100+
* Instantiates a new Abstract multiple open api resource.
101+
*
102+
* @param groupedOpenApis the grouped open apis
103+
* @param defaultOpenAPIBuilder the default open api builder
104+
* @param requestBuilder the request builder
105+
* @param responseBuilder the response builder
106+
* @param operationParser the operation parser
107+
* @param springDocConfigProperties the spring doc config properties
108+
* @param springDocProviders the spring doc providers
109+
* @param springDocCustomizers the spring doc customizers
110+
*/
111+
protected AbstractMultipleOpenApiResource(List<GroupedOpenApi> groupedOpenApis,
112+
ObjectFactory<OpenAPIService> defaultOpenAPIBuilder, AbstractRequestService requestBuilder,
113+
GenericResponseService responseBuilder, OperationService operationParser,
114+
SpringDocConfigProperties springDocConfigProperties, SpringDocProviders springDocProviders, SpringDocCustomizers springDocCustomizers) {
115+
116+
this.groupedOpenApis = groupedOpenApis;
117+
this.defaultOpenAPIBuilder = defaultOpenAPIBuilder;
118+
this.requestBuilder = requestBuilder;
119+
this.responseBuilder = responseBuilder;
120+
this.operationParser = operationParser;
121+
this.springDocConfigProperties = springDocConfigProperties;
122+
this.springDocProviders = springDocProviders;
123+
this.springDocCustomizers = springDocCustomizers;
124+
}
125+
126+
@Override
127+
public void afterPropertiesSet() {
128+
this.groupedOpenApis.forEach(groupedOpenApi -> {
129+
springDocCustomizers.getGlobalOpenApiCustomizers().ifPresent(groupedOpenApi::addAllOpenApiCustomizer);
130+
springDocCustomizers.getGlobalOperationCustomizers().ifPresent(groupedOpenApi::addAllOperationCustomizer);
131+
springDocCustomizers.getGlobalOpenApiMethodFilters().ifPresent(groupedOpenApi::addAllOpenApiMethodFilter);
132+
}
133+
);
134+
135+
this.groupedOpenApiResources = groupedOpenApis.stream()
136+
.collect(Collectors.toMap(GroupedOpenApi::getGroup, item ->
137+
{
138+
GroupConfig groupConfig = new GroupConfig(item.getGroup(), item.getPathsToMatch(), item.getPackagesToScan(), item.getPackagesToExclude(), item.getPathsToExclude(), item.getProducesToMatch(), item.getConsumesToMatch(), item.getHeadersToMatch(), item.getDisplayName());
139+
springDocConfigProperties.addGroupConfig(groupConfig);
140+
return buildOpenApiResource(item);
141+
},
142+
(existingValue, newValue) -> existingValue // choice to keep the existing value
143+
));
144+
}
145+
146+
/**
147+
* Build a platform-specific open api resource.
148+
*
149+
* @param item the grouped open api
150+
* @return the open api resource
151+
*/
152+
protected abstract R buildOpenApiResource(GroupedOpenApi item);
153+
154+
/**
155+
* Gets open api resource or throw.
156+
*
157+
* @param group the group
158+
* @return the open api resource or throw
159+
*/
160+
protected R getOpenApiResourceOrThrow(String group) {
161+
R openApiResource = groupedOpenApiResources.get(group);
162+
if (openApiResource == null) {
163+
throw new OpenApiResourceNotFoundException("No OpenAPI resource found for group: " + group);
164+
}
165+
return openApiResource;
166+
}
167+
168+
}

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocSecurityConfiguration.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,8 @@ OpenApiCustomizer springSecurityLoginEndpointCustomizer(ApplicationContext appli
166166

167167
String loginPath = null;
168168

169-
if (requestMatcher instanceof AntPathRequestMatcher) {
170-
loginPath = ((AntPathRequestMatcher) requestMatcher).getPattern();
169+
if (requestMatcher instanceof AntPathRequestMatcher antMatcher) {
170+
loginPath = antMatcher.getPattern();
171171
}
172172
else if (requestMatcher instanceof PathPatternRequestMatcher) {
173173
PathPattern pathPattern = (PathPattern) FieldUtils.readField(

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/converters/ConverterUtils.java

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
package org.springdoc.core.converters;
2828

2929
import java.util.ArrayList;
30-
import java.util.Arrays;
3130
import java.util.Collections;
3231
import java.util.List;
3332
import java.util.concurrent.Callable;
@@ -128,9 +127,7 @@ public static boolean isResponseTypeToIgnore(Class<?> rawClass) {
128127
* @param classes the classes
129128
*/
130129
public static void removeResponseWrapperToIgnore(Class<?> classes) {
131-
List classesToIgnore = Arrays.asList(classes);
132-
if (RESULT_WRAPPERS_TO_IGNORE.containsAll(classesToIgnore))
133-
RESULT_WRAPPERS_TO_IGNORE.removeAll(Arrays.asList(classes));
130+
RESULT_WRAPPERS_TO_IGNORE.remove(classes);
134131
}
135132

136133
/**
@@ -139,9 +136,7 @@ public static void removeResponseWrapperToIgnore(Class<?> classes) {
139136
* @param classes the classes
140137
*/
141138
public static void removeResponseTypeToIgnore(Class<?> classes) {
142-
List classesToIgnore = Arrays.asList(classes);
143-
if (RESPONSE_TYPES_TO_IGNORE.containsAll(classesToIgnore))
144-
RESPONSE_TYPES_TO_IGNORE.removeAll(Arrays.asList(classes));
139+
RESPONSE_TYPES_TO_IGNORE.remove(classes);
145140
}
146141

147142
/**
@@ -164,9 +159,7 @@ public static boolean isFluxTypeWrapper(Class<?> rawClass) {
164159
* @param classes the classes
165160
*/
166161
public static void removeFluxWrapperToIgnore(Class<?> classes) {
167-
List classesToIgnore = Arrays.asList(classes);
168-
if (FLUX_WRAPPERS_TO_IGNORE.containsAll(classesToIgnore))
169-
FLUX_WRAPPERS_TO_IGNORE.removeAll(Arrays.asList(classes));
162+
FLUX_WRAPPERS_TO_IGNORE.remove(classes);
170163
}
171164

172165
/**
@@ -193,9 +186,7 @@ public static void addJavaTypeToIgnore(Class<?> cls) {
193186
* @param classes the classes
194187
*/
195188
public static void removeJavaTypeToIgnore(Class<?> classes) {
196-
List classesToIgnore = Arrays.asList(classes);
197-
if (JAVA_TYPE_TO_IGNORE.containsAll(classesToIgnore))
198-
JAVA_TYPE_TO_IGNORE.removeAll(Arrays.asList(classes));
189+
JAVA_TYPE_TO_IGNORE.remove(classes);
199190
}
200191

201192
/**

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/data/DataRestOperationService.java

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -324,23 +324,12 @@ private Operation initOperation(HandlerMethod handlerMethod, Class<?> domainType
324324
*/
325325
private void addOperationDescription(Operation operation, RequestMethod requestMethod, String entity, DataRestRepository dataRestRepository) {
326326
switch (requestMethod) {
327-
case GET:
328-
operation.setDescription(createDescription("get-", entity, dataRestRepository));
329-
break;
330-
case POST:
331-
operation.setDescription(createDescription("create-", entity, dataRestRepository));
332-
break;
333-
case DELETE:
334-
operation.setDescription(createDescription("delete-", entity, dataRestRepository));
335-
break;
336-
case PUT:
337-
operation.setDescription(createDescription("update-", entity, dataRestRepository));
338-
break;
339-
case PATCH:
340-
operation.setDescription(createDescription("patch-", entity, dataRestRepository));
341-
break;
342-
default:
343-
throw new IllegalArgumentException(requestMethod.name());
327+
case GET -> operation.setDescription(createDescription("get-", entity, dataRestRepository));
328+
case POST -> operation.setDescription(createDescription("create-", entity, dataRestRepository));
329+
case DELETE -> operation.setDescription(createDescription("delete-", entity, dataRestRepository));
330+
case PUT -> operation.setDescription(createDescription("update-", entity, dataRestRepository));
331+
case PATCH -> operation.setDescription(createDescription("patch-", entity, dataRestRepository));
332+
default -> throw new IllegalArgumentException(requestMethod.name());
344333
}
345334
}
346335

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/data/DataRestResponseService.java

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -167,29 +167,26 @@ public void buildEntityResponse(Operation operation, HandlerMethod handlerMethod
167167
*/
168168
private void addResponse(RequestMethod requestMethod, String operationPath, ApiResponses apiResponses, ApiResponse apiResponse) {
169169
switch (requestMethod) {
170-
case GET:
170+
case GET -> {
171171
addResponse200(apiResponses, apiResponse);
172172
if (operationPath.contains("/{id}"))
173173
addResponse404(apiResponses);
174-
break;
175-
case POST:
176-
apiResponses.put(String.valueOf(HttpStatus.CREATED.value()), apiResponse.description(HttpStatus.CREATED.getReasonPhrase()));
177-
break;
178-
case DELETE:
174+
}
175+
case POST -> apiResponses.put(String.valueOf(HttpStatus.CREATED.value()), apiResponse.description(HttpStatus.CREATED.getReasonPhrase()));
176+
case DELETE -> {
179177
addResponse204(apiResponses);
180178
addResponse404(apiResponses);
181-
break;
182-
case PUT:
179+
}
180+
case PUT -> {
183181
addResponse200(apiResponses, apiResponse);
184182
apiResponses.put(String.valueOf(HttpStatus.CREATED.value()), new ApiResponse().content(apiResponse.getContent()).description(HttpStatus.CREATED.getReasonPhrase()));
185183
addResponse204(apiResponses);
186-
break;
187-
case PATCH:
184+
}
185+
case PATCH -> {
188186
addResponse200(apiResponses, apiResponse);
189187
addResponse204(apiResponses);
190-
break;
191-
default:
192-
throw new IllegalArgumentException(requestMethod.name());
188+
}
189+
default -> throw new IllegalArgumentException(requestMethod.name());
193190
}
194191
}
195192

@@ -263,11 +260,11 @@ private Type getTypeForResponseEntity(RequestMethod requestMethod, DataRestRepos
263260
if (Object.class.equals(parameterizedType.getActualTypeArguments()[0])) {
264261
return ResolvableType.forClassWithGenerics(ResponseEntity.class, returnedEntityType).getType();
265262
}
266-
else if (parameterizedType.getActualTypeArguments()[0] instanceof ParameterizedType) {
267-
return getTypeForParameterizedType(requestMethod, dataRestRepository, returnedEntityType, parameterizedType);
263+
else if (parameterizedType.getActualTypeArguments()[0] instanceof ParameterizedType innerType) {
264+
return getTypeForParameterizedType(requestMethod, dataRestRepository, returnedEntityType, innerType);
268265
}
269-
else if (parameterizedType.getActualTypeArguments()[0] instanceof WildcardType) {
270-
return getTypeForWildcardType(requestMethod, dataRestRepository, returnedEntityType, parameterizedType);
266+
else if (parameterizedType.getActualTypeArguments()[0] instanceof WildcardType wildcardType) {
267+
return getTypeForWildcardType(requestMethod, dataRestRepository, returnedEntityType, wildcardType);
271268
}
272269
return null;
273270
}
@@ -295,8 +292,7 @@ private Type getTypeForCollectionModel(Class returnedEntityType, boolean pagingR
295292
* @param parameterizedType the parameterized type
296293
* @return the type for wildcard type
297294
*/
298-
private Type getTypeForWildcardType(RequestMethod requestMethod, DataRestRepository dataRestRepository, Class returnedEntityType, ParameterizedType parameterizedType) {
299-
WildcardType wildcardType = (WildcardType) parameterizedType.getActualTypeArguments()[0];
295+
private Type getTypeForWildcardType(RequestMethod requestMethod, DataRestRepository dataRestRepository, Class returnedEntityType, WildcardType wildcardType) {
300296
if (wildcardType.getUpperBounds()[0] instanceof ParameterizedType wildcardTypeUpperBound) {
301297
if (RepresentationModel.class.equals(wildcardTypeUpperBound.getRawType())) {
302298
Class<?> type = findType(requestMethod, dataRestRepository);
@@ -318,17 +314,16 @@ private Type getTypeForWildcardType(RequestMethod requestMethod, DataRestReposit
318314
* @param parameterizedType the parameterized type
319315
* @return the type
320316
*/
321-
private Type getTypeForParameterizedType(RequestMethod requestMethod, DataRestRepository dataRestRepository, Class returnedEntityType, ParameterizedType parameterizedType) {
322-
ParameterizedType parameterizedType1 = (ParameterizedType) parameterizedType.getActualTypeArguments()[0];
323-
Class<?> rawType = ResolvableType.forType(parameterizedType1.getRawType()).getRawClass();
317+
private Type getTypeForParameterizedType(RequestMethod requestMethod, DataRestRepository dataRestRepository, Class returnedEntityType, ParameterizedType innerType) {
318+
Class<?> rawType = ResolvableType.forType(innerType.getRawType()).getRawClass();
324319
if (rawType != null && rawType.isAssignableFrom(RepresentationModel.class)) {
325320
Class<?> type = findType(requestMethod, dataRestRepository);
326321
if (MapModel.class.equals(type))
327322
return ResolvableType.forClassWithGenerics(ResponseEntity.class, type).getType();
328323
else
329324
return resolveGenericType(ResponseEntity.class, type, returnedEntityType);
330325
}
331-
else if (EntityModel.class.equals(parameterizedType1.getRawType())) {
326+
else if (EntityModel.class.equals(innerType.getRawType())) {
332327
return resolveGenericType(ResponseEntity.class, EntityModel.class, returnedEntityType);
333328
}
334329
return null;

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/data/DataRestRouterOperationService.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626

2727
package org.springdoc.core.data;
2828

29-
import java.util.Arrays;
3029
import java.util.LinkedHashMap;
3130
import java.util.LinkedHashSet;
3231
import java.util.List;
@@ -70,7 +69,7 @@ public class DataRestRouterOperationService {
7069
/**
7170
* The constant UNDOCUMENTED_REQUEST_METHODS.
7271
*/
73-
private static final List<RequestMethod> UNDOCUMENTED_REQUEST_METHODS = Arrays.asList(RequestMethod.OPTIONS, RequestMethod.HEAD);
72+
private static final List<RequestMethod> UNDOCUMENTED_REQUEST_METHODS = List.of(RequestMethod.OPTIONS, RequestMethod.HEAD);
7473

7574
/**
7675
* The constant REPOSITORY_PATH.

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/extractor/MethodParameterPojoExtractor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ public static void addSimpleTypePredicate(Predicate<Class<?>> predicate) {
322322
* @param classes the classes
323323
*/
324324
public static void addSimpleTypes(Class<?>... classes) {
325-
SIMPLE_TYPES.addAll(Arrays.asList(classes));
325+
SIMPLE_TYPES.addAll(List.of(classes));
326326
}
327327

328328
/**
@@ -331,7 +331,7 @@ public static void addSimpleTypes(Class<?>... classes) {
331331
* @param classes the classes
332332
*/
333333
public static void removeSimpleTypes(Class<?>... classes) {
334-
SIMPLE_TYPES.removeAll(Arrays.asList(classes));
334+
SIMPLE_TYPES.removeAll(List.of(classes));
335335
}
336336

337337
}

0 commit comments

Comments
 (0)