From 2db471305577f335deaf9c68a7e077596569efa2 Mon Sep 17 00:00:00 2001 From: gracekarina Date: Fri, 23 Nov 2018 22:54:42 -0500 Subject: [PATCH] fix for recurssion #2 --- .../swagger/v3/parser/util/ResolverFully.java | 12 +++-- .../v3/parser/test/OpenAPIResolverTest.java | 15 +++++++ .../src/test/resources/recursive2.yaml | 44 +++++++++++++++++++ 3 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 modules/swagger-parser-v3/src/test/resources/recursive2.yaml diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java index 0bc5cdb809..c3d358ba64 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java @@ -264,7 +264,6 @@ public Parameter resolveParameter(Parameter parameter){ public Schema resolveSchema(Schema schema) { if(schema.get$ref() != null) { - String ref= schema.get$ref(); ref = ref.substring(ref.lastIndexOf("/") + 1); Schema resolved = schemas.get(ref); @@ -306,8 +305,14 @@ public Schema resolveSchema(Schema schema) { Schema innerProperty = obj.getProperties().get(propertyName); // reference check if(schema != innerProperty) { - Schema resolved = resolveSchema(innerProperty); - updated.put(propertyName, resolved); + if(resolvedProperties.get(propertyName) == null && resolvedProperties.get(propertyName) != innerProperty) { + LOGGER.debug("avoiding infinite loop"); + Schema resolved = resolveSchema(innerProperty); + updated.put(propertyName, resolved); + resolvedProperties.put(propertyName, resolved); + }else { + updated.put(propertyName, resolvedProperties.get(propertyName)); + } } } obj.setProperties(updated); @@ -500,7 +505,6 @@ public Schema resolveSchema(Schema schema) { resolvedProperties.put(propertyName, resolved); }else { updated.put(propertyName, resolvedProperties.get(propertyName)); - } } diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java index 2526791a2e..e5558ed5d7 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java @@ -8,6 +8,7 @@ import com.github.tomakehurst.wiremock.client.WireMock; import com.github.tomakehurst.wiremock.core.WireMockConfiguration; import io.swagger.v3.core.util.Json; +import io.swagger.v3.core.util.Yaml; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Operation; @@ -1151,6 +1152,20 @@ public void recursiveResolving() { } + @Test + public void recursiveResolving2() { + ParseOptions parseOptions = new ParseOptions(); + parseOptions.setResolve(true); + parseOptions.setResolveFully(true); + OpenAPI openAPI = new OpenAPIV3Parser().read("recursive2.yaml", null, parseOptions); + try { + Json.mapper().writeValueAsString(openAPI); + } + catch (Exception e) { + fail("Recursive loop found"); + } + } + public String replacePort(String url){ String pathFile = url.replace("${dynamicPort}", String.valueOf(this.serverPort)); return pathFile; diff --git a/modules/swagger-parser-v3/src/test/resources/recursive2.yaml b/modules/swagger-parser-v3/src/test/resources/recursive2.yaml new file mode 100644 index 0000000000..301a2c51c1 --- /dev/null +++ b/modules/swagger-parser-v3/src/test/resources/recursive2.yaml @@ -0,0 +1,44 @@ +openapi: 3.0.0 +info: + version: 'minimal' + title: 'recursion2' + description: 'problem in ResolverFully' + +paths: + /foo: + post: + responses: + '200': + description: Ok + requestBody: + $ref: '#/components/requestBodies/MyRequestBody' + + /bar: + put: + responses: + '200': + description: Ok + requestBody: + $ref: '#/components/requestBodies/MyRequestBody' + +components: + schemas: + Schema1: + type: object + properties: + prop: + $ref: '#/components/schemas/Schema2' + Schema2: + type: object + properties: + prop1: + $ref: '#/components/schemas/Schema1' + prop2: + $ref: '#/components/schemas/Schema1' + + requestBodies: + MyRequestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Schema2' \ No newline at end of file