diff --git a/modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java b/modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java index 933de4a54e..a3501edb5a 100644 --- a/modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java +++ b/modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java @@ -1,5 +1,35 @@ package io.swagger.v3.parser.converter; +import io.swagger.models.ArrayModel; +import io.swagger.models.ComposedModel; +import io.swagger.models.ExternalDocs; +import io.swagger.models.Model; +import io.swagger.models.ModelImpl; +import io.swagger.models.Path; +import io.swagger.models.RefModel; +import io.swagger.models.RefPath; +import io.swagger.models.RefResponse; +import io.swagger.models.Response; +import io.swagger.models.Scheme; +import io.swagger.models.SecurityRequirement; +import io.swagger.models.Swagger; +import io.swagger.models.auth.ApiKeyAuthDefinition; +import io.swagger.models.auth.OAuth2Definition; +import io.swagger.models.auth.SecuritySchemeDefinition; +import io.swagger.models.parameters.AbstractSerializableParameter; +import io.swagger.models.parameters.BodyParameter; +import io.swagger.models.parameters.RefParameter; +import io.swagger.models.parameters.SerializableParameter; +import io.swagger.models.properties.AbstractNumericProperty; +import io.swagger.models.properties.ArrayProperty; +import io.swagger.models.properties.MapProperty; +import io.swagger.models.properties.ObjectProperty; +import io.swagger.models.properties.Property; +import io.swagger.models.properties.RefProperty; +import io.swagger.parser.SwaggerParser; +import io.swagger.parser.SwaggerResolver; +import io.swagger.parser.util.SwaggerDeserializationResult; +import io.swagger.util.Json; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.ExternalDocumentation; import io.swagger.v3.oas.models.OpenAPI; @@ -32,36 +62,7 @@ import io.swagger.v3.parser.core.models.ParseOptions; import io.swagger.v3.parser.core.models.SwaggerParseResult; import org.apache.commons.lang3.StringUtils; -import io.swagger.models.ArrayModel; -import io.swagger.models.ComposedModel; -import io.swagger.models.ExternalDocs; -import io.swagger.models.Model; -import io.swagger.models.ModelImpl; -import io.swagger.models.Path; -import io.swagger.models.RefModel; -import io.swagger.models.RefPath; -import io.swagger.models.RefResponse; -import io.swagger.models.Response; -import io.swagger.models.Scheme; -import io.swagger.models.SecurityRequirement; -import io.swagger.models.Swagger; -import io.swagger.models.auth.ApiKeyAuthDefinition; -import io.swagger.models.auth.OAuth2Definition; -import io.swagger.models.auth.SecuritySchemeDefinition; -import io.swagger.models.parameters.AbstractSerializableParameter; -import io.swagger.models.parameters.BodyParameter; -import io.swagger.models.parameters.RefParameter; -import io.swagger.models.parameters.SerializableParameter; -import io.swagger.models.properties.AbstractNumericProperty; -import io.swagger.models.properties.ArrayProperty; -import io.swagger.models.properties.MapProperty; -import io.swagger.models.properties.ObjectProperty; -import io.swagger.models.properties.Property; -import io.swagger.models.properties.RefProperty; -import io.swagger.parser.SwaggerParser; -import io.swagger.parser.SwaggerResolver; -import io.swagger.parser.util.SwaggerDeserializationResult; -import io.swagger.util.Json; + import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; @@ -73,6 +74,7 @@ public class SwaggerConverter implements SwaggerParserExtension { private List globalConsumes = new ArrayList<>(); private List globalProduces = new ArrayList<>(); + private Components components = new Components(); @Override public SwaggerParseResult readLocation(String url, List auths, ParseOptions options) { @@ -88,7 +90,8 @@ public SwaggerParseResult readLocation(String url, List auth @Override public SwaggerParseResult readContents(String swaggerAsString, List auth, ParseOptions options) { - SwaggerDeserializationResult result = new SwaggerParser().readWithInfo(swaggerAsString); + SwaggerDeserializationResult result = new SwaggerParser().readWithInfo(swaggerAsString, options == null ? + true : options.isResolve()); if (options != null) { if (options.isResolve()) { @@ -177,16 +180,6 @@ public SwaggerParseResult convert(SwaggerDeserializationResult parse) { } } - Paths v3Paths = new Paths(); - for (String pathname : swagger.getPaths().keySet()) { - io.swagger.models.Path v2Path = swagger.getPath(pathname); - PathItem v3Path = convert(v2Path); - v3Paths.put(pathname, v3Path); - } - openAPI.setPaths(v3Paths); - - Components components = new Components(); - if (swagger.getParameters() != null) { swagger.getParameters().forEach((k, v) -> { if ("body".equals(v.getIn())) { @@ -199,6 +192,14 @@ public SwaggerParseResult convert(SwaggerDeserializationResult parse) { }); } + Paths v3Paths = new Paths(); + for (String pathname : swagger.getPaths().keySet()) { + io.swagger.models.Path v2Path = swagger.getPath(pathname); + PathItem v3Path = convert(v2Path); + v3Paths.put(pathname, v3Path); + } + openAPI.setPaths(v3Paths); + if (swagger.getResponses() != null) { swagger.getResponses().forEach((k, v) -> components.addResponses(k, convert(v))); } @@ -863,8 +864,14 @@ public Parameter convert(io.swagger.models.parameters.Parameter v2Parameter) { RefParameter ref = (RefParameter) v2Parameter; if (ref.get$ref().indexOf("#/parameters") == 0) { - - String updatedRef = "#/components/parameters" + ref.get$ref().substring("#/parameters".length()); + String updatedRef = "#/components/"; + if (components.getRequestBodies() != null && + components.getRequestBodies().get(ref.getSimpleRef()) != null) { + updatedRef += "requestBodies"; + } else { + updatedRef += "parameters"; + } + updatedRef += ref.get$ref().substring("#/parameters".length()); ref.set$ref(updatedRef); } diff --git a/modules/swagger-parser-v2-converter/src/test/java/io/swagger/parser/test/V2ConverterTest.java b/modules/swagger-parser-v2-converter/src/test/java/io/swagger/parser/test/V2ConverterTest.java index 31e45a1f8a..866add662b 100644 --- a/modules/swagger-parser-v2-converter/src/test/java/io/swagger/parser/test/V2ConverterTest.java +++ b/modules/swagger-parser-v2-converter/src/test/java/io/swagger/parser/test/V2ConverterTest.java @@ -14,8 +14,9 @@ import io.swagger.v3.oas.models.security.OAuthFlow; import io.swagger.v3.oas.models.security.SecurityScheme; import io.swagger.v3.oas.models.tags.Tag; -import io.swagger.v3.parser.core.models.SwaggerParseResult; import io.swagger.v3.parser.converter.SwaggerConverter; +import io.swagger.v3.parser.core.models.ParseOptions; +import io.swagger.v3.parser.core.models.SwaggerParseResult; import org.testng.annotations.Test; import java.io.IOException; @@ -135,6 +136,7 @@ public class V2ConverterTest { private static final long DEFAULT_VALUE = 11L; private static final long EXAMPLE_8_NUMBER = 8L; private static final long EXAMPLE_42_NUMBER = 42L; + public static final String REQUEST_BODY_FORMEMAIL = "#/components/requestBodies/formEmail"; @Test public void testConvertPetstore() throws Exception { @@ -170,7 +172,7 @@ public void testIssue1() throws Exception { assertEquals(ENUM_SIZE, arraySchema.getItems().getEnum().size()); } - @Test(description = "Response Codes") + @Test(description = "Response Code") public void testIssue2() throws Exception { OpenAPI oas = getConvertedOpenAPIFromJsonFile(ISSUE_2_JSON); assertEquals(REQUIRED_SIZE, oas.getPaths().get(API_BATCH_PATH).getGet().getResponses().size()); @@ -292,7 +294,14 @@ public void testIssue16() throws Exception { @Test(description = "Referenced parameters are converted incorrectly") public void testIssue17() throws Exception { OpenAPI oas = getConvertedOpenAPIFromJsonFile(ISSUE_17_JSON); - assertNotNull(oas); + Map requestBodies = oas.getComponents().getRequestBodies(); + assertNotNull(requestBodies.get("formEmail").getContent().get("multipart/form-data")); + assertNotNull(requestBodies.get("formPassword").getContent().get("multipart/form-data")); + assertNotNull(requestBodies.get("bodyParam").getContent().get("*/*")); + assertEquals(oas.getPaths().get("/formPost").getPost().getParameters().get(0).get$ref(), + REQUEST_BODY_FORMEMAIL); + assertNotNull(oas.getPaths().get("/report/{userId}").getGet().getRequestBody(). + getContent().get("multipart/form-data").getSchema().getProperties().get("limitForm")); } @Test(description = "External Docs in Operations") @@ -364,7 +373,8 @@ public void testIssue23() throws Exception { @Test(description = "Covert path item $refs") public void testIssue25() throws Exception { OpenAPI oas = getConvertedOpenAPIFromJsonFile(ISSUE_25_JSON); - assertNull(oas); + assertNotNull(oas); + assertEquals(oas.getPaths().get("/foo2").get$ref(), "#/paths/~1foo"); } @Test(description = "Convert allOff") @@ -468,8 +478,9 @@ public void testIssue36() throws Exception { private OpenAPI getConvertedOpenAPIFromJsonFile(String file) throws IOException, URISyntaxException { SwaggerConverter converter = new SwaggerConverter(); String swaggerAsString = new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource(file).toURI()))); - - SwaggerParseResult result = converter.readContents(swaggerAsString, null, null); + ParseOptions parseOptions = new ParseOptions(); + parseOptions.setResolve(false); + SwaggerParseResult result = converter.readContents(swaggerAsString, null, parseOptions); assertNotNull(result); return result.getOpenAPI(); } diff --git a/modules/swagger-parser-v2-converter/src/test/resources/issue-17.json b/modules/swagger-parser-v2-converter/src/test/resources/issue-17.json index b5c4751812..e80166c779 100644 --- a/modules/swagger-parser-v2-converter/src/test/resources/issue-17.json +++ b/modules/swagger-parser-v2-converter/src/test/resources/issue-17.json @@ -13,6 +13,22 @@ }, { "$ref": "#/parameters/dateRangeParam" + }, + { + "name": "limit", + "in": "query", + "description": "number of pets to return", + "type": "string", + "x-example": "value" + }, + { + + "name": "limitForm", + "in": "formData", + "type": "string", + "format": "email", + "required": true + } ], "responses": { diff --git a/pom.xml b/pom.xml index cb56c2c832..ced14f765c 100644 --- a/pom.xml +++ b/pom.xml @@ -249,7 +249,7 @@ - 1.0.28 + 1.0.33-SNAPSHOT 2.4 1.6.3 2.0.0-SNAPSHOT