Skip to content

Commit 28bfd98

Browse files
authored
Merge pull request #1502 from BabisK/bug/1501-external-schema-name-calculation-fixed
Fix issue #1501: External schema name is correctly constructed
2 parents f5fdccb + ccff482 commit 28bfd98

File tree

5 files changed

+51
-30
lines changed

5 files changed

+51
-30
lines changed

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

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,23 @@ public ExternalRefProcessor(ResolverCache cache, OpenAPI openAPI) {
4949
this.openAPI = openAPI;
5050
}
5151

52+
private String finalNameRec(Map<String, Schema> schemas, String possiblyConflictingDefinitionName, Schema newScema,
53+
int iteration) {
54+
String tryName =
55+
iteration == 0 ? possiblyConflictingDefinitionName : possiblyConflictingDefinitionName + "_" + iteration;
56+
Schema existingModel = schemas.get(tryName);
57+
if (existingModel != null) {
58+
if (existingModel.get$ref() != null) {
59+
// use the new model
60+
existingModel = null;
61+
} else if (!newScema.equals(existingModel)) {
62+
LOGGER.debug("A model for " + existingModel + " already exists");
63+
return finalNameRec(schemas, possiblyConflictingDefinitionName, newScema, ++iteration);
64+
}
65+
}
66+
return tryName;
67+
}
68+
5269
public String processRefToExternalSchema(String $ref, RefFormat refFormat) {
5370
String renamedRef = cache.getRenamedRef($ref);
5471
if(renamedRef != null) {
@@ -75,34 +92,13 @@ public String processRefToExternalSchema(String $ref, RefFormat refFormat) {
7592
}
7693

7794
final String possiblyConflictingDefinitionName = computeDefinitionName($ref);
78-
String tryName = null;
79-
Schema existingModel = schemas.get(possiblyConflictingDefinitionName);
80-
81-
if (existingModel != null) {
82-
LOGGER.warn("A model for " + existingModel + " already exists");
83-
if(existingModel.get$ref() != null) {
84-
// use the new model
85-
existingModel = null;
86-
}else{
87-
if (!schema.equals(existingModel)){
88-
//We add a number at the end of the definition name
89-
int i = 2;
90-
for (String name : schemas.keySet()) {
91-
if (name.equals(possiblyConflictingDefinitionName)) {
92-
tryName = possiblyConflictingDefinitionName + "_" + i;
93-
existingModel = schemas.get(tryName);
94-
i++;
95-
}
96-
}
97-
}
98-
}
99-
}
100-
if (StringUtils.isNotBlank(tryName)){
101-
newRef = tryName;
102-
}else{
103-
newRef = possiblyConflictingDefinitionName;
104-
}
95+
newRef = finalNameRec(schemas, possiblyConflictingDefinitionName, schema, 0);
10596
cache.putRenamedRef($ref, newRef);
97+
Schema existingModel = schemas.get(newRef);
98+
if(existingModel != null && existingModel.get$ref() != null) {
99+
// use the new model
100+
existingModel = null;
101+
}
106102

107103
if(existingModel == null) {
108104
// don't overwrite existing model reference

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -777,7 +777,8 @@ public void testRefNameConflicts() throws Exception {
777777
assertEquals("referred", ((Schema)openAPI.getPaths().get("/oldPerson").getPost().getResponses().get("200").getContent().get("*/*").getSchema().getProperties().get("location")).getExample());
778778
assertEquals("referred", ((Schema)openAPI.getPaths().get("/yetAnotherPerson").getPost().getResponses().get("200").getContent().get("*/*").getSchema().getProperties().get("location")).getExample());
779779
assertEquals("local", ((Schema) openAPI.getComponents().getSchemas().get("PersonObj").getProperties().get("location")).getExample());
780-
assertEquals("referred", ((Schema) openAPI.getComponents().getSchemas().get("PersonObj_2").getProperties().get("location")).getExample());
780+
assertEquals("referred", ((Schema) openAPI.getComponents().getSchemas().get("PersonObj_1").getProperties().get("location")).getExample());
781+
assertEquals("referred-again", ((Schema) openAPI.getComponents().getSchemas().get("PersonObj_2").getProperties().get("location")).getExample());
781782
}
782783

783784

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1082,7 +1082,7 @@ public void testOneOfExternalRefConflictName() throws Exception {
10821082
Schema pet = openAPI.getComponents().getSchemas().get("Pet");
10831083
Assert.assertNotNull(pet);
10841084
Assert.assertTrue(pet.getDiscriminator().getMapping().containsKey("Cat"));
1085-
Assert.assertTrue(pet.getDiscriminator().getMapping().get("Cat").equals("#/components/schemas/Cat_2"));
1085+
Assert.assertTrue(pet.getDiscriminator().getMapping().get("Cat").equals("#/components/schemas/Cat_1"));
10861086
}
10871087

10881088
@Test
@@ -1687,7 +1687,7 @@ private OpenAPI doRelativeFileTest(String location) {
16871687

16881688
assertEquals(composedCat.getAllOf().size(), 3);
16891689
assertEquals(composedCat.getAllOf().get(0).get$ref(), "#/components/schemas/pet");
1690-
assertEquals(composedCat.getAllOf().get(1).get$ref(), "#/components/schemas/foo_2");
1690+
assertEquals(composedCat.getAllOf().get(1).get$ref(), "#/components/schemas/foo_1");
16911691

16921692
return openAPI;
16931693
}

modules/swagger-parser-v3/src/test/resources/refs-name-conflict/a.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,17 @@ paths:
3838
'*/*':
3939
schema:
4040
$ref: './refs-name-conflict/b.yaml#/components/schemas/PersonObj'
41+
/thisAintAnotherPerson:
42+
post:
43+
summary: Create no more persons
44+
description: Create no more persons
45+
responses:
46+
'200':
47+
description: OK
48+
content:
49+
'*/*':
50+
schema:
51+
$ref: './refs-name-conflict/c.yaml#/components/schemas/PersonObj'
4152
components:
4253
schemas:
4354
PersonObj:
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
openapi: 3.0.1
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-again

0 commit comments

Comments
 (0)