From 1a67f452e2bffc92fa9fcbedbdbae199d6604d58 Mon Sep 17 00:00:00 2001 From: xhh Date: Wed, 4 Nov 2015 20:51:56 +0800 Subject: [PATCH] Make parameters unique in generated code through a config option "ensureUniqueParams" which is false by default Closes #1422 --- .../io/swagger/codegen/CodegenConstants.java | 3 ++ .../io/swagger/codegen/DefaultCodegen.java | 46 ++++++++++++++++++- .../codegen/languages/JavaClientCodegen.java | 1 + .../codegen/languages/RubyClientCodegen.java | 12 ++++- .../src/main/resources/Java/api.mustache | 2 +- .../java/io/swagger/client/api/PetApi.java | 4 +- 6 files changed, 63 insertions(+), 5 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java index 2e53ab427970..684eea14fc58 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java @@ -40,6 +40,9 @@ public class CodegenConstants { public static final String SORT_PARAMS_BY_REQUIRED_FLAG = "sortParamsByRequiredFlag"; public static final String SORT_PARAMS_BY_REQUIRED_FLAG_DESC = "Sort method arguments to place required parameters before optional parameters. Default: true"; + public static final String ENSURE_UNIQUE_PARAMS = "ensureUniqueParams"; + public static final String ENSURE_UNIQUE_PARAMS_DESC = "Whether to ensure parameter names are unique in an operation (rename parameters that are not). Default: false"; + public static final String PACKAGE_NAME = "packageName"; public static final String PACKAGE_VERSION = "packageVersion"; public static final String POD_VERSION = "podVersion"; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index 7fa3d1883b62..4aa5af77fc76 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -87,6 +87,7 @@ public class DefaultCodegen { protected Map supportedLibraries = new LinkedHashMap(); protected String library = null; protected Boolean sortParamsByRequiredFlag = true; + protected Boolean ensureUniqueParams = false; public List cliOptions() { return cliOptions; @@ -109,6 +110,11 @@ public class DefaultCodegen { this.setSortParamsByRequiredFlag(Boolean.valueOf(additionalProperties .get(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG).toString())); } + + if (additionalProperties.containsKey(CodegenConstants.ENSURE_UNIQUE_PARAMS)) { + this.setEnsureUniqueParams(Boolean.valueOf(additionalProperties + .get(CodegenConstants.ENSURE_UNIQUE_PARAMS).toString())); + } } // override with any special post-processing @@ -245,6 +251,10 @@ public class DefaultCodegen { this.sortParamsByRequiredFlag = sortParamsByRequiredFlag; } + public void setEnsureUniqueParams(Boolean ensureUniqueParams) { + this.ensureUniqueParams = ensureUniqueParams; + } + /** * Return the file name of the Api * @@ -436,6 +446,7 @@ public class DefaultCodegen { cliOptions.add(new CliOption(CodegenConstants.MODEL_PACKAGE, CodegenConstants.MODEL_PACKAGE_DESC)); cliOptions.add(new CliOption(CodegenConstants.API_PACKAGE, CodegenConstants.API_PACKAGE_DESC)); cliOptions.add(new CliOption(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC)); + cliOptions.add(new CliOption(CodegenConstants.ENSURE_UNIQUE_PARAMS, CodegenConstants.ENSURE_UNIQUE_PARAMS_DESC)); } /** @@ -1245,6 +1256,23 @@ public class DefaultCodegen { if (parameters != null) { for (Parameter param : parameters) { CodegenParameter p = fromParameter(param, imports); + // rename parameters to make sure all of them have unique names + if (ensureUniqueParams) { + while (true) { + boolean exists = false; + for (CodegenParameter cp : allParams) { + if (p.paramName.equals(cp.paramName)) { + exists = true; + break; + } + } + if (exists) { + p.paramName = generateNextName(p.paramName); + } else { + break; + } + } + } allParams.add(p); if (param instanceof QueryParameter) { p.isQueryParam = new Boolean(true); @@ -1283,7 +1311,7 @@ public class DefaultCodegen { op.httpMethod = httpMethod.toUpperCase(); // move "required" parameters in front of "optional" parameters - if(sortParamsByRequiredFlag) { + if (sortParamsByRequiredFlag) { Collections.sort(allParams, new Comparator() { @Override public int compare(CodegenParameter one, CodegenParameter another) { @@ -1710,6 +1738,22 @@ public class DefaultCodegen { return word; } + // Generate the next name for the given name, e.g. + // status => status2 + // status2 => status3 + // myName100 => myName101 + private String generateNextName(String name) { + Pattern pattern = Pattern.compile("\\d+\\z"); + Matcher matcher = pattern.matcher(name); + if (matcher.find()) { + String numStr = matcher.group(); + int num = Integer.parseInt(numStr) + 1; + return name.substring(0, name.length() - numStr.length()) + num; + } else { + return name + "2"; + } + } + private void addImport(CodegenModel m, String type) { if (type != null && needToImport(type)) { m.imports.add(type); diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java index 34b4e0e77d6e..ac33bac7c9ac 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java @@ -56,6 +56,7 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { embeddedTemplateDir = templateDir = "Java"; apiPackage = "io.swagger.client.api"; modelPackage = "io.swagger.client.model"; + ensureUniqueParams = true; reservedWords = new HashSet( Arrays.asList( diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java index 12dcedd36aed..821919971d5a 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java @@ -2,6 +2,7 @@ package io.swagger.codegen.languages; import io.swagger.codegen.CliOption; import io.swagger.codegen.CodegenConfig; +import io.swagger.codegen.CodegenConstants; import io.swagger.codegen.CodegenType; import io.swagger.codegen.DefaultCodegen; import io.swagger.codegen.SupportingFile; @@ -12,6 +13,7 @@ import io.swagger.models.properties.Property; import java.io.File; import java.util.Arrays; import java.util.HashSet; +import java.util.Iterator; import org.apache.commons.lang.StringUtils; @@ -32,6 +34,7 @@ public class RubyClientCodegen extends DefaultCodegen implements CodegenConfig { modelTemplateFiles.put("model.mustache", ".rb"); apiTemplateFiles.put("api.mustache", ".rb"); embeddedTemplateDir = templateDir = "ruby"; + ensureUniqueParams = true; typeMapping.clear(); languageSpecificPrimitives.clear(); @@ -70,7 +73,14 @@ public class RubyClientCodegen extends DefaultCodegen implements CodegenConfig { typeMapping.put("file", "File"); // remove modelPackage and apiPackage added by default - cliOptions.clear(); + Iterator itr = cliOptions.iterator(); + while (itr.hasNext()) { + CliOption opt = itr.next(); + if (CodegenConstants.MODEL_PACKAGE.equals(opt.getOpt()) || + CodegenConstants.API_PACKAGE.equals(opt.getOpt())) { + itr.remove(); + } + } cliOptions.add(new CliOption(GEM_NAME, "gem name (convention: underscore_case), default: swagger_client")); cliOptions.add(new CliOption(MODULE_NAME, "top module name (convention: CamelCase, usually corresponding to gem name), default: SwaggerClient")); cliOptions.add(new CliOption(GEM_VERSION, "gem version, default: 1.0.0")); diff --git a/modules/swagger-codegen/src/main/resources/Java/api.mustache b/modules/swagger-codegen/src/main/resources/Java/api.mustache index 08d28ebd51b1..3ac280b2d706 100644 --- a/modules/swagger-codegen/src/main/resources/Java/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/api.mustache @@ -64,7 +64,7 @@ public class {{classname}} { {{/queryParams}} {{#headerParams}}if ({{paramName}} != null) - {{localVariablePrefix}}headerParams.put("{{baseName}}", {{localVariablePrefix}}apiClient.parameterToString({{paramName}})); + {{localVariablePrefix}}headerParams.put("{{baseName}}", {{localVariablePrefix}}apiClient.parameterToString({{paramName}})); {{/headerParams}} {{#formParams}}if ({{paramName}} != null) diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java index 34e29bdc5214..17e9a0e299e0 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java @@ -11,7 +11,7 @@ import java.io.File; import java.util.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-04T19:58:40.953+08:00") public class PetApi { private ApiClient apiClient; @@ -367,7 +367,7 @@ public class PetApi { if (apiKey != null) - headerParams.put("api_key", apiClient.parameterToString(apiKey)); + headerParams.put("api_key", apiClient.parameterToString(apiKey));