Skip to content

Commit fb5593a

Browse files
authored
Merge pull request #591 from joeljons/ref-name-conflicts2
$ref name conflicts for OAS 3
2 parents 6f2723d + a2d1f04 commit fb5593a

File tree

5 files changed

+139
-14
lines changed

5 files changed

+139
-14
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
@@ -36,6 +36,11 @@ public ExternalRefProcessor(ResolverCache cache, OpenAPI openAPI) {
3636
}
3737

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

4146
if(schema == null) {
@@ -52,7 +57,7 @@ public String processRefToExternalSchema(String $ref, RefFormat refFormat) {
5257
schemas = new LinkedHashMap<>();
5358
}
5459

55-
final String possiblyConflictingDefinitionName = computeDefinitionName($ref);
60+
final String possiblyConflictingDefinitionName = computeDefinitionName($ref, schemas.keySet());
5661

5762
Schema existingModel = schemas.get(possiblyConflictingDefinitionName);
5863

@@ -111,6 +116,11 @@ public String processRefToExternalSchema(String $ref, RefFormat refFormat) {
111116
}
112117

113118
public String processRefToExternalResponse(String $ref, RefFormat refFormat) {
119+
String renamedRef = cache.getRenamedRef($ref);
120+
if(renamedRef != null) {
121+
return renamedRef;
122+
}
123+
114124
final ApiResponse response = cache.loadRef($ref, refFormat, ApiResponse.class);
115125

116126
if(response == null) {
@@ -127,7 +137,7 @@ public String processRefToExternalResponse(String $ref, RefFormat refFormat) {
127137
responses = new LinkedHashMap<>();
128138
}
129139

130-
final String possiblyConflictingDefinitionName = computeDefinitionName($ref);
140+
final String possiblyConflictingDefinitionName = computeDefinitionName($ref, responses.keySet());
131141

132142
ApiResponse existingResponse = responses.get(possiblyConflictingDefinitionName);
133143

@@ -161,6 +171,11 @@ public String processRefToExternalResponse(String $ref, RefFormat refFormat) {
161171
}
162172

163173
public String processRefToExternalRequestBody(String $ref, RefFormat refFormat) {
174+
String renamedRef = cache.getRenamedRef($ref);
175+
if(renamedRef != null) {
176+
return renamedRef;
177+
}
178+
164179
final RequestBody body = cache.loadRef($ref, refFormat, RequestBody.class);
165180

166181
if(body == null) {
@@ -177,7 +192,7 @@ public String processRefToExternalRequestBody(String $ref, RefFormat refFormat)
177192
bodies = new LinkedHashMap<>();
178193
}
179194

180-
final String possiblyConflictingDefinitionName = computeDefinitionName($ref);
195+
final String possiblyConflictingDefinitionName = computeDefinitionName($ref, bodies.keySet());
181196

182197
RequestBody existingBody= bodies.get(possiblyConflictingDefinitionName);
183198

@@ -211,6 +226,11 @@ public String processRefToExternalRequestBody(String $ref, RefFormat refFormat)
211226
}
212227

213228
public String processRefToExternalHeader(String $ref, RefFormat refFormat) {
229+
String renamedRef = cache.getRenamedRef($ref);
230+
if(renamedRef != null) {
231+
return renamedRef;
232+
}
233+
214234
final Header header = cache.loadRef($ref, refFormat, Header.class);
215235

216236
if(header == null) {
@@ -227,7 +247,7 @@ public String processRefToExternalHeader(String $ref, RefFormat refFormat) {
227247
headers = new LinkedHashMap<>();
228248
}
229249

230-
final String possiblyConflictingDefinitionName = computeDefinitionName($ref);
250+
final String possiblyConflictingDefinitionName = computeDefinitionName($ref, headers.keySet());
231251

232252
Header existingHeader = headers.get(possiblyConflictingDefinitionName);
233253

@@ -261,6 +281,11 @@ public String processRefToExternalHeader(String $ref, RefFormat refFormat) {
261281
}
262282

263283
public String processRefToExternalSecurityScheme(String $ref, RefFormat refFormat) {
284+
String renamedRef = cache.getRenamedRef($ref);
285+
if(renamedRef != null) {
286+
return renamedRef;
287+
}
288+
264289
final SecurityScheme securityScheme = cache.loadRef($ref, refFormat, SecurityScheme.class);
265290

266291
if(securityScheme == null) {
@@ -277,7 +302,7 @@ public String processRefToExternalSecurityScheme(String $ref, RefFormat refForma
277302
securitySchemeMap = new LinkedHashMap<>();
278303
}
279304

280-
final String possiblyConflictingDefinitionName = computeDefinitionName($ref);
305+
final String possiblyConflictingDefinitionName = computeDefinitionName($ref, securitySchemeMap.keySet());
281306

282307
SecurityScheme existingSecurityScheme = securitySchemeMap.get(possiblyConflictingDefinitionName);
283308

@@ -311,6 +336,11 @@ public String processRefToExternalSecurityScheme(String $ref, RefFormat refForma
311336
}
312337

313338
public String processRefToExternalLink(String $ref, RefFormat refFormat) {
339+
String renamedRef = cache.getRenamedRef($ref);
340+
if(renamedRef != null) {
341+
return renamedRef;
342+
}
343+
314344
final Link link = cache.loadRef($ref, refFormat, Link.class);
315345

316346
if(link == null) {
@@ -327,7 +357,7 @@ public String processRefToExternalLink(String $ref, RefFormat refFormat) {
327357
links = new LinkedHashMap<>();
328358
}
329359

330-
final String possiblyConflictingDefinitionName = computeDefinitionName($ref);
360+
final String possiblyConflictingDefinitionName = computeDefinitionName($ref, links.keySet());
331361

332362
Link existingLink = links.get(possiblyConflictingDefinitionName);
333363

@@ -361,6 +391,11 @@ public String processRefToExternalLink(String $ref, RefFormat refFormat) {
361391
}
362392

363393
public String processRefToExternalExample(String $ref, RefFormat refFormat) {
394+
String renamedRef = cache.getRenamedRef($ref);
395+
if(renamedRef != null) {
396+
return renamedRef;
397+
}
398+
364399
final Example example = cache.loadRef($ref, refFormat, Example.class);
365400

366401
if(example == null) {
@@ -377,7 +412,7 @@ public String processRefToExternalExample(String $ref, RefFormat refFormat) {
377412
examples = new LinkedHashMap<>();
378413
}
379414

380-
final String possiblyConflictingDefinitionName = computeDefinitionName($ref);
415+
final String possiblyConflictingDefinitionName = computeDefinitionName($ref, examples.keySet());
381416

382417
Example existingExample = examples.get(possiblyConflictingDefinitionName);
383418

@@ -411,6 +446,11 @@ public String processRefToExternalExample(String $ref, RefFormat refFormat) {
411446
}
412447

413448
public String processRefToExternalParameter(String $ref, RefFormat refFormat) {
449+
String renamedRef = cache.getRenamedRef($ref);
450+
if(renamedRef != null) {
451+
return renamedRef;
452+
}
453+
414454
final Parameter parameter = cache.loadRef($ref, refFormat, Parameter.class);
415455

416456
if(parameter == null) {
@@ -427,7 +467,7 @@ public String processRefToExternalParameter(String $ref, RefFormat refFormat) {
427467
parameters = new LinkedHashMap<>();
428468
}
429469

430-
final String possiblyConflictingDefinitionName = computeDefinitionName($ref);
470+
final String possiblyConflictingDefinitionName = computeDefinitionName($ref, parameters.keySet());
431471

432472
Parameter existingParameters = parameters.get(possiblyConflictingDefinitionName);
433473

@@ -461,6 +501,11 @@ public String processRefToExternalParameter(String $ref, RefFormat refFormat) {
461501
}
462502

463503
public String processRefToExternalCallback(String $ref, RefFormat refFormat) {
504+
String renamedRef = cache.getRenamedRef($ref);
505+
if(renamedRef != null) {
506+
return renamedRef;
507+
}
508+
464509
final Callback callback = cache.loadRef($ref, refFormat, Callback.class);
465510

466511
if(callback == null) {
@@ -477,7 +522,7 @@ public String processRefToExternalCallback(String $ref, RefFormat refFormat) {
477522
callbacks = new LinkedHashMap<>();
478523
}
479524

480-
final String possiblyConflictingDefinitionName = computeDefinitionName($ref);
525+
final String possiblyConflictingDefinitionName = computeDefinitionName($ref, callback.keySet());
481526

482527
Callback existingCallback = callbacks.get(possiblyConflictingDefinitionName);
483528

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: 17 additions & 3 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,6 +604,19 @@ public void resolveComposedSchema(@Injectable final List<AuthorizationValue> aut
603604

604605
}
605606

607+
@Test
608+
public void testRefNameConflicts() throws Exception {
609+
ParseOptions options = new ParseOptions();
610+
options.setResolveFully(true);
611+
OpenAPI openAPI = new OpenAPIV3Parser().readLocation("src/test/resources/refs-name-conflict/a.yaml",null, options).getOpenAPI();
612+
613+
AssertJUnit.assertEquals("local", ((Schema) openAPI.getPaths().get("/newPerson").getPost().getResponses().get("200").getContent().get("*/*").getSchema().getProperties().get("location")).getExample());
614+
AssertJUnit.assertEquals("referred", ((Schema)openAPI.getPaths().get("/oldPerson").getPost().getResponses().get("200").getContent().get("*/*").getSchema().getProperties().get("location")).getExample());
615+
AssertJUnit.assertEquals("referred", ((Schema)openAPI.getPaths().get("/yetAnotherPerson").getPost().getResponses().get("200").getContent().get("*/*").getSchema().getProperties().get("location")).getExample());
616+
AssertJUnit.assertEquals("local", ((Schema) openAPI.getComponents().getSchemas().get("PersonObj").getProperties().get("location")).getExample());
617+
AssertJUnit.assertEquals("referred", ((Schema) openAPI.getComponents().getSchemas().get("PersonObj_2").getProperties().get("location")).getExample());
618+
}
619+
606620
private static int getDynamicPort() {
607621
return new Random().ints(50000, 60000).findFirst().getAsInt();
608622
}
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)