From e4f80dcc0e02de83227741dd5faa28e3fe860d79 Mon Sep 17 00:00:00 2001 From: William Cheng Date: Wed, 26 Dec 2018 10:38:07 +0800 Subject: [PATCH] various fix for free-form object (#1751) --- .../openapitools/codegen/DefaultCodegen.java | 34 +++++++++++++++---- .../codegen/DefaultGenerator.java | 13 ++++--- 2 files changed, 34 insertions(+), 13 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 d4728dea6d3..d2becf1e669 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 @@ -1418,17 +1418,19 @@ public class DefaultCodegen implements CodegenConfig { } } - if (StringUtils.isNotBlank(schema.get$ref())) { // reference to another definition/schema + Schema unaliasSchema = ModelUtils.unaliasSchema(globalSchemas, schema); + + if (StringUtils.isNotBlank(unaliasSchema.get$ref())) { // reference to another definition/schema // get the schema/model name from $ref - String schemaName = ModelUtils.getSimpleRef(schema.get$ref()); + String schemaName = ModelUtils.getSimpleRef(unaliasSchema.get$ref()); if (StringUtils.isNotEmpty(schemaName)) { return getAlias(schemaName); } else { - LOGGER.warn("Error obtaining the datatype from ref:" + schema.get$ref() + ". Default to 'object'"); + LOGGER.warn("Error obtaining the datatype from ref:" + unaliasSchema.get$ref() + ". Default to 'object'"); return "object"; } } else { // primitive type or model - return getAlias(getPrimitiveType(schema)); + return getAlias(getPrimitiveType(unaliasSchema)); } } @@ -2115,6 +2117,8 @@ public class DefaultCodegen implements CodegenConfig { allowableValues.put("values", _enum); property.allowableValues = allowableValues; } + } else if (ModelUtils.isFreeFormObject(p)){ + property.isFreeFormObject = true; } property.dataType = getTypeDeclaration(p); @@ -2918,7 +2922,7 @@ public class DefaultCodegen implements CodegenConfig { } if (parameter.getSchema() != null) { - Schema parameterSchema = parameter.getSchema(); + Schema parameterSchema = ModelUtils.unaliasSchema(globalSchemas, parameter.getSchema()); if (parameterSchema == null) { LOGGER.warn("warning! Schema not found for parameter \"" + parameter.getName() + "\", using String"); parameterSchema = new StringSchema().description("//TODO automatically added by openapi-generator due to missing type definition."); @@ -2992,7 +2996,6 @@ public class DefaultCodegen implements CodegenConfig { // set boolean flag (e.g. isString) setParameterBooleanFlagWithCodegenProperty(codegenParameter, codegenProperty); - String parameterDataType = this.getParameterDataType(parameter, parameterSchema); if (parameterDataType != null) { codegenParameter.dataType = parameterDataType; @@ -4635,6 +4638,25 @@ public class DefaultCodegen implements CodegenConfig { codegenProperty = codegenProperty.items; } + } else if (ModelUtils.isFreeFormObject(schema)) { + // HTTP request body is free form object + CodegenProperty codegenProperty = fromProperty("FREE_FORM_REQUEST_BODY", schema); + if (codegenProperty != null) { + if (StringUtils.isEmpty(bodyParameterName)) { + codegenParameter.baseName = "body"; // default to body + } else { + codegenParameter.baseName = bodyParameterName; + } + codegenParameter.isPrimitiveType = true; + codegenParameter.baseType = codegenProperty.baseType; + codegenParameter.dataType = codegenProperty.dataType; + codegenParameter.description = codegenProperty.description; + codegenParameter.paramName = toParamName(codegenParameter.baseName); + } + setParameterBooleanFlagWithCodegenProperty(codegenParameter, codegenProperty); + // set nullable + setParameterNullable(codegenParameter, codegenProperty); + } else if (ModelUtils.isObjectSchema(schema) || ModelUtils.isComposedSchema(schema)) { CodegenModel codegenModel = null; if (StringUtils.isNotBlank(name)) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java index e2febb05e54..d309f86d21e 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java @@ -430,17 +430,16 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { Schema schema = schemas.get(name); - // check to see if it's a "map" model - if (ModelUtils.isMapSchema(schema)) { + if (ModelUtils.isFreeFormObject(schema)) { // check to see if it'a a free-form object + LOGGER.info("Model " + name + " not generated since it's a free-form object"); + continue; + } else if (ModelUtils.isMapSchema(schema)) { // check to see if it's a "map" model if (schema.getProperties() == null || schema.getProperties().isEmpty()) { // schema without property, i.e. alias to map LOGGER.info("Model " + name + " not generated since it's an alias to map (without property)"); continue; } - } - - // check to see if it's an "array" model - if (ModelUtils.isArraySchema(schema)) { + } else if (ModelUtils.isArraySchema(schema)) { // check to see if it's an "array" model if (schema.getProperties() == null || schema.getProperties().isEmpty()) { // schema without property, i.e. alias to array LOGGER.info("Model " + name + " not generated since it's an alias to array (without property)"); @@ -898,7 +897,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { Map bundle = buildSupportFileBundle(allOperations, allModels); generateSupportingFiles(files, bundle); config.processOpenAPI(openAPI); - + // reset GeneratorProperties, so that the running thread can be reused for another generator-run GeneratorProperties.reset();