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 .ObjectFactory ;
7
+ import org .springframework .beans .factory .annotation .Value ;
8
+ import org .springframework .boot .autoconfigure .condition .ConditionalOnProperty ;
9
+ import org .springframework .http .MediaType ;
10
+ import org .springframework .web .bind .annotation .GetMapping ;
11
+ import org .springframework .web .bind .annotation .PathVariable ;
12
+ import org .springframework .web .bind .annotation .RestController ;
13
+ import org .springframework .web .servlet .mvc .method .RequestMappingInfoHandlerMapping ;
14
+
15
+ import javax .servlet .http .HttpServletRequest ;
16
+ import java .util .List ;
17
+ import java .util .Map ;
18
+ import java .util .Optional ;
19
+ import java .util .stream .Collectors ;
20
+
21
+ import static org .springdoc .core .Constants .*;
22
+
23
+ @ RestController
24
+ @ ConditionalOnProperty (name = SPRINGDOC_GROUPS_ENABLED , matchIfMissing = false )
25
+ public class MultipleOpenApiResource {
26
+
27
+ private final RequestMappingInfoHandlerMapping requestMappingHandlerMapping ;
28
+
29
+ private final Optional <ActuatorProvider > servletContextProvider ;
30
+
31
+ private final Map <String , OpenApiResource > groupedOpenApiResources ;
32
+
33
+ @ Value (SPRINGDOC_SHOW_ACTUATOR_VALUE )
34
+ private boolean showActuator ;
35
+
36
+ public MultipleOpenApiResource (List <GroupedOpenApi > groupedOpenApis ,
37
+ ObjectFactory <OpenAPIBuilder > defaultOpenAPIBuilder , OpenAPIBuilder openAPIBuilder , AbstractRequestBuilder requestBuilder ,
38
+ AbstractResponseBuilder responseBuilder , OperationBuilder operationParser ,
39
+ RequestMappingInfoHandlerMapping requestMappingHandlerMapping , Optional <ActuatorProvider > servletContextProvider ) {
40
+ this .requestMappingHandlerMapping = requestMappingHandlerMapping ;
41
+ this .servletContextProvider = servletContextProvider ;
42
+ this .groupedOpenApiResources = groupedOpenApis .stream ()
43
+ .collect (Collectors .toMap (GroupedOpenApi ::getGroup , item ->
44
+ new OpenApiResource (
45
+ defaultOpenAPIBuilder .getObject (),
46
+ requestBuilder ,
47
+ responseBuilder ,
48
+ operationParser ,
49
+ requestMappingHandlerMapping ,
50
+ servletContextProvider ,
51
+ Optional .of (item .getOpenApiCustomisers ()), item .getPathsToMatch ()
52
+ )
53
+ ));
54
+ }
55
+
56
+ @ Operation (hidden = true )
57
+ @ GetMapping (value = API_DOCS_URL + "/{group}" , produces = MediaType .APPLICATION_JSON_VALUE )
58
+ public String openapiJson (HttpServletRequest request , @ Value (API_DOCS_URL ) String apiDocsUrl ,
59
+ @ PathVariable String group )
60
+ throws JsonProcessingException {
61
+ return getOpenApiResourceOrThrow (group ).openapiJson (request , apiDocsUrl + "/" + group );
62
+ }
63
+
64
+ @ Operation (hidden = true )
65
+ @ GetMapping (value = DEFAULT_API_DOCS_URL_YAML + "/{group}" , produces = APPLICATION_OPENAPI_YAML )
66
+ public String openapiYaml (HttpServletRequest request , @ Value (DEFAULT_API_DOCS_URL_YAML ) String apiDocsUrl ,
67
+ @ PathVariable String group )
68
+ throws JsonProcessingException {
69
+ return getOpenApiResourceOrThrow (group ).openapiYaml (request , apiDocsUrl + "/" + group );
70
+ }
71
+
72
+
73
+ private OpenApiResource getOpenApiResourceOrThrow (String group ) {
74
+ OpenApiResource openApiResource = groupedOpenApiResources .get (group );
75
+ if (openApiResource == null ) {
76
+ throw new IllegalStateException ("No OpenAPI resource found for group " + group );
77
+ }
78
+ return openApiResource ;
79
+ }
80
+ }
0 commit comments