From 59f0e2747cfb6864cd14ea40e703535709fdd6a7 Mon Sep 17 00:00:00 2001 From: Babis Kaidos Date: Thu, 3 Dec 2020 00:21:26 +0200 Subject: [PATCH] Fix issue #1501: External schema name is correctly constructed based on all existing models --- .../processors/ExternalRefProcessor.java | 50 +++++++++---------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/ExternalRefProcessor.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/ExternalRefProcessor.java index 520abaa515..f0e426cfbd 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/ExternalRefProcessor.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/processors/ExternalRefProcessor.java @@ -49,6 +49,23 @@ public ExternalRefProcessor(ResolverCache cache, OpenAPI openAPI) { this.openAPI = openAPI; } + private String finalNameRec(Map schemas, String possiblyConflictingDefinitionName, Schema newScema, + int iteration) { + String tryName = + iteration == 0 ? possiblyConflictingDefinitionName : possiblyConflictingDefinitionName + "_" + iteration; + Schema existingModel = schemas.get(tryName); + if (existingModel != null) { + if (existingModel.get$ref() != null) { + // use the new model + existingModel = null; + } else if (!newScema.equals(existingModel)) { + LOGGER.debug("A model for " + existingModel + " already exists"); + return finalNameRec(schemas, possiblyConflictingDefinitionName, newScema, ++iteration); + } + } + return tryName; + } + public String processRefToExternalSchema(String $ref, RefFormat refFormat) { String renamedRef = cache.getRenamedRef($ref); if(renamedRef != null) { @@ -75,34 +92,13 @@ public String processRefToExternalSchema(String $ref, RefFormat refFormat) { } final String possiblyConflictingDefinitionName = computeDefinitionName($ref); - String tryName = null; - Schema existingModel = schemas.get(possiblyConflictingDefinitionName); - - if (existingModel != null) { - LOGGER.warn("A model for " + existingModel + " already exists"); - if(existingModel.get$ref() != null) { - // use the new model - existingModel = null; - }else{ - if (!schema.equals(existingModel)){ - //We add a number at the end of the definition name - int i = 2; - for (String name : schemas.keySet()) { - if (name.equals(possiblyConflictingDefinitionName)) { - tryName = possiblyConflictingDefinitionName + "_" + i; - existingModel = schemas.get(tryName); - i++; - } - } - } - } - } - if (StringUtils.isNotBlank(tryName)){ - newRef = tryName; - }else{ - newRef = possiblyConflictingDefinitionName; - } + newRef = finalNameRec(schemas, possiblyConflictingDefinitionName, schema, 0); cache.putRenamedRef($ref, newRef); + Schema existingModel = schemas.get(newRef); + if(existingModel != null && existingModel.get$ref() != null) { + // use the new model + existingModel = null; + } if(existingModel == null) { // don't overwrite existing model reference