Skip to content

Commit cacb3e1

Browse files
authored
Merge branch '2.0' into refering-without-components
2 parents 8351812 + fb5593a commit cacb3e1

File tree

5 files changed

+140
-15
lines changed

5 files changed

+140
-15
lines changed

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

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ public ExternalRefProcessor(ResolverCache cache, OpenAPI openAPI) {
3737
}
3838

3939
public String processRefToExternalSchema(String $ref, RefFormat refFormat) {
40+
String renamedRef = cache.getRenamedRef($ref);
41+
if(renamedRef != null) {
42+
return renamedRef;
43+
}
44+
4045
final Schema schema = cache.loadRef($ref, refFormat, Schema.class);
4146

4247
if(schema == null) {
@@ -56,7 +61,7 @@ public String processRefToExternalSchema(String $ref, RefFormat refFormat) {
5661
schemas = new LinkedHashMap<>();
5762
}
5863

59-
final String possiblyConflictingDefinitionName = computeDefinitionName($ref);
64+
final String possiblyConflictingDefinitionName = computeDefinitionName($ref, schemas.keySet());
6065

6166
Schema existingModel = schemas.get(possiblyConflictingDefinitionName);
6267

@@ -115,6 +120,11 @@ public String processRefToExternalSchema(String $ref, RefFormat refFormat) {
115120
}
116121

117122
public String processRefToExternalResponse(String $ref, RefFormat refFormat) {
123+
String renamedRef = cache.getRenamedRef($ref);
124+
if(renamedRef != null) {
125+
return renamedRef;
126+
}
127+
118128
final ApiResponse response = cache.loadRef($ref, refFormat, ApiResponse.class);
119129

120130
if(response == null) {
@@ -134,7 +144,7 @@ public String processRefToExternalResponse(String $ref, RefFormat refFormat) {
134144
responses = new LinkedHashMap<>();
135145
}
136146

137-
final String possiblyConflictingDefinitionName = computeDefinitionName($ref);
147+
final String possiblyConflictingDefinitionName = computeDefinitionName($ref, responses.keySet());
138148

139149
ApiResponse existingResponse = responses.get(possiblyConflictingDefinitionName);
140150

@@ -168,6 +178,11 @@ public String processRefToExternalResponse(String $ref, RefFormat refFormat) {
168178
}
169179

170180
public String processRefToExternalRequestBody(String $ref, RefFormat refFormat) {
181+
String renamedRef = cache.getRenamedRef($ref);
182+
if(renamedRef != null) {
183+
return renamedRef;
184+
}
185+
171186
final RequestBody body = cache.loadRef($ref, refFormat, RequestBody.class);
172187

173188
if(body == null) {
@@ -187,7 +202,7 @@ public String processRefToExternalRequestBody(String $ref, RefFormat refFormat)
187202
bodies = new LinkedHashMap<>();
188203
}
189204

190-
final String possiblyConflictingDefinitionName = computeDefinitionName($ref);
205+
final String possiblyConflictingDefinitionName = computeDefinitionName($ref, bodies.keySet());
191206

192207
RequestBody existingBody= bodies.get(possiblyConflictingDefinitionName);
193208

@@ -221,6 +236,11 @@ public String processRefToExternalRequestBody(String $ref, RefFormat refFormat)
221236
}
222237

223238
public String processRefToExternalHeader(String $ref, RefFormat refFormat) {
239+
String renamedRef = cache.getRenamedRef($ref);
240+
if(renamedRef != null) {
241+
return renamedRef;
242+
}
243+
224244
final Header header = cache.loadRef($ref, refFormat, Header.class);
225245

226246
if(header == null) {
@@ -240,7 +260,7 @@ public String processRefToExternalHeader(String $ref, RefFormat refFormat) {
240260
headers = new LinkedHashMap<>();
241261
}
242262

243-
final String possiblyConflictingDefinitionName = computeDefinitionName($ref);
263+
final String possiblyConflictingDefinitionName = computeDefinitionName($ref, headers.keySet());
244264

245265
Header existingHeader = headers.get(possiblyConflictingDefinitionName);
246266

@@ -274,6 +294,11 @@ public String processRefToExternalHeader(String $ref, RefFormat refFormat) {
274294
}
275295

276296
public String processRefToExternalSecurityScheme(String $ref, RefFormat refFormat) {
297+
String renamedRef = cache.getRenamedRef($ref);
298+
if(renamedRef != null) {
299+
return renamedRef;
300+
}
301+
277302
final SecurityScheme securityScheme = cache.loadRef($ref, refFormat, SecurityScheme.class);
278303

279304
if(securityScheme == null) {
@@ -293,7 +318,7 @@ public String processRefToExternalSecurityScheme(String $ref, RefFormat refForma
293318
securitySchemeMap = new LinkedHashMap<>();
294319
}
295320

296-
final String possiblyConflictingDefinitionName = computeDefinitionName($ref);
321+
final String possiblyConflictingDefinitionName = computeDefinitionName($ref, securitySchemeMap.keySet());
297322

298323
SecurityScheme existingSecurityScheme = securitySchemeMap.get(possiblyConflictingDefinitionName);
299324

@@ -327,6 +352,11 @@ public String processRefToExternalSecurityScheme(String $ref, RefFormat refForma
327352
}
328353

329354
public String processRefToExternalLink(String $ref, RefFormat refFormat) {
355+
String renamedRef = cache.getRenamedRef($ref);
356+
if(renamedRef != null) {
357+
return renamedRef;
358+
}
359+
330360
final Link link = cache.loadRef($ref, refFormat, Link.class);
331361

332362
if(link == null) {
@@ -346,7 +376,7 @@ public String processRefToExternalLink(String $ref, RefFormat refFormat) {
346376
links = new LinkedHashMap<>();
347377
}
348378

349-
final String possiblyConflictingDefinitionName = computeDefinitionName($ref);
379+
final String possiblyConflictingDefinitionName = computeDefinitionName($ref, links.keySet());
350380

351381
Link existingLink = links.get(possiblyConflictingDefinitionName);
352382

@@ -380,6 +410,11 @@ public String processRefToExternalLink(String $ref, RefFormat refFormat) {
380410
}
381411

382412
public String processRefToExternalExample(String $ref, RefFormat refFormat) {
413+
String renamedRef = cache.getRenamedRef($ref);
414+
if(renamedRef != null) {
415+
return renamedRef;
416+
}
417+
383418
final Example example = cache.loadRef($ref, refFormat, Example.class);
384419

385420
if(example == null) {
@@ -399,7 +434,7 @@ public String processRefToExternalExample(String $ref, RefFormat refFormat) {
399434
examples = new LinkedHashMap<>();
400435
}
401436

402-
final String possiblyConflictingDefinitionName = computeDefinitionName($ref);
437+
final String possiblyConflictingDefinitionName = computeDefinitionName($ref, examples.keySet());
403438

404439
Example existingExample = examples.get(possiblyConflictingDefinitionName);
405440

@@ -433,6 +468,11 @@ public String processRefToExternalExample(String $ref, RefFormat refFormat) {
433468
}
434469

435470
public String processRefToExternalParameter(String $ref, RefFormat refFormat) {
471+
String renamedRef = cache.getRenamedRef($ref);
472+
if(renamedRef != null) {
473+
return renamedRef;
474+
}
475+
436476
final Parameter parameter = cache.loadRef($ref, refFormat, Parameter.class);
437477

438478
if(parameter == null) {
@@ -452,7 +492,7 @@ public String processRefToExternalParameter(String $ref, RefFormat refFormat) {
452492
parameters = new LinkedHashMap<>();
453493
}
454494

455-
final String possiblyConflictingDefinitionName = computeDefinitionName($ref);
495+
final String possiblyConflictingDefinitionName = computeDefinitionName($ref, parameters.keySet());
456496

457497
Parameter existingParameters = parameters.get(possiblyConflictingDefinitionName);
458498

@@ -486,6 +526,11 @@ public String processRefToExternalParameter(String $ref, RefFormat refFormat) {
486526
}
487527

488528
public String processRefToExternalCallback(String $ref, RefFormat refFormat) {
529+
String renamedRef = cache.getRenamedRef($ref);
530+
if(renamedRef != null) {
531+
return renamedRef;
532+
}
533+
489534
final Callback callback = cache.loadRef($ref, refFormat, Callback.class);
490535

491536
if(callback == null) {
@@ -505,7 +550,7 @@ public String processRefToExternalCallback(String $ref, RefFormat refFormat) {
505550
callbacks = new LinkedHashMap<>();
506551
}
507552

508-
final String possiblyConflictingDefinitionName = computeDefinitionName($ref);
553+
final String possiblyConflictingDefinitionName = computeDefinitionName($ref, callback.keySet());
509554

510555
Callback existingCallback = callbacks.get(possiblyConflictingDefinitionName);
511556

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@
1111
import java.nio.file.Files;
1212
import java.nio.file.Path;
1313
import java.util.List;
14+
import java.util.Set;
1415

1516
public class RefUtils {
1617

17-
public static String computeDefinitionName(String ref) {
18+
public static String computeDefinitionName(String ref, Set<String> reserved) {
1819

1920
final String[] refParts = ref.split("#/");
2021

@@ -38,8 +39,13 @@ public static String computeDefinitionName(String ref) {
3839
final String[] split = plausibleName.split("\\.");
3940
plausibleName = split[0];
4041
}
42+
String tryName = plausibleName;
4143

42-
return plausibleName;
44+
for (int i = 2; reserved.contains(tryName); i++) {
45+
tryName = plausibleName + "_" + i;
46+
}
47+
48+
return tryName;
4349
}
4450

4551
public static boolean isAnExternalRefFormat(RefFormat refFormat) {

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

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.apache.commons.io.FileUtils;
3434
import org.testng.Assert;
3535

36+
import org.testng.AssertJUnit;
3637
import org.testng.annotations.AfterClass;
3738
import org.testng.annotations.BeforeClass;
3839
import org.testng.annotations.Test;
@@ -187,7 +188,7 @@ public void componentsResolver(@Injectable final List<AuthorizationValue> auths)
187188

188189
//remote url schema
189190
Schema user = (Schema) pet.getProperties().get("user");
190-
assertEquals(user.get$ref(),"#/components/schemas/User");
191+
assertEquals(user.get$ref(),"#/components/schemas/User_3");
191192

192193

193194
//ArraySchema items
@@ -200,7 +201,7 @@ public void componentsResolver(@Injectable final List<AuthorizationValue> auths)
200201
assertEquals(schemas.get("OrderRef").getNot().get$ref(), "#/components/schemas/Category");
201202

202203
//Schema additionalProperties
203-
assertEquals(schemas.get("OrderRef").getAdditionalProperties().get$ref(), "#/components/schemas/User");
204+
assertEquals(schemas.get("OrderRef").getAdditionalProperties().get$ref(), "#/components/schemas/User_3");
204205

205206
//AllOfSchema
206207
ComposedSchema extended = (ComposedSchema) schemas.get("ExtendedErrorModel");
@@ -265,7 +266,7 @@ public void componentsResolver(@Injectable final List<AuthorizationValue> auths)
265266
//internal Schema header
266267
Map<String, Header> headers = openAPI.getComponents().getHeaders();
267268
//header remote schema ref
268-
assertEquals(headers.get("X-Rate-Limit-Remaining").getSchema().get$ref(),"#/components/schemas/User");
269+
assertEquals(headers.get("X-Rate-Limit-Remaining").getSchema().get$ref(),"#/components/schemas/User_3");
269270

270271
//header examples
271272
assertEquals(headers.get("X-Rate-Limit-Reset").getExamples().get("headerExample").get$ref(), "#/components/examples/dog" );
@@ -603,7 +604,6 @@ public void resolveComposedSchema(@Injectable final List<AuthorizationValue> aut
603604

604605
}
605606

606-
@Test
607607
public void referringSpecWithoutComponentsTag() throws Exception {
608608
ParseOptions resolve = new ParseOptions();
609609
resolve.setResolveFully(true);
@@ -614,6 +614,20 @@ public void referringSpecWithoutComponentsTag() throws Exception {
614614
}
615615

616616

617+
618+
public void testRefNameConflicts() throws Exception {
619+
ParseOptions options = new ParseOptions();
620+
options.setResolveFully(true);
621+
OpenAPI openAPI = new OpenAPIV3Parser().readLocation("src/test/resources/refs-name-conflict/a.yaml",null, options).getOpenAPI();
622+
623+
AssertJUnit.assertEquals("local", ((Schema) openAPI.getPaths().get("/newPerson").getPost().getResponses().get("200").getContent().get("*/*").getSchema().getProperties().get("location")).getExample());
624+
AssertJUnit.assertEquals("referred", ((Schema)openAPI.getPaths().get("/oldPerson").getPost().getResponses().get("200").getContent().get("*/*").getSchema().getProperties().get("location")).getExample());
625+
AssertJUnit.assertEquals("referred", ((Schema)openAPI.getPaths().get("/yetAnotherPerson").getPost().getResponses().get("200").getContent().get("*/*").getSchema().getProperties().get("location")).getExample());
626+
AssertJUnit.assertEquals("local", ((Schema) openAPI.getComponents().getSchemas().get("PersonObj").getProperties().get("location")).getExample());
627+
AssertJUnit.assertEquals("referred", ((Schema) openAPI.getComponents().getSchemas().get("PersonObj_2").getProperties().get("location")).getExample());
628+
}
629+
630+
617631
private static int getDynamicPort() {
618632
return new Random().ints(50000, 60000).findFirst().getAsInt();
619633
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
openapi: 3.0.0
2+
servers: []
3+
info:
4+
version: 1.0.0
5+
title: Person
6+
description: Maintain Person data
7+
paths:
8+
/newPerson:
9+
post:
10+
summary: Create new person
11+
description: Create new person
12+
responses:
13+
'200':
14+
description: OK
15+
content:
16+
'*/*':
17+
schema:
18+
$ref: '#/components/schemas/PersonObj'
19+
/oldPerson:
20+
post:
21+
summary: Create old person
22+
description: Create old person
23+
responses:
24+
'200':
25+
description: OK
26+
content:
27+
'*/*':
28+
schema:
29+
$ref: './src/test/resources/refs-name-conflict/b.yaml#/components/schemas/PersonObj'
30+
/yetAnotherPerson:
31+
post:
32+
summary: Create yet another person
33+
description: Create yet another person
34+
responses:
35+
'200':
36+
description: OK
37+
content:
38+
'*/*':
39+
schema:
40+
$ref: './src/test/resources/refs-name-conflict/b.yaml#/components/schemas/PersonObj'
41+
components:
42+
schemas:
43+
PersonObj:
44+
properties:
45+
location:
46+
type: string
47+
example: local
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
openapi: 3.0.0
2+
servers: []
3+
info:
4+
version: ''
5+
title: ''
6+
paths: {}
7+
components:
8+
schemas:
9+
PersonObj:
10+
properties:
11+
location:
12+
type: string
13+
example: referred

0 commit comments

Comments
 (0)