Skip to content

Commit 36fda4e

Browse files
authored
Merge pull request #827 from swagger-api/fix-issue-811-master
Fix issue #811 OAS2 - RefResponse -> RefSchema external Resolving
2 parents 773d114 + 6349e9f commit 36fda4e

File tree

14 files changed

+123
-17
lines changed

14 files changed

+123
-17
lines changed

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import io.swagger.models.properties.RefProperty;
88
import io.swagger.models.refs.RefFormat;
99
import io.swagger.parser.ResolverCache;
10+
import io.swagger.parser.util.RefUtils;
1011
import org.apache.commons.lang3.StringUtils;
1112
import org.slf4j.LoggerFactory;
1213

@@ -153,6 +154,30 @@ public String processRefToExternalDefinition(String $ref, RefFormat refFormat) {
153154
return newRef;
154155
}
155156

157+
158+
public void processRefToExternalResponse(String $ref, RefFormat refFormat) {
159+
160+
final Response response = cache.loadRef($ref, refFormat, Response.class);
161+
162+
if(response != null) {
163+
164+
String file = $ref.split("#/")[0];
165+
166+
Model model = null;
167+
if (response.getResponseSchema() != null) {
168+
model = response.getResponseSchema();
169+
if (model instanceof RefModel) {
170+
RefModel refModel = (RefModel) model;
171+
if (RefUtils.isAnExternalRefFormat(refFormat)) {
172+
processRefModel(refModel, $ref);
173+
} else {
174+
processRefToExternalDefinition(file + refModel.get$ref(), RefFormat.RELATIVE);
175+
}
176+
}
177+
}
178+
}
179+
}
180+
156181
private void processProperties(final Map<String, Property> subProps, final String file) {
157182
if (subProps == null || 0 == subProps.entrySet().size() ) {
158183
return;
@@ -187,6 +212,16 @@ private void processRefProperty(RefProperty subRef, String externalFile) {
187212
processRefToExternalDefinition(externalFile + subRef.get$ref(), RefFormat.RELATIVE);
188213
}
189214
}
215+
216+
private void processRefModel(RefModel subRef, String externalFile) {
217+
218+
if (isAnExternalRefFormat(subRef.getRefFormat())) {
219+
String joinedRef = join(externalFile, subRef.get$ref());
220+
subRef.set$ref(processRefToExternalDefinition(joinedRef, subRef.getRefFormat()));
221+
} else {
222+
processRefToExternalDefinition(externalFile + subRef.get$ref(), RefFormat.RELATIVE);
223+
}
224+
}
190225

191226

192227
public static String join(String source, String fragment) {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ public void processOperation(Operation operation) {
3535
if(response != null) {
3636
if (response instanceof RefResponse) {
3737
RefResponse refResponse = (RefResponse) response;
38+
responseProcessor.processResponse(response);
39+
3840
Response resolvedResponse = cache.loadRef(refResponse.get$ref(), refResponse.getRefFormat(), Response.class);
3941

4042
if (resolvedResponse != null) {

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,35 @@
11
package io.swagger.parser.processors;
22

33
import io.swagger.models.Model;
4+
import io.swagger.models.RefResponse;
45
import io.swagger.models.Response;
56
import io.swagger.models.Swagger;
67
import io.swagger.models.properties.Property;
8+
import io.swagger.models.refs.RefFormat;
79
import io.swagger.parser.ResolverCache;
10+
import io.swagger.parser.util.RefUtils;
811

912
public class ResponseProcessor {
1013

1114
private final ModelProcessor modelProcessor;
15+
private final ExternalRefProcessor externalRefProcessor;
1216

1317
public ResponseProcessor(ResolverCache cache, Swagger swagger) {
1418
modelProcessor = new ModelProcessor(cache, swagger);
19+
externalRefProcessor = new ExternalRefProcessor(cache, swagger);
1520

1621
}
1722

1823
public void processResponse(Response response) {
1924
//process the response body
2025
final Model schema = response.getResponseSchema();
2126

27+
if (response instanceof RefResponse) {
28+
RefResponse refResponse = (RefResponse) response;
29+
processReferenceResponse(refResponse);
30+
}
31+
32+
2233
if (schema != null) {
2334
modelProcessor.processModel(schema);
2435
}
@@ -29,4 +40,12 @@ public void processResponse(Response response) {
2940
*/
3041

3142
}
43+
44+
public void processReferenceResponse(RefResponse refResponse){
45+
RefFormat refFormat = refResponse.getRefFormat();
46+
String $ref = refResponse.get$ref();
47+
if (RefUtils.isAnExternalRefFormat(refFormat)){
48+
externalRefProcessor.processRefToExternalResponse($ref, refFormat);
49+
}
50+
}
3251
}

modules/swagger-parser/src/main/java/io/swagger/parser/util/RefUtils.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,14 @@
55
import org.apache.commons.io.IOUtils;
66
import org.apache.commons.lang3.StringUtils;
77

8+
import java.io.File;
89
import java.io.FileInputStream;
10+
import java.net.URI;
11+
import java.net.URISyntaxException;
12+
import java.nio.file.FileSystem;
913
import java.nio.file.Files;
1014
import java.nio.file.Path;
15+
import java.nio.file.Paths;
1116
import java.util.List;
1217
import java.util.Set;
1318

@@ -114,6 +119,8 @@ else if ("..".equals(relPathParts[i])) {
114119
return StringUtils.join(outputParts, "/");
115120
}
116121

122+
123+
117124
public static String readExternalRef(String file, RefFormat refFormat, List<AuthorizationValue> auths,
118125
Path parentDirectory) {
119126

modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,17 @@
5454

5555
public class SwaggerParserTest {
5656

57+
@Test
58+
public void testIssue811() throws Exception {
59+
SwaggerParser parser = new SwaggerParser();
60+
final Swagger swagger = parser.read("src/test/resources/oapi-reference-test/index.yaml");
61+
Assert.assertNotNull(swagger);
62+
assertTrue(swagger.getPaths().get("/").getGet().getResponses().get("200").getResponseSchema() instanceof RefModel);
63+
RefModel model = (RefModel) swagger.getPaths().get("/").getGet().getResponses().get("200").getResponseSchema();
64+
Assert.assertEquals(model.get$ref(),"#/definitions/schema-with-reference");
65+
66+
}
67+
5768
@Test
5869
public void testIssue727() throws Exception {
5970
SwaggerParser parser = new SwaggerParser();

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public void testProcessOperation(@Injectable final List<Parameter> inputParamete
4242
operation.setParameters(inputParameterList);
4343

4444
final String ref = "http://my.company.com/path/to/file.json#/foo/bar";
45-
RefResponse refResponse = new RefResponse(ref);
45+
final RefResponse refResponse = new RefResponse(ref);
4646

4747
operation.response(200, refResponse);
4848
operation.response(400, incomingResponse);
@@ -59,6 +59,9 @@ public void testProcessOperation(@Injectable final List<Parameter> inputParamete
5959
times = 1;
6060
result = outputParameterList;
6161

62+
responseProcessor.processResponse(refResponse);
63+
times = 1;
64+
6265
cache.loadRef(ref, RefFormat.URL, Response.class);
6366
times = 1;
6467
result = resolvedResponse;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
---
2+
type: object
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
description: Response with schema containing reference
3+
schema:
4+
$ref: "./schema-with-reference.yaml"
Lines changed: 7 additions & 0 deletions
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"
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
---
2+
swagger: "2.0"
3+
4+
info:
5+
version: 1.0.0
6+
title: Path include test case child
7+
8+
paths:
9+
/:
10+
get:
11+
description: Test
12+
summary: Test
13+
operationId: getTest
14+
responses:
15+
200:
16+
$ref: "./components/response-with-reference.yaml"

0 commit comments

Comments
 (0)