From 9fca51781011e8a9d1c78121a23e983c106a6a36 Mon Sep 17 00:00:00 2001 From: Georgi Getsov Date: Tue, 5 Mar 2024 20:55:51 +0000 Subject: [PATCH 1/5] Make schema type retrieval and checks 3.1 compatible --- .../openapitools/codegen/DefaultCodegen.java | 28 ++--- .../codegen/InlineModelResolver.java | 20 ++-- .../codegen/OpenAPINormalizer.java | 4 +- .../codegen/utils/ModelUtils.java | 111 +++++++++--------- .../oas/OpenApiSchemaValidations.java | 4 +- 5 files changed, 82 insertions(+), 85 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 b37cf51c605a..e8a377714bd5 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 @@ -17,7 +17,6 @@ package org.openapitools.codegen; -import com.fasterxml.jackson.annotation.JsonCreator; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.Ticker; @@ -2486,10 +2485,10 @@ protected String getSingleSchemaType(Schema schema) { private String getPrimitiveType(Schema schema) { if (schema == null) { throw new RuntimeException("schema cannot be null in getPrimitiveType"); - } else if (typeMapping.containsKey(schema.getType() + "+" + schema.getFormat())) { + } else if (typeMapping.containsKey(ModelUtils.getSchemaType(schema) + "+" + schema.getFormat())) { // allows custom type_format mapping. // use {type}+{format} - return typeMapping.get(schema.getType() + "+" + schema.getFormat()); + return typeMapping.get(ModelUtils.getSchemaType(schema) + "+" + schema.getFormat()); } else if (ModelUtils.isNullType(schema)) { // The 'null' type is allowed in OAS 3.1 and above. It is not supported by OAS 3.0.x, // though this tooling supports it. @@ -2530,7 +2529,7 @@ private String getPrimitiveType(Schema schema) { } else if (ModelUtils.isShortSchema(schema)) {// int32 return "integer"; } else { - return schema.getType(); // integer + return ModelUtils.getSchemaType(schema); // integer } } else if (ModelUtils.isMapSchema(schema)) { return "map"; @@ -2561,11 +2560,11 @@ private String getPrimitiveType(Schema schema) { return "object"; } else if (ModelUtils.isAnyType(schema)) { return "AnyType"; - } else if (StringUtils.isNotEmpty(schema.getType())) { - if (!schemaMapping.containsKey(schema.getType())) { - LOGGER.warn("Unknown type found in the schema: {}. To map it, please use the schema mapping option (e.g. --schema-mappings in CLI)", schema.getType()); + } else if (StringUtils.isNotEmpty(ModelUtils.getSchemaType(schema))) { + if (!schemaMapping.containsKey(ModelUtils.getSchemaType(schema))) { + LOGGER.warn("Unknown type found in the schema: {}. To map it, please use the schema mapping option (e.g. --schema-mappings in CLI)", ModelUtils.getSchemaType(schema)); } - return schema.getType(); + return ModelUtils.getSchemaType(schema); } // The 'type' attribute has not been set in the OAS schema, which means the value // can be an arbitrary type, e.g. integer, string, object, array, number... @@ -4005,11 +4004,12 @@ public CodegenProperty fromProperty(String name, Schema p, boolean required, boo property.name = toVarName(name); property.baseName = name; - if (p.getType() == null) { - property.openApiType = getSchemaType(p); - } else { - property.openApiType = p.getType(); + + String propertyType = ModelUtils.getSchemaType(p); + if (propertyType == null) { + propertyType = getSchemaType(p); } + property.openApiType = propertyType; property.nameInCamelCase = camelize(property.name); property.nameInSnakeCase = CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, property.nameInCamelCase); property.description = escapeText(p.getDescription()); @@ -7111,7 +7111,7 @@ public List fromRequestBodyToFormParameters(RequestBody body, Schema original = null; // check if it's allOf (only 1 sub schema) with or without default/nullable/etc set in the top level if (ModelUtils.isAllOf(schema) && schema.getAllOf().size() == 1 && - schema.getType() == null && schema.getTypes() == null) { + ModelUtils.getSchemaType(schema) == null) { if (schema.getAllOf().get(0) instanceof Schema) { original = schema; schema = (Schema) schema.getAllOf().get(0); @@ -7745,7 +7745,7 @@ public CodegenParameter fromRequestBody(RequestBody body, Set imports, S Schema original = null; // check if it's allOf (only 1 sub schema) with or without default/nullable/etc set in the top level if (ModelUtils.isAllOf(schema) && schema.getAllOf().size() == 1 && - schema.getType() == null && schema.getTypes() == null) { + ModelUtils.getSchemaType(schema) == null) { if (schema.getAllOf().get(0) instanceof Schema) { original = schema; schema = (Schema) schema.getAllOf().get(0); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java index f36457cc115d..22972e60fed3 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java @@ -210,7 +210,7 @@ private boolean isModelNeeded(Schema schema, Set visitedSchemas) { if (resolveInlineEnums && schema.getEnum() != null && schema.getEnum().size() > 0) { return true; } - if (schema.getType() == null || "object".equals(schema.getType())) { + if (ModelUtils.getSchemaType(schema) == null || ModelUtils.isTypeObjectSchema(schema)) { // object or undeclared type with properties if (schema.getProperties() != null && schema.getProperties().size() > 0) { return true; @@ -269,7 +269,7 @@ private void gatherInlineModels(Schema schema, String modelPrefix) { if (schema.get$ref() != null) { // if ref already, no inline schemas should be present but check for // any to catch OpenAPI violations - if (isModelNeeded(schema) || "object".equals(schema.getType()) || + if (isModelNeeded(schema) || ModelUtils.isTypeObjectSchema(schema) || schema.getProperties() != null || schema.getAdditionalProperties() != null || ModelUtils.isComposedSchema(schema)) { LOGGER.error("Illegal schema found with $ref combined with other properties," + @@ -280,7 +280,7 @@ private void gatherInlineModels(Schema schema, String modelPrefix) { // Check object models / any type models / composed models for properties, // if the schema has a type defined that is not "object" it should not define // any properties - if (schema.getType() == null || "object".equals(schema.getType())) { + if (ModelUtils.getSchemaType(schema) == null || ModelUtils.isTypeObjectSchema(schema)) { // Check properties and recurse, each property could be its own inline model Map props = schema.getProperties(); if (props != null) { @@ -300,8 +300,8 @@ private void gatherInlineModels(Schema schema, String modelPrefix) { props.put(propName, refSchema); } else if (ModelUtils.isComposedSchema(prop)) { if (prop.getAllOf() != null && prop.getAllOf().size() == 1 && - !(((Schema) prop.getAllOf().get(0)).getType() == null || - "object".equals(((Schema) prop.getAllOf().get(0)).getType()))) { + !(ModelUtils.getSchemaType((Schema) prop.getAllOf().get(0)) == null) || + ModelUtils.isTypeObjectSchema((Schema) prop.getAllOf().get(0))) { // allOf with only 1 type (non-model) LOGGER.info("allOf schema used by the property `{}` replaced by its only item (a type)", propName); props.put(propName, (Schema) prop.getAllOf().get(0)); @@ -666,7 +666,7 @@ private void flattenComponents() { * @param m Schema implementation */ private void fixStringModel(Schema m) { - if (schemaIsOfType(m, "string") && schemaContainsExample(m)) { + if (ModelUtils.isStringSchema(m) && schemaContainsExample(m)) { String example = m.getExample().toString(); if (example.startsWith("\"") && example.endsWith("\"")) { m.setExample(example.substring(1, example.length() - 1)); @@ -674,10 +674,6 @@ private void fixStringModel(Schema m) { } } - private boolean schemaIsOfType(Schema m, String type) { - return m.getType() != null && m.getType().equals(type); - } - private boolean schemaContainsExample(Schema m) { return m.getExample() != null && m.getExample() != ""; } @@ -892,7 +888,7 @@ private Schema modelFromProperty(OpenAPI openAPI, Schema object, String path) { // NOTE: // No need to null check setters below. All defaults in the new'd Schema are null, so setting to null would just be a noop. Schema model = new Schema(); - model.setType(object.getType()); + model.setType(ModelUtils.getSchemaType(object)); // Even though the `format` keyword typically applies to primitive types only, // the JSON schema specification states `format` can be used for any model type instance @@ -908,7 +904,7 @@ private Schema modelFromProperty(OpenAPI openAPI, Schema object, String path) { model.setRequired(object.getRequired()); model.setNullable(object.getNullable()); model.setEnum(object.getEnum()); - model.setType(object.getType()); + model.setType(ModelUtils.getSchemaType(object)); model.setDiscriminator(object.getDiscriminator()); model.setWriteOnly(object.getWriteOnly()); model.setUniqueItems(object.getUniqueItems()); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java index b14adec76fce..cd017762d7f1 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java @@ -818,7 +818,7 @@ public boolean isNullTypeSchema(Schema schema) { } } - if (!(schema instanceof JsonSchema) && (schema.getType() == null || schema.getType().equals("null")) && schema.get$ref() == null) { + if (!(schema instanceof JsonSchema) && (ModelUtils.getSchemaType(schema) == null || ModelUtils.isNullType(schema)) && schema.get$ref() == null) { return true; } @@ -1000,7 +1000,7 @@ private Schema processNormalize31Spec(Schema schema, Set visitedSchemas) if (schema instanceof JsonSchema && schema.get$schema() == null && - schema.getTypes() == null && schema.getType() == null) { + ModelUtils.getSchemaType(schema) == null) { // convert any type in v3.1 to empty schema (any type in v3.0 spec), any type example: // components: // schemas: 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 9b7787eda4e1..e246aecceb99 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 @@ -408,6 +408,23 @@ public static String getSimpleRef(String ref) { return ref; } + /** + * Return the type of the specified schema + * + * @param schema the OAS schema + * @return the type of the specified schema + */ + public static String getSchemaType(Schema schema) { + if (schema.getType() != null) { + // 3.0.x or 2.0 spec + return schema.getType(); + } else if (schema.getTypes() != null && schema.getTypes().size() == 1) { + // 3.1 spec + return (String) schema.getTypes().iterator().next(); + } + return null; + } + /** * Return true if the specified schema is type object * We can't use isObjectSchema because it requires properties to exist which is not required @@ -417,16 +434,7 @@ public static String getSimpleRef(String ref) { * @return true if the specified schema is an Object schema. */ public static boolean isTypeObjectSchema(Schema schema) { - if (schema instanceof JsonSchema) { // 3.1 spec - if (schema.getTypes() != null && schema.getTypes().size() == 1) { - return SchemaTypeUtil.OBJECT_TYPE.equals(schema.getTypes().iterator().next()); - } else { - // null type or multiple types, e.g. [string, integer] - return false; - } - } else { // 3.0.x or 2.0 spec - return SchemaTypeUtil.OBJECT_TYPE.equals(schema.getType()); - } + return SchemaTypeUtil.OBJECT_TYPE.equals(getSchemaType(schema)); } /** @@ -458,9 +466,9 @@ public static boolean isObjectSchema(Schema schema) { return (schema instanceof ObjectSchema) || // must not be a map - (SchemaTypeUtil.OBJECT_TYPE.equals(schema.getType()) && !(schema instanceof MapSchema)) || + (isTypeObjectSchema(schema) && !(schema instanceof MapSchema)) || // must have at least one property - (schema.getType() == null && schema.getProperties() != null && !schema.getProperties().isEmpty()); + (getSchemaType(schema) == null && schema.getProperties() != null && !schema.getProperties().isEmpty()); } /** @@ -597,93 +605,93 @@ public static boolean isArraySchema(Schema schema) { } public static boolean isSet(Schema schema) { - return ModelUtils.isArraySchema(schema) && Boolean.TRUE.equals(schema.getUniqueItems()); + return isArraySchema(schema) && Boolean.TRUE.equals(schema.getUniqueItems()); } public static boolean isStringSchema(Schema schema) { - return schema instanceof StringSchema || SchemaTypeUtil.STRING_TYPE.equals(schema.getType()); + return schema instanceof StringSchema || SchemaTypeUtil.STRING_TYPE.equals(getSchemaType(schema)); } public static boolean isIntegerSchema(Schema schema) { - return schema instanceof IntegerSchema || SchemaTypeUtil.INTEGER_TYPE.equals(schema.getType()); + return schema instanceof IntegerSchema || SchemaTypeUtil.INTEGER_TYPE.equals(getSchemaType(schema)); } public static boolean isShortSchema(Schema schema) { // format: short (int32) - return SchemaTypeUtil.INTEGER_TYPE.equals(schema.getType()) // type: integer + return SchemaTypeUtil.INTEGER_TYPE.equals(getSchemaType(schema)) // type: integer && SchemaTypeUtil.INTEGER32_FORMAT.equals(schema.getFormat()); } public static boolean isUnsignedIntegerSchema(Schema schema) { - return SchemaTypeUtil.INTEGER_TYPE.equals(schema.getType()) && // type: integer + return SchemaTypeUtil.INTEGER_TYPE.equals(getSchemaType(schema)) && // type: integer ("int32".equals(schema.getFormat()) || schema.getFormat() == null) && // format: int32 (schema.getExtensions() != null && (Boolean) schema.getExtensions().getOrDefault("x-unsigned", Boolean.FALSE)); } public static boolean isLongSchema(Schema schema) { // format: long (int64) - return SchemaTypeUtil.INTEGER_TYPE.equals(schema.getType()) // type: integer + return SchemaTypeUtil.INTEGER_TYPE.equals(getSchemaType(schema)) // type: integer && SchemaTypeUtil.INTEGER64_FORMAT.equals(schema.getFormat()); } public static boolean isUnsignedLongSchema(Schema schema) { - return SchemaTypeUtil.INTEGER_TYPE.equals(schema.getType()) && // type: integer + return SchemaTypeUtil.INTEGER_TYPE.equals(getSchemaType(schema)) && // type: integer "int64".equals(schema.getFormat()) && // format: int64 (schema.getExtensions() != null && (Boolean) schema.getExtensions().getOrDefault("x-unsigned", Boolean.FALSE)); } public static boolean isBooleanSchema(Schema schema) { - return schema instanceof BooleanSchema || SchemaTypeUtil.BOOLEAN_TYPE.equals(schema.getType()); + return schema instanceof BooleanSchema || SchemaTypeUtil.BOOLEAN_TYPE.equals(getSchemaType(schema)); } public static boolean isNumberSchema(Schema schema) { - return schema instanceof NumberSchema || SchemaTypeUtil.NUMBER_TYPE.equals(schema.getType()); + return schema instanceof NumberSchema || SchemaTypeUtil.NUMBER_TYPE.equals(getSchemaType(schema)); } public static boolean isFloatSchema(Schema schema) { // format: float - return SchemaTypeUtil.NUMBER_TYPE.equals(schema.getType()) + return SchemaTypeUtil.NUMBER_TYPE.equals(getSchemaType(schema)) && SchemaTypeUtil.FLOAT_FORMAT.equals(schema.getFormat()); } public static boolean isDoubleSchema(Schema schema) { // format: double - return SchemaTypeUtil.NUMBER_TYPE.equals(schema.getType()) + return SchemaTypeUtil.NUMBER_TYPE.equals(getSchemaType(schema)) && SchemaTypeUtil.DOUBLE_FORMAT.equals(schema.getFormat()); } public static boolean isDateSchema(Schema schema) { return (schema instanceof DateSchema) || // format: date - (SchemaTypeUtil.STRING_TYPE.equals(schema.getType()) + (SchemaTypeUtil.STRING_TYPE.equals(getSchemaType(schema)) && SchemaTypeUtil.DATE_FORMAT.equals(schema.getFormat())); } public static boolean isDateTimeSchema(Schema schema) { return (schema instanceof DateTimeSchema) || // format: date-time - (SchemaTypeUtil.STRING_TYPE.equals(schema.getType()) + (SchemaTypeUtil.STRING_TYPE.equals(getSchemaType(schema)) && SchemaTypeUtil.DATE_TIME_FORMAT.equals(schema.getFormat())); } public static boolean isPasswordSchema(Schema schema) { return (schema instanceof PasswordSchema) || // double - (SchemaTypeUtil.STRING_TYPE.equals(schema.getType()) + (SchemaTypeUtil.STRING_TYPE.equals(getSchemaType(schema)) && SchemaTypeUtil.PASSWORD_FORMAT.equals(schema.getFormat())); } public static boolean isByteArraySchema(Schema schema) { return (schema instanceof ByteArraySchema) || // format: byte - (SchemaTypeUtil.STRING_TYPE.equals(schema.getType()) + (SchemaTypeUtil.STRING_TYPE.equals(getSchemaType(schema)) && SchemaTypeUtil.BYTE_FORMAT.equals(schema.getFormat())); } public static boolean isBinarySchema(Schema schema) { return (schema instanceof BinarySchema) || // format: binary - (SchemaTypeUtil.STRING_TYPE.equals(schema.getType()) + (SchemaTypeUtil.STRING_TYPE.equals(getSchemaType(schema)) && SchemaTypeUtil.BINARY_FORMAT.equals(schema.getFormat())); } @@ -696,26 +704,26 @@ public static boolean isFileSchema(Schema schema) { public static boolean isUUIDSchema(Schema schema) { return (schema instanceof UUIDSchema) || // format: uuid - (SchemaTypeUtil.STRING_TYPE.equals(schema.getType()) + (SchemaTypeUtil.STRING_TYPE.equals(getSchemaType(schema)) && SchemaTypeUtil.UUID_FORMAT.equals(schema.getFormat())); } public static boolean isURISchema(Schema schema) { // format: uri - return SchemaTypeUtil.STRING_TYPE.equals(schema.getType()) + return SchemaTypeUtil.STRING_TYPE.equals(getSchemaType(schema)) && URI_FORMAT.equals(schema.getFormat()); } public static boolean isEmailSchema(Schema schema) { return (schema instanceof EmailSchema) || // format: email - (SchemaTypeUtil.STRING_TYPE.equals(schema.getType()) + (SchemaTypeUtil.STRING_TYPE.equals(getSchemaType(schema)) && SchemaTypeUtil.EMAIL_FORMAT.equals(schema.getFormat())); } public static boolean isDecimalSchema(Schema schema) { // format: number - return SchemaTypeUtil.STRING_TYPE.equals(schema.getType()) // type: string + return SchemaTypeUtil.STRING_TYPE.equals(getSchemaType(schema)) // type: string && "number".equals(schema.getFormat()); } @@ -817,31 +825,24 @@ public static boolean isFreeFormObject(Schema schema) { return true; } else if (schema.getAdditionalProperties() instanceof JsonSchema) { return true; - } else if (schema.getTypes() != null) { - if (schema.getTypes().size() == 1) { // types = [object] - return SchemaTypeUtil.OBJECT_TYPE.equals(schema.getTypes().iterator().next()); - } else { // has more than 1 type, e.g. types = [integer, string] - return false; - } } - - return false; + return isTypeObjectSchema(schema); } // 3.0.x spec or 2.x spec // not free-form if allOf, anyOf, oneOf is not empty if (isComposedSchema(schema)) { - List interfaces = ModelUtils.getInterfaces(schema); + List interfaces = getInterfaces(schema); if (interfaces != null && !interfaces.isEmpty()) { return false; } } // has at least one property - if ("object".equals(schema.getType())) { + if (isTypeObjectSchema(schema)) { // no properties if ((schema.getProperties() == null || schema.getProperties().isEmpty())) { - Schema addlProps = ModelUtils.getAdditionalProperties(schema); + Schema addlProps = getAdditionalProperties(schema); if (schema.getExtensions() != null && schema.getExtensions().containsKey(freeFormExplicit)) { // User has hard-coded vendor extension to handle free-form evaluation. @@ -862,7 +863,7 @@ public static boolean isFreeFormObject(Schema schema) { return objSchema.getProperties() == null || objSchema.getProperties().isEmpty(); } else if (addlProps instanceof Schema) { // additionalProperties defined as {} - return addlProps.getType() == null && addlProps.get$ref() == null && (addlProps.getProperties() == null || addlProps.getProperties().isEmpty()); + return getSchemaType(addlProps) == null && addlProps.get$ref() == null && (addlProps.getProperties() == null || addlProps.getProperties().isEmpty()); } } } @@ -888,11 +889,11 @@ public static boolean shouldGenerateMapModel(Schema schema) { // A composed schema (allOf, oneOf, anyOf) is considered a Map schema if the additionalproperties attribute is set // for that composed schema. However, in the case of a composed schema, the properties are defined or referenced // in the inner schemas, and the outer schema does not have properties. - return ModelUtils.isGenerateAliasAsModel(schema) || ModelUtils.isComposedSchema(schema) || !(schema.getProperties() == null || schema.getProperties().isEmpty()); + return isGenerateAliasAsModel(schema) || isComposedSchema(schema) || !(schema.getProperties() == null || schema.getProperties().isEmpty()); } public static boolean shouldGenerateArrayModel(Schema schema) { - return ModelUtils.isGenerateAliasAsModel(schema) || !(schema.getProperties() == null || schema.getProperties().isEmpty()); + return isGenerateAliasAsModel(schema) || !(schema.getProperties() == null || schema.getProperties().isEmpty()); } /** @@ -1239,7 +1240,7 @@ public static Schema unaliasSchema(OpenAPI openAPI, } if (schema != null && StringUtils.isNotEmpty(schema.get$ref())) { - String simpleRef = ModelUtils.getSimpleRef(schema.get$ref()); + String simpleRef = getSimpleRef(schema.get$ref()); if (schemaMappings.containsKey(simpleRef)) { LOGGER.debug("Schema unaliasing of {} omitted because aliased class is to be mapped to {}", simpleRef, schemaMappings.get(simpleRef)); return schema; @@ -1255,7 +1256,7 @@ public static Schema unaliasSchema(OpenAPI openAPI, if (isGenerateAliasAsModel(ref)) { return schema; // generate a model extending array } else { - return unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref())), + return unaliasSchema(openAPI, allSchemas.get(getSimpleRef(schema.get$ref())), schemaMappings); } } else if (isComposedSchema(ref)) { @@ -1268,7 +1269,7 @@ public static Schema unaliasSchema(OpenAPI openAPI, return schema; // generate a model extending map } else { // treat it as a typical map - return unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref())), + return unaliasSchema(openAPI, allSchemas.get(getSimpleRef(schema.get$ref())), schemaMappings); } } @@ -1279,11 +1280,11 @@ public static Schema unaliasSchema(OpenAPI openAPI, // which is the last reference to the actual model/object return schema; } else { // free form object (type: object) - return unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref())), + return unaliasSchema(openAPI, allSchemas.get(getSimpleRef(schema.get$ref())), schemaMappings); } } else { - return unaliasSchema(openAPI, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref())), schemaMappings); + return unaliasSchema(openAPI, allSchemas.get(getSimpleRef(schema.get$ref())), schemaMappings); } } return schema; @@ -1457,7 +1458,7 @@ public static String getParentName(Schema composedSchema, Map al } else { // not a ref, doing nothing, except counting the number of times the 'null' type // is listed as composed element. - if (ModelUtils.isNullType(schema)) { + if (isNullType(schema)) { // If there are two interfaces, and one of them is the 'null' type, // then the parent is obvious and there is no need to warn about specifying // a determinator. @@ -1660,7 +1661,7 @@ public static boolean isNullableComposedSchema(Schema schema) { * @return true if the schema is the 'null' type */ public static boolean isNullType(Schema schema) { - return "null".equals(schema.getType()); + return "null".equals(getSchemaType(schema)); } /** @@ -1676,7 +1677,7 @@ public static boolean isAnyType(Schema schema) { // TODO remove the ref check here, or pass in the spec version // openapi 3.1.0 specs allow ref to be adjacent to any keyword // openapi 3.0.3 and earlier do not allow adjacent keywords to refs - return (schema.get$ref() == null && schema.getType() == null); + return (schema.get$ref() == null && getSchemaType(schema) == null); } public static void syncValidationProperties(Schema schema, IJsonSchemaValidationProperties target) { @@ -1808,7 +1809,7 @@ private static void setNumericValidations(Schema schema, BigDecimal multipleOf, private static void logWarnMessagesForIneffectiveValidations(Set setValidations, Schema schema, Set effectiveValidations) { setValidations.removeAll(effectiveValidations); setValidations.stream().forEach(validation -> { - LOGGER.warn("Validation '" + validation + "' has no effect on schema '" + schema.getType() +"'. Ignoring!"); + LOGGER.warn("Validation '" + validation + "' has no effect on schema '" + getSchemaType(schema) +"'. Ignoring!"); }); } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/validations/oas/OpenApiSchemaValidations.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/validations/oas/OpenApiSchemaValidations.java index de00e7e8c8b4..11e66850089f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/validations/oas/OpenApiSchemaValidations.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/validations/oas/OpenApiSchemaValidations.java @@ -161,7 +161,7 @@ private static ValidationRule.Result checkNullableAttribute(SchemaWrapper schema private static ValidationRule.Result checkInvalidType(SchemaWrapper schemaWrapper) { Schema schema = schemaWrapper.getSchema(); ValidationRule.Result result = ValidationRule.Pass.empty(); - if (schema.getType() != null && !validTypes.contains(schema.getType())) { + if (ModelUtils.getSchemaType(schema) != null && !validTypes.contains(ModelUtils.getSchemaType(schema))) { result = new ValidationRule.Fail(); String name = schema.getName(); if (name == null) { @@ -169,7 +169,7 @@ private static ValidationRule.Result checkInvalidType(SchemaWrapper schemaWrappe } result.setDetails(String.format(Locale.ROOT, "Schema '%s' uses the '%s' type, which is not a valid type.", - name, schema.getType())); + name, ModelUtils.getSchemaType(schema))); return result; } return result; From a46d42875413d8b479f24bca8fcc193ca34229c1 Mon Sep 17 00:00:00 2001 From: Georgi Getsov Date: Tue, 5 Mar 2024 21:03:07 +0000 Subject: [PATCH 2/5] Add regenerated samples --- .../okhttp-gson-3.1/.openapi-generator/FILES | 2 - .../petstore/java/okhttp-gson-3.1/README.md | 1 - .../java/okhttp-gson-3.1/api/openapi.yaml | 7 +-- .../java/org/openapitools/client/JSON.java | 1 - .../openapitools/client/model/AnyOfArray.java | 59 +++++++++---------- 5 files changed, 29 insertions(+), 41 deletions(-) diff --git a/samples/client/petstore/java/okhttp-gson-3.1/.openapi-generator/FILES b/samples/client/petstore/java/okhttp-gson-3.1/.openapi-generator/FILES index 5ba46e594fb5..f752384599d8 100644 --- a/samples/client/petstore/java/okhttp-gson-3.1/.openapi-generator/FILES +++ b/samples/client/petstore/java/okhttp-gson-3.1/.openapi-generator/FILES @@ -18,7 +18,6 @@ docs/Order.md docs/Pet.md docs/PetApi.md docs/StoreApi.md -docs/StringOrInt.md docs/Tag.md docs/User.md docs/UserApi.md @@ -67,6 +66,5 @@ src/main/java/org/openapitools/client/model/ModelApiResponse.java src/main/java/org/openapitools/client/model/OneOfStringOrInt.java src/main/java/org/openapitools/client/model/Order.java src/main/java/org/openapitools/client/model/Pet.java -src/main/java/org/openapitools/client/model/StringOrInt.java src/main/java/org/openapitools/client/model/Tag.java src/main/java/org/openapitools/client/model/User.java diff --git a/samples/client/petstore/java/okhttp-gson-3.1/README.md b/samples/client/petstore/java/okhttp-gson-3.1/README.md index cb3486b20fb6..35d517693aa9 100644 --- a/samples/client/petstore/java/okhttp-gson-3.1/README.md +++ b/samples/client/petstore/java/okhttp-gson-3.1/README.md @@ -152,7 +152,6 @@ Class | Method | HTTP request | Description - [OneOfStringOrInt](docs/OneOfStringOrInt.md) - [Order](docs/Order.md) - [Pet](docs/Pet.md) - - [StringOrInt](docs/StringOrInt.md) - [Tag](docs/Tag.md) - [User](docs/User.md) diff --git a/samples/client/petstore/java/okhttp-gson-3.1/api/openapi.yaml b/samples/client/petstore/java/okhttp-gson-3.1/api/openapi.yaml index 467a96683187..d866b34d2a18 100644 --- a/samples/client/petstore/java/okhttp-gson-3.1/api/openapi.yaml +++ b/samples/client/petstore/java/okhttp-gson-3.1/api/openapi.yaml @@ -908,12 +908,7 @@ components: message: type: string title: An uploaded response - StringOrInt: - anyOf: - - type: string - - format: int32 - type: integer - description: string or int + StringOrInt: {} OneOfStringOrInt: description: string or int (onefOf) oneOf: diff --git a/samples/client/petstore/java/okhttp-gson-3.1/src/main/java/org/openapitools/client/JSON.java b/samples/client/petstore/java/okhttp-gson-3.1/src/main/java/org/openapitools/client/JSON.java index 1e8826d32e85..1a8237183520 100644 --- a/samples/client/petstore/java/okhttp-gson-3.1/src/main/java/org/openapitools/client/JSON.java +++ b/samples/client/petstore/java/okhttp-gson-3.1/src/main/java/org/openapitools/client/JSON.java @@ -138,7 +138,6 @@ private static Class getClassByDiscriminator(Map classByDiscriminatorValue, Stri gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.OneOfStringOrInt.CustomTypeAdapterFactory()); gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.Order.CustomTypeAdapterFactory()); gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.Pet.CustomTypeAdapterFactory()); - gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.StringOrInt.CustomTypeAdapterFactory()); gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.Tag.CustomTypeAdapterFactory()); gsonBuilder.registerTypeAdapterFactory(new org.openapitools.client.model.User.CustomTypeAdapterFactory()); gson = gsonBuilder.create(); diff --git a/samples/client/petstore/java/okhttp-gson-3.1/src/main/java/org/openapitools/client/model/AnyOfArray.java b/samples/client/petstore/java/okhttp-gson-3.1/src/main/java/org/openapitools/client/model/AnyOfArray.java index 27ea72721574..8064214a2bca 100644 --- a/samples/client/petstore/java/okhttp-gson-3.1/src/main/java/org/openapitools/client/model/AnyOfArray.java +++ b/samples/client/petstore/java/okhttp-gson-3.1/src/main/java/org/openapitools/client/model/AnyOfArray.java @@ -14,6 +14,7 @@ package org.openapitools.client.model; import java.util.Objects; +import java.util.List; @@ -62,7 +63,7 @@ public TypeAdapter create(Gson gson, TypeToken type) { return null; // this class only serializes 'AnyOfArray' and its subtypes } final TypeAdapter elementAdapter = gson.getAdapter(JsonElement.class); - final TypeAdapter adapterObject = gson.getDelegateAdapter(this, TypeToken.get(Object.class)); + final TypeAdapter adapterList = gson.getDelegateAdapter(this, TypeToken.get(List.class)); return (TypeAdapter) new TypeAdapter() { @Override @@ -72,13 +73,13 @@ public void write(JsonWriter out, AnyOfArray value) throws IOException { return; } - // check if the actual instance is of the type `Object` - if (value.getActualInstance() instanceof Object) { - JsonPrimitive primitive = adapterObject.toJsonTree((Object)value.getActualInstance()).getAsJsonPrimitive(); - elementAdapter.write(out, primitive); + // check if the actual instance is of the type `List` + if (value.getActualInstance() instanceof List) { + JsonElement element = adapterList.toJsonTree((List)value.getActualInstance()); + elementAdapter.write(out, element); return; } - throw new IOException("Failed to serialize as the type doesn't match anyOf schemae: Object"); + throw new IOException("Failed to serialize as the type doesn't match anyOf schemae: List"); } @Override @@ -89,20 +90,18 @@ public AnyOfArray read(JsonReader in) throws IOException { ArrayList errorMessages = new ArrayList<>(); TypeAdapter actualAdapter = elementAdapter; - // deserialize Object + // deserialize List try { // validate the JSON object to see if any exception is thrown - if(!jsonElement.getAsJsonPrimitive().isNumber()) { - throw new IllegalArgumentException(String.format("Expected json element to be of type Number in the JSON string but got `%s`", jsonElement.toString())); - } - actualAdapter = adapterObject; + List.validateJsonElement(jsonElement); + actualAdapter = adapterList; AnyOfArray ret = new AnyOfArray(); ret.setActualInstance(actualAdapter.fromJsonTree(jsonElement)); return ret; } catch (Exception e) { // deserialization failed, continue - errorMessages.add(String.format("Deserialization for Object failed with `%s`.", e.getMessage())); - log.log(Level.FINER, "Input data does not match schema 'Object'", e); + errorMessages.add(String.format("Deserialization for List failed with `%s`.", e.getMessage())); + log.log(Level.FINER, "Input data does not match schema 'List'", e); } throw new IOException(String.format("Failed deserialization for AnyOfArray: no class matches result, expected at least 1. Detailed failure message for anyOf schemas: %s. JSON: %s", errorMessages, jsonElement.toString())); @@ -118,13 +117,13 @@ public AnyOfArray() { super("anyOf", Boolean.FALSE); } - public AnyOfArray(Object o) { + public AnyOfArray(List o) { super("anyOf", Boolean.FALSE); setActualInstance(o); } static { - schemas.put("Object", Object.class); + schemas.put("List", List.class); } @Override @@ -135,25 +134,25 @@ public Map> getSchemas() { /** * Set the instance that matches the anyOf child schema, check * the instance parameter is valid against the anyOf child schemas: - * Object + * List * * It could be an instance of the 'anyOf' schemas. */ @Override public void setActualInstance(Object instance) { - if (instance instanceof Object) { + if (instance instanceof List) { super.setActualInstance(instance); return; } - throw new RuntimeException("Invalid instance type. Must be Object"); + throw new RuntimeException("Invalid instance type. Must be List"); } /** * Get the actual instance, which can be the following: - * Object + * List * - * @return The actual instance (Object) + * @return The actual instance (List) */ @Override public Object getActualInstance() { @@ -161,14 +160,14 @@ public Object getActualInstance() { } /** - * Get the actual instance of `Object`. If the actual instance is not `Object`, + * Get the actual instance of `List`. If the actual instance is not `List`, * the ClassCastException will be thrown. * - * @return The actual instance of `Object` - * @throws ClassCastException if the instance is not `Object` + * @return The actual instance of `List` + * @throws ClassCastException if the instance is not `List` */ - public Object getObject() throws ClassCastException { - return (Object)super.getActualInstance(); + public List getList() throws ClassCastException { + return (List)super.getActualInstance(); } /** @@ -180,17 +179,15 @@ public Object getObject() throws ClassCastException { public static void validateJsonElement(JsonElement jsonElement) throws IOException { // validate anyOf schemas one by one ArrayList errorMessages = new ArrayList<>(); - // validate the json string with Object + // validate the json string with List try { - if(!jsonElement.getAsJsonPrimitive().isNumber()) { - throw new IllegalArgumentException(String.format("Expected json element to be of type Number in the JSON string but got `%s`", jsonElement.toString())); - } + List.validateJsonElement(jsonElement); return; } catch (Exception e) { - errorMessages.add(String.format("Deserialization for Object failed with `%s`.", e.getMessage())); + errorMessages.add(String.format("Deserialization for List failed with `%s`.", e.getMessage())); // continue to the next one } - throw new IOException(String.format("The JSON string is invalid for AnyOfArray with anyOf schemas: Object. no class match the result, expected at least 1. Detailed failure message for anyOf schemas: %s. JSON: %s", errorMessages, jsonElement.toString())); + throw new IOException(String.format("The JSON string is invalid for AnyOfArray with anyOf schemas: List. no class match the result, expected at least 1. Detailed failure message for anyOf schemas: %s. JSON: %s", errorMessages, jsonElement.toString())); } From 0e192152f2dc73447e37cadb406e0d74fda17cff Mon Sep 17 00:00:00 2001 From: Georgi Getsov Date: Wed, 6 Mar 2024 07:54:09 +0000 Subject: [PATCH 3/5] Removed invalid type definition --- .../src/test/resources/3_1/java/petstore.yaml | 3 --- samples/client/petstore/java/okhttp-gson-3.1/api/openapi.yaml | 1 - 2 files changed, 4 deletions(-) diff --git a/modules/openapi-generator/src/test/resources/3_1/java/petstore.yaml b/modules/openapi-generator/src/test/resources/3_1/java/petstore.yaml index e38732656f3d..200db7858a19 100644 --- a/modules/openapi-generator/src/test/resources/3_1/java/petstore.yaml +++ b/modules/openapi-generator/src/test/resources/3_1/java/petstore.yaml @@ -841,9 +841,6 @@ components: type: string message: type: string - StringOrInt: - description: string or int - type: [string, integer] OneOfStringOrInt: description: string or int (onefOf) oneOf: diff --git a/samples/client/petstore/java/okhttp-gson-3.1/api/openapi.yaml b/samples/client/petstore/java/okhttp-gson-3.1/api/openapi.yaml index d866b34d2a18..945179fde677 100644 --- a/samples/client/petstore/java/okhttp-gson-3.1/api/openapi.yaml +++ b/samples/client/petstore/java/okhttp-gson-3.1/api/openapi.yaml @@ -908,7 +908,6 @@ components: message: type: string title: An uploaded response - StringOrInt: {} OneOfStringOrInt: description: string or int (onefOf) oneOf: From 6ca1c41eecee89026861739aed951bb6f8661077 Mon Sep 17 00:00:00 2001 From: Georgi Getsov Date: Wed, 6 Mar 2024 23:22:22 +0000 Subject: [PATCH 4/5] Added support for 3.1 array type --- .../openapitools/codegen/DefaultCodegen.java | 37 +++++++++---------- .../codegen/InlineModelResolver.java | 20 +++++----- .../codegen/OpenAPINormalizer.java | 2 +- .../codegen/examples/ExampleGenerator.java | 9 ++--- .../codegen/examples/XmlExampleGenerator.java | 3 +- .../codegen/languages/AbstractAdaCodegen.java | 3 +- .../languages/AbstractApexCodegen.java | 12 +++--- .../languages/AbstractCSharpCodegen.java | 6 +-- .../languages/AbstractDartCodegen.java | 2 +- .../languages/AbstractEiffelCodegen.java | 6 +-- .../languages/AbstractFSharpCodegen.java | 6 +-- .../codegen/languages/AbstractGoCodegen.java | 3 +- .../languages/AbstractGraphQLCodegen.java | 3 +- .../languages/AbstractJavaCodegen.java | 2 +- .../languages/AbstractJuliaCodegen.java | 3 +- .../languages/AbstractKotlinCodegen.java | 4 +- .../codegen/languages/AbstractPhpCodegen.java | 5 +-- .../languages/AbstractPythonCodegen.java | 6 +-- .../AbstractPythonConnexionServerCodegen.java | 3 +- .../AbstractPythonPydanticV1Codegen.java | 6 +-- .../languages/AbstractRubyCodegen.java | 2 +- .../languages/AbstractRustCodegen.java | 3 +- .../languages/AbstractScalaCodegen.java | 19 ++++------ .../AbstractTypeScriptClientCodegen.java | 8 ++-- .../languages/AndroidClientCodegen.java | 3 +- .../codegen/languages/ApexClientCodegen.java | 2 +- .../codegen/languages/BashClientCodegen.java | 3 +- .../languages/CLibcurlClientCodegen.java | 2 +- .../languages/CSharpClientCodegen.java | 3 +- .../languages/CSharpReducedClientCodegen.java | 3 +- .../languages/ClojureClientCodegen.java | 5 +-- .../languages/ConfluenceWikiCodegen.java | 3 +- .../languages/CppPistacheServerCodegen.java | 6 +-- .../languages/CppQtAbstractCodegen.java | 6 +-- .../languages/CppRestSdkClientCodegen.java | 6 +-- .../languages/CppRestbedServerCodegen.java | 9 ++--- .../CppRestbedServerDeprecatedCodegen.java | 6 +-- .../languages/CppUE4ClientCodegen.java | 3 +- .../languages/CrystalClientCodegen.java | 2 +- .../languages/ElixirClientCodegen.java | 3 +- .../codegen/languages/ElmClientCodegen.java | 6 +-- .../languages/ErlangProperCodegen.java | 10 ++--- .../GraphQLNodeJSExpressServerCodegen.java | 3 +- .../languages/HaskellHttpClientCodegen.java | 6 +-- .../languages/HaskellServantCodegen.java | 6 +-- .../languages/HaskellYesodServerCodegen.java | 6 +-- .../languages/JMeterClientCodegen.java | 3 +- .../JavascriptApolloClientCodegen.java | 8 ++-- .../languages/JavascriptClientCodegen.java | 8 ++-- ...JavascriptClosureAngularClientCodegen.java | 3 +- .../codegen/languages/LuaClientCodegen.java | 3 +- .../codegen/languages/N4jsClientCodegen.java | 5 +-- .../codegen/languages/NimClientCodegen.java | 3 +- .../codegen/languages/OCamlClientCodegen.java | 16 ++++---- .../codegen/languages/ObjcClientCodegen.java | 3 +- .../codegen/languages/PerlClientCodegen.java | 3 +- .../PhpDataTransferClientCodegen.java | 5 +-- .../PhpMezzioPathHandlerServerCodegen.java | 4 +- .../languages/PhpSilexServerCodegen.java | 3 +- .../languages/PhpSymfonyServerCodegen.java | 3 +- .../languages/PowerShellClientCodegen.java | 3 +- .../languages/ProtobufSchemaCodegen.java | 3 +- .../languages/PythonFastAPIServerCodegen.java | 3 +- .../codegen/languages/RClientCodegen.java | 3 +- .../languages/RustAxumServerCodegen.java | 3 +- .../codegen/languages/RustServerCodegen.java | 18 ++++----- .../languages/ScalaAkkaClientCodegen.java | 5 +-- .../languages/ScalaFinchServerCodegen.java | 3 +- .../languages/ScalaGatlingCodegen.java | 3 +- .../languages/ScalaHttp4sServerCodegen.java | 3 +- .../languages/ScalaPekkoClientCodegen.java | 5 +-- .../ScalaPlayFrameworkServerCodegen.java | 2 +- .../languages/ScalaSttp4ClientCodegen.java | 5 +-- .../languages/ScalaSttpClientCodegen.java | 5 +-- .../languages/ScalazClientCodegen.java | 5 +-- .../languages/StaticHtml2Generator.java | 3 +- .../languages/StaticHtmlGenerator.java | 3 +- .../languages/Swift5ClientCodegen.java | 9 ++--- .../languages/SwiftCombineClientCodegen.java | 5 +-- .../languages/TypeScriptClientCodegen.java | 8 ++-- .../TypeScriptNodeClientCodegen.java | 2 +- .../codegen/languages/XojoClientCodegen.java | 3 +- .../codegen/utils/ModelUtils.java | 8 ++-- .../codegen/java/JavaClientCodegenTest.java | 37 +++++++++++++++++++ 84 files changed, 216 insertions(+), 276 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 e8a377714bd5..2673760167f1 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 @@ -1087,7 +1087,7 @@ public void preprocessOpenAPI(OpenAPI openAPI) { addOneOfNameExtension(s, n); } } else if (ModelUtils.isArraySchema(s)) { - Schema items = ((ArraySchema) s).getItems(); + Schema items = s.getItems(); if (ModelUtils.isComposedSchema(items)) { addOneOfNameExtension(items, nOneOf); addOneOfInterfaceModel(items, nOneOf); @@ -2056,8 +2056,7 @@ public String toInstantiationType(Schema schema) { String inner = getSchemaType(additionalProperties); return instantiationTypes.get("map") + ""; } else if (ModelUtils.isArraySchema(schema)) { - ArraySchema arraySchema = (ArraySchema) schema; - String inner = getSchemaType(getSchemaItems(arraySchema)); + String inner = getSchemaType(getSchemaItems(schema)); String parentType; if (ModelUtils.isSet(schema)) { parentType = "set"; @@ -2363,8 +2362,13 @@ public String getSchemaType(Schema schema) { } - protected Schema getSchemaItems(ArraySchema schema) { - Schema items = schema.getItems(); + protected Schema getSchemaItems(Schema schema) { + Schema items = null; + if (schema instanceof ArraySchema) { + items = ((ArraySchema) schema).getItems(); + } else if (schema instanceof JsonSchema) { + items = ((JsonSchema) schema).getItems(); + } if (items == null) { LOGGER.error("Undefined array inner type for `{}`. Default to String.", schema.getName()); items = new StringSchema().description("TODO default missing array inner type to string"); @@ -4166,8 +4170,7 @@ public CodegenProperty fromProperty(String name, Schema p, boolean required, boo // handle inner property String itemName = getItemsName(p, name); - ArraySchema arraySchema = (ArraySchema) p; - Schema innerSchema = unaliasSchema(getSchemaItems(arraySchema)); + Schema innerSchema = unaliasSchema(getSchemaItems(p)); CodegenProperty cp = fromProperty(itemName, innerSchema, false); updatePropertyForArray(property, cp); } else if (ModelUtils.isTypeObjectSchema(p)) { @@ -4477,8 +4480,7 @@ protected void handleMethodResponse(Operation operation, CodegenProperty cm = fromProperty("response", responseSchema, false); if (ModelUtils.isArraySchema(responseSchema)) { - ArraySchema as = (ArraySchema) responseSchema; - CodegenProperty innerProperty = fromProperty("response", getSchemaItems(as), false); + CodegenProperty innerProperty = fromProperty("response", getSchemaItems(responseSchema), false); op.returnBaseType = innerProperty.baseType; } else if (ModelUtils.isMapSchema(responseSchema)) { CodegenProperty innerProperty = fromProperty("response", ModelUtils.getAdditionalProperties(responseSchema), false); @@ -5005,8 +5007,7 @@ public CodegenResponse fromResponse(String responseCode, ApiResponse response) { r.isArray = true; r.containerType = cp.containerType; r.containerTypeMapped = typeMapping.get(cp.containerType); - ArraySchema as = (ArraySchema) responseSchema; - CodegenProperty items = fromProperty("response", getSchemaItems(as), false); + CodegenProperty items = fromProperty("response", getSchemaItems(responseSchema), false); r.setItems(items); CodegenProperty innerCp = items; @@ -5382,8 +5383,7 @@ public CodegenParameter fromParameter(Parameter parameter, Set imports) } addVarsRequiredVarsAdditionalProps(parameterSchema, codegenParameter); } else if (ModelUtils.isArraySchema(parameterSchema)) { - final ArraySchema arraySchema = (ArraySchema) parameterSchema; - Schema inner = getSchemaItems(arraySchema); + Schema inner = getSchemaItems(parameterSchema); collectionFormat = getCollectionFormat(parameter); // default to csv: @@ -7256,7 +7256,7 @@ public CodegenParameter fromFormProperty(String name, Schema propertySchema, Set } else if (ModelUtils.isAnyType(ps)) { // any schema with no type set, composed schemas often do this } else if (ModelUtils.isArraySchema(ps)) { - Schema inner = getSchemaItems((ArraySchema) ps); + Schema inner = getSchemaItems(ps); CodegenProperty arrayInnerProperty = fromProperty("inner", inner, false); codegenParameter.items = arrayInnerProperty; codegenParameter.mostInnerItems = arrayInnerProperty.mostInnerItems; @@ -7537,11 +7537,10 @@ protected void updateRequestBodyForArray(CodegenParameter codegenParameter, Sche if (ModelUtils.isGenerateAliasAsModel(schema) && StringUtils.isNotBlank(name)) { this.addBodyModelSchema(codegenParameter, name, schema, imports, bodyParameterName, true); } else { - final ArraySchema arraySchema = (ArraySchema) schema; - Schema inner = getSchemaItems(arraySchema); - CodegenProperty codegenProperty = fromProperty("property", arraySchema, false); + Schema inner = getSchemaItems(schema); + CodegenProperty codegenProperty = fromProperty("property", schema, false); if (codegenProperty == null) { - throw new RuntimeException("CodegenProperty cannot be null. arraySchema for debugging: " + arraySchema); + throw new RuntimeException("CodegenProperty cannot be null. arraySchema for debugging: " + schema); } imports.add(codegenProperty.baseType); @@ -7569,7 +7568,7 @@ protected void updateRequestBodyForArray(CodegenParameter codegenParameter, Sche codegenParameter.paramName = toArrayModelParamName(codegenParameter.baseName); codegenParameter.items = codegenProperty.items; codegenParameter.mostInnerItems = codegenProperty.mostInnerItems; - codegenParameter.dataType = getTypeDeclaration(arraySchema); + codegenParameter.dataType = getTypeDeclaration(schema); codegenParameter.baseType = getSchemaType(inner); codegenParameter.isContainer = Boolean.TRUE; codegenParameter.isNullable = codegenProperty.isNullable; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java index 22972e60fed3..08386d1a6ead 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/InlineModelResolver.java @@ -338,10 +338,9 @@ private void gatherInlineModels(Schema schema, String modelPrefix) { return; } // Check array items - if (schema instanceof ArraySchema) { - ArraySchema array = (ArraySchema) schema; - Schema items = array.getItems(); - if (items == null && array.getPrefixItems() == null) { + if (ModelUtils.isArraySchema(schema)) { + Schema items = schema.getItems(); + if (items == null && schema.getPrefixItems() == null) { LOGGER.debug("Incorrect array schema with no items, prefixItems: {}", schema.toString()); return; } @@ -357,7 +356,7 @@ private void gatherInlineModels(Schema schema, String modelPrefix) { if (isModelNeeded(items)) { // If this schema should be split into its own model, do so - array.setItems(this.makeSchemaInComponents(schemaName, items)); + schema.setItems(this.makeSchemaInComponents(schemaName, items)); } } // Check allOf, anyOf, oneOf for inline models @@ -784,9 +783,8 @@ private void flattenProperties(OpenAPI openAPI, Map properties, propsToUpdate.put(key, schema); modelsToAdd.put(modelName, model); } - } else if (property instanceof ArraySchema) { - ArraySchema ap = (ArraySchema) property; - Schema inner = ap.getItems(); + } else if (ModelUtils.isArraySchema(property)) { + Schema inner = property.getItems(); if (inner instanceof ObjectSchema) { ObjectSchema op = (ObjectSchema) inner; if (op.getProperties() != null && op.getProperties().size() > 0) { @@ -797,12 +795,12 @@ private void flattenProperties(OpenAPI openAPI, Map properties, if (existing != null) { Schema schema = new Schema().$ref(existing); schema.setRequired(op.getRequired()); - ap.setItems(schema); + property.setItems(schema); } else { modelName = addSchemas(modelName, innerModel); Schema schema = new Schema().$ref(modelName); schema.setRequired(op.getRequired()); - ap.setItems(schema); + property.setItems(schema); } } } else if (ModelUtils.isComposedSchema(inner)) { @@ -811,7 +809,7 @@ private void flattenProperties(OpenAPI openAPI, Map properties, innerModelName = addSchemas(innerModelName, inner); Schema schema = new Schema().$ref(innerModelName); schema.setRequired(inner.getRequired()); - ap.setItems(schema); + property.setItems(schema); } else { LOGGER.debug("Schema not yet handled in model resolver: {}", inner); } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java index cd017762d7f1..3e31dbe782ce 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java @@ -444,7 +444,7 @@ public Schema normalizeSchema(Schema schema, Set visitedSchemas) { visitedSchemas.add(schema); } - if (schema instanceof ArraySchema) { // array + if (ModelUtils.isArraySchema(schema)) { // array normalizeSchema(schema.getItems(), visitedSchemas); } else if (schema.getAdditionalProperties() instanceof Schema) { // map normalizeSchema((Schema) schema.getAdditionalProperties(), visitedSchemas); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/examples/ExampleGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/examples/ExampleGenerator.java index 09ef2bfb4461..fa387c27618a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/examples/ExampleGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/examples/ExampleGenerator.java @@ -84,10 +84,9 @@ private List> generateFromResponseSchema(Schema responseSche } if (ModelUtils.isArraySchema(responseSchema)) { // array of schema - ArraySchema as = (ArraySchema) responseSchema; - if (as.getItems() != null) { // array of primitive types + if (responseSchema.getItems() != null) { // array of primitive types return generate((Map) responseSchema.getExample(), - new ArrayList<>(producesInfo), as); + new ArrayList<>(producesInfo), responseSchema); } else { // TODO log warning message as such case is not handled at the moment return null; @@ -248,9 +247,9 @@ private Object resolvePropertyToExample(String propertyName, String mediaType, S } return Boolean.TRUE; } else if (ModelUtils.isArraySchema(property)) { - Schema innerType = ((ArraySchema) property).getItems(); + Schema innerType = property.getItems(); if (innerType != null) { - int arrayLength = null == ((ArraySchema) property).getMaxItems() ? 2 : ((ArraySchema) property).getMaxItems(); + int arrayLength = null == property.getMaxItems() ? 2 : property.getMaxItems(); // avoid memory issues by limiting to max. 5 items arrayLength = Math.min(arrayLength, 5); Object[] objectProperties = new Object[arrayLength]; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/examples/XmlExampleGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/examples/XmlExampleGenerator.java index 3151c0bffd94..d4f50718e215 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/examples/XmlExampleGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/examples/XmlExampleGenerator.java @@ -128,8 +128,7 @@ protected String toXml(String name, Schema schema, int indent, Collection schema = unaliasSchema(p); Schema target = ModelUtils.isGenerateAliasAsModel() ? p : schema; if (ModelUtils.isArraySchema(target)) { - Schema items = getSchemaItems((ArraySchema) schema); + Schema items = getSchemaItems(schema); return getSchemaType(target) + "<" + getTypeDeclaration(items) + ">"; } if (ModelUtils.isMapSchema(target)) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractEiffelCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractEiffelCodegen.java index 8f071ddc40c2..923a7e85efd4 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractEiffelCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractEiffelCodegen.java @@ -293,8 +293,7 @@ public String toApiDocFilename(String name) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return "LIST [" + getTypeDeclaration(inner) + "]"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); @@ -578,8 +577,7 @@ public String toInstantiationType(Schema p) { // String inner = toModelName(getSchemaType(additionalProperties2)); // return instantiationTypes.get("map") + " [" + inner + "]"; // } else if (ModelUtils.isArraySchema(p)) { -// ArraySchema ap = (ArraySchema) p; -// String inner = toModelName(getSchemaType(ap.getItems())); +// String inner = toModelName(getSchemaType(p.getItems())); // return instantiationTypes.get("array") + " [" + inner + "]"; // } else { // return null; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractFSharpCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractFSharpCodegen.java index 8eebfaadab0a..fd58f3030008 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractFSharpCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractFSharpCodegen.java @@ -855,7 +855,7 @@ public String getSchemaType(Schema p) { * @param arr The input array property * @return The type declaration when the type is an array of arrays. */ - private String getArrayTypeDeclaration(ArraySchema arr) { + private String getArrayTypeDeclaration(Schema arr) { // TODO: collection type here should be fully qualified namespace to avoid model conflicts // This supports arrays of arrays. String arrayType = typeMapping.get("array"); @@ -869,7 +869,7 @@ private String getArrayTypeDeclaration(ArraySchema arr) { @Override public String toInstantiationType(Schema p) { if (ModelUtils.isArraySchema(p)) { - return getArrayTypeDeclaration((ArraySchema) p); + return getArrayTypeDeclaration(p); } return super.toInstantiationType(p); } @@ -877,7 +877,7 @@ public String toInstantiationType(Schema p) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - return getArrayTypeDeclaration((ArraySchema) p); + return getArrayTypeDeclaration(p); } else if (ModelUtils.isMapSchema(p)) { // Should we also support maps of maps? Schema inner = ModelUtils.getAdditionalProperties(p); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGoCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGoCodegen.java index 11e4c3f8fe6d..967e48800653 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGoCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGoCodegen.java @@ -360,8 +360,7 @@ public String toApiTestFilename(String name) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); // In OAS 3.0.x, the array "items" attribute is required. // In OAS >= 3.1, the array "items" attribute is optional such that the OAS // specification is aligned with the JSON schema specification. diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGraphQLCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGraphQLCodegen.java index b72b574e89a9..f592d8c4d118 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGraphQLCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractGraphQLCodegen.java @@ -273,8 +273,7 @@ public String toApiName(String name) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return "[" + getTypeDeclaration(inner) + "]"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = (Schema) p.getAdditionalProperties(); 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 b1c47e795707..6bf2bd9aa939 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 @@ -932,7 +932,7 @@ public String getTypeDeclaration(Schema p) { Schema schema = unaliasSchema(p); Schema target = ModelUtils.isGenerateAliasAsModel() ? p : schema; if (ModelUtils.isArraySchema(target)) { - Schema items = getSchemaItems((ArraySchema) schema); + Schema items = getSchemaItems(schema); return getSchemaType(target) + "<" + getBeanValidation(items) + getTypeDeclaration(items) + ">"; } else if (ModelUtils.isMapSchema(target)) { // Note: ModelUtils.isMapSchema(p) returns true when p is a composed schema that also defines diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJuliaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJuliaCodegen.java index 6fec46385629..3a4eddfa28cc 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJuliaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJuliaCodegen.java @@ -346,8 +346,7 @@ public String toModelName(final String name) { @Override public String getTypeDeclaration(Schema schema) { if (ModelUtils.isArraySchema(schema)) { - ArraySchema ap = (ArraySchema) schema; - Schema inner = ap.getItems(); + Schema inner = schema.getItems(); return getSchemaType(schema) + "{" + getTypeDeclaration(inner) + "}"; } else if (ModelUtils.isSet(schema)) { Schema inner = ModelUtils.getAdditionalProperties(schema); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java index 3224e1cf5c91..862ba13a9d03 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java @@ -361,7 +361,7 @@ public String getTypeDeclaration(Schema p) { Schema schema = unaliasSchema(p); Schema target = ModelUtils.isGenerateAliasAsModel() ? p : schema; if (ModelUtils.isArraySchema(target)) { - Schema items = getSchemaItems((ArraySchema) schema); + Schema items = getSchemaItems(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 @@ -1106,7 +1106,7 @@ private String toArrayDefaultValue(CodegenProperty cp, Schema schema) { } StringBuilder defaultContent = new StringBuilder(); - Schema itemsSchema = getSchemaItems((ArraySchema) schema); + Schema itemsSchema = getSchemaItems(schema); _default.elements().forEachRemaining((element) -> { String defaultValue = element.asText(); if (defaultValue != null) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPhpCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPhpCodegen.java index 19dddf4a3715..c7e048d5ac18 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPhpCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPhpCodegen.java @@ -355,11 +355,10 @@ public String toApiDocFilename(String name) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); if (inner == null) { LOGGER.warn("{}(array property) does not have a proper inner type defined.Default to string", - ap.getName()); + p.getName()); inner = new StringSchema().description("TODO default missing array inner type to string"); } return getTypeDeclaration(inner) + "[]"; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonCodegen.java index f35cb23d722d..76636a5c8dee 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonCodegen.java @@ -489,8 +489,7 @@ private String toExampleValueRecursive(Schema schema, List includedSchem if (StringUtils.isNotBlank(schema.getTitle()) && !"null".equals(schema.getTitle())) { includedSchemas.add(schema); } - ArraySchema arrayschema = (ArraySchema) schema; - example = "[\n" + indentationString + toExampleValueRecursive(arrayschema.getItems(), includedSchemas, indentation + 1) + "\n" + indentationString + "]"; + example = "[\n" + indentationString + toExampleValueRecursive(schema.getItems(), includedSchemas, indentation + 1) + "\n" + indentationString + "]"; } else if (ModelUtils.isMapSchema(schema)) { if (StringUtils.isNotBlank(schema.getTitle()) && !"null".equals(schema.getTitle())) { includedSchemas.add(schema); @@ -691,8 +690,7 @@ public String getTypeDeclaration(Schema p) { p = ModelUtils.unaliasSchema(openAPI, p); if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getSchemaType(p) + "[" + getCollectionItemTypeDeclaration(inner) + "]"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonConnexionServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonConnexionServerCodegen.java index a171b8f77513..3aa7a70f001a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonConnexionServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonConnexionServerCodegen.java @@ -351,8 +351,7 @@ public String modelFileFolder() { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getSchemaType(p) + "[" + getTypeDeclaration(inner) + "]"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonPydanticV1Codegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonPydanticV1Codegen.java index 921f28c3f709..a41fe07f3f6d 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonPydanticV1Codegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonPydanticV1Codegen.java @@ -454,8 +454,7 @@ private String toExampleValueRecursive(Schema schema, List includedSchem if (StringUtils.isNotBlank(schema.getTitle()) && !"null".equals(schema.getTitle())) { includedSchemas.add(schema); } - ArraySchema arrayschema = (ArraySchema) schema; - example = "[\n" + indentationString + toExampleValueRecursive(arrayschema.getItems(), includedSchemas, indentation + 1) + "\n" + indentationString + "]"; + example = "[\n" + indentationString + toExampleValueRecursive(schema.getItems(), includedSchemas, indentation + 1) + "\n" + indentationString + "]"; } else if (ModelUtils.isMapSchema(schema)) { if (StringUtils.isNotBlank(schema.getTitle()) && !"null".equals(schema.getTitle())) { includedSchemas.add(schema); @@ -656,8 +655,7 @@ public String getTypeDeclaration(Schema p) { p = ModelUtils.unaliasSchema(openAPI, p); if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getSchemaType(p) + "[" + getTypeDeclaration(inner) + "]"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractRubyCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractRubyCodegen.java index 2e6c90b9c357..3d0c9022bd25 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractRubyCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractRubyCodegen.java @@ -119,7 +119,7 @@ public String escapeReservedWord(String name) { @Override public String getTypeDeclaration(Schema schema) { if (ModelUtils.isArraySchema(schema)) { - Schema inner = ((ArraySchema) schema).getItems(); + Schema inner = schema.getItems(); return getSchemaType(schema) + "<" + getTypeDeclaration(inner) + ">"; } else if (ModelUtils.isMapSchema(schema)) { Schema inner = ModelUtils.getAdditionalProperties(schema); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractRustCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractRustCodegen.java index 94d6cb36385c..8330304b170a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractRustCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractRustCodegen.java @@ -236,8 +236,7 @@ public String sanitizeIdentifier(String name, CasingType casingType, String esca @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); String innerType = getTypeDeclaration(inner); return typeMapping.get("array") + "<" + innerType + ">"; } else if (ModelUtils.isMapSchema(p)) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java index d5bf542c0b8a..9a83f62a37a3 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java @@ -371,7 +371,7 @@ public String getTypeDeclaration(Schema p) { Schema schema = unaliasSchema(p); Schema target = ModelUtils.isGenerateAliasAsModel() ? p : schema; if (ModelUtils.isArraySchema(target)) { - Schema items = getSchemaItems((ArraySchema) schema); + Schema items = getSchemaItems(schema); return getSchemaType(target) + "[" + getTypeDeclaration(items) + "]"; } else if (ModelUtils.isMapSchema(target)) { Schema inner = ModelUtils.getAdditionalProperties(target); @@ -404,9 +404,8 @@ public String toInstantiationType(Schema p) { String inner = getSchemaType(ModelUtils.getAdditionalProperties(p)); return instantiationTypes.get("map") + "[String, " + inner + "]"; } else if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - String inner = getSchemaType(ap.getItems()); - return (ModelUtils.isSet(ap) ? instantiationTypes.get("set") : instantiationTypes.get("array")) + "[" + inner + "]"; + String inner = getSchemaType(p.getItems()); + return (ModelUtils.isSet(p) ? instantiationTypes.get("set") : instantiationTypes.get("array")) + "[" + inner + "]"; } else { return null; } @@ -433,10 +432,9 @@ public String toDefaultValue(Schema p) { String inner = getSchemaType(ModelUtils.getAdditionalProperties(p)); return "new HashMap[String, " + inner + "]() "; } else if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - String inner = getSchemaType(ap.getItems()); + String inner = getSchemaType(p.getItems()); String genericType; - if (ModelUtils.isSet(ap)) { + if (ModelUtils.isSet(p)) { genericType = instantiationTypes.get("set"); } else { genericType = instantiationTypes.get("array"); @@ -474,11 +472,8 @@ public String toDefaultValue(Schema p) { @Override public CodegenProperty fromProperty(String name, Schema p, boolean required) { CodegenProperty prop = super.fromProperty(name, p, required); - if (ModelUtils.isArraySchema(p)) { - ArraySchema as = (ArraySchema) p; - if (ModelUtils.isSet(as)) { - prop.containerType = "set"; - } + if (ModelUtils.isSet(p)) { + prop.containerType = "set"; } return prop; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java index 10cfdd80cc10..f35c8043a3b8 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java @@ -624,7 +624,7 @@ public String toModelFilename(String name) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - Schema items = getSchemaItems((ArraySchema) p); + Schema items = getSchemaItems(p); return getSchemaType(p) + "<" + getTypeDeclaration(unaliasSchema(items)) + ">"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = getSchemaAdditionalProperties(p); @@ -647,8 +647,7 @@ protected String getParameterDataType(Parameter parameter, Schema p) { // handle enums of various data types Schema inner; if (ModelUtils.isArraySchema(p)) { - ArraySchema mp1 = (ArraySchema) p; - inner = mp1.getItems(); + inner = p.getItems(); return this.getSchemaType(p) + "<" + this.getParameterDataType(parameter, inner) + ">"; } else if (ModelUtils.isMapSchema(p)) { inner = ModelUtils.getAdditionalProperties(p); @@ -1173,8 +1172,7 @@ protected List getTypesFromSchemas(List schemas) { return filteredSchemas.stream().map(schema -> { String schemaType = getSchemaType(schema); if (ModelUtils.isArraySchema(schema)) { - ArraySchema ap = (ArraySchema) schema; - Schema inner = ap.getItems(); + Schema inner = schema.getItems(); schemaType = schemaType + "<" + getSchemaType(inner) + ">"; } return schemaType; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AndroidClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AndroidClientCodegen.java index 993a48aa769e..47a9f44cec73 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AndroidClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AndroidClientCodegen.java @@ -221,8 +221,7 @@ public String toModelDocFilename(String name) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getSchemaType(p) + "<" + getTypeDeclaration(inner) + ">"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ApexClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ApexClientCodegen.java index 8018d38da342..11a747eb15be 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ApexClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ApexClientCodegen.java @@ -223,7 +223,7 @@ public String toModelName(String name) { public String toDefaultValue(Schema p) { String out = null; if (ModelUtils.isArraySchema(p)) { - Schema inner = ((ArraySchema) p).getItems(); + Schema inner = p.getItems(); out = String.format( Locale.ROOT, "new List<%s>()", diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/BashClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/BashClientCodegen.java index c51225bbec07..540a874d69c7 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/BashClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/BashClientCodegen.java @@ -429,8 +429,7 @@ public String toApiDocFilename(String name) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getSchemaType(p) + "[" + getTypeDeclaration(inner) + "]"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CLibcurlClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CLibcurlClientCodegen.java index 3b13f6ba19cd..889e293d9754 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CLibcurlClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CLibcurlClientCodegen.java @@ -408,7 +408,7 @@ public String modelDocFileFolder() { public String getTypeDeclaration(Schema schema) { /* comment out below as we'll do it in the template instead if (ModelUtils.isArraySchema(schema)) { - Schema inner = ((ArraySchema) schema).getItems(); + Schema inner = schema.getItems(); return getSchemaType(schema) + "<" + getTypeDeclaration(inner) + ">"; } else if (ModelUtils.isMapSchema(schema)) { Schema inner = (Schema) schema.getAdditionalProperties(); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java index f084de1cc735..b155c4cb9d9a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java @@ -1515,8 +1515,7 @@ public String toInstantiationType(Schema schema) { } return instantiationTypes.get("map") + ""; } else if (ModelUtils.isArraySchema(schema)) { - ArraySchema arraySchema = (ArraySchema) schema; - String inner = getSchemaType(arraySchema.getItems()); + String inner = getSchemaType(schema.getItems()); return instantiationTypes.get("array") + "<" + inner + ">"; } else { return null; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpReducedClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpReducedClientCodegen.java index 7275873f2163..ae9cdfe0a4c7 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpReducedClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpReducedClientCodegen.java @@ -1091,8 +1091,7 @@ public String toInstantiationType(Schema schema) { } return instantiationTypes.get("map") + ""; } else if (ModelUtils.isArraySchema(schema)) { - ArraySchema arraySchema = (ArraySchema) schema; - String inner = getSchemaType(arraySchema.getItems()); + String inner = getSchemaType(schema.getItems()); return instantiationTypes.get("array") + "<" + inner + ">"; } else { return null; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ClojureClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ClojureClientCodegen.java index c5163ecb6e2f..20a6f3faf4e3 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ClojureClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ClojureClientCodegen.java @@ -165,9 +165,8 @@ public String getHelp() { @Override public String getTypeDeclaration(Schema p) { - if (p instanceof ArraySchema) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + if (ModelUtils.isArraySchema(p)) { + Schema inner = p.getItems(); return "(s/coll-of " + getTypeDeclaration(inner) + ")"; } else if (ModelUtils.isMapSchema(p)) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ConfluenceWikiCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ConfluenceWikiCodegen.java index 22cdb199c959..23193ba801cc 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ConfluenceWikiCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ConfluenceWikiCodegen.java @@ -108,8 +108,7 @@ public String getHelp() { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getSchemaType(p) + "[" + getTypeDeclaration(inner) + "]"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppPistacheServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppPistacheServerCodegen.java index aceefd0f3c4b..3786dceb5eaf 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppPistacheServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppPistacheServerCodegen.java @@ -381,8 +381,7 @@ public String getTypeDeclaration(Schema p) { String openAPIType = getSchemaType(p); if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getSchemaType(p) + "<" + getTypeDeclaration(inner) + ">"; } if (ModelUtils.isMapSchema(p)) { @@ -474,8 +473,7 @@ public String toDefaultValue(Schema p) { String inner = getSchemaType(ModelUtils.getAdditionalProperties(p)); return "std::map()"; } else if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - String inner = getSchemaType(ap.getItems()); + String inner = getSchemaType(p.getItems()); if (!languageSpecificPrimitives.contains(inner)) { inner = "std::shared_ptr<" + inner + ">"; } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQtAbstractCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQtAbstractCodegen.java index 09a45e7a1431..a9d0656515a6 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQtAbstractCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQtAbstractCodegen.java @@ -189,8 +189,7 @@ public String getTypeDeclaration(Schema p) { String openAPIType = getSchemaType(p); if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getSchemaType(p) + "<" + getTypeDeclaration(inner) + ">"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); @@ -232,8 +231,7 @@ public String toDefaultValue(Schema p) { Schema inner = ModelUtils.getAdditionalProperties(p); return "QMap()"; } else if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return "QList<" + getTypeDeclaration(inner) + ">()"; } else if (ModelUtils.isStringSchema(p)) { return "QString(\"\")"; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestSdkClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestSdkClientCodegen.java index ca90e4b89560..ae3a04568976 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestSdkClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestSdkClientCodegen.java @@ -367,8 +367,7 @@ public String getTypeDeclaration(Schema p) { String openAPIType = getSchemaType(p); if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getSchemaType(p) + "<" + getTypeDeclaration(inner) + ">"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); @@ -407,8 +406,7 @@ public String toDefaultValue(Schema p) { String inner = getSchemaType(ModelUtils.getAdditionalProperties(p)); return "std::map()"; } else if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - String inner = getSchemaType(ap.getItems()); + String inner = getSchemaType(p.getItems()); if (!languageSpecificPrimitives.contains(inner)) { inner = "std::shared_ptr<" + inner + ">"; } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestbedServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestbedServerCodegen.java index 9fd2c4ae691a..e7f9eae5f65d 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestbedServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestbedServerCodegen.java @@ -379,8 +379,7 @@ public String getTypeDeclaration(Schema p) { String openAPIType = getSchemaType(p); if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getSchemaType(p) + "<" + getTypeDeclaration(inner) + ">"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); @@ -469,12 +468,10 @@ public String toDefaultValue(Schema p) { String inner = getSchemaType(ModelUtils.getAdditionalProperties(p)); return "std::map()"; } else if (ModelUtils.isSet(p)) { - ArraySchema ap = (ArraySchema) p; - String inner = getSchemaType(ap.getItems()); + String inner = getSchemaType(p.getItems()); return "std::set<" + inner + ">()"; } else if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - String inner = getSchemaType(ap.getItems()); + String inner = getSchemaType(p.getItems()); return "std::vector<" + inner + ">()"; } else if (ModelUtils.isModel(p)) { String modelName = getTypeDeclaration(p); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestbedServerDeprecatedCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestbedServerDeprecatedCodegen.java index bb5941040ad9..804b6da06bb1 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestbedServerDeprecatedCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestbedServerDeprecatedCodegen.java @@ -351,8 +351,7 @@ public String getTypeDeclaration(Schema p) { String openAPIType = getSchemaType(p); if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getSchemaType(p) + "<" + getTypeDeclaration(inner) + ">"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); @@ -433,8 +432,7 @@ public String toDefaultValue(Schema p) { String inner = getSchemaType(ModelUtils.getAdditionalProperties(p)); return "std::map()"; } else if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - String inner = getSchemaType(ap.getItems()); + String inner = getSchemaType(p.getItems()); if (!languageSpecificPrimitives.contains(inner)) { inner = "std::shared_ptr<" + inner + ">"; } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppUE4ClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppUE4ClientCodegen.java index 9ac111edaf33..3e6b78754653 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppUE4ClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppUE4ClientCodegen.java @@ -384,8 +384,7 @@ public String getTypeDeclaration(Schema p) { String openAPIType = getSchemaType(p); if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - return getSchemaType(p) + "<" + getTypeDeclaration(ap.getItems()) + ">"; + return getSchemaType(p) + "<" + getTypeDeclaration(p.getItems()) + ">"; } else if (ModelUtils.isMapSchema(p)) { return getSchemaType(p) + ""; } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CrystalClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CrystalClientCodegen.java index 818d14939a4f..510da82228bf 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CrystalClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CrystalClientCodegen.java @@ -819,7 +819,7 @@ public String escapeReservedWord(String name) { @Override public String getTypeDeclaration(Schema schema) { if (ModelUtils.isArraySchema(schema)) { - Schema inner = ((ArraySchema) schema).getItems(); + Schema inner = schema.getItems(); return getSchemaType(schema) + "(" + getTypeDeclaration(inner) + ")"; } else if (ModelUtils.isMapSchema(schema)) { Schema inner = ModelUtils.getAdditionalProperties(schema); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElixirClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElixirClientCodegen.java index 37118de3b13a..290b031fc014 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElixirClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElixirClientCodegen.java @@ -557,8 +557,7 @@ public String toOperationId(String operationId) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return "[" + getTypeDeclaration(inner) + "]"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java index 2648e67cfbfb..d44c70dc5a1d 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java @@ -244,8 +244,7 @@ public String toEnumVarName(String value, String datatype) { @Override public String toInstantiationType(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - String inner = getSchemaType(ap.getItems()); + String inner = getSchemaType(p.getItems()); return instantiationTypes.get("array") + " " + inner; } else { return null; @@ -464,8 +463,7 @@ public String getSchemaType(Schema p) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getTypeDeclaration(inner); } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ErlangProperCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ErlangProperCodegen.java index f1eafd8ce7a3..8aeff6532cf1 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ErlangProperCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ErlangProperCodegen.java @@ -141,7 +141,7 @@ public ErlangProperCodegen() { public CodegenModel fromModel(String name, Schema model) { CodegenModel cm = super.fromModel(name, model); if(ModelUtils.isArraySchema(model)) { - return new CodegenArrayModel(cm, (ArraySchema) model); + return new CodegenArrayModel(cm, model); } else { return cm; } @@ -156,8 +156,7 @@ public String getTypeDeclaration(String name) { public String getTypeDeclaration(Schema schema) { String typeDeclaration = super.getSchemaType(schema); if(ModelUtils.isArraySchema(schema)) { - ArraySchema arraySchema = (ArraySchema) schema; - String complexType = getSchemaType(arraySchema.getItems()); + String complexType = getSchemaType(schema.getItems()); StringBuilder sb = new StringBuilder("list("); sb.append(complexType); @@ -174,8 +173,7 @@ public String getTypeDeclaration(Schema schema) { public String getSchemaType(Schema schema) { String schemaType = super.getSchemaType(schema); if(ModelUtils.isArraySchema(schema)) { - ArraySchema arraySchema = (ArraySchema) schema; - String complexType = getSchemaType(arraySchema.getItems()); + String complexType = getSchemaType(schema.getItems()); StringBuilder sb = new StringBuilder("list("); sb.append(complexType); @@ -446,7 +444,7 @@ class CodegenArrayModel extends CodegenModel { Integer minItems; Integer maxItems; - public CodegenArrayModel(CodegenModel cm, ArraySchema schema) { + public CodegenArrayModel(CodegenModel cm, Schema schema) { super(); // Copy all fields of CodegenModel diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GraphQLNodeJSExpressServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GraphQLNodeJSExpressServerCodegen.java index fc68c05827a9..2bc5b8f8edac 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GraphQLNodeJSExpressServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GraphQLNodeJSExpressServerCodegen.java @@ -124,8 +124,7 @@ public void processOpts() { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); // IMPORTANT NOTE we add the braces within template because there we have the possibility to differentiate // between some specific types for GraphQL: diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellHttpClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellHttpClientCodegen.java index efcb7ab97b8b..5af310ededbc 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellHttpClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellHttpClientCodegen.java @@ -653,8 +653,7 @@ public Map postProcessSupportingFileData(Map obj @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return "[" + getTypeDeclaration(inner) + "]"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); @@ -687,8 +686,7 @@ public String toInstantiationType(Schema p) { String inner = getSchemaType(additionalProperties2); return "(Map.Map Text " + inner + ")"; } else if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - return getSchemaType(ap.getItems()); + return getSchemaType(p.getItems()); } else { return null; } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellServantCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellServantCodegen.java index 4b26ba11d110..72486fbac832 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellServantCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellServantCodegen.java @@ -372,8 +372,7 @@ private void setGenerateToSchema(CodegenModel model) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return "[" + getTypeDeclaration(inner) + "]"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); @@ -419,8 +418,7 @@ public String toInstantiationType(Schema p) { String inner = getSchemaType(additionalProperties2); return "(Map.Map Text " + inner + ")"; } else if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - String inner = getSchemaType(ap.getItems()); + String inner = getSchemaType(p.getItems()); // Return only the inner type; the wrapping with QueryList is done // somewhere else, where we have access to the collection format. return inner; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellYesodServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellYesodServerCodegen.java index eb55671fceb3..724f8fb83cc6 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellYesodServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/HaskellYesodServerCodegen.java @@ -295,8 +295,7 @@ public void preprocessOpenAPI(OpenAPI openAPI) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return "[" + getTypeDeclaration(inner) + "]"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); @@ -342,8 +341,7 @@ public String toInstantiationType(Schema p) { String inner = getSchemaType(additionalProperties2); return "(Map.Map Text " + inner + ")"; } else if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - String inner = getSchemaType(ap.getItems()); + String inner = getSchemaType(p.getItems()); // Return only the inner type; the wrapping with QueryList is done // somewhere else, where we have access to the collection format. return inner; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JMeterClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JMeterClientCodegen.java index 5779f9631234..3aee4ead1afd 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JMeterClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JMeterClientCodegen.java @@ -210,8 +210,7 @@ public String apiFileFolder() { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getSchemaType(p) + "[" + getTypeDeclaration(inner) + "]"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptApolloClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptApolloClientCodegen.java index ed04eb222b73..346aad359523 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptApolloClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptApolloClientCodegen.java @@ -610,8 +610,7 @@ public String toApiImport(String name) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return "[" + getTypeDeclaration(inner) + "]"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); @@ -872,9 +871,8 @@ public CodegenModel fromModel(String name, Schema model) { codegenModel = JavascriptApolloClientCodegen.reconcileInlineEnums(codegenModel, parentCodegenModel); } if (ModelUtils.isArraySchema(model)) { - ArraySchema am = (ArraySchema) model; - if (codegenModel != null && am.getItems() != null) { - String itemType = getSchemaType(am.getItems()); + if (codegenModel != null && model.getItems() != null) { + String itemType = getSchemaType(model.getItems()); codegenModel.vendorExtensions.put("x-is-array", true); codegenModel.vendorExtensions.put("x-item-type", itemType); } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClientCodegen.java index cbd5d088c951..c6e574b37bc4 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClientCodegen.java @@ -610,8 +610,7 @@ public String toApiImport(String name) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return "[" + getTypeDeclaration(inner) + "]"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); @@ -874,9 +873,8 @@ public CodegenModel fromModel(String name, Schema model) { } } if (ModelUtils.isArraySchema(model)) { - ArraySchema am = (ArraySchema) model; - if (codegenModel != null && am.getItems() != null) { - String itemType = getSchemaType(am.getItems()); + if (codegenModel != null && model.getItems() != null) { + String itemType = getSchemaType(model.getItems()); codegenModel.vendorExtensions.put("x-is-array", true); codegenModel.vendorExtensions.put("x-item-type", itemType); } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClosureAngularClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClosureAngularClientCodegen.java index 38b57b1a7c15..c7aa10e4ebe0 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClosureAngularClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavascriptClosureAngularClientCodegen.java @@ -225,8 +225,7 @@ public String toModelFilename(String name) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getSchemaType(p) + ""; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/LuaClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/LuaClientCodegen.java index 81037ee6dcd2..4ceeb0ef3c5d 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/LuaClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/LuaClientCodegen.java @@ -383,8 +383,7 @@ public String toApiName(String name) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getTypeDeclaration(inner); } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/N4jsClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/N4jsClientCodegen.java index 49a3166668ec..dcea521cd2ba 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/N4jsClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/N4jsClientCodegen.java @@ -513,7 +513,7 @@ protected String fromModelImport(String modelImportName) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - Schema items = getSchemaItems((ArraySchema) p); + Schema items = getSchemaItems(p); return getTypeDeclaration(unaliasSchema(items)) + "[]"; } else if (ModelUtils.isMapSchema(p)) { return "~Object+"; @@ -544,8 +544,7 @@ public String getTypeDeclaration(Schema p) { protected String getParameterDataType(Parameter parameter, Schema p) { // handle enums of various data types if (ModelUtils.isArraySchema(p)) { - ArraySchema mp1 = (ArraySchema) p; - Schema inner = mp1.getItems(); + Schema inner = p.getItems(); return getParameterDataType(parameter, inner) + "[]"; } else if (ModelUtils.isMapSchema(p)) { return "~Object+"; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/NimClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/NimClientCodegen.java index 71486156b332..5f56a96e8095 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/NimClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/NimClientCodegen.java @@ -275,8 +275,7 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List schemas) collectEnumSchemas(pName, (Schema) schema.getAdditionalProperties()); } - if (schema instanceof ArraySchema) { - ArraySchema s = (ArraySchema) schema; - if (s.getItems() != null) { + if (ModelUtils.isArraySchema(schema)) { + if (schema.getItems() != null) { String pName = parentName != null ? parentName + "_" + sName : sName; - collectEnumSchemas(pName, s.getItems()); + collectEnumSchemas(pName, schema.getItems()); } } } @@ -581,11 +580,10 @@ public String toApiDocFilename(String name) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); if (inner == null) { LOGGER.warn("{}(array property) does not have a proper inner type defined.Default to string", - ap.getName()); + p.getName()); inner = new StringSchema().description("TODO default missing array inner type to string"); } return getTypeDeclaration(inner) + " list"; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ObjcClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ObjcClientCodegen.java index bd46543760fc..39cfcc9c000a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ObjcClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ObjcClientCodegen.java @@ -370,8 +370,7 @@ public String getSchemaType(Schema p) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); String innerTypeDeclaration = getTypeDeclaration(inner); if (innerTypeDeclaration.endsWith("*")) { innerTypeDeclaration = innerTypeDeclaration.substring(0, innerTypeDeclaration.length() - 1); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PerlClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PerlClientCodegen.java index f5d72b984d74..6fb4ab9d51c0 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PerlClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PerlClientCodegen.java @@ -261,8 +261,7 @@ public String modelDocFileFolder() { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getSchemaType(p) + "[" + getTypeDeclaration(inner) + "]"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpDataTransferClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpDataTransferClientCodegen.java index d6171c79a4f4..357b37d17222 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpDataTransferClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpDataTransferClientCodegen.java @@ -271,11 +271,10 @@ protected Schema convertParameterToSchema(OpenAPI openAPI, Parameter parameter) Schema parameterSchema = ModelUtils.getReferencedSchema(openAPI, parameter.getSchema()); // array if (ModelUtils.isArraySchema(parameterSchema)) { - Schema itemSchema = ((ArraySchema) parameterSchema).getItems(); ArraySchema arraySchema = new ArraySchema(); arraySchema.setMinItems(parameterSchema.getMinItems()); arraySchema.setMaxItems(parameterSchema.getMaxItems()); - arraySchema.setItems(itemSchema); + arraySchema.setItems(parameterSchema); String collectionFormat = getCollectionFormat(parameter); if (collectionFormat == null) { collectionFormat = "csv"; @@ -419,7 +418,7 @@ protected void generateContainerSchemas(OpenAPI openAPI, Set visitedSche } } else if (ModelUtils.isArraySchema(schema)) { //Recursively process schema of array items - generateContainerSchemas(openAPI, visitedSchemas, ((ArraySchema) schema).getItems()); + generateContainerSchemas(openAPI, visitedSchemas, schema.getItems()); isContainer = Boolean.TRUE; } else if (ModelUtils.isMapSchema(schema)) { //Recursively process schema of map items diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpMezzioPathHandlerServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpMezzioPathHandlerServerCodegen.java index d7f8b7222e18..bc4cc1634f67 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpMezzioPathHandlerServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpMezzioPathHandlerServerCodegen.java @@ -248,7 +248,7 @@ protected Schema convertParameterToSchema(OpenAPI openAPI, Parameter parameter) Schema parameterSchema = ModelUtils.getReferencedSchema(openAPI, queryParameter.getSchema()); // array if (ModelUtils.isArraySchema(parameterSchema)) { - Schema itemSchema = ((ArraySchema) parameterSchema).getItems(); + Schema itemSchema = parameterSchema.getItems(); ArraySchema arraySchema = new ArraySchema(); arraySchema.setMinItems(parameterSchema.getMinItems()); arraySchema.setMaxItems(parameterSchema.getMaxItems()); @@ -397,7 +397,7 @@ protected void generateContainerSchemas(OpenAPI openAPI, Set visitedSche } } else if (ModelUtils.isArraySchema(schema)) { //Recursively process schema of array items - generateContainerSchemas(openAPI, visitedSchemas, ((ArraySchema) schema).getItems()); + generateContainerSchemas(openAPI, visitedSchemas, schema.getItems()); isContainer = Boolean.TRUE; } else if (ModelUtils.isMapSchema(schema)) { //Recursively process schema of map items diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSilexServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSilexServerCodegen.java index 7d92a0ec0912..60760114a5ce 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSilexServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSilexServerCodegen.java @@ -175,8 +175,7 @@ public String modelFileFolder() { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getSchemaType(p) + "[" + getTypeDeclaration(inner) + "]"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSymfonyServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSymfonyServerCodegen.java index 9334bad5ab19..8ff7830acc5f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSymfonyServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSymfonyServerCodegen.java @@ -538,8 +538,7 @@ public void setInvokerPackage(String invokerPackage) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getTypeDeclaration(inner); } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellClientCodegen.java index fea2bc0a7ecb..7d4d7e9d8ea8 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PowerShellClientCodegen.java @@ -998,8 +998,7 @@ public String getSchemaType(Schema p) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getTypeDeclaration(inner) + "[]"; } else if (ModelUtils.isMapSchema(p)) { return "System.Collections.Hashtable"; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ProtobufSchemaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ProtobufSchemaCodegen.java index 13a356a47d34..005024998966 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ProtobufSchemaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ProtobufSchemaCodegen.java @@ -608,8 +608,7 @@ public String toModelImport(String name) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getSchemaType(p) + "[" + getTypeDeclaration(inner) + "]"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonFastAPIServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonFastAPIServerCodegen.java index 6132cc3a6e21..36d0ed66abce 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonFastAPIServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonFastAPIServerCodegen.java @@ -223,8 +223,7 @@ public String toModelImport(String name) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getSchemaType(p) + "[" + getTypeDeclaration(inner) + "]"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RClientCodegen.java index 872c75239d2b..97d7d308800f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RClientCodegen.java @@ -535,8 +535,7 @@ public String toApiName(String name) { @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getSchemaType(p) + "[" + getTypeDeclaration(inner) + "]"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustAxumServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustAxumServerCodegen.java index ecbc29c5c32c..42ff22176b42 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustAxumServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustAxumServerCodegen.java @@ -705,8 +705,7 @@ public CodegenParameter fromRequestBody(RequestBody body, Set imports, S @Override public String toInstantiationType(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return instantiationTypes.get("array") + "<" + getSchemaType(inner) + ">"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustServerCodegen.java index 2f2d9f074863..5688bb06f07a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustServerCodegen.java @@ -981,8 +981,7 @@ public CodegenParameter fromRequestBody(RequestBody body, Set imports, S @Override public String toInstantiationType(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return instantiationTypes.get("array") + "<" + getSchemaType(inner) + ">"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); @@ -1000,21 +999,20 @@ public CodegenModel fromModel(String name, Schema model) { CodegenModel mdl = super.fromModel(name, model); if (ModelUtils.isArraySchema(model)) { - ArraySchema am = (ArraySchema) model; String xmlName = null; // Detect XML list where the inner item is defined directly. - if ((am.getItems() != null) && - (am.getItems().getXml() != null)) { - xmlName = am.getItems().getXml().getName(); + if ((model.getItems() != null) && + (model.getItems().getXml() != null)) { + xmlName = model.getItems().getXml().getName(); } // Detect XML list where the inner item is a reference. - if (am.getXml() != null && am.getXml().getWrapped() && - am.getItems() != null && - !StringUtils.isEmpty(am.getItems().get$ref())) { + if (model.getXml() != null && model.getXml().getWrapped() && + model.getItems() != null && + !StringUtils.isEmpty(model.getItems().get$ref())) { Schema inner_schema = allDefinitions.get( - ModelUtils.getSimpleRef(am.getItems().get$ref())); + ModelUtils.getSimpleRef(model.getItems().get$ref())); if (inner_schema.getXml() != null && inner_schema.getXml().getName() != null) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaAkkaClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaAkkaClientCodegen.java index c1fa721d5f54..ab57ba7091a1 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaAkkaClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaAkkaClientCodegen.java @@ -295,9 +295,8 @@ public String toDefaultValue(Schema p) { String inner = getSchemaType(ModelUtils.getAdditionalProperties(p)); return "Map[String, " + inner + "].empty "; } else if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - String inner = getSchemaType(ap.getItems()); - if (ModelUtils.isSet(ap)) { + String inner = getSchemaType(p.getItems()); + if (ModelUtils.isSet(p)) { return "Set[" + inner + "].empty "; } return "Seq[" + inner + "].empty "; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaFinchServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaFinchServerCodegen.java index 9b68bc73649c..b7d7579f245e 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaFinchServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaFinchServerCodegen.java @@ -261,8 +261,7 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List parameters, @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return getSchemaType(p) + "[" + getTypeDeclaration(inner) + "]"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaHttp4sServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaHttp4sServerCodegen.java index 1b633ac99187..47c95bc0e5e5 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaHttp4sServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaHttp4sServerCodegen.java @@ -711,8 +711,7 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objsI, List" : "[" + getTypeDeclaration(inner) + "]"; } else if (ModelUtils.isMapSchema(p)) { Schema inner = ModelUtils.getAdditionalProperties(p); @@ -794,8 +792,7 @@ public String toInstantiationType(Schema p) { if (ModelUtils.isMapSchema(p)) { return getSchemaType(ModelUtils.getAdditionalProperties(p)); } else if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - String inner = getSchemaType(ap.getItems()); + String inner = getSchemaType(p.getItems()); return ModelUtils.isSet(p) ? "Set<" + inner + ">" : "[" + inner + "]"; } return null; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SwiftCombineClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SwiftCombineClientCodegen.java index fd7e9022f30d..8b8b54b077b3 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SwiftCombineClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SwiftCombineClientCodegen.java @@ -289,7 +289,7 @@ public String getTypeDeclaration(Schema p) { Schema schema = ModelUtils.unaliasSchema(this.openAPI, p, importMapping); Schema target = ModelUtils.isGenerateAliasAsModel() ? p : schema; if (ModelUtils.isArraySchema(target)) { - Schema items = getSchemaItems((ArraySchema) schema); + Schema items = getSchemaItems(schema); return ModelUtils.isSet(target) && ModelUtils.isObjectSchema(items) ? "Set<" + getTypeDeclaration(items) + ">" : "[" + getTypeDeclaration(items) + "]"; } else if (ModelUtils.isMapSchema(target)) { // Note: ModelUtils.isMapSchema(p) returns true when p is a composed schema that also defines @@ -422,8 +422,7 @@ public String toInstantiationType(Schema p) { if (ModelUtils.isMapSchema(p)) { return getSchemaType(ModelUtils.getAdditionalProperties(p)); } else if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - String inner = getSchemaType(ap.getItems()); + String inner = getSchemaType(p.getItems()); return ModelUtils.isSet(p) ? "Set<" + inner + ">" : "[" + inner + "]"; } return null; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptClientCodegen.java index 696bf349ca5f..d1ba1492bc5b 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptClientCodegen.java @@ -482,7 +482,7 @@ private String getHttpLibForFramework(String object) { public String getTypeDeclaration(Schema p) { Schema inner; if (ModelUtils.isArraySchema(p)) { - inner = ((ArraySchema) p).getItems(); + inner = p.getItems(); return this.getSchemaType(p) + "<" + this.getTypeDeclaration(unaliasSchema(inner)) + ">"; } else if (ModelUtils.isMapSchema(p)) { inner = getSchemaAdditionalProperties(p); @@ -787,8 +787,7 @@ private String toExampleValueRecursive(String modelName, Schema schema, Object o } return fullPrefix + example + closeChars; } else if (ModelUtils.isArraySchema(schema)) { - ArraySchema arrayschema = (ArraySchema) schema; - Schema itemSchema = arrayschema.getItems(); + Schema itemSchema = schema.getItems(); String itemModelName = getModelName(itemSchema); if (objExample instanceof Iterable && itemModelName == null) { // If the example is already a list, return it directly instead of wrongly wrap it in another list @@ -919,8 +918,7 @@ private Object exampleFromStringOrArraySchema(Schema sc, Object currentExample, } else if (simpleStringSchema(schema)) { return propName + "_example"; } else if (ModelUtils.isArraySchema(schema)) { - ArraySchema arraySchema = (ArraySchema) schema; - Schema itemSchema = arraySchema.getItems(); + Schema itemSchema = schema.getItems(); example = getObjectExample(itemSchema); if (example != null) { return example; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNodeClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNodeClientCodegen.java index b80b2e9b8b6b..b06331f1364b 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNodeClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNodeClientCodegen.java @@ -337,7 +337,7 @@ protected void addAdditionPropertiesToCodeGenModel(CodegenModel codegenModel, Sc Schema additionalProperties = ModelUtils.getAdditionalProperties(schema); codegenModel.additionalPropertiesType = getSchemaType(additionalProperties); if ("array".equalsIgnoreCase(codegenModel.additionalPropertiesType)) { - codegenModel.additionalPropertiesType += '<' + getSchemaType(((ArraySchema) additionalProperties).getItems()) + '>'; + codegenModel.additionalPropertiesType += '<' + getSchemaType(additionalProperties.getItems()) + '>'; } addImport(codegenModel, codegenModel.additionalPropertiesType); } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/XojoClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/XojoClientCodegen.java index 9359f41d5ee4..cf188041c580 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/XojoClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/XojoClientCodegen.java @@ -235,8 +235,7 @@ private static CodegenModel reconcileProperties(CodegenModel codegenModel, @Override public String getTypeDeclaration(Schema p) { if (ModelUtils.isArraySchema(p)) { - ArraySchema ap = (ArraySchema) p; - Schema inner = ap.getItems(); + Schema inner = p.getItems(); return super.getTypeDeclaration(inner); } return super.getTypeDeclaration(p); 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 e246aecceb99..1b98d3274f14 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 @@ -355,8 +355,8 @@ private static void visitSchema(OpenAPI openAPI, Schema schema, String mimeType, visitSchema(openAPI, s, mimeType, visitedSchemas, visitor); } } - } else if (schema instanceof ArraySchema) { - Schema itemsSchema = ((ArraySchema) schema).getItems(); + } else if (ModelUtils.isArraySchema(schema)) { + Schema itemsSchema = schema.getItems(); if (itemsSchema != null) { visitSchema(openAPI, itemsSchema, mimeType, visitedSchemas, visitor); } @@ -601,7 +601,7 @@ public static boolean isMapSchema(Schema schema) { * @return true if the specified schema is an Array schema. */ public static boolean isArraySchema(Schema schema) { - return (schema instanceof ArraySchema); + return schema instanceof ArraySchema || "array".equals(getSchemaType(schema)); } public static boolean isSet(Schema schema) { @@ -1187,7 +1187,7 @@ public static boolean hasSelfReference(OpenAPI openAPI, } } } else if (isArraySchema(schema)) { - Schema itemsSchema = ((ArraySchema) schema).getItems(); + Schema itemsSchema = schema.getItems(); if (itemsSchema != null) { return hasSelfReference(openAPI, itemsSchema, visitedSchemaNames); } 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 e3d026d447a7..9f3d75552eec 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 @@ -823,6 +823,43 @@ public void testTypedAndNonTypedComposedSchemaGeneration_3_1() throws IOExceptio files.forEach(File::deleteOnExit); } + + @Test + public void testOkHttpGsonGeneration_3_1() throws IOException { + File output = Files.createTempDirectory("test").toFile(); + output.deleteOnExit(); + + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName("java") + .setLibrary(JavaClientCodegen.OKHTTP_GSON) + .setValidateSpec(false) + .setInputSpec("src/test/resources/3_1/java/petstore.yaml") + .setTemplateDir("src/main/resources/Java") + .addNameMapping("underscoreType", "typeWithUnderscore") + .addParameterNameMapping("underscoreType", "typeWithUnderscore") + .addAdditionalProperty("artifactId", "petstore-okhttp-gson-31") + .addAdditionalProperty("hideGenerationTimestamp", "true") + .addAdditionalProperty("useOfDiscriminatorLookup", "true") + .addAdditionalProperty("disallowAdditionalPropertiesIfNotPresent", "false") + .setOutputDir(output.getAbsolutePath().replace("\\", "/")); + + final ClientOptInput clientOptInput = configurator.toClientOptInput(); + + DefaultGenerator generator = new DefaultGenerator(); + generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); + generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); + generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); + generator.setGenerateMetadata(false); + List files = generator.opts(clientOptInput).generate(); + + validateJavaSourceFiles(files); + + Assert.assertEquals(files.size(), 9); + files.forEach(File::deleteOnExit); + } + @Test public void testMultiPartSpecifiesFileName_Issue17367() throws IOException { File output = Files.createTempDirectory("test").toFile(); From 1eb31d700cf16ffcbb4a94ad00d39a5e5daeec97 Mon Sep 17 00:00:00 2001 From: Georgi Getsov Date: Wed, 6 Mar 2024 23:41:15 +0000 Subject: [PATCH 5/5] Removed accidentally commited test and regenerated samples --- .../codegen/utils/ModelUtils.java | 3 + .../codegen/java/JavaClientCodegenTest.java | 37 ---- .../java/okhttp-gson-3.1/api/openapi.yaml | 12 -- .../openapitools/client/model/AnyOfArray.java | 180 +++++++++++++++--- .../App/DTO/FindPetsByStatusParameterData.php | 4 +- .../App/DTO/FindPetsByTagsParameterData.php | 4 +- .../App/DTO/FindPetsByStatusParameterData.php | 4 +- .../App/DTO/FindPetsByTagsParameterData.php | 4 +- 8 files changed, 162 insertions(+), 86 deletions(-) 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 1b98d3274f14..380d26d2ee1c 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 @@ -415,6 +415,9 @@ public static String getSimpleRef(String ref) { * @return the type of the specified schema */ public static String getSchemaType(Schema schema) { + if (schema == null) { + return null; + } if (schema.getType() != null) { // 3.0.x or 2.0 spec return schema.getType(); 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 9f3d75552eec..e3d026d447a7 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 @@ -823,43 +823,6 @@ public void testTypedAndNonTypedComposedSchemaGeneration_3_1() throws IOExceptio files.forEach(File::deleteOnExit); } - - @Test - public void testOkHttpGsonGeneration_3_1() throws IOException { - File output = Files.createTempDirectory("test").toFile(); - output.deleteOnExit(); - - final CodegenConfigurator configurator = new CodegenConfigurator() - .setGeneratorName("java") - .setLibrary(JavaClientCodegen.OKHTTP_GSON) - .setValidateSpec(false) - .setInputSpec("src/test/resources/3_1/java/petstore.yaml") - .setTemplateDir("src/main/resources/Java") - .addNameMapping("underscoreType", "typeWithUnderscore") - .addParameterNameMapping("underscoreType", "typeWithUnderscore") - .addAdditionalProperty("artifactId", "petstore-okhttp-gson-31") - .addAdditionalProperty("hideGenerationTimestamp", "true") - .addAdditionalProperty("useOfDiscriminatorLookup", "true") - .addAdditionalProperty("disallowAdditionalPropertiesIfNotPresent", "false") - .setOutputDir(output.getAbsolutePath().replace("\\", "/")); - - final ClientOptInput clientOptInput = configurator.toClientOptInput(); - - DefaultGenerator generator = new DefaultGenerator(); - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - generator.setGenerateMetadata(false); - List files = generator.opts(clientOptInput).generate(); - - validateJavaSourceFiles(files); - - Assert.assertEquals(files.size(), 9); - files.forEach(File::deleteOnExit); - } - @Test public void testMultiPartSpecifiesFileName_Issue17367() throws IOException { File output = Files.createTempDirectory("test").toFile(); diff --git a/samples/client/petstore/java/okhttp-gson-3.1/api/openapi.yaml b/samples/client/petstore/java/okhttp-gson-3.1/api/openapi.yaml index 945179fde677..5929b0d7a667 100644 --- a/samples/client/petstore/java/okhttp-gson-3.1/api/openapi.yaml +++ b/samples/client/petstore/java/okhttp-gson-3.1/api/openapi.yaml @@ -99,7 +99,6 @@ paths: - pending - sold type: string - type: array style: form responses: "200": @@ -108,12 +107,10 @@ paths: schema: items: $ref: '#/components/schemas/Pet' - type: array application/json: schema: items: $ref: '#/components/schemas/Pet' - type: array description: successful operation "400": description: Invalid status value @@ -139,7 +136,6 @@ paths: schema: items: type: string - type: array style: form responses: "200": @@ -148,12 +144,10 @@ paths: schema: items: $ref: '#/components/schemas/Pet' - type: array application/json: schema: items: $ref: '#/components/schemas/Pet' - type: array description: successful operation "400": description: Invalid tag value @@ -714,7 +708,6 @@ components: schema: items: $ref: '#/components/schemas/User' - type: array description: List of user object required: true Pet: @@ -868,14 +861,12 @@ components: photoUrls: items: type: string - type: array xml: name: photoUrl wrapped: true tags: items: $ref: '#/components/schemas/Tag' - type: array xml: name: tag wrapped: true @@ -945,7 +936,6 @@ components: description: test array in 3.1 spec items: type: string - type: array ref_array_prefix_items: description: | An item that was added to the queue. @@ -954,7 +944,6 @@ components: type: string maxItems: 5 minItems: 3 - type: array HTTPValidationError: properties: {} title: HTTPValidationError @@ -973,7 +962,6 @@ components: type: string maxItems: 5 minItems: 3 - type: array updatePetWithForm_request: properties: name: diff --git a/samples/client/petstore/java/okhttp-gson-3.1/src/main/java/org/openapitools/client/model/AnyOfArray.java b/samples/client/petstore/java/okhttp-gson-3.1/src/main/java/org/openapitools/client/model/AnyOfArray.java index 8064214a2bca..91f0c5f4514d 100644 --- a/samples/client/petstore/java/okhttp-gson-3.1/src/main/java/org/openapitools/client/model/AnyOfArray.java +++ b/samples/client/petstore/java/okhttp-gson-3.1/src/main/java/org/openapitools/client/model/AnyOfArray.java @@ -14,7 +14,6 @@ package org.openapitools.client.model; import java.util.Objects; -import java.util.List; @@ -63,7 +62,12 @@ public TypeAdapter create(Gson gson, TypeToken type) { return null; // this class only serializes 'AnyOfArray' and its subtypes } final TypeAdapter elementAdapter = gson.getAdapter(JsonElement.class); - final TypeAdapter adapterList = gson.getDelegateAdapter(this, TypeToken.get(List.class)); + + final Type typeInstance = new TypeToken>(){}.getType(); + final TypeAdapter> adapterList = (TypeAdapter>) gson.getDelegateAdapter(this, TypeToken.get(typeInstance)); + + final Type typeInstance = new TypeToken>(){}.getType(); + final TypeAdapter> adapterList = (TypeAdapter>) gson.getDelegateAdapter(this, TypeToken.get(typeInstance)); return (TypeAdapter) new TypeAdapter() { @Override @@ -73,13 +77,31 @@ public void write(JsonWriter out, AnyOfArray value) throws IOException { return; } - // check if the actual instance is of the type `List` - if (value.getActualInstance() instanceof List) { - JsonElement element = adapterList.toJsonTree((List)value.getActualInstance()); - elementAdapter.write(out, element); + // check if the actual instance is of the type `List` + if (value.getActualInstance() instanceof List) { + JsonPrimitive primitive = adapterList.toJsonTree((List)value.getActualInstance()).getAsJsonPrimitive(); + elementAdapter.write(out, primitive); return; + List list = (List) value.getActualInstance(); + if(list.get(0) instanceof ) { + JsonArray array = adapterList.toJsonTree((List)value.getActualInstance()).getAsJsonArray(); + elementAdapter.write(out, array); + return; + } } - throw new IOException("Failed to serialize as the type doesn't match anyOf schemae: List"); + // check if the actual instance is of the type `List` + if (value.getActualInstance() instanceof List) { + JsonPrimitive primitive = adapterList.toJsonTree((List)value.getActualInstance()).getAsJsonPrimitive(); + elementAdapter.write(out, primitive); + return; + List list = (List) value.getActualInstance(); + if(list.get(0) instanceof ) { + JsonArray array = adapterList.toJsonTree((List)value.getActualInstance()).getAsJsonArray(); + elementAdapter.write(out, array); + return; + } + } + throw new IOException("Failed to serialize as the type doesn't match anyOf schemae: List, List"); } @Override @@ -90,18 +112,59 @@ public AnyOfArray read(JsonReader in) throws IOException { ArrayList errorMessages = new ArrayList<>(); TypeAdapter actualAdapter = elementAdapter; - // deserialize List + // deserialize List + try { + // validate the JSON object to see if any exception is thrown + if(!jsonElement.getAsJsonPrimitive().isNumber()) { + throw new IllegalArgumentException(String.format("Expected json element to be of type Number in the JSON string but got `%s`", jsonElement.toString())); + } + actualAdapter = adapterList; + if (!jsonElement.isJsonArray()) { + throw new IllegalArgumentException(String.format("Expected json element to be a array type in the JSON string but got `%s`", jsonElement.toString())); + } + + JsonArray array = jsonElement.getAsJsonArray(); + // validate array items + for(JsonElement element : array) { + if(!element.getAsJsonPrimitive().isString()) { + throw new IllegalArgumentException(String.format("Expected array items to be of type String in the JSON string but got `%s`", jsonElement.toString())); + } + } + actualAdapter = adapterList; + AnyOfArray ret = new AnyOfArray(); + ret.setActualInstance(actualAdapter.fromJsonTree(jsonElement)); + return ret; + } catch (Exception e) { + // deserialization failed, continue + errorMessages.add(String.format("Deserialization for List failed with `%s`.", e.getMessage())); + log.log(Level.FINER, "Input data does not match schema 'List'", e); + } + // deserialize List try { // validate the JSON object to see if any exception is thrown - List.validateJsonElement(jsonElement); + if(!jsonElement.getAsJsonPrimitive().isNumber()) { + throw new IllegalArgumentException(String.format("Expected json element to be of type Number in the JSON string but got `%s`", jsonElement.toString())); + } + actualAdapter = adapterList; + if (!jsonElement.isJsonArray()) { + throw new IllegalArgumentException(String.format("Expected json element to be a array type in the JSON string but got `%s`", jsonElement.toString())); + } + + JsonArray array = jsonElement.getAsJsonArray(); + // validate array items + for(JsonElement element : array) { + if(!element.getAsJsonPrimitive().isNumber()) { + throw new IllegalArgumentException(String.format("Expected array items to be of type Number in the JSON string but got `%s`", jsonElement.toString())); + } + } actualAdapter = adapterList; AnyOfArray ret = new AnyOfArray(); ret.setActualInstance(actualAdapter.fromJsonTree(jsonElement)); return ret; } catch (Exception e) { // deserialization failed, continue - errorMessages.add(String.format("Deserialization for List failed with `%s`.", e.getMessage())); - log.log(Level.FINER, "Input data does not match schema 'List'", e); + errorMessages.add(String.format("Deserialization for List failed with `%s`.", e.getMessage())); + log.log(Level.FINER, "Input data does not match schema 'List'", e); } throw new IOException(String.format("Failed deserialization for AnyOfArray: no class matches result, expected at least 1. Detailed failure message for anyOf schemas: %s. JSON: %s", errorMessages, jsonElement.toString())); @@ -117,13 +180,19 @@ public AnyOfArray() { super("anyOf", Boolean.FALSE); } - public AnyOfArray(List o) { + public AnyOfArray(List o) { + super("anyOf", Boolean.FALSE); + setActualInstance(o); + } + + public AnyOfArray(List o) { super("anyOf", Boolean.FALSE); setActualInstance(o); } static { - schemas.put("List", List.class); + schemas.put("List", List.class); + schemas.put("List", List.class); } @Override @@ -134,25 +203,36 @@ public Map> getSchemas() { /** * Set the instance that matches the anyOf child schema, check * the instance parameter is valid against the anyOf child schemas: - * List + * List, List * * It could be an instance of the 'anyOf' schemas. */ @Override public void setActualInstance(Object instance) { - if (instance instanceof List) { - super.setActualInstance(instance); - return; + if (instance instanceof List) { + List list = (List) instance; + if(list.get(0) instanceof ) { + super.setActualInstance(instance); + return; + } } - throw new RuntimeException("Invalid instance type. Must be List"); + if (instance instanceof List) { + List list = (List) instance; + if(list.get(0) instanceof ) { + super.setActualInstance(instance); + return; + } + } + + throw new RuntimeException("Invalid instance type. Must be List, List"); } /** * Get the actual instance, which can be the following: - * List + * List, List * - * @return The actual instance (List) + * @return The actual instance (List, List) */ @Override public Object getActualInstance() { @@ -160,14 +240,24 @@ public Object getActualInstance() { } /** - * Get the actual instance of `List`. If the actual instance is not `List`, + * Get the actual instance of `List`. If the actual instance is not `List`, + * the ClassCastException will be thrown. + * + * @return The actual instance of `List` + * @throws ClassCastException if the instance is not `List` + */ + public List getList() throws ClassCastException { + return (List)super.getActualInstance(); + } + /** + * Get the actual instance of `List`. If the actual instance is not `List`, * the ClassCastException will be thrown. * - * @return The actual instance of `List` - * @throws ClassCastException if the instance is not `List` + * @return The actual instance of `List` + * @throws ClassCastException if the instance is not `List` */ - public List getList() throws ClassCastException { - return (List)super.getActualInstance(); + public List getList() throws ClassCastException { + return (List)super.getActualInstance(); } /** @@ -179,15 +269,47 @@ public List getList() throws ClassCastException { public static void validateJsonElement(JsonElement jsonElement) throws IOException { // validate anyOf schemas one by one ArrayList errorMessages = new ArrayList<>(); - // validate the json string with List + // validate the json string with List try { - List.validateJsonElement(jsonElement); + if(!jsonElement.getAsJsonPrimitive().isNumber()) { + throw new IllegalArgumentException(String.format("Expected json element to be of type Number in the JSON string but got `%s`", jsonElement.toString())); + } + if (!jsonElement.isJsonArray()) { + throw new IllegalArgumentException(String.format("Expected json element to be a array type in the JSON string but got `%s`", jsonElement.toString())); + } + JsonArray array = jsonElement.getAsJsonArray(); + // validate array items + for(JsonElement element : array) { + if(!element.getAsJsonPrimitive().isString()) { + throw new IllegalArgumentException(String.format("Expected array items to be of type String in the JSON string but got `%s`", jsonElement.toString())); + } + } + return; + } catch (Exception e) { + errorMessages.add(String.format("Deserialization for List failed with `%s`.", e.getMessage())); + // continue to the next one + } + // validate the json string with List + try { + if(!jsonElement.getAsJsonPrimitive().isNumber()) { + throw new IllegalArgumentException(String.format("Expected json element to be of type Number in the JSON string but got `%s`", jsonElement.toString())); + } + if (!jsonElement.isJsonArray()) { + throw new IllegalArgumentException(String.format("Expected json element to be a array type in the JSON string but got `%s`", jsonElement.toString())); + } + JsonArray array = jsonElement.getAsJsonArray(); + // validate array items + for(JsonElement element : array) { + if(!element.getAsJsonPrimitive().isNumber()) { + throw new IllegalArgumentException(String.format("Expected array items to be of type Number in the JSON string but got `%s`", jsonElement.toString())); + } + } return; } catch (Exception e) { - errorMessages.add(String.format("Deserialization for List failed with `%s`.", e.getMessage())); + errorMessages.add(String.format("Deserialization for List failed with `%s`.", e.getMessage())); // continue to the next one } - throw new IOException(String.format("The JSON string is invalid for AnyOfArray with anyOf schemas: List. no class match the result, expected at least 1. Detailed failure message for anyOf schemas: %s. JSON: %s", errorMessages, jsonElement.toString())); + throw new IOException(String.format("The JSON string is invalid for AnyOfArray with anyOf schemas: List, List. no class match the result, expected at least 1. Detailed failure message for anyOf schemas: %s. JSON: %s", errorMessages, jsonElement.toString())); } diff --git a/samples/client/petstore/php-dt-modern/src/App/DTO/FindPetsByStatusParameterData.php b/samples/client/petstore/php-dt-modern/src/App/DTO/FindPetsByStatusParameterData.php index 857a59ed71a4..3d4c07a7b941 100644 --- a/samples/client/petstore/php-dt-modern/src/App/DTO/FindPetsByStatusParameterData.php +++ b/samples/client/petstore/php-dt-modern/src/App/DTO/FindPetsByStatusParameterData.php @@ -14,8 +14,8 @@ class FindPetsByStatusParameterData * Status values that need to be considered for filter */ #[DTA\Data(subset: "query", field: "status")] - #[DTA\Strategy("QueryStringScalarArray", ["type" => "string", "format" => "csv"], "query")] - #[DTA\Validator("QueryStringScalarArray", ["type" => "string", "format" => "csv"], subset: "query")] + #[DTA\Strategy("QueryStringScalarArray", ["type" => \App\DTO\Collection2::class, "format" => "csv"], "query")] + #[DTA\Validator("QueryStringScalarArray", ["type" => \App\DTO\Collection2::class, "format" => "csv"], subset: "query")] public array|null $status = null; } diff --git a/samples/client/petstore/php-dt-modern/src/App/DTO/FindPetsByTagsParameterData.php b/samples/client/petstore/php-dt-modern/src/App/DTO/FindPetsByTagsParameterData.php index 7a8f0690b903..7731497027ce 100644 --- a/samples/client/petstore/php-dt-modern/src/App/DTO/FindPetsByTagsParameterData.php +++ b/samples/client/petstore/php-dt-modern/src/App/DTO/FindPetsByTagsParameterData.php @@ -14,8 +14,8 @@ class FindPetsByTagsParameterData * Tags to filter by */ #[DTA\Data(subset: "query", field: "tags")] - #[DTA\Strategy("QueryStringScalarArray", ["type" => "string", "format" => "csv"], "query")] - #[DTA\Validator("QueryStringScalarArray", ["type" => "string", "format" => "csv"], subset: "query")] + #[DTA\Strategy("QueryStringScalarArray", ["type" => \App\DTO\Collection5::class, "format" => "csv"], "query")] + #[DTA\Validator("QueryStringScalarArray", ["type" => \App\DTO\Collection5::class, "format" => "csv"], subset: "query")] public array|null $tags = null; } diff --git a/samples/client/petstore/php-dt/src/App/DTO/FindPetsByStatusParameterData.php b/samples/client/petstore/php-dt/src/App/DTO/FindPetsByStatusParameterData.php index 4302e9206099..8f33de4a512f 100644 --- a/samples/client/petstore/php-dt/src/App/DTO/FindPetsByStatusParameterData.php +++ b/samples/client/petstore/php-dt/src/App/DTO/FindPetsByStatusParameterData.php @@ -13,8 +13,8 @@ class FindPetsByStatusParameterData /** * Status values that need to be considered for filter * @DTA\Data(subset="query", field="status") - * @DTA\Strategy(subset="query", name="QueryStringScalarArray", options={"type":"string", "format":"csv"}) - * @DTA\Validator(subset="query", name="QueryStringScalarArray", options={"type":"string", "format":"csv"}) + * @DTA\Strategy(subset="query", name="QueryStringScalarArray", options={"type":\App\DTO\Collection2::class, "format":"csv"}) + * @DTA\Validator(subset="query", name="QueryStringScalarArray", options={"type":\App\DTO\Collection2::class, "format":"csv"}) */ public ?array $status = null; diff --git a/samples/client/petstore/php-dt/src/App/DTO/FindPetsByTagsParameterData.php b/samples/client/petstore/php-dt/src/App/DTO/FindPetsByTagsParameterData.php index 9ef0df593ec1..0e6d5e8f6fa2 100644 --- a/samples/client/petstore/php-dt/src/App/DTO/FindPetsByTagsParameterData.php +++ b/samples/client/petstore/php-dt/src/App/DTO/FindPetsByTagsParameterData.php @@ -13,8 +13,8 @@ class FindPetsByTagsParameterData /** * Tags to filter by * @DTA\Data(subset="query", field="tags") - * @DTA\Strategy(subset="query", name="QueryStringScalarArray", options={"type":"string", "format":"csv"}) - * @DTA\Validator(subset="query", name="QueryStringScalarArray", options={"type":"string", "format":"csv"}) + * @DTA\Strategy(subset="query", name="QueryStringScalarArray", options={"type":\App\DTO\Collection5::class, "format":"csv"}) + * @DTA\Validator(subset="query", name="QueryStringScalarArray", options={"type":\App\DTO\Collection5::class, "format":"csv"}) */ public ?array $tags = null;