Skip to content

Commit 22c8eff

Browse files
committed
code review
1 parent 69d1649 commit 22c8eff

File tree

12 files changed

+161
-55
lines changed

12 files changed

+161
-55
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/*
2+
*
3+
* *
4+
* * *
5+
* * * *
6+
* * * * * Copyright 2019-2022 the original author or authors.
7+
* * * * *
8+
* * * * * Licensed under the Apache License, Version 2.0 (the "License");
9+
* * * * * you may not use this file except in compliance with the License.
10+
* * * * * You may obtain a copy of the License at
11+
* * * * *
12+
* * * * * https://www.apache.org/licenses/LICENSE-2.0
13+
* * * * *
14+
* * * * * Unless required by applicable law or agreed to in writing, software
15+
* * * * * distributed under the License is distributed on an "AS IS" BASIS,
16+
* * * * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17+
* * * * * See the License for the specific language governing permissions and
18+
* * * * * limitations under the License.
19+
* * * *
20+
* * *
21+
* *
22+
*
23+
*/
24+
package org.springdoc.core.conditions;
25+
26+
import org.springframework.context.annotation.Condition;
27+
import org.springframework.context.annotation.ConditionContext;
28+
import org.springframework.core.env.ConfigurableEnvironment;
29+
import org.springframework.core.env.EnumerablePropertySource;
30+
import org.springframework.core.env.MutablePropertySources;
31+
import org.springframework.core.env.PropertySource;
32+
import org.springframework.core.type.AnnotatedTypeMetadata;
33+
34+
import static org.springdoc.core.utils.Constants.SPRINGDOC_SPEC_PROPERTIES_PREFIX;
35+
36+
/**
37+
* The type Spec properties condition.
38+
*
39+
* @author bnasslahsen
40+
*/
41+
public class SpecPropertiesCondition implements Condition {
42+
43+
@Override
44+
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
45+
MutablePropertySources propertySources = ((ConfigurableEnvironment) context.getEnvironment())
46+
.getPropertySources();
47+
for (PropertySource<?> propertySource : propertySources) {
48+
if (propertySource instanceof EnumerablePropertySource<?>) {
49+
String[] propertyNames = ((EnumerablePropertySource<?>) propertySource).getPropertyNames();
50+
for (String name : propertyNames) {
51+
if (name.startsWith(SPRINGDOC_SPEC_PROPERTIES_PREFIX)) {
52+
return true;
53+
}
54+
}
55+
}
56+
}
57+
return false;
58+
}
59+
}
Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,29 +24,32 @@
2424

2525
package org.springdoc.core.configuration;
2626

27-
import org.springdoc.core.customizers.SpecificationStringPropertiesCustomizer;
27+
import java.util.List;
28+
29+
import org.springdoc.core.conditions.SpecPropertiesCondition;
30+
import org.springdoc.core.customizers.SpecPropertiesCustomizer;
2831
import org.springdoc.core.models.GroupedOpenApi;
32+
2933
import org.springframework.beans.factory.config.BeanPostProcessor;
3034
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
3135
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
32-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3336
import org.springframework.context.annotation.Bean;
37+
import org.springframework.context.annotation.Conditional;
3438
import org.springframework.context.annotation.Configuration;
3539
import org.springframework.context.annotation.Lazy;
3640
import org.springframework.core.env.PropertyResolver;
3741

