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 d4576c2ff95..ae7b617a3e3 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 @@ -3616,6 +3616,10 @@ public class DefaultCodegen implements CodegenConfig { } protected void updatePropertyForMap(CodegenProperty property, Schema p) { + // throw exception if additionalProperties is false + if (p.getAdditionalProperties() instanceof Boolean && Boolean.FALSE.equals(p.getAdditionalProperties())) { + throw new RuntimeException("additionalProperties cannot be false in updatePropertyForMap."); + } property.isContainer = true; property.containerType = "map"; // TODO remove this hack in the future, code should use minProperties and maxProperties for object schemas diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java index ab9a1f32117..d4bef127c73 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java @@ -524,6 +524,11 @@ public class ModelUtils { * @return true if the specified schema is a Map schema. */ public static boolean isMapSchema(Schema schema) { + // additionalProperties explicitly set to false + if (schema.getAdditionalProperties() instanceof Boolean && Boolean.FALSE.equals(schema.getAdditionalProperties())) { + return false; + } + return (schema instanceof MapSchema) || (schema.getAdditionalProperties() instanceof Schema) || (schema.getAdditionalProperties() instanceof Boolean && (Boolean) schema.getAdditionalProperties()); 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 a6a6720a921..5cfaa144af2 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 @@ -337,10 +337,11 @@ public class DefaultCodegenTest { // It is unfortunate that child.getAdditionalProperties() returns null for a V2 schema. // We cannot differentiate between 'additionalProperties' not present and // additionalProperties: true. - Assert.assertNull(map_with_additional_properties_sc.getAdditionalProperties()); + // UPDATE fixed in swagger parser 2.1.14 + Assert.assertTrue((Boolean) map_with_additional_properties_sc.getAdditionalProperties()); addProps = ModelUtils.getAdditionalProperties(openAPI, map_with_additional_properties_sc); - Assert.assertNull(addProps); - Assert.assertNull(map_with_additional_properties_cp.getAdditionalProperties()); + Assert.assertEquals(addProps, new Schema()); + Assert.assertNotNull(map_with_additional_properties_cp.getAdditionalProperties()); // map_without_additional_properties // This property has the following inline schema. @@ -349,7 +350,8 @@ public class DefaultCodegenTest { // It is unfortunate that child.getAdditionalProperties() returns null for a V2 schema. // We cannot differentiate between 'additionalProperties' not present and // additionalProperties: false. - Assert.assertNull(map_without_additional_properties_sc.getAdditionalProperties()); + // UPDATE fixed in swagger parser 2.1.14 + Assert.assertFalse((Boolean) map_without_additional_properties_sc.getAdditionalProperties()); addProps = ModelUtils.getAdditionalProperties(openAPI, map_without_additional_properties_sc); Assert.assertNull(addProps); Assert.assertNull(map_without_additional_properties_cp.getAdditionalProperties()); @@ -426,9 +428,10 @@ public class DefaultCodegenTest { // It is unfortunate that child.getAdditionalProperties() returns null for a V2 schema. // We cannot differentiate between 'additionalProperties' not present and // additionalProperties: true. - Assert.assertNull(map_with_additional_properties_sc.getAdditionalProperties()); + // UPDATE fixed in swagger parser 2.1.14 + Assert.assertTrue((Boolean) map_with_additional_properties_sc.getAdditionalProperties()); addProps = ModelUtils.getAdditionalProperties(openAPI, map_with_additional_properties_sc); - Assert.assertNull(addProps); + Assert.assertEquals(addProps, new Schema()); Assert.assertNotNull(map_with_additional_properties_cp.getAdditionalProperties()); // map_without_additional_properties @@ -438,10 +441,11 @@ public class DefaultCodegenTest { // It is unfortunate that child.getAdditionalProperties() returns null for a V2 schema. // We cannot differentiate between 'additionalProperties' not present and // additionalProperties: false. - Assert.assertNull(map_without_additional_properties_sc.getAdditionalProperties()); + // UPDATE fixed in swagger parser 2.1.14 + Assert.assertFalse((Boolean) map_without_additional_properties_sc.getAdditionalProperties()); addProps = ModelUtils.getAdditionalProperties(openAPI, map_without_additional_properties_sc); - Assert.assertNull(addProps); - Assert.assertNotNull(map_without_additional_properties_cp.getAdditionalProperties()); + Assert.assertEquals(addProps, null); + Assert.assertNull(map_without_additional_properties_cp.getAdditionalProperties()); // check of composed schema model String schemaName = "Parent"; @@ -2386,7 +2390,7 @@ public class DefaultCodegenTest { assertTrue(names.contains("password")); assertTrue(names.contains("passwordConfirmation")); assertTrue(names.contains("oldPassword")); - + Optional passwordParameter = operation.formParams.stream().filter(p -> "password".equals(p.paramName)).findFirst(); assertTrue(passwordParameter.isPresent()); assertTrue(passwordParameter.get().isPassword); @@ -4277,7 +4281,7 @@ public class DefaultCodegenTest { .collect(Collectors.toList()); // JUnit assertions - assertEquals("Messages: " + logsList.stream().map(ILoggingEvent::getMessage).collect(Collectors.toList()),8, logsList.size()); + assertEquals("Messages: " + logsList.stream().map(ILoggingEvent::getMessage).collect(Collectors.toList()), 8, logsList.size()); assertEquals("Validation 'minItems' has no effect on schema 'string'. Ignoring!", logsList.get(0) .getMessage()); assertEquals("Validation 'maxItems' has no effect on schema 'string'. Ignoring!", logsList.get(1) @@ -4324,7 +4328,7 @@ public class DefaultCodegenTest { .collect(Collectors.toList()); // JUnit assertions - assertEquals("Messages: " + logsList.stream().map(ILoggingEvent::getMessage).collect(Collectors.toList()),8, logsList.size()); + assertEquals("Messages: " + logsList.stream().map(ILoggingEvent::getMessage).collect(Collectors.toList()), 8, logsList.size()); assertEquals("Validation 'minItems' has no effect on schema 'integer'. Ignoring!", logsList.get(0) .getMessage()); assertEquals("Validation 'maxItems' has no effect on schema 'integer'. Ignoring!", logsList.get(1) @@ -4371,7 +4375,7 @@ public class DefaultCodegenTest { .collect(Collectors.toList()); // JUnit assertions - assertEquals("Messages: " + logsList.stream().map(ILoggingEvent::getMessage).collect(Collectors.toList()),0, logsList.size()); + assertEquals("Messages: " + logsList.stream().map(ILoggingEvent::getMessage).collect(Collectors.toList()), 0, logsList.size()); } @Test diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/yaml/YamlGeneratorTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/yaml/YamlGeneratorTest.java index cc4e74ade5d..6f289d538e1 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/yaml/YamlGeneratorTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/yaml/YamlGeneratorTest.java @@ -112,10 +112,13 @@ public class YamlGeneratorTest { TestUtils.ensureContainsFile(files, output, ".openapi-generator/FILES"); TestUtils.ensureContainsFile(files, output, ".openapi-generator/VERSION"); - OpenAPI generated = TestUtils.parseSpec(new File(output, "issue_9086.yaml").getPath()); + OpenAPI actual = TestUtils.parseSpec("src/test/resources/2_0/issue_9086.yaml"); OpenAPI expected = TestUtils.parseSpec("src/test/resources/2_0/issue_9086_expected.yaml"); // use #toString because the equals methods is a little stricter than necessary for this test - Assert.assertEquals(expected.toString(), generated.toString()); + Assert.assertEquals(actual.getComponents().getSchemas().get("bar2").getAdditionalProperties(), + expected.getComponents().getSchemas().get("bar2").getAdditionalProperties()); + Assert.assertEquals(actual.getPaths().get("/foo/bar").getPost().getResponses().get("200").getContent().get("*/*").getSchema().getAdditionalProperties(), + expected.getComponents().getSchemas().get("_foo_bar_post_200_response").getAdditionalProperties()); } } diff --git a/modules/openapi-generator/src/test/resources/2_0/issue_9086_expected.yaml b/modules/openapi-generator/src/test/resources/2_0/issue_9086_expected.yaml index 120df701d7c..73264074825 100644 --- a/modules/openapi-generator/src/test/resources/2_0/issue_9086_expected.yaml +++ b/modules/openapi-generator/src/test/resources/2_0/issue_9086_expected.yaml @@ -26,6 +26,7 @@ paths: components: schemas: bar2: + additionalProperties: false example: "n": 4.56 properties: @@ -34,6 +35,7 @@ components: type: number type: object _foo_bar_post_200_response: + additionalProperties: false example: "n": 1.23 properties: diff --git a/pom.xml b/pom.xml index 5100cc2f6e2..afa82c73994 100644 --- a/pom.xml +++ b/pom.xml @@ -1478,7 +1478,7 @@ 3.0.0 7.22.0 io.swagger.parser.v3 - 2.1.6 + 2.1.14 7.5 1.34 3.4.3