Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -145,17 +145,7 @@ public void resolvePath(PathItem pathItem){
parameter.setSchema(resolved);
}
}
if(parameter.getContent() != null){
Map<String,MediaType> content = parameter.getContent();
for (String key: content.keySet()){
if (content.get(key) != null && content.get(key).getSchema() != null ){
Schema resolvedSchema = resolveSchema(content.get(key).getSchema());
if (resolvedSchema != null) {
content.get(key).setSchema(resolvedSchema);
}
}
}
}
resolveContent(parameter.getContent());
}
}

Expand All @@ -181,17 +171,7 @@ public void resolvePath(PathItem pathItem){
if (refRequestBody != null){
RequestBody requestBody = refRequestBody.get$ref() != null ? resolveRequestBody(refRequestBody) : refRequestBody;
op.setRequestBody(requestBody);
if (requestBody.getContent() != null) {
Map<String, MediaType> content = requestBody.getContent();
for (String key : content.keySet()) {
if (content.get(key) != null && content.get(key).getSchema() != null) {
Schema resolved = resolveSchema(content.get(key).getSchema());
if (resolved != null) {
content.get(key).setSchema(resolved);
}
}
}
}
resolveContent(requestBody.getContent());
}
// responses
ApiResponses responses = op.getResponses();
Expand All @@ -200,20 +180,7 @@ public void resolvePath(PathItem pathItem){
for(String code : responses.keySet()) {
ApiResponse response = responses.get(code);
response = response.get$ref() != null ? resolveResponse(response) : response;
if (response.getContent() != null) {
Map<String, MediaType> content = response.getContent();
for(String mediaType: content.keySet()){
if(content.get(mediaType).getSchema() != null) {
Schema resolved = resolveSchema(content.get(mediaType).getSchema());
response.getContent().get(mediaType).setSchema(resolved);
}
if(content.get(mediaType).getExamples() != null) {
Map<String,Example> resolved = resolveExample(content.get(mediaType).getExamples());
response.getContent().get(mediaType).setExamples(resolved);

}
}
}
resolveContent(response.getContent());

resolveHeaders(response.getHeaders());

Expand All @@ -232,6 +199,28 @@ public void resolvePath(PathItem pathItem){
}
}

private void resolveContent(Map<String, MediaType> content) {
if (content == null) {
return;
}
for (String key : content.keySet()) {
MediaType mediaType = content.get(key);
if (mediaType != null) {
Schema mediaTypeSchema = mediaType.getSchema();
if (mediaTypeSchema != null) {
Schema resolved = resolveSchema(mediaTypeSchema);
if (resolved != null) {
mediaType.setSchema(resolved);
}
}
Map<String, Example> examples = mediaType.getExamples();
if (examples != null) {
mediaType.setExamples(resolveExample(examples));
}
}
}
}

private void resolveHeaders(Map<String, Header> headers) {
if (headers == null || headers.isEmpty()) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1500,5 +1500,39 @@ public Object[][] explicitObjectSchemaProvider() {
{ false }
};
}


@Test
public void testIssue2292() {
ParseOptions options = new ParseOptions();
options.setResolve(true);
options.setResolveFully(true);

OpenAPI openAPI = new OpenAPIV3Parser().readLocation("/issue-2292.yaml", auths, options).getOpenAPI();

// Verify parameter content examples are resolved
Parameter filterParam = openAPI.getPaths().get("/users").getPost().getParameters().get(0);
Map<String, Example> paramExamples = filterParam.getContent().get("application/json").getExamples();
Example resolvedFilterExample = paramExamples.get("simpleFilter");
assertNotNull(resolvedFilterExample);
assertNull(resolvedFilterExample.get$ref());
assertEquals("A sample filter", resolvedFilterExample.getSummary());

// Verify requestBody content examples are resolved
RequestBody requestBody = openAPI.getPaths().get("/users").getPost().getRequestBody();
Map<String, Example> requestBodyExamples = requestBody.getContent().get("application/json").getExamples();
Example resolvedUserExample = requestBodyExamples.get("defaultUser");
assertNotNull(resolvedUserExample);
assertNull(resolvedUserExample.get$ref());
assertEquals("A sample user", resolvedUserExample.getSummary());

// Verify response content examples are resolved
ApiResponse response = openAPI.getPaths().get("/users").getPost().getResponses().get("200");
Map<String, Example> responseExamples = response.getContent().get("application/json").getExamples();
Example resolvedResponseExample = responseExamples.get("successResponse");
assertNotNull(resolvedResponseExample);
assertNull(resolvedResponseExample.get$ref());
assertEquals("A sample user", resolvedResponseExample.getSummary());
}


}
56 changes: 56 additions & 0 deletions modules/swagger-parser-v3/src/test/resources/issue-2292.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
openapi: "3.0.3"
info:
title: Example Reference Demo API
version: "1.0"
paths:
/users:
post:
summary: Create a user
parameters:
- name: filter
in: query
content:
application/json:
schema:
type: object
examples:
simpleFilter:
$ref: "#/components/examples/FilterExample"
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/User"
examples:
defaultUser:
$ref: "#/components/examples/UserExample"
responses:
"200":
description: Success
content:
application/json:
schema:
$ref: "#/components/schemas/User"
examples:
successResponse:
$ref: "#/components/examples/UserExample"
components:
schemas:
User:
type: object
properties:
id:
type: string
name:
type: string
examples:
UserExample:
summary: A sample user
value:
id: "12345"
name: John Doe
FilterExample:
summary: A sample filter
value:
status: active