Skip to content

Commit fd3bc70

Browse files
committed
fix: refs #1552 - fix response schema conversion v2->v3
1 parent 9739fc6 commit fd3bc70

File tree

4 files changed

+158
-18
lines changed

4 files changed

+158
-18
lines changed

modules/swagger-parser-v2-converter/src/main/java/io/swagger/v3/parser/converter/SwaggerConverter.java

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -861,8 +861,8 @@ public ApiResponse convert(io.swagger.models.Response v2Response, List<String> p
861861

862862
response.setDescription(v2Response.getDescription());
863863

864-
if (v2Response.getSchema() != null) {
865-
Schema schema = convertFileSchema(convert(v2Response.getSchema()));
864+
if (v2Response.getResponseSchema() != null) {
865+
Schema schema = convertFileSchema(convert(v2Response.getResponseSchema()));
866866
for (String type : mediaTypes) {
867867
// TODO: examples
868868
MediaType mediaType = new MediaType();
@@ -930,6 +930,9 @@ private Schema convert(Property schema) {
930930
if (schema == null) {
931931
return null;
932932
}
933+
if (schema.getBooleanValue() != null) {
934+
return new Schema().booleanSchemaValue(schema.getBooleanValue());
935+
}
933936
Schema result;
934937

935938
if (schema instanceof RefProperty) {
@@ -961,8 +964,7 @@ private Schema convert(Property schema) {
961964
result = arraySchema;
962965

963966
} else if (schema instanceof FileProperty) {
964-
FileSchema fileSchema = Json.mapper().convertValue(schema, FileSchema.class);
965-
result = fileSchema;
967+
result = Json.mapper().convertValue(schema, FileSchema.class);
966968

967969
}else {
968970

@@ -982,7 +984,11 @@ private Schema convert(Property schema) {
982984
if (schema instanceof MapProperty) {
983985
MapProperty map = (MapProperty) schema;
984986

985-
result.setAdditionalProperties(convert(map.getAdditionalProperties()));
987+
if (map.getAdditionalProperties().getBooleanValue() != null) {
988+
result.setAdditionalProperties(map.getAdditionalProperties().getBooleanValue());
989+
} else {
990+
result.setAdditionalProperties(convert(map.getAdditionalProperties()));
991+
}
986992
result.setMinProperties(map.getMinProperties());
987993
result.setMaxProperties(map.getMaxProperties());
988994
}
@@ -1173,6 +1179,9 @@ public Schema convert(io.swagger.models.Model v2Model) {
11731179
if (v2Model == null) {
11741180
return null;
11751181
}
1182+
if (v2Model.getBooleanValue() != null) {
1183+
return new Schema().booleanSchemaValue(v2Model.getBooleanValue());
1184+
}
11761185
Schema result;
11771186

11781187
if (v2Model instanceof ArrayModel) {
@@ -1208,16 +1217,22 @@ public Schema convert(io.swagger.models.Model v2Model) {
12081217
v2discriminator = model.getDiscriminator();
12091218
model.setDiscriminator(null);
12101219
}
1211-
1212-
result = Json.mapper().convertValue(v2Model, Schema.class);
1213-
1220+
if (v2Model instanceof ModelImpl && ("file".equals(((ModelImpl)v2Model).getType()))) {
1221+
result = Json.mapper().convertValue(v2Model, FileSchema.class);
1222+
} else {
1223+
result = Json.mapper().convertValue(v2Model, Schema.class);
1224+
}
12141225
addProperties(v2Model, result);
12151226

12161227
if (v2Model instanceof ModelImpl) {
12171228
ModelImpl model = (ModelImpl) v2Model;
12181229

12191230
if (model.getAdditionalProperties() != null) {
1220-
result.setAdditionalProperties(convert(model.getAdditionalProperties()));
1231+
if (model.getAdditionalProperties().getBooleanValue() != null) {
1232+
result.setAdditionalProperties(model.getAdditionalProperties().getBooleanValue());
1233+
} else {
1234+
result.setAdditionalProperties(convert(model.getAdditionalProperties()));
1235+
}
12211236
}
12221237
} else if(v2Model instanceof RefModel) {
12231238
RefModel ref = (RefModel) v2Model;

modules/swagger-parser-v2-converter/src/test/java/io/swagger/parser/test/V2ConverterTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,7 @@ public void testIssue745() throws Exception {
645645
OpenAPI oas = getConvertedOpenAPIFromJsonFile(ISSUE_745_YAML);
646646
assertTrue(oas.getServers().get(0).getUrl().startsWith("//"));
647647
}
648-
648+
649649
@Test(description = "OpenAPIParser.readLocation fails when fetching valid Swagger 2.0 resource with AuthorizationValues provided")
650650
public void testIssue785() {
651651
AuthorizationValue apiKey = new AuthorizationValue("api_key", "special-key", "header");
@@ -676,7 +676,7 @@ public void testIssue758() throws Exception {
676676
final OpenAPI oas = getConvertedOpenAPIFromJsonFile(ISSUE_758_JSON);
677677
assertNotNull(oas);
678678
}
679-
679+
680680
@Test(description = "OpenAPI v2 Converter: NPE when type is array and 'items' field is missing in array property")
681681
public void testIssue762() throws Exception {
682682
final OpenAPI oas = getConvertedOpenAPIFromJsonFile(ISSUE_762_JSON);
@@ -733,7 +733,7 @@ public void testSwaggerParseResultHasMessage() throws Exception {
733733
assertNotNull(result.getMessages());
734734
}
735735

736-
736+
737737
@Test(description = "OpenAPI v2 converter - Migrate minLength, maxLength and pattern of String property")
738738
public void testIssue786() throws Exception {
739739
final OpenAPI oas = getConvertedOpenAPIFromJsonFile(ISSUE_768_JSON);
@@ -753,7 +753,7 @@ public void testTopLevelExtensions() throws Exception {
753753
assertNotNull(oas);
754754
assertEquals((String)oas.getExtensions().get("x-some-extensions"), "hello");
755755
}
756-
756+
757757
@Test(description = "OpenAPI v2 converter - Conversion param extensions should be preserved")
758758
public void testIssue820() throws Exception {
759759
final OpenAPI oas = getConvertedOpenAPIFromJsonFile(ISSUE_820_YAML);

modules/swagger-parser/src/test/java/io/swagger/parser/OpenAPIParserTest.java

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.swagger.parser;
22

3+
import io.swagger.v3.core.util.Yaml;
34
import io.swagger.v3.oas.models.Components;
45
import io.swagger.v3.oas.models.OpenAPI;
56
import io.swagger.v3.oas.models.media.ArraySchema;
@@ -665,5 +666,129 @@ public void testConvertWindowsPathsToUnixWhenResolvingServerPaths() {
665666

666667
assertEquals("/api/customer1/v1", result.getOpenAPI().getServers().get(0).getUrl());
667668
}
669+
670+
@org.testng.annotations.Test(description = "convert response schema")
671+
public void testIssue1552() throws Exception {
672+
ParseOptions options = new ParseOptions();
673+
options.setResolve(true);
674+
OpenAPIParser parser = new OpenAPIParser();
675+
SwaggerParseResult result = parser.readContents(
676+
"swagger: \"2.0\"\n"
677+
+ "info:\n"
678+
+ " version: \"1.0\"\n"
679+
+ " title: \"test\"\n"
680+
+ "host: \"foo\"\n"
681+
+ "paths:\n"
682+
+ " /example:\n"
683+
+ " get:\n"
684+
+ " consumes:\n"
685+
+ " - \"application/json\"\n"
686+
+ " produces:\n"
687+
+ " - \"application/json\"\n"
688+
+ " responses:\n"
689+
+ " 200:\n"
690+
+ " $ref: \"#/responses/something\"\n"
691+
+ "responses:\n"
692+
+ " something:\n"
693+
+ " description: \"my response\"\n"
694+
+ " schema:\n"
695+
+ " title: \"my schema\"\n"
696+
+ " properties:\n"
697+
+ " foo:\n"
698+
+ " type: string\n"
699+
+ "", null, options);
700+
Schema<?> schema = result.getOpenAPI().getPaths()
701+
.get("/example").getGet()
702+
.getResponses().get("200").getContent()
703+
.get("application/json").getSchema();
704+
assertNotNull(schema.getTitle()); // found title
705+
assertNotNull(schema.getProperties().get("foo"));
706+
}
707+
708+
@org.testng.annotations.Test(description = "convert response schema")
709+
public void testIssue1552AdditionalProps() throws Exception {
710+
ParseOptions options = new ParseOptions();
711+
options.setResolve(true);
712+
options.setInferSchemaType(false);
713+
OpenAPIParser parser = new OpenAPIParser();
714+
SwaggerParseResult result = parser.readContents(
715+
"swagger: '2.0'\n" +
716+
"info:\n" +
717+
" title: Some API\n" +
718+
" description: >-\n" +
719+
" This is the Some Api\n" +
720+
" version: 2.0.0\n" +
721+
"basePath: /somepath\n" +
722+
"schemes:\n" +
723+
" - https\n" +
724+
"consumes:\n" +
725+
" - application/json\n" +
726+
"produces:\n" +
727+
" - application/json\n" +
728+
"paths:\n" +
729+
" /somepath:\n" +
730+
" get:\n" +
731+
" description: >\n" +
732+
" my description\n" +
733+
" operationId: MyGet\n" +
734+
" responses:\n" +
735+
" '200':\n" +
736+
" $ref: '#/responses/Response'\n" +
737+
"responses:\n" +
738+
" Response:\n" +
739+
" description: Response\n" +
740+
" schema:\n" +
741+
" type: object\n" +
742+
" required:\n" +
743+
" - Report\n" +
744+
" properties:\n" +
745+
" Report:\n" +
746+
" type: string\n" +
747+
" additionalProperties: false", null, options);
748+
assertEquals(Yaml.pretty(result), "messages: []\n" +
749+
"openAPI:\n" +
750+
" openapi: 3.0.1\n" +
751+
" info:\n" +
752+
" title: Some API\n" +
753+
" description: This is the Some Api\n" +
754+
" version: 2.0.0\n" +
755+
" servers:\n" +
756+
" - url: /somepath\n" +
757+
" paths:\n" +
758+
" /somepath:\n" +
759+
" get:\n" +
760+
" description: |\n" +
761+
" my description\n" +
762+
" operationId: MyGet\n" +
763+
" responses:\n" +
764+
" \"200\":\n" +
765+
" description: Response\n" +
766+
" content:\n" +
767+
" application/json:\n" +
768+
" schema:\n" +
769+
" required:\n" +
770+
" - Report\n" +
771+
" type: object\n" +
772+
" properties:\n" +
773+
" Report:\n" +
774+
" type: string\n" +
775+
" additionalProperties: false\n" +
776+
" components:\n" +
777+
" responses:\n" +
778+
" Response:\n" +
779+
" description: Response\n" +
780+
" content:\n" +
781+
" application/json:\n" +
782+
" schema:\n" +
783+
" required:\n" +
784+
" - Report\n" +
785+
" type: object\n" +
786+
" properties:\n" +
787+
" Report:\n" +
788+
" type: string\n" +
789+
" additionalProperties: false\n" +
790+
" x-original-swagger-version: \"2.0\"\n" +
791+
"openapi31: false\n");
792+
}
668793
}
669794

pom.xml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -403,19 +403,19 @@
403403
</repositories>
404404
<properties>
405405
<snakeyaml-version>1.33</snakeyaml-version>
406-
<swagger-parser-v2-version>1.0.63</swagger-parser-v2-version>
406+
<swagger-parser-v2-version>1.0.64</swagger-parser-v2-version>
407407
<commons-io-version>2.11.0</commons-io-version>
408408
<slf4j-version>1.7.30</slf4j-version>
409-
<swagger-core-version>2.2.6</swagger-core-version>
410-
<swagger-core-v2-version>1.6.8</swagger-core-v2-version>
409+
<swagger-core-version>2.2.7</swagger-core-version>
410+
<swagger-core-v2-version>1.6.9</swagger-core-v2-version>
411411
<junit-version>4.13.2</junit-version>
412412
<testng-version>6.14.2</testng-version>
413413
<jmockit-version>1.35</jmockit-version>
414414
<wiremock-version>2.15.0</wiremock-version>
415415
<surefire-version>2.22.2</surefire-version>
416416
<commons-lang-version>3.2.1</commons-lang-version>
417-
<jackson-version>2.13.4</jackson-version>
418-
<jackson-databind-version>2.13.4.2</jackson-databind-version>
417+
<jackson-version>2.14.0</jackson-version>
418+
<jackson-databind-version>2.14.0</jackson-databind-version>
419419
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
420420
<sonatypeOssDistMgmtSnapshotsUrl>https://oss.sonatype.org/content/repositories/snapshots/</sonatypeOssDistMgmtSnapshotsUrl>
421421
</properties>

0 commit comments

Comments
 (0)