Skip to content

Commit 359f8d4

Browse files
author
bnasslahsen
committed
Merge branch 'zarebski-m-master'
2 parents a9aab30 + e9bdd0e commit 359f8d4

File tree

10 files changed

+94
-16
lines changed

10 files changed

+94
-16
lines changed

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

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
package org.springdoc.api;
2020

2121
import java.io.UnsupportedEncodingException;
22+
import java.lang.annotation.Annotation;
23+
import java.lang.reflect.AnnotatedElement;
2224
import java.lang.reflect.Method;
2325
import java.net.URLDecoder;
2426
import java.nio.charset.StandardCharsets;
@@ -33,6 +35,7 @@
3335
import java.util.Optional;
3436
import java.util.Set;
3537
import java.util.stream.Collectors;
38+
import java.util.stream.Stream;
3639

3740
import com.fasterxml.jackson.annotation.JsonView;
3841
import io.swagger.v3.core.filter.SpecFilter;
@@ -57,6 +60,7 @@
5760
import org.springdoc.core.customizers.OpenApiCustomiser;
5861
import org.springdoc.core.customizers.OperationCustomizer;
5962

63+
import org.springframework.core.MethodParameter;
6064
import org.springframework.core.annotation.AnnotatedElementUtils;
6165
import org.springframework.core.annotation.AnnotationUtils;
6266
import org.springframework.util.AntPathMatcher;
@@ -74,10 +78,10 @@ public abstract class AbstractOpenApiResource extends SpecFilter {
7478

7579
private static final List<Class<?>> HIDDEN_REST_CONTROLLERS = new ArrayList<>();
7680

77-
private static final List<Class> DEPRECATED_TYPES = new ArrayList<>();
81+
public static final List<Class<? extends Annotation>> DEPRECATED_ANNOTATIONS = new ArrayList<>();
7882

7983
static {
80-
DEPRECATED_TYPES.add(Deprecated.class);
84+
DEPRECATED_ANNOTATIONS.add(Deprecated.class);
8185
}
8286

8387
protected final OpenAPIBuilder openAPIBuilder;
@@ -125,8 +129,8 @@ public static void addHiddenRestControllers(Class<?>... classes) {
125129
HIDDEN_REST_CONTROLLERS.addAll(Arrays.asList(classes));
126130
}
127131

128-
public static void addDeprecatedType(Class<?> cls) {
129-
DEPRECATED_TYPES.add(cls);
132+
public static void addDeprecatedType(Class<? extends Annotation> cls) {
133+
DEPRECATED_ANNOTATIONS.add(cls);
130134
}
131135

132136
protected synchronized OpenAPI getOpenApi() {
@@ -196,7 +200,7 @@ protected void calculatePath(HandlerMethod handlerMethod, String operationPath,
196200

197201
Operation operation = (existingOperation != null) ? existingOperation : new Operation();
198202

199-
if (isDeprecatedType(method))
203+
if (isDeprecated(method))
200204
operation.setDeprecated(true);
201205

202206
// Add documentation from operation annotation
@@ -411,8 +415,7 @@ protected Operation customiseOperation(Operation operation, HandlerMethod handle
411415
return operation;
412416
}
413417

414-
private boolean isDeprecatedType(Method method) {
415-
return DEPRECATED_TYPES.stream().anyMatch(clazz -> (AnnotatedElementUtils.findMergedAnnotation(method, clazz) != null));
418+
private boolean isDeprecated(AnnotatedElement annotatedElement) {
419+
return DEPRECATED_ANNOTATIONS.stream().anyMatch(annoClass -> AnnotatedElementUtils.findMergedAnnotation(annotatedElement, annoClass) != null);
416420
}
417-
418421
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
import static org.springdoc.core.Constants.OPENAPI_ARRAY_TYPE;
7979
import static org.springdoc.core.Constants.OPENAPI_STRING_TYPE;
8080
import static org.springdoc.core.Constants.QUERY_PARAM;
81+
import static org.springdoc.core.converters.SchemaPropertyDeprecatingConverter.containsDeprecatedAnnotation;
8182

8283
public abstract class AbstractRequestBuilder {
8384

@@ -338,6 +339,9 @@ private Parameter buildParam(String in, Components components, ParameterInfo par
338339
if (required != null && parameter.getRequired() == null)
339340
parameter.setRequired(required);
340341

342+
if (containsDeprecatedAnnotation(parameterInfo.getMethodParameter().getParameterAnnotations()))
343+
parameter.setDeprecated(true);
344+
341345
if (parameter.getSchema() == null) {
342346
Schema<?> schema = parameterBuilder.calculateSchema(components, parameterInfo, null,
343347
jsonView);

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import io.swagger.v3.oas.models.media.ObjectSchema;
3232
import io.swagger.v3.oas.models.media.Schema;
3333
import org.springdoc.core.converters.AdditionalModelsConverter;
34+
import org.springdoc.core.converters.SchemaPropertyDeprecatingConverter;
3435
import org.springdoc.core.converters.FileSupportConverter;
3536
import org.springdoc.core.converters.ModelConverterRegistrar;
3637
import org.springdoc.core.converters.PropertyCustomizingConverter;
@@ -105,6 +106,13 @@ ResponseSupportConverter responseSupportConverter() {
105106
return new ResponseSupportConverter();
106107
}
107108

109+
@Bean
110+
@ConditionalOnMissingBean
111+
@Lazy(false)
112+
SchemaPropertyDeprecatingConverter schemaPropertyDeprecatingConverter() {
113+
return new SchemaPropertyDeprecatingConverter();
114+
}
115+
108116
@Bean
109117
@ConditionalOnMissingBean
110118
OpenAPIBuilder openAPIBuilder(Optional<OpenAPI> openAPI, ApplicationContext context,

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
package org.springdoc.core;
2020

21+
import java.lang.annotation.Annotation;
2122
import java.util.function.Predicate;
2223

2324
import io.swagger.v3.oas.models.media.Schema;
@@ -36,7 +37,7 @@ public static SpringDocUtils getConfig() {
3637
return springDocConfig;
3738
}
3839

39-
public SpringDocUtils addDeprecatedType(Class<?> cls) {
40+
public SpringDocUtils addDeprecatedType(Class<? extends Annotation> cls) {
4041
AbstractOpenApiResource.addDeprecatedType(cls);
4142
return this;
4243
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.springdoc.core.converters;
2+
3+
import java.lang.annotation.Annotation;
4+
import java.util.Iterator;
5+
import java.util.stream.Stream;
6+
7+
import io.swagger.v3.core.converter.AnnotatedType;
8+
import io.swagger.v3.core.converter.ModelConverter;
9+
import io.swagger.v3.core.converter.ModelConverterContext;
10+
import io.swagger.v3.oas.models.media.Schema;
11+
12+
import static org.springdoc.api.AbstractOpenApiResource.DEPRECATED_ANNOTATIONS;
13+
14+
public class SchemaPropertyDeprecatingConverter implements ModelConverter {
15+
16+
@Override
17+
public Schema resolve(AnnotatedType type, ModelConverterContext context, Iterator<ModelConverter> chain) {
18+
if (chain.hasNext()) {
19+
Schema<?> resolvedSchema = chain.next().resolve(type, context, chain);
20+
if (type.isSchemaProperty() && containsDeprecatedAnnotation(type.getCtxAnnotations()))
21+
resolvedSchema.setDeprecated(true);
22+
return resolvedSchema;
23+
}
24+
return null;
25+
}
26+
27+
public static boolean containsDeprecatedAnnotation(Annotation[] annotations) {
28+
return annotations != null && Stream.of(annotations).map(Annotation::annotationType).anyMatch(DEPRECATED_ANNOTATIONS::contains);
29+
}
30+
}

springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app1/ItemDTO.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ public class ItemDTO implements Serializable {
4545
*/
4646
private int price;
4747

48+
@Deprecated
49+
private int deprecatedPrice;
50+
4851
/**
4952
*
5053
*/
@@ -113,4 +116,11 @@ public void setPrice(final int price) {
113116
this.price = price;
114117
}
115118

119+
public int getDeprecatedPrice() {
120+
return deprecatedPrice;
121+
}
122+
123+
public void setDeprecatedPrice(int deprecatedPrice) {
124+
this.deprecatedPrice = deprecatedPrice;
125+
}
116126
}

springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app1/ItemLightDTO.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ public class ItemLightDTO implements Serializable {
4040
*/
4141
private int price;
4242

43+
@Deprecated
44+
private int deprecatedPrice;
45+
4346
/**
4447
*
4548
*/
@@ -80,4 +83,11 @@ public void setPrice(final int price) {
8083
this.price = price;
8184
}
8285

86+
public int getDeprecatedPrice() {
87+
return deprecatedPrice;
88+
}
89+
90+
public void setDeprecatedPrice(int deprecatedPrice) {
91+
this.deprecatedPrice = deprecatedPrice;
92+
}
8393
}

springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app102/RequestParams.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public class RequestParams {
1313
@Parameter(description = "string parameter")
1414
private String stringParam;
1515

16+
@Deprecated
1617
private String stringParam1;
1718

1819
@Parameter(description = "string parameter2", required = true)

springdoc-openapi-webmvc-core/src/test/resources/results/app1.json

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -561,30 +561,40 @@
561561
}
562562
}
563563
},
564-
"ItemDTO": {
564+
"ItemLightDTO": {
565565
"type": "object",
566566
"properties": {
567-
"itemID": {
568-
"type": "string"
569-
},
570567
"description": {
571568
"type": "string"
572569
},
573570
"price": {
574571
"type": "integer",
575572
"format": "int32"
573+
},
574+
"deprecatedPrice": {
575+
"type": "integer",
576+
"format": "int32",
577+
"deprecated": true
576578
}
577579
}
578580
},
579-
"ItemLightDTO": {
581+
"ItemDTO": {
580582
"type": "object",
581583
"properties": {
584+
"itemID": {
585+
"type": "string"
586+
},
582587
"description": {
583588
"type": "string"
584589
},
585590
"price": {
586591
"type": "integer",
587592
"format": "int32"
593+
},
594+
"deprecatedPrice": {
595+
"type": "integer",
596+
"format": "int32",
597+
"deprecated": true
588598
}
589599
}
590600
},
@@ -610,4 +620,4 @@
610620
}
611621
}
612622
}
613-
}
623+
}

springdoc-openapi-webmvc-core/src/test/resources/results/app102.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
"name": "stringParam1",
4949
"in": "query",
5050
"required": false,
51+
"deprecated": true,
5152
"schema": {
5253
"type": "string"
5354
}
@@ -138,4 +139,4 @@
138139
}
139140
}
140141
}
141-
}
142+
}

0 commit comments

Comments
 (0)