diff --git a/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/Generate.java b/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/Generate.java index f12bbb06db5d..a4a2e8c990f0 100644 --- a/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/Generate.java +++ b/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/Generate.java @@ -208,6 +208,9 @@ public class Generate implements Runnable { @Option(name = {"--enable-post-process-file"}, title = "enable post-process file", description = CodegenConstants.ENABLE_POST_PROCESS_FILE) private Boolean enablePostProcessFile; + @Option(name = {"--generate-alias-as-model"}, title = "generate alias (array, map) as model", description = CodegenConstants.GENERATE_ALIAS_AS_MODEL_DESC) + private Boolean generateAliasAsModel; + @Override public void run() { if (logToStderr != null) { @@ -334,6 +337,10 @@ public void run() { configurator.setEnablePostProcessFile(enablePostProcessFile); } + if (generateAliasAsModel != null) { + configurator.setGenerateAliasAsModel(generateAliasAsModel); + } + applySystemPropertiesKvpList(systemProperties, configurator); applyInstantiationTypesKvpList(instantiationTypes, configurator); applyImportMappingsKvpList(importMappings, configurator); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java index 694377a1d83e..1da4126e7e3b 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java @@ -262,11 +262,11 @@ public interface CodegenConfig { boolean isEnablePostProcessFile(); - public void setEnablePostProcessFile(boolean isEnablePostProcessFile); + void setEnablePostProcessFile(boolean isEnablePostProcessFile); // set OpenAPI and schemas - public void setGlobalOpenAPI(OpenAPI openAPI); + void setGlobalOpenAPI(OpenAPI openAPI); - public void setGlobalSchemas(OpenAPI openAPI); + void setGlobalSchemas(OpenAPI openAPI); } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java index 7de5eb75a253..21f921fc6551 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java @@ -284,6 +284,9 @@ public static enum ENUM_PROPERTY_NAMING_TYPE {camelCase, PascalCase, snake_case, public static final String OPEN_API_SPEC_NAME = "openAPISpecName"; + public static final String GENERATE_ALIAS_AS_MODEL = "generateAliasAsModel"; + public static final String GENERATE_ALIAS_AS_MODEL_DESC = "Generate alias to map, array as models"; + public static final String USE_COMPARE_NET_OBJECTS = "useCompareNetObjects"; public static final String USE_COMPARE_NET_OBJECTS_DESC = "Use KellermanSoftware.CompareNetObjects for deep recursive object comparison. WARNING: this option incurs potential performance impact."; } \ No newline at end of file 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 32a16ec7f60e..c43a840e497d 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 @@ -209,6 +209,11 @@ public void processOpts() { this.setEnablePostProcessFile(Boolean.valueOf(additionalProperties .get(CodegenConstants.ENABLE_POST_PROCESS_FILE).toString())); } + + if (additionalProperties.containsKey(CodegenConstants.GENERATE_ALIAS_AS_MODEL)) { + ModelUtils.setGenerateAliasAsModel(Boolean.valueOf(additionalProperties + .get(CodegenConstants.GENERATE_ALIAS_AS_MODEL).toString())); + } } // override with any special post-processing for all models 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 36d759d9e6c5..d5a0334c53b4 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 @@ -434,13 +434,13 @@ private Model getParent(Model model) { 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()) { + if (!ModelUtils.isGenerateAliasAsModel() && (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; } } else if (ModelUtils.isArraySchema(schema)) { // check to see if it's an "array" model - if (schema.getProperties() == null || schema.getProperties().isEmpty()) { + if (!ModelUtils.isGenerateAliasAsModel() && (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)"); continue; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java index 071f7adb87ea..79176e84c6bd 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java @@ -220,6 +220,15 @@ public CodegenConfigurator setEnablePostProcessFile(boolean enablePostProcessFil return this; } + public boolean isGenerateAliasAsModel() { + return ModelUtils.isGenerateAliasAsModel(); + } + + public CodegenConfigurator setGenerateAliasAsModel(boolean generateAliasAsModel) { + ModelUtils.setGenerateAliasAsModel(generateAliasAsModel); + return this; + } + public String getModelNameSuffix() { return modelNameSuffix; } 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 73957e2cacb9..ba84394916be 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 @@ -61,6 +61,16 @@ public class ModelUtils { private static final Logger LOGGER = LoggerFactory.getLogger(ModelUtils.class); + private static boolean generateAliasAsModel = false; + + public static void setGenerateAliasAsModel(boolean value) { + generateAliasAsModel = value; + } + + public static boolean isGenerateAliasAsModel() { + return generateAliasAsModel; + } + /** * Searches for the model by name in the map of models and returns it @@ -769,15 +779,23 @@ public static Schema unaliasSchema(Map allSchemas, Schema schema // top-level enum class return schema; } else if (isArraySchema(ref)) { - return unaliasSchema(allSchemas, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref()))); + if (generateAliasAsModel) { + return schema; // generate a model extending array + } else { + return unaliasSchema(allSchemas, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref()))); + } } else if (isComposedSchema(ref)) { return schema; } else if (isMapSchema(ref)) { if (ref.getProperties() != null && !ref.getProperties().isEmpty()) // has at least one property return schema; // treat it as model else { - // treat it as a typical map - return unaliasSchema(allSchemas, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref()))); + if (generateAliasAsModel) { + return schema; // generate a model extending map + } else { + // treat it as a typical map + return unaliasSchema(allSchemas, allSchemas.get(ModelUtils.getSimpleRef(schema.get$ref()))); + } } } else if (isObjectSchema(ref)) { // model if (ref.getProperties() != null && !ref.getProperties().isEmpty()) { // has at least one property