Skip to content

Commit 4c8aa7b

Browse files
authored
Merge pull request #826 from swagger-api/fix-issue-811-OAS3
Fix issue #811 OAS3 - RefResponse -> RefSchema external Resolving
2 parents ecc018c + 9adf55d commit 4c8aa7b

File tree

18 files changed

+156
-81
lines changed

18 files changed

+156
-81
lines changed

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/ExternalRefProcessor.java

Lines changed: 22 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import io.swagger.v3.oas.models.links.Link;
1010
import io.swagger.v3.oas.models.media.ArraySchema;
1111
import io.swagger.v3.oas.models.media.ComposedSchema;
12+
import io.swagger.v3.oas.models.media.MediaType;
1213
import io.swagger.v3.oas.models.media.Schema;
1314
import io.swagger.v3.oas.models.parameters.Parameter;
1415
import io.swagger.v3.oas.models.parameters.RequestBody;
@@ -199,62 +200,33 @@ private void processProperties(Map<String,Schema> subProps, String file) {
199200
}
200201
}
201202

202-
public String processRefToExternalResponse(String $ref, RefFormat refFormat) {
203-
String renamedRef = cache.getRenamedRef($ref);
204-
if(renamedRef != null) {
205-
return renamedRef;
206-
}
203+
public void processRefToExternalResponse(String $ref, RefFormat refFormat) {
207204

208205
final ApiResponse response = cache.loadRef($ref, refFormat, ApiResponse.class);
209206

210-
if(response == null) {
211-
// stop! There's a problem. retain the original ref
212-
LOGGER.warn("unable to load model reference from `" + $ref + "`. It may not be available " +
213-
"or the reference isn't a valid model schema");
214-
return $ref;
215-
}
216-
String newRef;
217-
218-
if (openAPI.getComponents() == null) {
219-
openAPI.setComponents(new Components());
220-
}
221-
Map<String, ApiResponse> responses = openAPI.getComponents().getResponses();
222-
223-
if (responses == null) {
224-
responses = new LinkedHashMap<>();
225-
}
226-
227-
final String possiblyConflictingDefinitionName = computeDefinitionName($ref);
228-
229-
ApiResponse existingResponse = responses.get(possiblyConflictingDefinitionName);
230-
231-
if (existingResponse != null) {
232-
LOGGER.debug("A model for " + existingResponse + " already exists");
233-
if(existingResponse.get$ref() != null) {
234-
// use the new model
235-
existingResponse = null;
236-
}
237-
}
238-
newRef = possiblyConflictingDefinitionName;
239-
cache.putRenamedRef($ref, newRef);
240-
241-
if(existingResponse == null) {
242-
// don't overwrite existing model reference
243-
openAPI.getComponents().addResponses(newRef, response);
244-
cache.addReferencedKey(newRef);
245-
246-
String file = $ref.split("#/")[0];
247-
if (response.get$ref() != null) {
248-
RefFormat format = computeRefFormat(response.get$ref());
249-
if (isAnExternalRefFormat(format)) {
250-
response.set$ref(processRefToExternalResponse(response.get$ref(), format));
251-
} else {
252-
processRefToExternalResponse(file + response.get$ref(), RefFormat.RELATIVE);
207+
if(response != null) {
208+
209+
String file = $ref.split("#/")[0];
210+
211+
Schema schema = null;
212+
if(response.getContent() != null){
213+
Map<String, MediaType> content = response.getContent();
214+
for( String mediaName : content.keySet()) {
215+
MediaType mediaType = content.get(mediaName);
216+
if(mediaType.getSchema()!= null) {
217+
schema = mediaType.getSchema();
218+
if (schema.get$ref() != null) {
219+
RefFormat ref = computeRefFormat(schema.get$ref());
220+
if (isAnExternalRefFormat(ref)) {
221+
processRefSchema(schema, $ref);
222+
} else {
223+
processRefToExternalSchema(file + schema.get$ref(), RefFormat.RELATIVE);
224+
}
225+
}
226+
}
253227
}
254228
}
255229
}
256-
257-
return newRef;
258230
}
259231

260232
public String processRefToExternalRequestBody(String $ref, RefFormat refFormat) {

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/OperationProcessor.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,10 @@ public void processOperation(Operation operation) {
5151
for (String responseCode : responses.keySet()) {
5252
ApiResponse response = responses.get(responseCode);
5353
if(response != null) {
54-
if (response.get$ref() != null){
54+
if (response.get$ref() != null) {
55+
56+
responseProcessor.processResponse(response);
57+
5558
RefFormat refFormat = computeRefFormat(response.get$ref());
5659
ApiResponse resolvedResponse = cache.loadRef(response.get$ref(), refFormat, ApiResponse.class);
5760

@@ -60,7 +63,9 @@ public void processOperation(Operation operation) {
6063
responses.put(responseCode, resolvedResponse);
6164
}
6265
}
66+
6367
responseProcessor.processResponse(response);
68+
6469
}
6570
}
6671
}

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/ResponseProcessor.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public void processResponse(ApiResponse response) {
3737
if (response.get$ref() != null){
3838
processReferenceResponse(response);
3939
}
40+
4041
Schema schema = null;
4142
if(response.getContent() != null){
4243
Map<String,MediaType> content = response.getContent();
@@ -72,11 +73,7 @@ public void processReferenceResponse(ApiResponse response){
7273
RefFormat refFormat = computeRefFormat(response.get$ref());
7374
String $ref = response.get$ref();
7475
if (isAnExternalRefFormat(refFormat)){
75-
final String newRef = externalRefProcessor.processRefToExternalResponse($ref, refFormat);
76-
77-
if (newRef != null) {
78-
response.set$ref(newRef);
79-
}
76+
externalRefProcessor.processRefToExternalResponse($ref, refFormat);
8077
}
8178
}
8279
}

modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/processors/OperationProcessorTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,12 @@ public void testProcessOperation(@Injectable final List<Parameter> inputParamete
4949
operation.responses(new ApiResponses().addApiResponse("200", refResponse));
5050
operation.getResponses().addApiResponse("400", incomingResponse);
5151

52+
5253
new Expectations() {{
5354
new ParameterProcessor(cache, openAPI);
5455
times = 1;
5556
result = parameterProcessor;
57+
5658
new ResponseProcessor(cache, openAPI);
5759
times = 1;
5860
result = responseProcessor;
@@ -61,6 +63,9 @@ public void testProcessOperation(@Injectable final List<Parameter> inputParamete
6163
times = 1;
6264
result = outputParameterList;
6365

66+
responseProcessor.processResponse(refResponse);
67+
times = 1;
68+
6469
RefUtils.computeRefFormat(ref);
6570
times = 1;
6671

@@ -78,10 +83,14 @@ public void testProcessOperation(@Injectable final List<Parameter> inputParamete
7883
times = 1;
7984
responseProcessor.processResponse(resolvedResponse);
8085
times = 1;
86+
8187
}};
8288

89+
90+
8391
new OperationProcessor(cache, openAPI).processOperation(operation);
8492

93+
8594
new FullVerifications() {{}};
8695

8796
assertEquals(operation.getResponses().get("200"), resolvedResponse);

modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -252,11 +252,6 @@ public void componentsResolver() throws Exception {
252252

253253
Map<String, ApiResponse> responses = openAPI.getComponents().getResponses();
254254

255-
//remote url response
256-
ApiResponse found = responses.get("Found");
257-
assertEquals(openAPI.getComponents().getResponses().get("RemoteResponse").getDescription(),"Remote Description");
258-
assertEquals(found.get$ref(), "#/components/responses/RemoteResponse");
259-
260255
//internal response headers
261256
ApiResponse illegalInput = responses.get("IllegalInput");
262257
assertEquals(illegalInput.getHeaders().get("X-Ref-Limit-Limit").get$ref(),"#/components/headers/X-Rate-Limit-Reset");

modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,30 @@ public class OpenAPIV3ParserTest {
5656
protected int serverPort = getDynamicPort();
5757
protected WireMockServer wireMockServer;
5858

59+
@Test
60+
public void testIssue811_RefSchema_ToRefSchema() {
61+
ParseOptions options = new ParseOptions();
62+
options.setResolve(true);
63+
final OpenAPI openAPI = new OpenAPIV3Parser().readLocation("oapi-reference-test2/index.yaml", null, options).getOpenAPI();
64+
65+
Assert.assertNotNull(openAPI);
66+
Assert.assertEquals(openAPI.getPaths().get("/").getGet().getResponses().get("200").getContent().get("application/json").getSchema().get$ref(),"#/components/schemas/schema-with-reference");
67+
68+
69+
}
70+
71+
@Test
72+
public void testIssue811() {
73+
ParseOptions options = new ParseOptions();
74+
options.setResolve(true);
75+
final OpenAPI openAPI = new OpenAPIV3Parser().readLocation("oapi-reference-test/index.yaml", null, options).getOpenAPI();
76+
77+
Assert.assertNotNull(openAPI);
78+
79+
Assert.assertEquals(openAPI.getPaths().get("/").getGet().getResponses().get("200").getContent().get("application/json").getSchema().get$ref(),"#/components/schemas/schema-with-reference");
80+
81+
}
82+
5983
@Test
6084
public void testIssue719() {
6185
final OpenAPI openAPI = new OpenAPIV3Parser().readLocation("extensions-responses.yaml", null, new ParseOptions()).getOpenAPI();

modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/util/OpenAPIDeserializerTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757

5858
public class OpenAPIDeserializerTest {
5959

60+
6061
@Test
6162
public void testEmptyDefinitions() throws Exception {
6263
String yaml = "openapi: 3.0.0\n" +
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
---
2+
type: object
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
description: Response with schema containing reference
3+
content:
4+
application/json:
5+
schema:
6+
$ref: "./schema-with-reference.yaml"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
type: object
3+
properties:
4+
reference_array:
5+
type: array
6+
items:
7+
$ref: "./referent.yaml"

0 commit comments

Comments
 (0)