Skip to content

Commit

Permalink
Ordering of GlobalOpenApiCustomizers different than for OpenApiCustom…
Browse files Browse the repository at this point in the history
…isers. Fixes #2107
  • Loading branch information
bnasslahsen committed Mar 8, 2023
1 parent e88429b commit 53ca7f4
Show file tree
Hide file tree
Showing 17 changed files with 432 additions and 69 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
import org.springdoc.core.customizers.RouterOperationCustomizer;
import org.springdoc.core.customizers.ServerBaseUrlCustomizer;
import org.springdoc.core.customizers.SpringDocCustomizers;
import org.springdoc.core.filters.GlobalOpenApiMethodFilter;
import org.springdoc.core.filters.OpenApiMethodFilter;
import org.springdoc.core.providers.ActuatorProvider;
import org.springdoc.core.providers.CloudFunctionProvider;
Expand Down Expand Up @@ -685,6 +686,9 @@ public ResponseEntity<ErrorMessage> handleNoHandlerFound(OpenApiResourceNotFound
* @param routerOperationCustomizers the router operation customizers
* @param dataRestRouterOperationCustomizers the data rest router operation customizers
* @param methodFilters the method filters
* @param globalOpenApiCustomizers the global open api customizers
* @param globalOperationCustomizers the global operation customizers
* @param globalOpenApiMethodFilters the global open api method filters
* @return the spring doc customizers
*/
@Bean
Expand All @@ -694,11 +698,15 @@ public SpringDocCustomizers springDocCustomizers(Optional<List<OpenApiCustomiser
Optional<List<OperationCustomizer>> operationCustomizers,
Optional<List<RouterOperationCustomizer>> routerOperationCustomizers,
Optional<List<DataRestRouterOperationCustomizer>> dataRestRouterOperationCustomizers,
Optional<List<OpenApiMethodFilter>> methodFilters){
Optional<List<OpenApiMethodFilter>> methodFilters, Optional<List<GlobalOpenApiCustomizer>> globalOpenApiCustomizers,
Optional<List<GlobalOperationCustomizer>> globalOperationCustomizers,
Optional<List<GlobalOpenApiMethodFilter>> globalOpenApiMethodFilters){
return new SpringDocCustomizers(openApiCustomizers,
operationCustomizers,
routerOperationCustomizers,
dataRestRouterOperationCustomizers,
methodFilters);
methodFilters, globalOpenApiCustomizers,
globalOperationCustomizers,
globalOpenApiMethodFilters);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import java.util.Objects;
import java.util.Optional;

import org.springdoc.core.filters.GlobalOpenApiMethodFilter;
import org.springdoc.core.filters.OpenApiMethodFilter;

import org.springframework.beans.BeansException;
Expand All @@ -39,6 +40,8 @@
import static org.springdoc.core.Constants.LINKS_SCHEMA_CUSTOMISER;

/**
* The type Spring doc customizers.
*
* @author bnasslahsen
*/
public class SpringDocCustomizers implements ApplicationContextAware, InitializingBean {
Expand All @@ -65,6 +68,9 @@ public class SpringDocCustomizers implements ApplicationContextAware, Initializi
private final Optional<List<DataRestRouterOperationCustomizer>> dataRestRouterOperationCustomizers;


/**
* The Context.
*/
private ApplicationContext context;

/**
Expand All @@ -73,6 +79,21 @@ public class SpringDocCustomizers implements ApplicationContextAware, Initializi
private final Optional<List<OpenApiMethodFilter>> methodFilters;


/**
* The Global open api customizers.
*/
private Optional<List<GlobalOpenApiCustomizer>> globalOpenApiCustomizers;

/**
* The Global operation customizers.
*/
private Optional<List<GlobalOperationCustomizer>> globalOperationCustomizers;

/**
* The Global open api method filters.
*/
private Optional<List<GlobalOpenApiMethodFilter>> globalOpenApiMethodFilters;

/**
* Instantiates a new Spring doc customizers.
*
Expand All @@ -81,14 +102,22 @@ public class SpringDocCustomizers implements ApplicationContextAware, Initializi
* @param routerOperationCustomizers the router operation customizers
* @param dataRestRouterOperationCustomizers the data rest router operation customizers
* @param methodFilters the method filters
* @param globalOpenApiCustomizers the global open api customizers
* @param globalOperationCustomizers the global operation customizers
* @param globalOpenApiMethodFilters the global open api method filters
*/
public SpringDocCustomizers(Optional<List<OpenApiCustomiser>> openApiCustomizers,
Optional<List<OperationCustomizer>> operationCustomizers,
Optional<List<RouterOperationCustomizer>> routerOperationCustomizers,
Optional<List<DataRestRouterOperationCustomizer>> dataRestRouterOperationCustomizers,
Optional<List<OpenApiMethodFilter>> methodFilters) {
Optional<List<OpenApiMethodFilter>> methodFilters, Optional<List<GlobalOpenApiCustomizer>> globalOpenApiCustomizers,
Optional<List<GlobalOperationCustomizer>> globalOperationCustomizers,
Optional<List<GlobalOpenApiMethodFilter>> globalOpenApiMethodFilters) {
this.openApiCustomizers = openApiCustomizers;
this.operationCustomizers = operationCustomizers;
this.globalOpenApiCustomizers = globalOpenApiCustomizers;
this.globalOperationCustomizers = globalOperationCustomizers;
this.globalOpenApiMethodFilters = globalOpenApiMethodFilters;
operationCustomizers.ifPresent(customizers -> customizers.removeIf(Objects::isNull));
this.routerOperationCustomizers = routerOperationCustomizers;
this.dataRestRouterOperationCustomizers = dataRestRouterOperationCustomizers;
Expand All @@ -112,22 +141,47 @@ public SpringDocCustomizers(Optional<List<OpenApiCustomiser>> openApiCustomizers
this.dataRestRouterOperationCustomizers = Optional.empty();
}

/**
* Gets open api customizers.
*
* @return the open api customizers
*/
public Optional<List<OpenApiCustomiser>> getOpenApiCustomizers() {
return openApiCustomizers;
}

/**
* Gets operation customizers.
*
* @return the operation customizers
*/
public Optional<List<OperationCustomizer>> getOperationCustomizers() {
return operationCustomizers;
}

/**
* Gets router operation customizers.
*
* @return the router operation customizers
*/
public Optional<List<RouterOperationCustomizer>> getRouterOperationCustomizers() {
return routerOperationCustomizers;
}

/**
* Gets data rest router operation customizers.
*
* @return the data rest router operation customizers
*/
public Optional<List<DataRestRouterOperationCustomizer>> getDataRestRouterOperationCustomizers() {
return dataRestRouterOperationCustomizers;
}

/**
* Gets method filters.
*
* @return the method filters
*/
public Optional<List<OpenApiMethodFilter>> getMethodFilters() {
return methodFilters;
}
Expand All @@ -144,4 +198,31 @@ public void afterPropertiesSet() {
if (!CollectionUtils.isEmpty(existingOpenApiCustomizers) && existingOpenApiCustomizers.containsKey(LINKS_SCHEMA_CUSTOMISER))
this.openApiCustomizers.ifPresent(openApiCustomizersList -> openApiCustomizersList.add(existingOpenApiCustomizers.get(LINKS_SCHEMA_CUSTOMISER)));
}

/**
* Gets global open api customizers.
*
* @return the global open api customizers
*/
public Optional<List<GlobalOpenApiCustomizer>> getGlobalOpenApiCustomizers() {
return globalOpenApiCustomizers;
}

/**
* Gets global operation customizers.
*
* @return the global operation customizers
*/
public Optional<List<GlobalOperationCustomizer>> getGlobalOperationCustomizers() {
return globalOperationCustomizers;
}

/**
* Gets global open api method filters.
*
* @return the global open api method filters
*/
public Optional<List<GlobalOpenApiMethodFilter>> getGlobalOpenApiMethodFilters() {
return globalOpenApiMethodFilters;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationServerMetadata;
import org.springframework.security.oauth2.server.authorization.OAuth2TokenIntrospection;
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationConsentAuthenticationToken;
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenIntrospectionAuthenticationToken;
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenRevocationAuthenticationToken;
import org.springframework.security.oauth2.server.authorization.web.NimbusJwkSetEndpointFilter;
import org.springframework.security.oauth2.server.authorization.web.OAuth2AuthorizationEndpointFilter;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import org.springdoc.core.OperationService;
import org.springdoc.core.SpringDocConfigProperties;
import org.springdoc.core.SpringDocProviders;
import org.springdoc.core.customizers.SpringDocCustomizers;
import reactor.core.publisher.Mono;

import org.springframework.beans.factory.ObjectFactory;
Expand All @@ -59,16 +60,20 @@ public class MultipleOpenApiActuatorResource extends MultipleOpenApiResource {

/**
* Instantiates a new Multiple open api resource.
*
* @param groupedOpenApis the grouped open apis
* @param defaultOpenAPIBuilder the default open api builder
* @param requestBuilder the request builder
* @param responseBuilder the response builder
* @param operationParser the operation parser
* @param springDocConfigProperties the spring doc config properties
* @param springDocProviders the spring doc providers
* @param springDocCustomizers the spring doc customizers
*/
public MultipleOpenApiActuatorResource(List<GroupedOpenApi> groupedOpenApis, ObjectFactory<OpenAPIService> defaultOpenAPIBuilder, AbstractRequestService requestBuilder, GenericResponseService responseBuilder, OperationService operationParser, SpringDocConfigProperties springDocConfigProperties, SpringDocProviders springDocProviders) {
super(groupedOpenApis, defaultOpenAPIBuilder, requestBuilder, responseBuilder, operationParser, springDocConfigProperties, springDocProviders);
public MultipleOpenApiActuatorResource(List<GroupedOpenApi> groupedOpenApis, ObjectFactory<OpenAPIService> defaultOpenAPIBuilder, AbstractRequestService requestBuilder,
GenericResponseService responseBuilder, OperationService operationParser, SpringDocConfigProperties springDocConfigProperties,
SpringDocProviders springDocProviders, SpringDocCustomizers springDocCustomizers) {
super(groupedOpenApis, defaultOpenAPIBuilder, requestBuilder, responseBuilder, operationParser, springDocConfigProperties, springDocProviders, springDocCustomizers);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,24 +36,18 @@
import org.springdoc.core.SpringDocConfigProperties;
import org.springdoc.core.SpringDocConfigProperties.GroupConfig;
import org.springdoc.core.SpringDocProviders;
import org.springdoc.core.customizers.GlobalOpenApiCustomizer;
import org.springdoc.core.customizers.GlobalOperationCustomizer;
import org.springdoc.core.customizers.SpringDocCustomizers;
import org.springdoc.core.filters.GlobalOpenApiMethodFilter;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

import static org.springdoc.core.Constants.ACTUATOR_DEFAULT_GROUP;

/**
* The type Multiple open api resource.
* @author bnasslahsen
*/
public abstract class MultipleOpenApiResource implements InitializingBean, ApplicationContextAware {
public abstract class MultipleOpenApiResource implements InitializingBean {

/**
* The Grouped open apis.
Expand Down Expand Up @@ -90,16 +84,15 @@ public abstract class MultipleOpenApiResource implements InitializingBean, Appli
*/
private final SpringDocProviders springDocProviders;

/**
* The Application context.
*/
protected ApplicationContext applicationContext;

/**
* The Grouped open api resources.
*/
private Map<String, OpenApiResource> groupedOpenApiResources;

/**
* The Spring doc customizers.
*/
private final SpringDocCustomizers springDocCustomizers;

/**
* Instantiates a new Multiple open api resource.
Expand All @@ -111,11 +104,13 @@ public abstract class MultipleOpenApiResource implements InitializingBean, Appli
* @param operationParser the operation parser
* @param springDocConfigProperties the spring doc config properties
* @param springDocProviders the spring doc providers
* @param springDocCustomizers the spring doc customizers
*/
protected MultipleOpenApiResource(List<GroupedOpenApi> groupedOpenApis,
ObjectFactory<OpenAPIService> defaultOpenAPIBuilder, AbstractRequestService requestBuilder,
GenericResponseService responseBuilder, OperationService operationParser,
SpringDocConfigProperties springDocConfigProperties, SpringDocProviders springDocProviders) {
SpringDocConfigProperties springDocConfigProperties,
SpringDocProviders springDocProviders, SpringDocCustomizers springDocCustomizers) {

this.groupedOpenApis = groupedOpenApis;
this.defaultOpenAPIBuilder = defaultOpenAPIBuilder;
Expand All @@ -124,18 +119,16 @@ protected MultipleOpenApiResource(List<GroupedOpenApi> groupedOpenApis,
this.operationParser = operationParser;
this.springDocConfigProperties = springDocConfigProperties;
this.springDocProviders = springDocProviders;
this.springDocCustomizers = springDocCustomizers;
}

@Override
public void afterPropertiesSet() {
Map<String, GlobalOpenApiCustomizer> globalOpenApiCustomizerMap = applicationContext.getBeansOfType(GlobalOpenApiCustomizer.class);
Map<String, GlobalOperationCustomizer> globalOperationCustomizerMap = applicationContext.getBeansOfType(GlobalOperationCustomizer.class);
Map<String, GlobalOpenApiMethodFilter> globalOpenApiMethodFilterMap = applicationContext.getBeansOfType(GlobalOpenApiMethodFilter.class);

this.groupedOpenApis.forEach(groupedOpenApi -> groupedOpenApi
.addAllOpenApiCustomizer(globalOpenApiCustomizerMap.values())
.addAllOperationCustomizer(globalOperationCustomizerMap.values())
.addAllOpenApiMethodFilter(globalOpenApiMethodFilterMap.values())
this.groupedOpenApis.forEach(groupedOpenApi -> {
springDocCustomizers.getGlobalOpenApiCustomizers().ifPresent(groupedOpenApi::addAllOpenApiCustomizer);
springDocCustomizers.getGlobalOperationCustomizers().ifPresent(groupedOpenApi::addAllOperationCustomizer);
springDocCustomizers.getGlobalOpenApiMethodFilters().ifPresent(groupedOpenApi::addAllOpenApiMethodFilter);
}
);

this.groupedOpenApiResources = groupedOpenApis.stream()
Expand Down Expand Up @@ -193,8 +186,4 @@ protected OpenApiResource getOpenApiResourceOrThrow(String group) {
return openApiResource;
}

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import org.springdoc.core.OperationService;
import org.springdoc.core.SpringDocConfigProperties;
import org.springdoc.core.SpringDocProviders;
import org.springdoc.core.customizers.SpringDocCustomizers;
import reactor.core.publisher.Mono;

import org.springframework.beans.factory.ObjectFactory;
Expand All @@ -58,16 +59,20 @@ public class MultipleOpenApiWebFluxResource extends MultipleOpenApiResource {

/**
* Instantiates a new Multiple open api resource.
*
* @param groupedOpenApis the grouped open apis
* @param defaultOpenAPIBuilder the default open api builder
* @param requestBuilder the request builder
* @param responseBuilder the response builder
* @param operationParser the operation parser
* @param springDocConfigProperties the spring doc config properties
* @param springDocProviders the spring doc providers
* @param springDocCustomizers the spring doc customizers
*/
public MultipleOpenApiWebFluxResource(List<GroupedOpenApi> groupedOpenApis, ObjectFactory<OpenAPIService> defaultOpenAPIBuilder, AbstractRequestService requestBuilder, GenericResponseService responseBuilder, OperationService operationParser, SpringDocConfigProperties springDocConfigProperties, SpringDocProviders springDocProviders) {
super(groupedOpenApis, defaultOpenAPIBuilder, requestBuilder, responseBuilder, operationParser, springDocConfigProperties, springDocProviders);
public MultipleOpenApiWebFluxResource(List<GroupedOpenApi> groupedOpenApis, ObjectFactory<OpenAPIService> defaultOpenAPIBuilder, AbstractRequestService requestBuilder,
GenericResponseService responseBuilder, OperationService operationParser, SpringDocConfigProperties springDocConfigProperties,
SpringDocProviders springDocProviders, SpringDocCustomizers springDocCustomizers) {
super(groupedOpenApis, defaultOpenAPIBuilder, requestBuilder, responseBuilder, operationParser, springDocConfigProperties, springDocProviders, springDocCustomizers);
}

/**
Expand Down
Loading

0 comments on commit 53ca7f4

Please sign in to comment.