From 02536bcb98321b8ca40fdd6e57727effe0d3fb0f Mon Sep 17 00:00:00 2001 From: William Cheng Date: Fri, 21 Dec 2018 21:44:22 +0800 Subject: [PATCH 1/2] add option to generate alias as model --- .../openapitools/codegen/cmd/Generate.java | 7 ++++++ .../openapitools/codegen/CodegenConfig.java | 6 ++--- .../codegen/CodegenConstants.java | 3 +++ .../openapitools/codegen/DefaultCodegen.java | 5 ++++ .../codegen/DefaultGenerator.java | 4 ++-- .../codegen/config/CodegenConfigurator.java | 9 +++++++ .../codegen/utils/ModelUtils.java | 24 ++++++++++++++++--- 7 files changed, 50 insertions(+), 8 deletions(-) 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 c66cce4b4f69..15e06109e04e 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 @@ -283,4 +283,7 @@ public static enum ENUM_PROPERTY_NAMING_TYPE {camelCase, PascalCase, snake_case, public static final String ENABLE_POST_PROCESS_FILE_DESC = "Enable post-processing file using environment variables."; 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"; } \ 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 17c1756d9ee2..55b8ac9bb5f3 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 e2febb05e54c..ada90c66e9be 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 @@ -432,7 +432,7 @@ private Model getParent(Model model) { // check to see if it's a "map" model if (ModelUtils.isMapSchema(schema)) { - 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; @@ -441,7 +441,7 @@ private Model getParent(Model model) { // check to see if it's an "array" model if (ModelUtils.isArraySchema(schema)) { - 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 From cd133378a016a5626e6d1d67673c3a17edd07fc1 Mon Sep 17 00:00:00 2001 From: William Cheng Date: Wed, 26 Dec 2018 17:06:35 +0800 Subject: [PATCH 2/2] fix issue due to incorrect merge --- .../main/java/org/openapitools/codegen/DefaultGenerator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 4c6a5e54b7b3..cf3be9dbe41d 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 (!ModelUtils.isGenerateAliasAsModel() && 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 (!ModelUtils.isGenerateAliasAsModel() && 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;