Skip to content

Commit

Permalink
[Java] Unalias type when generating default value for model property (#…
Browse files Browse the repository at this point in the history
…5017)

Co-authored-by: Jim Schubert <james.schubert@gmail.com>
  • Loading branch information
zippolyte and jimschubert authored Sep 2, 2020
1 parent 966b87e commit 91ea6a1
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) + "<String, " + getTypeDeclaration(ModelUtils.unaliasSchema(this.openAPI, inner)) + ">";
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) + "<String, " + getTypeDeclaration(inner) + ">";
}
return super.getTypeDeclaration(p);
return super.getTypeDeclaration(target);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<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();
LocalDate defaultLocalDate = LocalDate.of(2019,2,15);
Date date = Date.from(defaultLocalDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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("\\", "/"));

Expand Down

0 comments on commit 91ea6a1

Please sign in to comment.