Skip to content

Commit 3f7dde6

Browse files
committed
code review
1 parent da735b0 commit 3f7dde6

File tree

11 files changed

+180
-200
lines changed

11 files changed

+180
-200
lines changed

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

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222

2323
import java.util.ArrayList;
2424
import java.util.Arrays;
25+
import java.util.Collection;
26+
import java.util.Collections;
2527
import java.util.List;
2628
import java.util.Objects;
2729

@@ -463,11 +465,38 @@ public GroupedOpenApi build() {
463465
}
464466

465467
/**
466-
* Add open api customiser.
468+
* Add all open api customizer grouped open api.
467469
*
468-
* @param openApiCustomiser the open api customiser
470+
* @param openApiCustomizerCollection the open api customizer collection
471+
* @return the grouped open api
469472
*/
470-
public void addOpenApiCustomizer(OpenApiCustomiser openApiCustomiser) {
471-
this.openApiCustomisers.add(openApiCustomiser);
473+
public GroupedOpenApi addAllOpenApiCustomizer(Collection openApiCustomizerCollection) {
474+
this.openApiCustomisers.addAll(openApiCustomizerCollection);
475+
Collections.reverse(openApiCustomisers);
476+
return this;
477+
}
478+
479+
/**
480+
* Add all operation customizer grouped open api.
481+
*
482+
* @param operationCustomizerCollection the operation customizer collection
483+
* @return the grouped open api
484+
*/
485+
public GroupedOpenApi addAllOperationCustomizer(Collection operationCustomizerCollection) {
486+
this.operationCustomizers.addAll(operationCustomizerCollection);
487+
Collections.reverse(operationCustomizers);
488+
return this;
489+
}
490+
491+
/**
492+
* Add all open api method filter grouped open api.
493+
*
494+
* @param openApiMethodFilterCollection the open api method filter collection
495+
* @return the grouped open api
496+
*/
497+
public GroupedOpenApi addAllOpenApiMethodFilter(Collection openApiMethodFilterCollection) {
498+
this.openApiMethodFilters.addAll(openApiMethodFilterCollection);
499+
Collections.reverse(openApiMethodFilters);
500+
return this;
472501
}
473502
}

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

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,12 @@
4949
import org.springdoc.core.customizers.ActuatorOperationCustomizer;
5050
import org.springdoc.core.customizers.DataRestDelegatingMethodParameterCustomizer;
5151
import org.springdoc.core.customizers.DelegatingMethodParameterCustomizer;
52-
import org.springdoc.core.customizers.GlobalOpenApiCustomiser;
53-
import org.springdoc.core.customizers.GlobalOperationCustomizer;
52+
import org.springdoc.core.customizers.GlobalOpenApiCustomizer;
5453
import org.springdoc.core.customizers.OpenApiBuilderCustomizer;
5554
import org.springdoc.core.customizers.OpenApiCustomiser;
55+
import org.springdoc.core.customizers.OperationCustomizer;
5656
import org.springdoc.core.customizers.PropertyCustomizer;
5757
import org.springdoc.core.customizers.ServerBaseUrlCustomizer;
58-
import org.springdoc.core.filters.GlobalOpenApiMethodFilter;
5958
import org.springdoc.core.providers.ActuatorProvider;
6059
import org.springdoc.core.providers.CloudFunctionProvider;
6160
import org.springdoc.core.providers.JavadocProvider;
@@ -87,7 +86,6 @@
8786
import org.springframework.context.annotation.Conditional;
8887
import org.springframework.context.annotation.Configuration;
8988
import org.springframework.context.annotation.Lazy;
90-
import org.springframework.context.annotation.Scope;
9189
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
9290
import org.springframework.core.convert.support.GenericConversionService;
9391
import org.springframework.data.domain.Pageable;
@@ -112,7 +110,6 @@
112110
/**
113111
* The type Spring doc configuration.
114112
* @author bnasslahsen
115-
* @author christophejan
116113
*/
117114
@Lazy(false)
118115
@Configuration(proxyBeanMethods = false)
@@ -345,7 +342,7 @@ GenericParameterService parameterBuilder(PropertyResolverUtils propertyResolverU
345342
@Bean
346343
@ConditionalOnProperty(SPRINGDOC_SCHEMA_RESOLVE_PROPERTIES)
347344
@Lazy(false)
348-
OpenApiCustomiser propertiesResolverForSchema(PropertyResolverUtils propertyResolverUtils) {
345+
GlobalOpenApiCustomizer propertiesResolverForSchema(PropertyResolverUtils propertyResolverUtils) {
349346
return openApi -> {
350347
Components components = openApi.getComponents();
351348
Map<String, Schema> schemas = components.getSchemas();
@@ -363,7 +360,7 @@ OpenApiCustomiser propertiesResolverForSchema(PropertyResolverUtils propertyReso
363360
@Conditional(CacheOrGroupedOpenApiCondition.class)
364361
@ConditionalOnClass(name = BINDRESULT_CLASS)
365362
@Lazy(false)
366-
static SpringdocBeanFactoryConfigurer springdocBeanFactoryPostProcessor() {
363+
static BeanFactoryPostProcessor springdocBeanFactoryPostProcessor() {
367364
return new SpringdocBeanFactoryConfigurer();
368365
}
369366

@@ -401,18 +398,6 @@ SpringDocProviders springDocProviders(Optional<ActuatorProvider> actuatorProvide
401398
return new SpringDocProviders(actuatorProvider, springCloudFunctionProvider, springSecurityOAuth2Provider, repositoryRestResourceProvider, routerFunctionProvider, springWebProvider);
402399
}
403400

404-
@Bean
405-
@Scope("prototype")
406-
@ConditionalOnMissingBean
407-
public GroupedOpenApi.Builder groupedOpenApiBuilder(List<GlobalOpenApiCustomiser> globalOpenApiCustomisers, List<GlobalOperationCustomizer> globalOperationCustomizers,
408-
List<GlobalOpenApiMethodFilter> globalOpenApiMethodFilters) {
409-
GroupedOpenApi.Builder builder = GroupedOpenApi.builder();
410-
globalOpenApiCustomisers.forEach(builder::addOpenApiCustomiser);
411-
globalOperationCustomizers.forEach(builder::addOperationCustomizer);
412-
globalOpenApiMethodFilters.forEach(builder::addOpenApiMethodFilter);
413-
return builder;
414-
}
415-
416401
/**
417402
* The type Open api resource advice.
418403
* @author bnasslashen
@@ -444,14 +429,15 @@ static class SpringDocActuatorConfiguration {
444429
/**
445430
* Springdoc bean factory post processor 3 bean factory post processor.
446431
*
432+
* @param groupedOpenApis the grouped open apis
447433
* @return the bean factory post processor
448434
*/
449435
@Bean
450436
@Lazy(false)
451437
@ConditionalOnManagementPort(ManagementPortType.DIFFERENT)
452438
@Conditional(MultipleOpenApiSupportCondition.class)
453-
static SpringdocActuatorBeanFactoryConfigurer springdocBeanFactoryPostProcessor3() {
454-
return new SpringdocActuatorBeanFactoryConfigurer();
439+
static BeanFactoryPostProcessor springdocBeanFactoryPostProcessor3(List<GroupedOpenApi> groupedOpenApis) {
440+
return new SpringdocActuatorBeanFactoryConfigurer(groupedOpenApis);
455441
}
456442

457443
/**
@@ -462,7 +448,7 @@ static SpringdocActuatorBeanFactoryConfigurer springdocBeanFactoryPostProcessor3
462448
@Bean
463449
@Lazy(false)
464450
@ConditionalOnManagementPort(ManagementPortType.SAME)
465-
ActuatorOperationCustomizer actuatorCustomizer() {
451+
OperationCustomizer actuatorCustomizer() {
466452
return new ActuatorOperationCustomizer();
467453
}
468454

@@ -475,7 +461,7 @@ ActuatorOperationCustomizer actuatorCustomizer() {
475461
@Bean
476462
@Lazy(false)
477463
@ConditionalOnManagementPort(ManagementPortType.SAME)
478-
ActuatorOpenApiCustomizer actuatorOpenApiCustomiser(WebEndpointProperties webEndpointProperties) {
464+
OpenApiCustomiser actuatorOpenApiCustomiser(WebEndpointProperties webEndpointProperties) {
479465
return new ActuatorOpenApiCustomizer(webEndpointProperties);
480466
}
481467

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

Lines changed: 44 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
*
33
* *
44
* * *
5-
* * * * Copyright 2019-2022 the original author or authors.
5+
* * * * Copyright 2019-2020 the original author or authors.
66
* * * *
77
* * * * Licensed under the Apache License, Version 2.0 (the "License");
88
* * * * you may not use this file except in compliance with the License.
@@ -23,20 +23,17 @@
2323

2424
package org.springdoc.core;
2525

26+
import java.util.ArrayList;
27+
import java.util.List;
28+
2629
import org.springdoc.core.customizers.ActuatorOpenApiCustomizer;
2730
import org.springdoc.core.customizers.ActuatorOperationCustomizer;
28-
import org.springframework.beans.BeansException;
31+
2932
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
30-
import org.springframework.beans.factory.config.RuntimeBeanReference;
31-
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
32-
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
33-
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
3433
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
3534
import org.springframework.boot.context.properties.bind.BindResult;
3635
import org.springframework.boot.context.properties.bind.Binder;
37-
import org.springframework.context.ApplicationContext;
38-
import org.springframework.context.ApplicationContextAware;
39-
import org.springframework.util.ObjectUtils;
36+
import org.springframework.util.CollectionUtils;
4037

4138
import static org.springdoc.core.Constants.ACTUATOR_DEFAULT_GROUP;
4239
import static org.springdoc.core.Constants.ALL_PATTERN;
@@ -47,99 +44,58 @@
4744
/**
4845
* The type Springdoc bean factory configurer.
4946
* @author bnasslahsen
50-
* @author christophejan
5147
*/
52-
public class SpringdocActuatorBeanFactoryConfigurer implements ApplicationContextAware, BeanDefinitionRegistryPostProcessor {
48+
public class SpringdocActuatorBeanFactoryConfigurer extends SpringdocBeanFactoryConfigurer{
5349

5450
/**
55-
* The ApplicationContext.
51+
* The Grouped open apis.
5652
*/
57-
protected ApplicationContext applicationContext;
53+
private List<GroupedOpenApi> groupedOpenApis;
5854

59-
@Override
60-
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
61-
this.applicationContext = applicationContext;
55+
/**
56+
* Instantiates a new Springdoc actuator bean factory configurer.
57+
*
58+
* @param groupedOpenApis the grouped open apis
59+
*/
60+
public SpringdocActuatorBeanFactoryConfigurer(List<GroupedOpenApi> groupedOpenApis) {
61+
this.groupedOpenApis = groupedOpenApis;
6262
}
6363

6464
@Override
65-
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
66-
final BindResult<WebEndpointProperties> result = Binder.get(applicationContext.getEnvironment())
65+
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
66+
final BindResult<WebEndpointProperties> result = Binder.get(environment)
6767
.bind(MANAGEMENT_ENDPOINTS_WEB, WebEndpointProperties.class);
6868
if (result.isBound()) {
6969
WebEndpointProperties webEndpointProperties = result.get();
7070

71-
boolean addDefaultGroup = ObjectUtils.isEmpty(applicationContext
72-
.getBeanNamesForType(GroupedOpenApi.class, true, false));
73-
74-
registry.registerBeanDefinition("actuatorOpenApiCustomiser", BeanDefinitionBuilder
75-
.genericBeanDefinition(ActuatorOpenApiCustomizer.class)
76-
.addConstructorArgValue(webEndpointProperties)
77-
.getBeanDefinition());
78-
79-
registry.registerBeanDefinition("actuatorCustomizer", BeanDefinitionBuilder
80-
.genericBeanDefinition(ActuatorOperationCustomizer.class)
81-
.getBeanDefinition());
82-
83-
// register the actuator group bean definition
84-
registry.registerBeanDefinition(ACTUATOR_DEFAULT_GROUP, BeanDefinitionBuilder
85-
.genericBeanDefinition(SpringdocActuatorBeanFactoryConfigurer.class)
86-
.setFactoryMethod("actuatorGroupFactoryMethod")
87-
.addConstructorArgValue(new RuntimeBeanReference(GroupedOpenApi.Builder.class))
88-
.addConstructorArgValue(webEndpointProperties.getBasePath())
89-
.addConstructorArgValue(new RuntimeBeanReference(ActuatorOpenApiCustomizer.class))
90-
.addConstructorArgValue(new RuntimeBeanReference(ActuatorOperationCustomizer.class))
91-
.getBeanDefinition());
92-
93-
if (addDefaultGroup) {
94-
// register the default group bean definition
95-
registry.registerBeanDefinition(DEFAULT_GROUP_NAME, BeanDefinitionBuilder
96-
.genericBeanDefinition(SpringdocActuatorBeanFactoryConfigurer.class)
97-
.setFactoryMethod("defaultGroupFactoryMethod")
98-
.addConstructorArgValue(new RuntimeBeanReference(GroupedOpenApi.Builder.class))
99-
.addConstructorArgValue(webEndpointProperties.getBasePath())
100-
.getBeanDefinition());
71+
List<GroupedOpenApi> newGroups = new ArrayList<>();
72+
73+
ActuatorOpenApiCustomizer actuatorOpenApiCustomiser = new ActuatorOpenApiCustomizer(webEndpointProperties);
74+
beanFactory.registerSingleton("actuatorOpenApiCustomiser", actuatorOpenApiCustomiser);
75+
ActuatorOperationCustomizer actuatorCustomizer = new ActuatorOperationCustomizer();
76+
beanFactory.registerSingleton("actuatorCustomizer", actuatorCustomizer);
77+
78+
GroupedOpenApi actuatorGroup = GroupedOpenApi.builder().group(ACTUATOR_DEFAULT_GROUP)
79+
.pathsToMatch(webEndpointProperties.getBasePath() + ALL_PATTERN)
80+
.pathsToExclude(webEndpointProperties.getBasePath() + HEALTH_PATTERN)
81+
.addOperationCustomizer(actuatorCustomizer)
82+
.addOpenApiCustomiser(actuatorOpenApiCustomiser)
83+
.build();
84+
// Add the actuator group
85+
newGroups.add(actuatorGroup);
86+
87+
if (CollectionUtils.isEmpty(groupedOpenApis)) {
88+
GroupedOpenApi defaultGroup = GroupedOpenApi.builder().group(DEFAULT_GROUP_NAME)
89+
.pathsToMatch(ALL_PATTERN)
90+
.pathsToExclude(webEndpointProperties.getBasePath() + ALL_PATTERN)
91+
.build();
92+
// Register the default group
93+
newGroups.add(defaultGroup);
10194
}
102-
}
103-
}
10495

105-
@Override
106-
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
107-
SpringdocBeanFactoryConfigurer.initBeanFactoryPostProcessor(beanFactory);
108-
}
109-
110-
/**
111-
* Actuator {@link GroupedOpenApi} factory method.
112-
*
113-
* @param builder the {@link GroupedOpenApi.Builder}
114-
* @param actuatorBasePath the actuator base path
115-
* @param actuatorOpenApiCustomiser the {@link ActuatorOpenApiCustomizer}
116-
* @param actuatorOperationCustomizer the {@link ActuatorOperationCustomizer}
117-
*
118-
* @return the actuator {@link GroupedOpenApi}
119-
*/
120-
public static GroupedOpenApi actuatorGroupFactoryMethod(GroupedOpenApi.Builder builder, String actuatorBasePath,
121-
ActuatorOpenApiCustomizer actuatorOpenApiCustomiser, ActuatorOperationCustomizer actuatorOperationCustomizer) {
122-
return builder.group(ACTUATOR_DEFAULT_GROUP)
123-
.pathsToMatch(actuatorBasePath + ALL_PATTERN)
124-
.pathsToExclude(actuatorBasePath + HEALTH_PATTERN)
125-
.addOpenApiCustomiser(actuatorOpenApiCustomiser)
126-
.addOperationCustomizer(actuatorOperationCustomizer)
127-
.build();
128-
}
129-
130-
/**
131-
* Default {@link GroupedOpenApi} factory method.
132-
*
133-
* @param builder the {@link GroupedOpenApi.Builder}
134-
* @param actuatorBasePath the actuator base path
135-
*
136-
* @return the default {@link GroupedOpenApi}
137-
*/
138-
public static GroupedOpenApi defaultGroupFactoryMethod(GroupedOpenApi.Builder builder, String actuatorBasePath) {
139-
return builder.group(DEFAULT_GROUP_NAME)
140-
.pathsToMatch(ALL_PATTERN)
141-
.pathsToExclude(actuatorBasePath + ALL_PATTERN)
142-
.build();
96+
newGroups.forEach(elt -> beanFactory.registerSingleton(elt.getGroup(), elt));
97+
}
98+
initBeanFactoryPostProcessor(beanFactory);
14399
}
144100

145101
}

0 commit comments

Comments
 (0)