1
+ package org .springdoc .api ;
2
+
3
+ import com .fasterxml .jackson .core .JsonProcessingException ;
4
+ import io .swagger .v3 .oas .annotations .Operation ;
5
+ import org .springdoc .core .*;
6
+ import org .springframework .beans .factory .InitializingBean ;
7
+ import org .springframework .beans .factory .ObjectFactory ;
8
+ import org .springframework .beans .factory .annotation .Value ;
9
+ import org .springframework .http .MediaType ;
10
+ import org .springframework .http .server .reactive .ServerHttpRequest ;
11
+ import org .springframework .web .bind .annotation .GetMapping ;
12
+ import org .springframework .web .bind .annotation .PathVariable ;
13
+ import org .springframework .web .bind .annotation .RestController ;
14
+ import org .springframework .web .reactive .result .method .RequestMappingInfoHandlerMapping ;
15
+ import reactor .core .publisher .Mono ;
16
+
17
+ import java .util .List ;
18
+ import java .util .Map ;
19
+ import java .util .Optional ;
20
+ import java .util .stream .Collectors ;
21
+
22
+ import static org .springdoc .core .Constants .*;
23
+ import static org .springframework .util .AntPathMatcher .DEFAULT_PATH_SEPARATOR ;
24
+
25
+ @ RestController
26
+ public class MultipleOpenApiResource implements InitializingBean {
27
+
28
+ private final List <GroupedOpenApi > groupedOpenApis ;
29
+ private final ObjectFactory <OpenAPIBuilder > defaultOpenAPIBuilder ;
30
+ private final AbstractRequestBuilder requestBuilder ;
31
+ private final AbstractResponseBuilder responseBuilder ;
32
+ private final OperationBuilder operationParser ;
33
+ private final RequestMappingInfoHandlerMapping requestMappingHandlerMapping ;
34
+ private Map <String , OpenApiResource > groupedOpenApiResources ;
35
+
36
+ public MultipleOpenApiResource (List <GroupedOpenApi > groupedOpenApis ,
37
+ ObjectFactory <OpenAPIBuilder > defaultOpenAPIBuilder , AbstractRequestBuilder requestBuilder ,
38
+ AbstractResponseBuilder responseBuilder , OperationBuilder operationParser ,
39
+ RequestMappingInfoHandlerMapping requestMappingHandlerMapping ) {
40
+
41
+ this .groupedOpenApis = groupedOpenApis ;
42
+ this .defaultOpenAPIBuilder = defaultOpenAPIBuilder ;
43
+ this .requestBuilder = requestBuilder ;
44
+ this .responseBuilder = responseBuilder ;
45
+ this .operationParser = operationParser ;
46
+ this .requestMappingHandlerMapping = requestMappingHandlerMapping ;
47
+ }
48
+
49
+ @ Override
50
+ public void afterPropertiesSet () throws Exception {
51
+ this .groupedOpenApiResources = groupedOpenApis .stream ()
52
+ .collect (Collectors .toMap (GroupedOpenApi ::getGroup , item ->
53
+ new OpenApiResource (
54
+ defaultOpenAPIBuilder .getObject (),
55
+ requestBuilder ,
56
+ responseBuilder ,
57
+ operationParser ,
58
+ requestMappingHandlerMapping ,
59
+ Optional .of (item .getOpenApiCustomisers ()), item .getPathsToMatch (), item .getPackagesToScan ()
60
+ )
61
+ ));
62
+ }
63
+
64
+ @ Operation (hidden = true )
65
+ @ GetMapping (value = API_DOCS_URL + "/{group}" , produces = MediaType .APPLICATION_JSON_VALUE )
66
+ public Mono <String > openapiJson (ServerHttpRequest serverHttpRequest , @ Value (API_DOCS_URL ) String apiDocsUrl , @ PathVariable String group )
67
+ throws JsonProcessingException {
68
+ return getOpenApiResourceOrThrow (group ).openapiJson (serverHttpRequest , apiDocsUrl + DEFAULT_PATH_SEPARATOR + group );
69
+ }
70
+
71
+ @ Operation (hidden = true )
72
+ @ GetMapping (value = DEFAULT_API_DOCS_URL_YAML + "/{group}" , produces = APPLICATION_OPENAPI_YAML )
73
+ public Mono <String > openapiYaml (ServerHttpRequest serverHttpRequest ,
74
+ @ Value (DEFAULT_API_DOCS_URL_YAML ) String apiDocsUrl , @ PathVariable String group ) throws JsonProcessingException {
75
+ return getOpenApiResourceOrThrow (group ).openapiYaml (serverHttpRequest , apiDocsUrl + DEFAULT_PATH_SEPARATOR + group );
76
+ }
77
+
78
+ private OpenApiResource getOpenApiResourceOrThrow (String group ) {
79
+ OpenApiResource openApiResource = groupedOpenApiResources .get (group );
80
+ if (openApiResource == null ) {
81
+ throw new IllegalStateException ("No OpenAPI resource found for group " + group );
82
+ }
83
+ return openApiResource ;
84
+ }
85
+ }
0 commit comments