[Java] Unalias type when generating default value for model property (#5017)

Co-authored-by: Jim Schubert <james.schubert@gmail.com>
This commit is contained in:
Hippolyte HENRY 2020-09-02 13:52:38 +02:00 committed by GitHub
parent 966b87e66c
commit 91ea6a17d9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 7 deletions

View File

@ -24,6 +24,7 @@ import io.swagger.v3.oas.models.PathItem;
import io.swagger.v3.oas.models.media.ArraySchema; import io.swagger.v3.oas.models.media.ArraySchema;
import io.swagger.v3.oas.models.media.ComposedSchema; import io.swagger.v3.oas.models.media.ComposedSchema;
import io.swagger.v3.oas.models.media.Schema; 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.oas.models.servers.Server;
import io.swagger.v3.parser.util.SchemaTypeUtil; import io.swagger.v3.parser.util.SchemaTypeUtil;
import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.FilenameUtils;
@ -765,16 +766,23 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
@Override @Override
public String getTypeDeclaration(Schema p) { public String getTypeDeclaration(Schema p) {
if (ModelUtils.isArraySchema(p)) { Schema<?> schema = ModelUtils.unaliasSchema(this.openAPI, p);
Schema<?> items = getSchemaItems((ArraySchema) p); Schema<?> target = ModelUtils.isGenerateAliasAsModel() ? p : schema;
return getSchemaType(p) + "<" + getTypeDeclaration(ModelUtils.unaliasSchema(this.openAPI, items)) + ">"; if (ModelUtils.isArraySchema(target)) {
} else if (ModelUtils.isMapSchema(p) && !ModelUtils.isComposedSchema(p)) { 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 // Note: ModelUtils.isMapSchema(p) returns true when p is a composed schema that also defines
// additionalproperties: true // additionalproperties: true
Schema<?> inner = getSchemaAdditionalProperties(p); Schema<?> inner = getAdditionalProperties(target);
return getSchemaType(p) + "<String, " + getTypeDeclaration(ModelUtils.unaliasSchema(this.openAPI, inner)) + ">"; 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) + "<String, " + getTypeDeclaration(inner) + ">";
} }
return super.getTypeDeclaration(p); return super.getTypeDeclaration(target);
} }
@Override @Override

View File

@ -416,6 +416,34 @@ public class AbstractJavaCodegenTest {
Schema<?> schema = createObjectSchemaWithMinItems(); Schema<?> schema = createObjectSchemaWithMinItems();
String defaultValue = codegen.toDefaultValue(schema); String defaultValue = codegen.toDefaultValue(schema);
Assert.assertNull(defaultValue); 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<List<Integer>>()");
ModelUtils.setGenerateAliasAsModel(true);
defaultValue = codegen.toDefaultValue(schema);
Assert.assertEquals(defaultValue, "new ArrayList<NestedArray>()");
// 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<String, List<Integer>>()");
ModelUtils.setGenerateAliasAsModel(true);
defaultValue = codegen.toDefaultValue(schema);
Assert.assertEquals(defaultValue, "new HashMap<String, NestedArray>()");
// Test default value for date format
DateSchema dateSchema = new DateSchema(); DateSchema dateSchema = new DateSchema();
LocalDate defaultLocalDate = LocalDate.of(2019,2,15); LocalDate defaultLocalDate = LocalDate.of(2019,2,15);
Date date = Date.from(defaultLocalDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); Date date = Date.from(defaultLocalDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

View File

@ -608,6 +608,7 @@ public class JavaClientCodegenTest {
.setLibrary(JavaClientCodegen.RESTEASY) .setLibrary(JavaClientCodegen.RESTEASY)
.setAdditionalProperties(properties) .setAdditionalProperties(properties)
.setImportMappings(importMappings) .setImportMappings(importMappings)
.setGenerateAliasAsModel(true)
.setInputSpec("src/test/resources/3_0/type-alias.yaml") .setInputSpec("src/test/resources/3_0/type-alias.yaml")
.setOutputDir(output.getAbsolutePath().replace("\\", "/")); .setOutputDir(output.getAbsolutePath().replace("\\", "/"));