From 026612fed7071fcd7e39a693e3df5333c5fa45dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Bresson?= Date: Thu, 29 Aug 2019 05:40:44 +0200 Subject: [PATCH] [core] do not always cast to ArraySchema (#3780) * [core] do not always cast to ArraySchema * Change ModelUtil.isArraySchema() --- .../openapitools/codegen/DefaultCodegen.java | 51 ++++++++++--------- .../languages/AbstractJavaCodegen.java | 18 ++----- .../codegen/utils/ModelUtils.java | 9 +--- .../codegen/java/AbstractJavaCodegenTest.java | 19 +++++-- 4 files changed, 46 insertions(+), 51 deletions(-) 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 4a99f26be636..71299a3ace26 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 @@ -1247,7 +1247,7 @@ public class DefaultCodegen implements CodegenConfig { return instantiationTypes.get("map") + ""; } else if (ModelUtils.isArraySchema(schema)) { ArraySchema arraySchema = (ArraySchema) schema; - String inner = getSchemaType(arraySchema.getItems()); + String inner = getSchemaType(getSchemaItems(arraySchema)); return instantiationTypes.get("array") + "<" + inner + ">"; } else { return null; @@ -1462,6 +1462,15 @@ public class DefaultCodegen implements CodegenConfig { } + protected Schema getSchemaItems(ArraySchema schema) { + if (schema.getItems() != null) { + return schema.getItems(); + } else { + LOGGER.error("Undefined array inner type for `{}`. Default to String.", schema.getName()); + return new StringSchema().description("TODO default missing array inner type to string"); + } + } + /** * Return the name of the allOf schema * @@ -2180,11 +2189,10 @@ public class DefaultCodegen implements CodegenConfig { property.isFreeFormObject = true; } else if (ModelUtils.isArraySchema(p)) { // default to string if inner item is undefined - Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, ((ArraySchema) p).getItems()); - if (innerSchema == null) { - LOGGER.error("Undefined array inner type for `{}`. Default to String.", p.getName()); - innerSchema = new StringSchema().description("//TODO automatically added by openapi-generator due to undefined type"); - ((ArraySchema) p).setItems(innerSchema); + ArraySchema arraySchema = (ArraySchema) p; + Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, getSchemaItems(arraySchema)); + if (arraySchema.getItems() == null) { + arraySchema.setItems(innerSchema); } } else if (ModelUtils.isMapSchema(p)) { Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, ModelUtils.getAdditionalProperties(p)); @@ -2262,11 +2270,10 @@ public class DefaultCodegen implements CodegenConfig { if (itemName == null) { itemName = property.name; } - Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, ((ArraySchema) p).getItems()); - if (innerSchema == null) { - LOGGER.error("Undefined array inner type for `{}`. Default to String.", p.getName()); - innerSchema = new StringSchema().description("//TODO automatically added by openapi-generator due to undefined type"); - ((ArraySchema) p).setItems(innerSchema); + ArraySchema arraySchema = (ArraySchema) p; + Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, getSchemaItems(arraySchema)); + if (arraySchema.getItems() == null) { + arraySchema.setItems(innerSchema); } CodegenProperty cp = fromProperty(itemName, innerSchema); updatePropertyForArray(property, cp); @@ -2584,7 +2591,7 @@ public class DefaultCodegen implements CodegenConfig { if (ModelUtils.isArraySchema(responseSchema)) { ArraySchema as = (ArraySchema) responseSchema; - CodegenProperty innerProperty = fromProperty("response", as.getItems()); + CodegenProperty innerProperty = fromProperty("response", getSchemaItems(as)); op.returnBaseType = innerProperty.baseType; } else if (ModelUtils.isMapSchema(responseSchema)) { CodegenProperty innerProperty = fromProperty("response", ModelUtils.getAdditionalProperties(responseSchema)); @@ -2854,7 +2861,7 @@ public class DefaultCodegen implements CodegenConfig { if (ModelUtils.isArraySchema(responseSchema)) { ArraySchema as = (ArraySchema) responseSchema; - CodegenProperty innerProperty = fromProperty("response", as.getItems()); + CodegenProperty innerProperty = fromProperty("response", getSchemaItems(as)); CodegenProperty innerCp = innerProperty; while (innerCp != null) { r.baseType = innerCp.baseType; @@ -3062,10 +3069,8 @@ public class DefaultCodegen implements CodegenConfig { String collectionFormat = null; if (ModelUtils.isArraySchema(parameterSchema)) { // for array parameter final ArraySchema arraySchema = (ArraySchema) parameterSchema; - Schema inner = arraySchema.getItems(); - if (inner == null) { - LOGGER.warn("warning! No inner type supplied for array parameter \"" + parameter.getName() + "\", using String"); - inner = new StringSchema().description("//TODO automatically added by openapi-generator due to missing iner type definition in the spec"); + Schema inner = getSchemaItems(arraySchema); + if (arraySchema.getItems() == null) { arraySchema.setItems(inner); } @@ -4598,10 +4603,8 @@ public class DefaultCodegen implements CodegenConfig { // array of schema if (ModelUtils.isArraySchema(s)) { final ArraySchema arraySchema = (ArraySchema) s; - Schema inner = arraySchema.getItems(); - if (inner == null) { - LOGGER.error("No inner type supplied for array parameter `{}`. Default to type:string", s.getName()); - inner = new StringSchema().description("//TODO automatically added by openapi-generator due to missing inner type definition in the spec"); + Schema inner = getSchemaItems(arraySchema); + if (arraySchema.getItems() == null) { arraySchema.setItems(inner); } @@ -4798,10 +4801,8 @@ public class DefaultCodegen implements CodegenConfig { setParameterNullable(codegenParameter, codegenProperty); } else if (ModelUtils.isArraySchema(schema)) { final ArraySchema arraySchema = (ArraySchema) schema; - Schema inner = arraySchema.getItems(); - if (inner == null) { - LOGGER.error("No inner type supplied for array parameter `{}`. Default to type:string", schema.getName()); - inner = new StringSchema().description("//TODO automatically added by openapi-generator due to undefined type"); + Schema inner = getSchemaItems(arraySchema); + if (arraySchema.getItems() == null) { arraySchema.setItems(inner); } CodegenProperty codegenProperty = fromProperty("property", arraySchema); 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 1e77a694db84..f04d4ac1379c 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 @@ -686,14 +686,8 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); - if (inner == null) { - LOGGER.error("`{}` (array property) does not have a proper inner type defined. Default to type:string", ap.getName()); - inner = new StringSchema().description("TODO default missing array inner type to string"); - ap.setItems(inner); - } - return getSchemaType(p) + "<" + getTypeDeclaration(inner) + ">"; + Schema items = getSchemaItems((ArraySchema) p); + return getSchemaType(p) + "<" + getTypeDeclaration(items) + ">"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); if (inner == null) { @@ -725,13 +719,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code pattern = "new ArrayList<%s>()"; } - Schema items; - if (p instanceof ArraySchema && ((ArraySchema) p).getItems() != null) { - items = ((ArraySchema) p).getItems(); - } else { - LOGGER.error("`{}` (array property) does not have a proper inner type defined. Default to type:string", p.getName()); - items = new StringSchema().description("TODO default missing array inner type to string"); - } + Schema items = getSchemaItems((ArraySchema) p); String typeDeclaration = getTypeDeclaration(items); Object java8obj = additionalProperties.get("java8"); 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 50c9250224bd..d9cc61cbc034 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 @@ -359,14 +359,7 @@ public class ModelUtils { } public static boolean isArraySchema(Schema schema) { - if (schema instanceof ArraySchema) { - return true; - } - // assume it's an array if maxItems, minItems is set - if (schema != null && (schema.getMaxItems() != null || schema.getMinItems() != null)) { - return true; - } - return false; + return (schema instanceof ArraySchema); } public static boolean isStringSchema(Schema schema) { 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 0fe770d44dab..77fb953bb341 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 @@ -310,11 +310,24 @@ public class AbstractJavaCodegenTest { public void toDefaultValueTest() { final P_AbstractJavaCodegen codegen = new P_AbstractJavaCodegen(); - Schema schema = new ObjectSchema() + Schema schema = createObjectSchemaWithMinItems(); + String defaultValue = codegen.toDefaultValue(schema); + Assert.assertNull(defaultValue); + } + + @Test + public void getTypeDeclarationTest() { + final P_AbstractJavaCodegen codegen = new P_AbstractJavaCodegen(); + + Schema schema = createObjectSchemaWithMinItems(); + String defaultValue = codegen.getTypeDeclaration(schema); + Assert.assertEquals(defaultValue, "Object"); + } + + private static Schema createObjectSchemaWithMinItems() { + return new ObjectSchema() .addProperties("id", new IntegerSchema().format("int32")) .minItems(1); - String defaultValue = codegen.toDefaultValue(schema); - Assert.assertEquals(defaultValue, "new ArrayList()"); } private static class P_AbstractJavaCodegen extends AbstractJavaCodegen {