38-
import java.util.List;
39-
4042
/**
4143
* The type Spring doc specification string properties configuration.
4244
*
4345
* @author Anton Tkachenko [email protected]
46+
* @author bnasslahsen
4447
*/
4548
@Lazy(false)
4649
@Configuration(proxyBeanMethods = false)
47-
@ConditionalOnProperty(name = "springdoc.api-docs.specification-string-properties")
50+
@Conditional(SpecPropertiesCondition.class)
4851
@ConditionalOnBean(SpringDocConfiguration.class)
49-
public class SpringDocSpecificationStringPropertiesConfiguration {
52+
public class SpringDocSpecPropertiesConfiguration {
5053

5154
/**
5255
* Springdoc customizer that takes care of the specification string properties customization.
@@ -57,10 +60,10 @@ public class SpringDocSpecificationStringPropertiesConfiguration {
5760
@Bean
5861
@ConditionalOnMissingBean
5962
@Lazy(false)
60-
SpecificationStringPropertiesCustomizer specificationStringPropertiesCustomizer(
63+
SpecPropertiesCustomizer specificationStringPropertiesCustomizer(
6164
PropertyResolver propertyResolverUtils
6265
) {
63-
return new SpecificationStringPropertiesCustomizer(propertyResolverUtils);
66+
return new SpecPropertiesCustomizer(propertyResolverUtils);
6467
}
6568

6669
/**
@@ -79,7 +82,10 @@ SpecificationStringPropertiesCustomizerBeanPostProcessor specificationStringProp
7982
}
8083

8184

82-
private static class SpecificationStringPropertiesCustomizerBeanPostProcessor implements BeanPostProcessor {
85+
/**
86+
* The type Specification string properties customizer bean post processor.
87+
*/
88+
private static class SpecificationStringPropertiesCustomizerBeanPostProcessor implements BeanPostProcessor {
8389

8490
private final PropertyResolver propertyResolverUtils;
8591

@@ -92,12 +98,13 @@ public SpecificationStringPropertiesCustomizerBeanPostProcessor(
9298
@Override
9399
public Object postProcessAfterInitialization(Object bean, String beanName) {
94100
if (bean instanceof GroupedOpenApi groupedOpenApi) {
95-
groupedOpenApi.addAllOpenApiCustomizer(List.of(new SpecificationStringPropertiesCustomizer(
101+
groupedOpenApi.addAllOpenApiCustomizer(List.of(new SpecPropertiesCustomizer(
96102
propertyResolverUtils, groupedOpenApi.getGroup()
97103
)));
98104
}
99105
return bean;
100106
}
101107
}
108+
102109

103110
}
Lines changed: 68 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -36,59 +36,78 @@
3636
import java.util.Map;
3737
import java.util.function.Consumer;
3838

39+
import static org.springdoc.core.utils.Constants.SPRINGDOC_SPEC_PROPERTIES_PREFIX;
40+
3941
/**
4042
* Allows externalizing strings in generated openapi schema via properties that follow
4143
* conventional naming similar or identical to <a href="https://swagger.io/docs/specification/basic-structure/">openapi schema</a>
4244
* <p>
4345
* To set value of a string in schema, define an application property that matches the target node
44-
* with springdoc.specification-strings prefix.
46+
* with springdoc.spec-properties prefix.
4547
* <p>
4648
* Sample supported properties for api-info customization:
4749
* <ul>
48-
* <li>springdoc.specification-strings.info.title - to set title of api-info</li>
49-
* <li>springdoc.specification-strings.info.description - to set description of api-info</li>
50-
* <li>springdoc.specification-strings.info.version - to set version of api-info</li>
51-
* <li>springdoc.specification-strings.info.termsOfService - to set terms of service of api-info</li>
50+
* <li>springdoc.spec-properties.info.title - to set title of api-info</li>
51+
* <li>springdoc.spec-properties.info.description - to set description of api-info</li>
52+
* <li>springdoc.spec-properties.info.version - to set version of api-info</li>
53+
* <li>springdoc.spec-properties.info.termsOfService - to set terms of service of api-info</li>
5254
* </ul>
5355
* <p>
5456
* Sample supported properties for components customization:
5557
* <ul>
56-
* <li>springdoc.specification-strings.components.User.description - to set description of User model</li>
57-
* <li>springdoc.specification-strings.components.User.properties.name.description - to set description of 'name' property</li>
58-
* <li>springdoc.specification-strings.components.User.properties.name.example - to set example of 'name' property</li>
58+
* <li>springdoc.spec-properties.components.User.description - to set description of User model</li>
59+
* <li>springdoc.spec-properties.components.User.properties.name.description - to set description of 'name' property</li>
60+
* <li>springdoc.spec-properties.components.User.properties.name.example - to set example of 'name' property</li>
5961
* </ul>
6062
* <p>
6163
* Sample supported properties for paths/operationIds customization:
6264
* <ul>
63-
* <li>springdoc.specification-strings.paths.{operationId}.description - to set description of {operationId}</li>
64-
* <li>springdoc.specification-strings.paths.{operationId}.summary - to set summary of {operationId}</li>
65+
* <li>springdoc.spec-properties.paths.{operationId}.description - to set description of {operationId}</li>
66+
* <li>springdoc.spec-properties.paths.{operationId}.summary - to set summary of {operationId}</li>
6567
* </ul>
6668
* <p>
6769
* Support for groped openapi customization is similar to the above, but with a group name prefix.
6870
* E.g.
6971
* <ul>
70-
* <li>springdoc.specification-strings.{group-name}.info.title - to set title of api-info</li>
71-
* <li>springdoc.specification-strings.{group-name}.components.User.description - to set description of User model</li>
72-
* <li>springdoc.specification-strings.{group-name}.paths.{operationId}.description - to set description of {operationId}</li>
72+
* <li>springdoc.spec-properties.{group-name}.info.title - to set title of api-info</li>
73+
* <li>springdoc.spec-properties.{group-name}.components.User.description - to set description of User model</li>
74+
* <li>springdoc.spec-properties.{group-name}.paths.{operationId}.description - to set description of {operationId}</li>
7375
* </ul>
7476
*
7577
* @author Anton Tkachenko [email protected]
78+
* @author bnasslahsen
7679
*/
77-
public class SpecificationStringPropertiesCustomizer implements GlobalOpenApiCustomizer {
78-
79-
private static final String SPECIFICATION_STRINGS_PREFIX = "springdoc.specification-strings.";
80-
81-
private final PropertyResolver propertyResolver;
82-
private final String propertyPrefix;
83-
84-
public SpecificationStringPropertiesCustomizer(PropertyResolver resolverUtils) {
80+
public class SpecPropertiesCustomizer implements GlobalOpenApiCustomizer {
81+
82+
/**
83+
* The Property resolver.
84+
*/
85+
private final PropertyResolver propertyResolver;
86+
87+
/**
88+
* The Property prefix.
89+
*/
90+
private final String propertyPrefix;
91+
92+
/**
93+
* Instantiates a new Spec properties customizer.
94+
*
95+
* @param resolverUtils the resolver utils
96+
*/
97+
public SpecPropertiesCustomizer(PropertyResolver resolverUtils) {
8598
this.propertyResolver = resolverUtils;
86-
this.propertyPrefix = SPECIFICATION_STRINGS_PREFIX;
99+
this.propertyPrefix = SPRINGDOC_SPEC_PROPERTIES_PREFIX;
87100
}
88101

89-
public SpecificationStringPropertiesCustomizer(PropertyResolver propertyResolver, String groupName) {
102+
/**
103+
* Instantiates a new Spec properties customizer.
104+
*
105+
* @param propertyResolver the property resolver
106+
* @param groupName the group name
107+
*/
108+
public SpecPropertiesCustomizer(PropertyResolver propertyResolver, String groupName) {
90109
this.propertyResolver = propertyResolver;
91-
this.propertyPrefix = SPECIFICATION_STRINGS_PREFIX + groupName + ".";
110+
this.propertyPrefix = SPRINGDOC_SPEC_PROPERTIES_PREFIX + groupName + ".";
92111
}
93112

94113
@Override
@@ -98,7 +117,12 @@ public void customise(OpenAPI openApi) {
98117
setPathsProperties(openApi);
99118
}
100119

101-
private void setOperationInfoProperties(OpenAPI openApi) {
120+
/**
121+
* Sets operation info properties.
122+
*
123+
* @param openApi the open api
124+
*/
125+
private void setOperationInfoProperties(OpenAPI openApi) {
102126
if (openApi.getInfo() == null) {
103127
openApi.setInfo(new Info());
104128
}
@@ -109,7 +133,12 @@ private void setOperationInfoProperties(OpenAPI openApi) {
109133
resolveString(info::setTermsOfService, "info.termsOfService");
110134
}
111135

112-
private void setPathsProperties(OpenAPI openApi) {
136+
/**
137+
* Sets paths properties.
138+
*
139+
* @param openApi the open api
140+
*/
141+
private void setPathsProperties(OpenAPI openApi) {
113142
Paths paths = openApi.getPaths();
114143
if (CollectionUtils.isEmpty(paths.values())) {
115144
return;
@@ -126,7 +155,12 @@ private void setPathsProperties(OpenAPI openApi) {
126155
}
127156
}
128157

129-
private void setComponentsProperties(OpenAPI openApi) {
158+
/**
159+
* Sets components properties.
160+
*
161+
* @param openApi the open api
162+
*/
163+
private void setComponentsProperties(OpenAPI openApi) {
130164
Components components = openApi.getComponents();
131165
if (components == null || CollectionUtils.isEmpty(components.getSchemas())) {
132166
return;
@@ -152,7 +186,13 @@ private void setComponentsProperties(OpenAPI openApi) {
152186
}
153187
}
154188

155-
private void resolveString(
189+
/**
190+
* Resolve string.
191+
*
192+
* @param setter the setter
193+
* @param node the node
194+
*/
195+
private void resolveString(
156196
Consumer<String> setter, String node
157197
) {
158198
String nodeWithPrefix = propertyPrefix + node;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,9 @@ public final class Constants {
105105
public static final String SPRINGDOC_SCHEMA_RESOLVE_PROPERTIES = "springdoc.api-docs.resolve-schema-properties";
106106

107107
/**
108-
* The constant SPRINGDOC_SPECIFICATION_STRING_PROPERTIES.
108+
* The constant SPRINGDOC_SPEC_PROPERTIES_PREFIX.
109109
*/
110-
public static final String SPRINGDOC_SPECIFICATION_STRING_PROPERTIES = "springdoc.api-docs.specification-string-properties";
110+
public static final String SPRINGDOC_SPEC_PROPERTIES_PREFIX = "springdoc.spec-properties.";
111111

112112
/**
113113
* The constant SPRINGDOC_SHOW_LOGIN_ENDPOINT.

springdoc-openapi-starter-common/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ org.springdoc.core.configuration.SpringDocFunctionCatalogConfiguration
77
org.springdoc.core.configuration.SpringDocHateoasConfiguration
88
org.springdoc.core.configuration.SpringDocPageableConfiguration
99
org.springdoc.core.configuration.SpringDocSortConfiguration
10-
org.springdoc.core.configuration.SpringDocSpecificationStringPropertiesConfiguration
10+
org.springdoc.core.configuration.SpringDocSpecPropertiesConfiguration
1111
org.springdoc.core.configuration.SpringDocDataRestConfiguration
1212
org.springdoc.core.configuration.SpringDocKotlinConfiguration
1313
org.springdoc.core.configuration.SpringDocKotlinxConfiguration
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
*
1717
*/
1818

19-
package test.org.springdoc.api.app212;
19+
package test.org.springdoc.api.v30.app212;
2020

2121
import org.springframework.web.bind.annotation.GetMapping;
2222
import org.springframework.web.bind.annotation.RestController;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
*
1717
*/
1818

19-
package test.org.springdoc.api.app212;
19+
package test.org.springdoc.api.v30.app212;
2020

2121
public record PersonDTO(String name) {
2222
}
Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,16 @@
1616
*
1717
*/
1818

19-
package test.org.springdoc.api.app212;
19+
package test.org.springdoc.api.v30.app212;
2020

2121
import org.junit.jupiter.api.Test;
22+
import org.springdoc.core.customizers.SpecPropertiesCustomizer;
2223
import org.springdoc.core.models.GroupedOpenApi;
24+
import test.org.springdoc.api.v30.AbstractSpringDocV30Test;
25+
2326
import org.springframework.boot.autoconfigure.SpringBootApplication;
2427
import org.springframework.context.annotation.Bean;
2528
import org.springframework.test.context.ActiveProfiles;
26-
import test.org.springdoc.api.AbstractSpringDocTest;
2729

2830
import static org.skyscreamer.jsonassert.JSONAssert.assertEquals;
2931
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
@@ -32,10 +34,10 @@
3234
/**
3335
* The type Spring doc app 192 test.
3436
* <p>
35-
* A test for {@link org.springdoc.core.customizers.SpecificationStringPropertiesCustomizer}
37+
* A test for {@link SpecPropertiesCustomizer}
3638
*/
3739
@ActiveProfiles("212")
38-
public class SpringDocApp212Test extends AbstractSpringDocTest {
40+
public class SpringDocApp212Test extends AbstractSpringDocV30Test {
3941

4042
/**
4143
* The type Spring doc test app.
@@ -47,7 +49,7 @@ static class SpringDocTestApp {
4749
GroupedOpenApi apiGroupBeanName() {
4850
return GroupedOpenApi.builder()
4951
.group("apiGroupName")
50-
.packagesToScan("test.org.springdoc.api.app212")
52+
.packagesToScan("test.org.springdoc.api.v30.app212")
5153
.build();
5254
}
5355
}
@@ -57,7 +59,7 @@ void getGroupedOpenapi_shouldCustomizeFromPropertiesWithGroupNamePrefix() throws
5759
String result = mockMvc.perform(get("/v3/api-docs/apiGroupName"))
5860
.andExpect(status().isOk())
5961
.andReturn().getResponse().getContentAsString();
60-
String expected = getContent("results/app212-grouped.json");
62+
String expected = getContent("results/3.0.1/app212-grouped.json");
6163
assertEquals(expected, result, true);
6264
}
6365

0 commit comments

Comments
 (0)