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 ac1ee38bc369..9d01aeff79f3 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 @@ -24,6 +24,7 @@ import io.swagger.v3.oas.models.media.ArraySchema; import io.swagger.v3.oas.models.media.ComposedSchema; import io.swagger.v3.oas.models.media.Schema; +import io.swagger.v3.oas.models.media.StringSchema; import io.swagger.v3.oas.models.servers.Server; import io.swagger.v3.parser.util.SchemaTypeUtil; import org.apache.commons.io.FilenameUtils; @@ -765,16 +766,23 @@ public String toModelFilename(String name) { @Override public String getTypeDeclaration(Schema p) { - if (ModelUtils.isArraySchema(p)) { - Schema items = getSchemaItems((ArraySchema) p); - return getSchemaType(p) + "<" + getTypeDeclaration(ModelUtils.unaliasSchema(this.openAPI, items)) + ">"; - } else if (ModelUtils.isMapSchema(p) && !ModelUtils.isComposedSchema(p)) { + Schema schema = ModelUtils.unaliasSchema(this.openAPI, p); + Schema target = ModelUtils.isGenerateAliasAsModel() ? p : schema; + if (ModelUtils.isArraySchema(target)) { + Schema items = getSchemaItems((ArraySchema) schema); + return getSchemaType(target) + "<" + getTypeDeclaration(items) + ">"; + } else if (ModelUtils.isMapSchema(target)) { // Note: ModelUtils.isMapSchema(p) returns true when p is a composed schema that also defines // additionalproperties: true - Schema inner = getSchemaAdditionalProperties(p); - return getSchemaType(p) + ""; + Schema inner = getAdditionalProperties(target); + if (inner == null) { + LOGGER.error("`{}` (map property) does not have a proper inner type defined. Default to type:string", p.getName()); + inner = new StringSchema().description("TODO default missing map inner type to string"); + p.setAdditionalProperties(inner); + } + return getSchemaType(target) + ""; } - return super.getTypeDeclaration(p); + return super.getTypeDeclaration(target); } @Override 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 4e2c6014193d..6ba9e4b67f83 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 @@ -416,6 +416,34 @@ public void toDefaultValueTest() { Schema schema = createObjectSchemaWithMinItems(); String defaultValue = codegen.toDefaultValue(schema); Assert.assertNull(defaultValue); + + // Create an alias to an array schema + Schema nestedArraySchema = new ArraySchema().items(new IntegerSchema().format("int32")); + codegen.setOpenAPI(new OpenAPI().components(new Components().addSchemas("NestedArray", nestedArraySchema))); + + // Create an array schema with item type set to the array alias + schema = new ArraySchema().items(new Schema().$ref("#/components/schemas/NestedArray")); + + ModelUtils.setGenerateAliasAsModel(false); + defaultValue = codegen.toDefaultValue(schema); + Assert.assertEquals(defaultValue, "new ArrayList>()"); + + ModelUtils.setGenerateAliasAsModel(true); + defaultValue = codegen.toDefaultValue(schema); + Assert.assertEquals(defaultValue, "new ArrayList()"); + + // Create a map schema with additionalProperties type set to array alias + schema = new MapSchema().additionalProperties(new Schema().$ref("#/components/schemas/NestedArray")); + + ModelUtils.setGenerateAliasAsModel(false); + defaultValue = codegen.toDefaultValue(schema); + Assert.assertEquals(defaultValue, "new HashMap>()"); + + ModelUtils.setGenerateAliasAsModel(true); + defaultValue = codegen.toDefaultValue(schema); + Assert.assertEquals(defaultValue, "new HashMap()"); + + // Test default value for date format DateSchema dateSchema = new DateSchema(); LocalDate defaultLocalDate = LocalDate.of(2019,2,15); Date date = Date.from(defaultLocalDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java index f4ad38c2ec3d..6ffed70c44d6 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java @@ -608,6 +608,7 @@ public void testImportMapping() throws IOException { .setLibrary(JavaClientCodegen.RESTEASY) .setAdditionalProperties(properties) .setImportMappings(importMappings) + .setGenerateAliasAsModel(true) .setInputSpec("src/test/resources/3_0/type-alias.yaml") .setOutputDir(output.getAbsolutePath().replace("\\", "/"));