From 72d3f38b8fea64113f89345de8ed62286e7f127a Mon Sep 17 00:00:00 2001 From: Tomohiko Ozawa Date: Sat, 3 Feb 2024 10:27:39 +0900 Subject: [PATCH 1/2] fix invalid default values of parameters with array type in a referenced file --- .../codegen/languages/AbstractJavaCodegen.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java index c1ae3cc8fbbd..44bc81fd58b1 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java @@ -1289,6 +1289,9 @@ public String toDefaultParameterValue(final Schema schema) { return localDate.toString(); } if (ModelUtils.isArraySchema(schema)) { + // swagger-parser parses the default value differently depending on whether it's in a referenced file or not. + // cf. https://github.com/swagger-api/swagger-parser/issues/1958 + // ArrayList if in the referenced file, ArrayNode if not. if (defaultValue instanceof ArrayNode) { ArrayNode array = (ArrayNode) defaultValue; return StreamSupport.stream(array.spliterator(), false) @@ -1297,6 +1300,11 @@ public String toDefaultParameterValue(final Schema schema) { .map(item -> StringUtils.removeStart(item, "\"")) .map(item -> StringUtils.removeEnd(item, "\"")) .collect(Collectors.joining(",")); + } else if (defaultValue instanceof ArrayList) { + ArrayList array = (ArrayList) defaultValue; + return array.stream() + .map(Object::toString) + .collect(Collectors.joining(",")); } } // escape quotes From df0be8a32ddcba5791ce57aa06df79c805afd89f Mon Sep 17 00:00:00 2001 From: Tomohiko Ozawa Date: Sat, 3 Feb 2024 12:29:00 +0900 Subject: [PATCH 2/2] add test --- .../codegen/java/AbstractJavaCodegenTest.java | 24 +++++++++ .../src/test/resources/3_0/issue_16223.yaml | 54 +++++++++++++++++++ .../3_0/issue_16223_enum_with_default.yaml | 10 ++++ .../issue_16223_enum_with_default_empty.yaml | 8 +++ 4 files changed, 96 insertions(+) create mode 100644 modules/openapi-generator/src/test/resources/3_0/issue_16223.yaml create mode 100644 modules/openapi-generator/src/test/resources/3_0/issue_16223_enum_with_default.yaml create mode 100644 modules/openapi-generator/src/test/resources/3_0/issue_16223_enum_with_default_empty.yaml diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/AbstractJavaCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/AbstractJavaCodegenTest.java index aeee65e8b46e..8b6e6281a146 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/AbstractJavaCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/AbstractJavaCodegenTest.java @@ -17,14 +17,18 @@ package org.openapitools.codegen.java; +import io.swagger.parser.OpenAPIParser; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.media.*; +import io.swagger.v3.oas.models.parameters.Parameter; +import io.swagger.v3.parser.core.models.ParseOptions; import java.time.OffsetDateTime; import java.time.ZonedDateTime; import java.util.*; +import java.util.stream.Collectors; import org.openapitools.codegen.*; import org.openapitools.codegen.languages.AbstractJavaCodegen; import org.openapitools.codegen.utils.ModelUtils; @@ -873,6 +877,26 @@ public void testOneOfModelImports() throws Exception { Assert.assertTrue(cm.imports.contains("UUID")); } + @Test + public void arrayParameterDefaultValueDoesNotNeedBraces() throws Exception { + ParseOptions parseOptions = new ParseOptions(); + parseOptions.setResolve(true); + final OpenAPI openAPI = new OpenAPIParser() + .readLocation("src/test/resources/3_0/issue_16223.yaml", null, parseOptions) + .getOpenAPI(); + final P_AbstractJavaCodegen codegen = new P_AbstractJavaCodegen(); + codegen.setOpenAPI(openAPI); + + Map schemas = openAPI.getPaths().get("/test").getGet().getParameters().stream() + .collect(Collectors.toMap( + Parameter::getName, + p -> ModelUtils.getReferencedSchema(openAPI, p.getSchema()))); + Assert.assertEquals(codegen.toDefaultParameterValue(schemas.get("fileEnumWithDefault")), "A,B"); + Assert.assertEquals(codegen.toDefaultParameterValue(schemas.get("fileEnumWithDefaultEmpty")), ""); + Assert.assertEquals(codegen.toDefaultParameterValue(schemas.get("inlineEnumWithDefault")), "A,B"); + Assert.assertEquals(codegen.toDefaultParameterValue(schemas.get("inlineEnumWithDefaultEmpty")), ""); + } + private static Schema createObjectSchemaWithMinItems() { return new ObjectSchema() .addProperties("id", new IntegerSchema().format("int32")) diff --git a/modules/openapi-generator/src/test/resources/3_0/issue_16223.yaml b/modules/openapi-generator/src/test/resources/3_0/issue_16223.yaml new file mode 100644 index 000000000000..db720b714f7c --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/issue_16223.yaml @@ -0,0 +1,54 @@ +--- +openapi: 3.0.3 +info: + title: Test + version: 1.0.0-SNAPSHOT +paths: + /test: + get: + parameters: + - name: fileEnumWithDefault + in: query + schema: + $ref: './issue_16223_enum_with_default.yaml' + - name: fileEnumWithDefaultEmpty + in: query + schema: + $ref: './issue_16223_enum_with_default_empty.yaml' + - name: inlineEnumWithDefault + in: query + schema: + type: array + items: + type: string + enum: + - A + - B + - C + default: + - A + - B + - name: inlineEnumWithDefaultEmpty + in: query + schema: + type: array + items: + type: string + enum: + - A + - B + - C + default: [] + responses: + "200": + description: OK + +components: + schemas: + Test: + type: object + properties: + withDefault: + $ref: './issue_16223_enum_with_default.yaml' + withEmptyDefault: + $ref: './issue_16223_enum_with_default_empty.yaml' diff --git a/modules/openapi-generator/src/test/resources/3_0/issue_16223_enum_with_default.yaml b/modules/openapi-generator/src/test/resources/3_0/issue_16223_enum_with_default.yaml new file mode 100644 index 000000000000..c926f665b89b --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/issue_16223_enum_with_default.yaml @@ -0,0 +1,10 @@ +type: array +items: + type: string + enum: + - A + - B + - C +default: + - A + - B diff --git a/modules/openapi-generator/src/test/resources/3_0/issue_16223_enum_with_default_empty.yaml b/modules/openapi-generator/src/test/resources/3_0/issue_16223_enum_with_default_empty.yaml new file mode 100644 index 000000000000..066864a06300 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/issue_16223_enum_with_default_empty.yaml @@ -0,0 +1,8 @@ +type: array +items: + type: string + enum: + - A + - B + - C +default: []