Skip to content

Commit 91ea6a1

Browse files
[Java] Unalias type when generating default value for model property (#5017)
Co-authored-by: Jim Schubert <james.schubert@gmail.com>
1 parent 966b87e commit 91ea6a1

3 files changed

Lines changed: 44 additions & 7 deletions

File tree

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import io.swagger.v3.oas.models.media.ArraySchema;
2525
import io.swagger.v3.oas.models.media.ComposedSchema;
2626
import io.swagger.v3.oas.models.media.Schema;
27+
import io.swagger.v3.oas.models.media.StringSchema;
2728
import io.swagger.v3.oas.models.servers.Server;
2829
import io.swagger.v3.parser.util.SchemaTypeUtil;
2930
import org.apache.commons.io.FilenameUtils;
@@ -765,16 +766,23 @@ public String toModelFilename(String name) {
765766

766767
@Override
767768
public String getTypeDeclaration(Schema p) {
768-
if (ModelUtils.isArraySchema(p)) {
769-
Schema<?> items = getSchemaItems((ArraySchema) p);
770-
return getSchemaType(p) + "<" + getTypeDeclaration(ModelUtils.unaliasSchema(this.openAPI, items)) + ">";
771-
} else if (ModelUtils.isMapSchema(p) && !ModelUtils.isComposedSchema(p)) {
769+
Schema<?> schema = ModelUtils.unaliasSchema(this.openAPI, p);
770+
Schema<?> target = ModelUtils.isGenerateAliasAsModel() ? p : schema;
771+
if (ModelUtils.isArraySchema(target)) {
772+
Schema<?> items = getSchemaItems((ArraySchema) schema);
773+
return getSchemaType(target) + "<" + getTypeDeclaration(items) + ">";
774+
} else if (ModelUtils.isMapSchema(target)) {
772775
// Note: ModelUtils.isMapSchema(p) returns true when p is a composed schema that also defines
773776
// additionalproperties: true
774-
Schema<?> inner = getSchemaAdditionalProperties(p);
775-
return getSchemaType(p) + "<String, " + getTypeDeclaration(ModelUtils.unaliasSchema(this.openAPI, inner)) + ">";
777+
Schema<?> inner = getAdditionalProperties(target);
778+
if (inner == null) {
779+
LOGGER.error("`{}` (map property) does not have a proper inner type defined. Default to type:string", p.getName());
780+
inner = new StringSchema().description("TODO default missing map inner type to string");
781+
p.setAdditionalProperties(inner);
782+
}
783+
return getSchemaType(target) + "<String, " + getTypeDeclaration(inner) + ">";
776784
}
777-
return super.getTypeDeclaration(p);
785+
return super.getTypeDeclaration(target);
778786
}
779787

780788
@Override

modules/openapi-generator/src/test/java/org/openapitools/codegen/java/AbstractJavaCodegenTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,34 @@ public void toDefaultValueTest() {
416416
Schema<?> schema = createObjectSchemaWithMinItems();
417417
String defaultValue = codegen.toDefaultValue(schema);
418418
Assert.assertNull(defaultValue);
419+
420+
// Create an alias to an array schema
421+
Schema<?> nestedArraySchema = new ArraySchema().items(new IntegerSchema().format("int32"));
422+
codegen.setOpenAPI(new OpenAPI().components(new Components().addSchemas("NestedArray", nestedArraySchema)));
423+
424+
// Create an array schema with item type set to the array alias
425+
schema = new ArraySchema().items(new Schema().$ref("#/components/schemas/NestedArray"));
426+
427+
ModelUtils.setGenerateAliasAsModel(false);
428+
defaultValue = codegen.toDefaultValue(schema);
429+
Assert.assertEquals(defaultValue, "new ArrayList<List<Integer>>()");
430+
431+
ModelUtils.setGenerateAliasAsModel(true);
432+
defaultValue = codegen.toDefaultValue(schema);
433+
Assert.assertEquals(defaultValue, "new ArrayList<NestedArray>()");
434+
435+
// Create a map schema with additionalProperties type set to array alias
436+
schema = new MapSchema().additionalProperties(new Schema().$ref("#/components/schemas/NestedArray"));
437+
438+
ModelUtils.setGenerateAliasAsModel(false);
439+
defaultValue = codegen.toDefaultValue(schema);
440+
Assert.assertEquals(defaultValue, "new HashMap<String, List<Integer>>()");
441+
442+
ModelUtils.setGenerateAliasAsModel(true);
443+
defaultValue = codegen.toDefaultValue(schema);
444+
Assert.assertEquals(defaultValue, "new HashMap<String, NestedArray>()");
445+
446+
// Test default value for date format
419447
DateSchema dateSchema = new DateSchema();
420448
LocalDate defaultLocalDate = LocalDate.of(2019,2,15);
421449
Date date = Date.from(defaultLocalDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -608,6 +608,7 @@ public void testImportMapping() throws IOException {
608608
.setLibrary(JavaClientCodegen.RESTEASY)
609609
.setAdditionalProperties(properties)
610610
.setImportMappings(importMappings)
611+
.setGenerateAliasAsModel(true)
611612
.setInputSpec("src/test/resources/3_0/type-alias.yaml")
612613
.setOutputDir(output.getAbsolutePath().replace("\\", "/"));
613614

0 commit comments

Comments
 (0)