|
20 | 20 | import io.swagger.v3.oas.models.OpenAPI;
|
21 | 21 | import io.swagger.v3.oas.models.Operation;
|
22 | 22 | import io.swagger.v3.oas.models.PathItem;
|
| 23 | +import io.swagger.v3.oas.models.callbacks.Callback; |
23 | 24 | import io.swagger.v3.oas.models.headers.Header;
|
24 | 25 | import io.swagger.v3.oas.models.media.ArraySchema;
|
25 | 26 | import io.swagger.v3.oas.models.media.BinarySchema;
|
@@ -167,40 +168,56 @@ private static void visitOpenAPI(OpenAPI openAPI, OpenAPISchemaVisitor visitor)
|
167 | 168 |
|
168 | 169 | if (paths != null) {
|
169 | 170 | for (PathItem path : paths.values()) {
|
170 |
| - List<Operation> allOperations = path.readOperations(); |
171 |
| - if (allOperations != null) { |
172 |
| - for (Operation operation : allOperations) { |
173 |
| - //Params: |
174 |
| - if (operation.getParameters() != null) { |
175 |
| - for (Parameter p : operation.getParameters()) { |
176 |
| - Parameter parameter = getReferencedParameter(openAPI, p); |
177 |
| - if (parameter.getSchema() != null) { |
178 |
| - visitSchema(openAPI, parameter.getSchema(), null, visitedSchemas, visitor); |
179 |
| - } |
180 |
| - } |
| 171 | + visitPathItem(path, openAPI, visitor, visitedSchemas); |
| 172 | + } |
| 173 | + } |
| 174 | + } |
| 175 | + |
| 176 | + private static void visitPathItem(PathItem pathItem, OpenAPI openAPI, OpenAPISchemaVisitor visitor, List<String> visitedSchemas) { |
| 177 | + List<Operation> allOperations = pathItem.readOperations(); |
| 178 | + if (allOperations != null) { |
| 179 | + for (Operation operation : allOperations) { |
| 180 | + //Params: |
| 181 | + if (operation.getParameters() != null) { |
| 182 | + for (Parameter p : operation.getParameters()) { |
| 183 | + Parameter parameter = getReferencedParameter(openAPI, p); |
| 184 | + if (parameter.getSchema() != null) { |
| 185 | + visitSchema(openAPI, parameter.getSchema(), null, visitedSchemas, visitor); |
181 | 186 | }
|
| 187 | + } |
| 188 | + } |
182 | 189 |
|
183 |
| - //RequestBody: |
184 |
| - RequestBody requestBody = getReferencedRequestBody(openAPI, operation.getRequestBody()); |
185 |
| - if (requestBody != null && requestBody.getContent() != null) { |
186 |
| - for (Entry<String, MediaType> e : requestBody.getContent().entrySet()) { |
| 190 | + //RequestBody: |
| 191 | + RequestBody requestBody = getReferencedRequestBody(openAPI, operation.getRequestBody()); |
| 192 | + if (requestBody != null && requestBody.getContent() != null) { |
| 193 | + for (Entry<String, MediaType> e : requestBody.getContent().entrySet()) { |
| 194 | + if (e.getValue().getSchema() != null) { |
| 195 | + visitSchema(openAPI, e.getValue().getSchema(), e.getKey(), visitedSchemas, visitor); |
| 196 | + } |
| 197 | + } |
| 198 | + } |
| 199 | + |
| 200 | + //Responses: |
| 201 | + if (operation.getResponses() != null) { |
| 202 | + for (ApiResponse r : operation.getResponses().values()) { |
| 203 | + ApiResponse apiResponse = getReferencedApiResponse(openAPI, r); |
| 204 | + if (apiResponse != null && apiResponse.getContent() != null) { |
| 205 | + for (Entry<String, MediaType> e : apiResponse.getContent().entrySet()) { |
187 | 206 | if (e.getValue().getSchema() != null) {
|
188 | 207 | visitSchema(openAPI, e.getValue().getSchema(), e.getKey(), visitedSchemas, visitor);
|
189 | 208 | }
|
190 | 209 | }
|
191 | 210 | }
|
| 211 | + } |
| 212 | + } |
192 | 213 |
|
193 |
| - //Responses: |
194 |
| - if (operation.getResponses() != null) { |
195 |
| - for (ApiResponse r : operation.getResponses().values()) { |
196 |
| - ApiResponse apiResponse = getReferencedApiResponse(openAPI, r); |
197 |
| - if (apiResponse != null && apiResponse.getContent() != null) { |
198 |
| - for (Entry<String, MediaType> e : apiResponse.getContent().entrySet()) { |
199 |
| - if (e.getValue().getSchema() != null) { |
200 |
| - visitSchema(openAPI, e.getValue().getSchema(), e.getKey(), visitedSchemas, visitor); |
201 |
| - } |
202 |
| - } |
203 |
| - } |
| 214 | + //Callbacks: |
| 215 | + if (operation.getCallbacks() != null) { |
| 216 | + for (Callback c : operation.getCallbacks().values()) { |
| 217 | + Callback callback = getReferencedCallback(openAPI, c); |
| 218 | + if (callback != null) { |
| 219 | + for (PathItem p : callback.values()) { |
| 220 | + visitPathItem(p, openAPI, visitor, visitedSchemas); |
204 | 221 | }
|
205 | 222 | }
|
206 | 223 | }
|
@@ -603,6 +620,35 @@ public static Parameter getParameter(OpenAPI openAPI, String name) {
|
603 | 620 | return null;
|
604 | 621 | }
|
605 | 622 |
|
| 623 | + /** |
| 624 | + * If a Callback contains a reference to an other Callback with '$ref', returns the referenced Callback if it is found or the actual Callback in the other cases. |
| 625 | + * |
| 626 | + * @param openAPI specification being checked |
| 627 | + * @param callback potentially containing a '$ref' |
| 628 | + * @return callback without '$ref' |
| 629 | + */ |
| 630 | + public static Callback getReferencedCallback(OpenAPI openAPI, Callback callback) { |
| 631 | + if (callback != null && StringUtils.isNotEmpty(callback.get$ref())) { |
| 632 | + String name = getSimpleRef(callback.get$ref()); |
| 633 | + Callback referencedCallback = getCallback(openAPI, name); |
| 634 | + if (referencedCallback != null) { |
| 635 | + return referencedCallback; |
| 636 | + } |
| 637 | + } |
| 638 | + return callback; |
| 639 | + } |
| 640 | + |
| 641 | + public static Callback getCallback(OpenAPI openAPI, String name) { |
| 642 | + if (name == null) { |
| 643 | + return null; |
| 644 | + } |
| 645 | + |
| 646 | + if (openAPI != null && openAPI.getComponents() != null && openAPI.getComponents().getCallbacks() != null) { |
| 647 | + return openAPI.getComponents().getCallbacks().get(name); |
| 648 | + } |
| 649 | + return null; |
| 650 | + } |
| 651 | + |
606 | 652 | /**
|
607 | 653 | * Return the first defined Schema for a RequestBody
|
608 | 654 | *
|
|
0 commit comments