From 090e8228ea9c3505c611ea17b686e025a11542f6 Mon Sep 17 00:00:00 2001 From: "akihito.nakano" Date: Tue, 19 Feb 2019 13:46:33 +0900 Subject: [PATCH 1/7] Add test case which reproduces the issue --- .../openapitools/codegen/InlineModelResolverTest.java | 10 ++++++++++ .../src/test/resources/3_0/inline_model_resolver.yaml | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java index 4eb8c29c3b7c..35845b0edd11 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java @@ -695,4 +695,14 @@ public void emptyExampleOnStringTypeModels() { assertTrue(ModelUtils.getReferencedSchema(openAPI, schema.getItems()) instanceof StringSchema); assertNull(ModelUtils.getReferencedSchema(openAPI, schema.getItems()).getExample()); } + + @Test + public void nullable() { + OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/inline_model_resolver.yaml"); + new InlineModelResolver().flatten(openAPI); + + Schema nullablePropertyReference = (Schema) openAPI.getComponents().getSchemas().get("InlinePropertyIsNullable").getProperties().get("nullable_property"); + Schema nullablePropertySchema = ModelUtils.getReferencedSchema(openAPI, nullablePropertyReference); + assertTrue(nullablePropertySchema.getNullable()); + } } \ No newline at end of file diff --git a/modules/openapi-generator/src/test/resources/3_0/inline_model_resolver.yaml b/modules/openapi-generator/src/test/resources/3_0/inline_model_resolver.yaml index 9da6749774ef..8e474697b037 100644 --- a/modules/openapi-generator/src/test/resources/3_0/inline_model_resolver.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/inline_model_resolver.yaml @@ -301,3 +301,12 @@ components: EmptyExampleOnStringTypeModels: type: string example: '' + InlinePropertyIsNullable: + type: object + properties: + nullable_property: + type: object + nullable: true + properties: + foo: + type: string From e887067f71a04fbf145cb7803f21a48245451a09 Mon Sep 17 00:00:00 2001 From: "akihito.nakano" Date: Tue, 19 Feb 2019 13:47:49 +0900 Subject: [PATCH 2/7] Fix missing `nullable` --- .../main/java/org/openapitools/codegen/InlineModelResolver.java | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java index cba9be057fbe..63d937e2d1bc 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java @@ -531,6 +531,7 @@ private Schema modelFromProperty(ObjectSchema object, String path) { model.setName(object.getName()); model.setXml(xml); model.setRequired(object.getRequired()); + model.setNullable(object.getNullable()); if (properties != null) { flattenProperties(properties, path); model.setProperties(properties); From 6f9c3ee36680c2661ed504a7a1e1a9d1b1032a64 Mon Sep 17 00:00:00 2001 From: "akihito.nakano" Date: Tue, 19 Feb 2019 13:50:38 +0900 Subject: [PATCH 3/7] Tweak property name --- .../src/test/resources/3_0/inline_model_resolver.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/test/resources/3_0/inline_model_resolver.yaml b/modules/openapi-generator/src/test/resources/3_0/inline_model_resolver.yaml index 8e474697b037..0d55bd24a4e6 100644 --- a/modules/openapi-generator/src/test/resources/3_0/inline_model_resolver.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/inline_model_resolver.yaml @@ -308,5 +308,5 @@ components: type: object nullable: true properties: - foo: + nullable_property_name: type: string From c3c3b570511832a12a50deb43f517c9ddb3af78c Mon Sep 17 00:00:00 2001 From: "akihito.nakano" Date: Tue, 19 Feb 2019 14:01:19 +0900 Subject: [PATCH 4/7] Add test case which covers `Paths` --- .../codegen/InlineModelResolverTest.java | 14 ++++++++++++++ .../resources/3_0/inline_model_resolver.yaml | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java index 35845b0edd11..92018e3f50cc 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/InlineModelResolverTest.java @@ -704,5 +704,19 @@ public void nullable() { Schema nullablePropertyReference = (Schema) openAPI.getComponents().getSchemas().get("InlinePropertyIsNullable").getProperties().get("nullable_property"); Schema nullablePropertySchema = ModelUtils.getReferencedSchema(openAPI, nullablePropertyReference); assertTrue(nullablePropertySchema.getNullable()); + + + Schema nullableRequestBodyReference = (Schema) openAPI + .getPaths() + .get("/nullable_properties") + .getPost() + .getRequestBody() + .getContent() + .get("application/json") + .getSchema() + .getProperties() + .get("nullable_request_body_property"); + Schema nullableRequestBodySchema = ModelUtils.getReferencedSchema(openAPI, nullableRequestBodyReference); + assertTrue(nullableRequestBodySchema.getNullable()); } } \ No newline at end of file diff --git a/modules/openapi-generator/src/test/resources/3_0/inline_model_resolver.yaml b/modules/openapi-generator/src/test/resources/3_0/inline_model_resolver.yaml index 0d55bd24a4e6..a6235c7e60ec 100644 --- a/modules/openapi-generator/src/test/resources/3_0/inline_model_resolver.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/inline_model_resolver.yaml @@ -266,6 +266,24 @@ paths: type: array items: $ref: '#/components/schemas/EmptyExampleOnStringTypeModels' + /nullable_properties: + post: + requestBody: + content: + application/json: + schema: + type: object + properties: + nullable_request_body_property: + type: object + nullable: true + properties: + nullable_request_body_property_name: + type: string + operationId: arbitraryObjectRequestBodyProperty + responses: + '200': + description: OK components: schemas: Users: From d7eb7a80de03a0d92d0721e933c81f595179d902 Mon Sep 17 00:00:00 2001 From: "akihito.nakano" Date: Tue, 19 Feb 2019 17:16:17 +0900 Subject: [PATCH 5/7] Add test case for CodegenProperty.isNullable --- .../org/openapitools/codegen/DefaultCodegenTest.java | 12 ++++++++++++ .../src/test/resources/3_0/examples.yaml | 12 +++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index 348c41b1f830..3a7825c1d834 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -551,6 +551,18 @@ public void testResponseWithNoSchemaInHeaders() { Assert.assertTrue(cr.hasHeaders); } + @Test + public void testNullableProperty() { + final OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/examples.yaml"); + new InlineModelResolver().flatten(openAPI); + final DefaultCodegen codegen = new DefaultCodegen(); + codegen.setOpenAPI(openAPI); + + CodegenProperty property = codegen.fromProperty("address", (Schema) openAPI.getComponents().getSchemas().get("User").getProperties().get("address")); + + Assert.assertTrue(property.isNullable); + } + private void verifyPersonDiscriminator(CodegenDiscriminator discriminator) { CodegenDiscriminator test = new CodegenDiscriminator(); test.setPropertyName("DollarUnderscoretype"); diff --git a/modules/openapi-generator/src/test/resources/3_0/examples.yaml b/modules/openapi-generator/src/test/resources/3_0/examples.yaml index 92f6d7b46de4..30c540919b12 100644 --- a/modules/openapi-generator/src/test/resources/3_0/examples.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/examples.yaml @@ -107,4 +107,14 @@ paths: responses: '200': description: successful operation - +components: + schemas: + User: + type: object + properties: + address: + type: object + nullable: true + properties: + city: + type: string From f9cec69cb3d383e709d968cce9d84ccdcf5c6a1f Mon Sep 17 00:00:00 2001 From: "akihito.nakano" Date: Tue, 19 Feb 2019 17:18:03 +0900 Subject: [PATCH 6/7] Fix missing CodegenProperty.isNullable --- .../java/org/openapitools/codegen/DefaultCodegen.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index c153ed99da0b..9cd88e1010ec 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -2041,8 +2041,10 @@ public CodegenProperty fromProperty(String name, Schema p) { property.allowableValues = allowableValues; } } - //Referenced enum case: + Schema r = ModelUtils.getReferencedSchema(this.openAPI, p); + + //Referenced enum case: if (r.getEnum() != null && !r.getEnum().isEmpty()) { List _enum = r.getEnum(); @@ -2053,6 +2055,10 @@ public CodegenProperty fromProperty(String name, Schema p) { } } + if (r.getNullable() != null) { + property.isNullable = r.getNullable(); + } + property.dataType = getTypeDeclaration(p); property.dataFormat = p.getFormat(); property.baseType = getSchemaType(p); From 4e60860db377a96147f00e794239a9b9ad387204 Mon Sep 17 00:00:00 2001 From: "akihito.nakano" Date: Tue, 19 Feb 2019 17:20:08 +0900 Subject: [PATCH 7/7] Rename r -> referencedSchema --- .../java/org/openapitools/codegen/DefaultCodegen.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 9cd88e1010ec..3f6fc5ce2317 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -2042,11 +2042,11 @@ public CodegenProperty fromProperty(String name, Schema p) { } } - Schema r = ModelUtils.getReferencedSchema(this.openAPI, p); + Schema referencedSchema = ModelUtils.getReferencedSchema(this.openAPI, p); //Referenced enum case: - if (r.getEnum() != null && !r.getEnum().isEmpty()) { - List _enum = r.getEnum(); + if (referencedSchema.getEnum() != null && !referencedSchema.getEnum().isEmpty()) { + List _enum = referencedSchema.getEnum(); Map allowableValues = new HashMap(); allowableValues.put("values", _enum); @@ -2055,8 +2055,8 @@ public CodegenProperty fromProperty(String name, Schema p) { } } - if (r.getNullable() != null) { - property.isNullable = r.getNullable(); + if (referencedSchema.getNullable() != null) { + property.isNullable = referencedSchema.getNullable(); } property.dataType = getTypeDeclaration(p);