Skip to content

Commit f2abb2a

Browse files
committed
code review
1 parent a7a3adf commit f2abb2a

File tree

5 files changed

+191
-112
lines changed

5 files changed

+191
-112
lines changed

springdoc-openapi-data-rest/pom.xml

-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
<groupId>org.springdoc</groupId>
3333
<artifactId>springdoc-openapi-webmvc-core</artifactId>
3434
<version>${project.version}</version>
35-
<scope>test</scope>
3635
</dependency>
3736
<dependency>
3837
<groupId>org.springframework.boot</groupId>

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

+83-34
Original file line numberDiff line numberDiff line change
@@ -202,12 +202,7 @@ private Type findSearchReturnType(MethodResourceMapping methodResourceMapping, C
202202
}
203203
else if (ResolvableType.forType(returnRepoType).getRawClass() != null
204204
&& Iterable.class.isAssignableFrom(Objects.requireNonNull(ResolvableType.forType(returnRepoType).getRawClass()))) {
205-
206-
if (methodResourceMapping.isPagingResource())
207-
return resolveGenericType(PagedModel.class, EntityModel.class, domainType);
208-
else
209-
return resolveGenericType(CollectionModel.class, EntityModel.class, domainType);
210-
205+
return getTypeForCollectionModel(domainType, methodResourceMapping.isPagingResource());
211206
}
212207
else if (ClassUtils.isPrimitiveOrWrapper(methodResourceMapping.getReturnedDomainType())) {
213208
returnType = methodResourceMapping.getReturnedDomainType();
@@ -234,30 +229,7 @@ private Type getType(MethodParameter methodParameterReturn, RequestMethod reques
234229
if (returnType instanceof ParameterizedType) {
235230
ParameterizedType parameterizedType = (ParameterizedType) returnType;
236231
if ((ResponseEntity.class.equals(parameterizedType.getRawType()))) {
237-
if (Object.class.equals(parameterizedType.getActualTypeArguments()[0])) {
238-
return ResolvableType.forClassWithGenerics(ResponseEntity.class, returnedEntityType).getType();
239-
}
240-
else if (parameterizedType.getActualTypeArguments()[0] instanceof ParameterizedType) {
241-
ParameterizedType parameterizedType1 = (ParameterizedType) parameterizedType.getActualTypeArguments()[0];
242-
Class<?> rawType = ResolvableType.forType(parameterizedType1.getRawType()).getRawClass();
243-
if (rawType != null && rawType.isAssignableFrom(RepresentationModel.class)) {
244-
Class<?> type = findType(requestMethod, dataRestRepository);
245-
return resolveGenericType(ResponseEntity.class, type, returnedEntityType);
246-
}
247-
else if (EntityModel.class.equals(parameterizedType1.getRawType())) {
248-
return resolveGenericType(ResponseEntity.class, EntityModel.class, returnedEntityType);
249-
}
250-
}
251-
else if (parameterizedType.getActualTypeArguments()[0] instanceof WildcardType) {
252-
WildcardType wildcardType = (WildcardType) parameterizedType.getActualTypeArguments()[0];
253-
if (wildcardType.getUpperBounds()[0] instanceof ParameterizedType) {
254-
ParameterizedType wildcardTypeUpperBound = (ParameterizedType) wildcardType.getUpperBounds()[0];
255-
if (RepresentationModel.class.equals(wildcardTypeUpperBound.getRawType())) {
256-
Class<?> type = findType(requestMethod, dataRestRepository);
257-
return resolveGenericType(ResponseEntity.class, type, returnedEntityType);
258-
}
259-
}
260-
}
232+
return getTypeForResponseEntity(requestMethod, dataRestRepository, returnedEntityType, parameterizedType);
261233
}
262234
else if ((HttpEntity.class.equals(parameterizedType.getRawType())
263235
&& parameterizedType.getActualTypeArguments()[0] instanceof ParameterizedType)) {
@@ -268,15 +240,92 @@ else if ((HttpEntity.class.equals(parameterizedType.getRawType())
268240
}
269241
else if ((CollectionModel.class.equals(parameterizedType.getRawType())
270242
&& Object.class.equals(parameterizedType.getActualTypeArguments()[0]))) {
271-
if (resourceMetadata.isPagingResource())
272-
return resolveGenericType(PagedModel.class, EntityModel.class, returnedEntityType);
273-
else
274-
return resolveGenericType(CollectionModel.class, EntityModel.class, returnedEntityType);
243+
return getTypeForCollectionModel(returnedEntityType, resourceMetadata.isPagingResource());
275244
}
276245
}
277246
return returnType;
278247
}
279248

249+
/**
250+
* Gets type for response entity.
251+
*
252+
* @param requestMethod the request method
253+
* @param dataRestRepository the data rest repository
254+
* @param returnedEntityType the returned entity type
255+
* @param parameterizedType the parameterized type
256+
* @return the type for response entity
257+
*/
258+
private Type getTypeForResponseEntity(RequestMethod requestMethod, DataRestRepository dataRestRepository, Class returnedEntityType, ParameterizedType parameterizedType) {
259+
if (Object.class.equals(parameterizedType.getActualTypeArguments()[0])) {
260+
return ResolvableType.forClassWithGenerics(ResponseEntity.class, returnedEntityType).getType();
261+
}
262+
else if (parameterizedType.getActualTypeArguments()[0] instanceof ParameterizedType) {
263+
return getTypeForParameterizedType(requestMethod, dataRestRepository, returnedEntityType, parameterizedType);
264+
}
265+
else if (parameterizedType.getActualTypeArguments()[0] instanceof WildcardType) {
266+
Type type = getTypeForWildcardType(requestMethod, dataRestRepository, returnedEntityType, parameterizedType);
267+
if (type != null) return type;
268+
}
269+
return null;
270+
}
271+
272+
/**
273+
* Gets type for collection model.
274+
*
275+
* @param returnedEntityType the returned entity type
276+
* @param pagingResource the paging resource
277+
* @return the type for collection model
278+
*/
279+
private Type getTypeForCollectionModel(Class returnedEntityType, boolean pagingResource) {
280+
if (pagingResource)
281+
return resolveGenericType(PagedModel.class, EntityModel.class, returnedEntityType);
282+
else
283+
return resolveGenericType(CollectionModel.class, EntityModel.class, returnedEntityType);
284+
}
285+
286+
/**
287+
* Gets type for wildcard type.
288+
*
289+
* @param requestMethod the request method
290+
* @param dataRestRepository the data rest repository
291+
* @param returnedEntityType the returned entity type
292+
* @param parameterizedType the parameterized type
293+
* @return the type for wildcard type
294+
*/
295+
private Type getTypeForWildcardType(RequestMethod requestMethod, DataRestRepository dataRestRepository, Class returnedEntityType, ParameterizedType parameterizedType) {
296+
WildcardType wildcardType = (WildcardType) parameterizedType.getActualTypeArguments()[0];
297+
if (wildcardType.getUpperBounds()[0] instanceof ParameterizedType) {
298+
ParameterizedType wildcardTypeUpperBound = (ParameterizedType) wildcardType.getUpperBounds()[0];
299+
if (RepresentationModel.class.equals(wildcardTypeUpperBound.getRawType())) {
300+
Class<?> type = findType(requestMethod, dataRestRepository);
301+
return resolveGenericType(ResponseEntity.class, type, returnedEntityType);
302+
}
303+
}
304+
return null;
305+
}
306+
307+
/**
308+
* Gets type.
309+
*
310+
* @param requestMethod the request method
311+
* @param dataRestRepository the data rest repository
312+
* @param returnedEntityType the returned entity type
313+
* @param parameterizedType the parameterized type
314+
* @return the type
315+
*/
316+
private Type getTypeForParameterizedType(RequestMethod requestMethod, DataRestRepository dataRestRepository, Class returnedEntityType, ParameterizedType parameterizedType) {
317+
ParameterizedType parameterizedType1 = (ParameterizedType) parameterizedType.getActualTypeArguments()[0];
318+
Class<?> rawType = ResolvableType.forType(parameterizedType1.getRawType()).getRawClass();
319+
if (rawType != null && rawType.isAssignableFrom(RepresentationModel.class)) {
320+
Class<?> type = findType(requestMethod, dataRestRepository);
321+
return resolveGenericType(ResponseEntity.class, type, returnedEntityType);
322+
}
323+
else if (EntityModel.class.equals(parameterizedType1.getRawType())) {
324+
return resolveGenericType(ResponseEntity.class, EntityModel.class, returnedEntityType);
325+
}
326+
return null;
327+
}
328+
280329
/**
281330
* Find type class.
282331
*

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

+14-20
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.springdoc.core.SpringDocConfigProperties;
4040
import org.springdoc.core.fn.RouterOperation;
4141
import org.springdoc.data.rest.DataRestHalProvider;
42+
import org.springdoc.webmvc.api.OpenApiResource;
4243

4344
import org.springframework.data.rest.core.Path;
4445
import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
@@ -51,10 +52,10 @@
5152
import org.springframework.util.CollectionUtils;
5253
import org.springframework.web.bind.annotation.RequestMethod;
5354
import org.springframework.web.method.HandlerMethod;
54-
import org.springframework.web.servlet.mvc.condition.PathPatternsRequestCondition;
55-
import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition;
5655
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
5756

57+
import static org.springdoc.webmvc.api.OpenApiResource.getActivePatterns;
58+
5859
/**
5960
* The type Data rest router operation builder.
6061
* @author bnasslahsen
@@ -170,7 +171,7 @@ private void buildRouterOperationList(List<RouterOperation> routerOperationList,
170171
Set<RequestMethod> requestMethodsCollection = null;
171172

172173
Set<RequestMethod> requestMethods = requestMappingInfo.getMethodsCondition().getMethods();
173-
if (resourceMetadata != null && !controllerType.equals(ControllerType.SEARCH)) {
174+
if (andCheck(resourceMetadata != null, !controllerType.equals(ControllerType.SEARCH))) {
174175
HttpMethods httpMethodsItem = resourceMetadata.getSupportedHttpMethods().getMethodsFor(ResourceType.ITEM);
175176
requestMethodsItem = requestMethods.stream().filter(requestMethod -> httpMethodsItem.contains(HttpMethod.valueOf(requestMethod.toString())))
176177
.collect(Collectors.toSet());
@@ -217,7 +218,7 @@ private void buildRouterOperation(List<RouterOperation> routerOperationList, Res
217218
if (!CollectionUtils.isEmpty(requestMethodsCollection))
218219
for (RequestMethod requestMethod : requestMethodsCollection) {
219220
if (!UNDOCUMENTED_REQUEST_METHODS.contains(requestMethod)) {
220-
Set<String> patterns = getActivePatterns(requestMappingInfo);
221+
Set<String> patterns = OpenApiResource.getActivePatterns(requestMappingInfo);
221222
if (!CollectionUtils.isEmpty(patterns)) {
222223
Map<String, String> regexMap = new LinkedHashMap<>();
223224
String relationName = dataRestRepository.getRelationName();
@@ -249,7 +250,7 @@ private String calculateOperationPath(String path, String subPath, Set<String> p
249250
operationPath = PathUtils.parsePath(pattern, regexMap);
250251
operationPath = operationPath.replace(REPOSITORY_PATH, path);
251252
if (ControllerType.ENTITY.equals(controllerType)) {
252-
if ((ResourceType.ITEM.equals(resourceType) && !operationPath.endsWith(ID)) || (ResourceType.COLLECTION.equals(resourceType) && operationPath.endsWith(ID)))
253+
if ((andCheck(ResourceType.ITEM.equals(resourceType), !operationPath.endsWith(ID))) || (andCheck(ResourceType.COLLECTION.equals(resourceType), operationPath.endsWith(ID))))
253254
operationPath = null;
254255
}
255256
else if (ControllerType.SEARCH.equals(controllerType))
@@ -328,7 +329,7 @@ private boolean isSearchControllerPresent(RequestMappingInfo requestMappingInfo,
328329
String operationPath;
329330
for (String pattern : patterns) {
330331
operationPath = PathUtils.parsePath(pattern, regexMap);
331-
if (operationPath.contains(REPOSITORY_PATH) && operationPath.contains(SEARCH_PATH)) {
332+
if (andCheck(operationPath.contains(REPOSITORY_PATH), operationPath.contains(SEARCH_PATH))) {
332333
MethodAttributes methodAttributes = new MethodAttributes(springDocConfigProperties.getDefaultConsumesMediaType(), springDocConfigProperties.getDefaultProducesMediaType());
333334
methodAttributes.calculateConsumesProduces(handlerMethod.getMethod());
334335
if (springDocConfigProperties.getDefaultProducesMediaType().equals(methodAttributes.getMethodProduces()[0]))
@@ -341,21 +342,14 @@ private boolean isSearchControllerPresent(RequestMappingInfo requestMappingInfo,
341342
}
342343

343344
/**
344-
* Gets active patterns.
345+
* Is condition one and condition two boolean.
345346
*
346-
* @param requestMappingInfo the request mapping info
347-
* @return the active patterns
347+
* @param conditionOne the condition one
348+
* @param conditionTwo the condition two
349+
* @return the boolean
348350
*/
349-
private Set<String> getActivePatterns(RequestMappingInfo requestMappingInfo) {
350-
Set<String> patterns = null;
351-
PatternsRequestCondition patternsRequestCondition = requestMappingInfo.getPatternsCondition();
352-
if (patternsRequestCondition != null)
353-
patterns = patternsRequestCondition.getPatterns();
354-
else {
355-
PathPatternsRequestCondition pathPatternsRequestCondition = requestMappingInfo.getPathPatternsCondition();
356-
if (pathPatternsRequestCondition != null)
357-
patterns = pathPatternsRequestCondition.getPatternValues();
358-
}
359-
return patterns;
351+
private boolean andCheck(boolean conditionOne, boolean conditionTwo) {
352+
return conditionOne && conditionTwo;
360353
}
354+
361355
}

0 commit comments

Comments
 (0)