From 98c5e70f7cb42d797649ab980b9595ee45357422 Mon Sep 17 00:00:00 2001 From: Paul Ebermann Date: Tue, 16 Feb 2016 18:34:21 +0100 Subject: [PATCH 1/6] [feature #1255] Start of an implementation of model name prefix + suffix. This is just the implementation in DefaultCodegen and some configurator stuff, the connection to command line arguments is still missing. --- .../io/swagger/codegen/CodegenConstants.java | 5 +++++ .../io/swagger/codegen/DefaultCodegen.java | 5 +++-- .../codegen/config/CodegenConfigurator.java | 20 +++++++++++++++++++ 3 files changed, 28 insertions(+), 2 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 83330477b65..0893c5102dd 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 @@ -82,4 +82,9 @@ public class CodegenConstants { public static enum MODEL_PROPERTY_NAMING_TYPE {camelCase, PascalCase, snake_case, original} + public static final String MODEL_NAME_PREFIX = "modelNamePrefix"; + public static final String MODEL_NAME_PREFIX_DESC = "Prefix that will be prepended to all model names. Default is the empty string."; + + public static final String MODEL_NAME_SUFFIX = "modelNameSuffix"; + public static final String MODEL_NAME_SUFFIX_DESC = "Suffix that will be appended to all model names. Default is the empty string."; } 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 7ea95597dd7..9e692a1c80b 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 @@ -63,6 +63,7 @@ public class DefaultCodegen { protected Set languageSpecificPrimitives = new HashSet(); protected Map importMapping = new HashMap(); protected String modelPackage = "", apiPackage = "", fileSuffix; + protected String modelNamePrefix = "", modelNameSuffix = ""; protected String testPackage = ""; protected Map apiTemplateFiles = new HashMap(); protected Map modelTemplateFiles = new HashMap(); @@ -826,8 +827,8 @@ public class DefaultCodegen { * @param name the name of the model * @return capitalized model name */ - public String toModelName(String name) { - return initialCaps(name); + public String toModelName(final String name) { + return initialCaps(modelNamePrefix + name + modelNameSuffix); } /** diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/config/CodegenConfigurator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/config/CodegenConfigurator.java index c4b275e8eeb..eaa3bd21fad 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/config/CodegenConfigurator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/config/CodegenConfigurator.java @@ -48,6 +48,8 @@ public class CodegenConfigurator { private String apiPackage; private String modelPackage; private String invokerPackage; + private String modelNamePrefix; + private String modelNameSuffix; private String groupId; private String artifactId; private String artifactVersion; @@ -97,6 +99,24 @@ public class CodegenConfigurator { return this; } + public String getModelNamePrefix() { + return modelNamePrefix; + } + + public CodegenConfigurator setModelNamePrefix(String prefix) { + this.modelNamePrefix = prefix; + return this; + } + + public String getModelNameSuffix() { + return modelNameSuffix; + } + + public CodegenConfigurator setModelNameSuffix(String suffix) { + this.modelNameSuffix = suffix; + return this; + } + public boolean isVerbose() { return verbose; } From a6f3914a92c0e455bf48a442cb210637856b5f4e Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Thu, 18 Feb 2016 13:07:42 -0500 Subject: [PATCH 2/6] [feature #1255] prefix and suffix for model names. This implements the command line arguments `--model-name-prefix` and `--model-name-suffix` for all languages which do not override `DefaultCodegen.toModelName()`. This fixes most of swagger-api/swagger-codegen#1255. Connection to the maven plugin works with additional-properties, a more explicit parameter waits for swagger-api/swagger-codegen#2168. --- .../java/io/swagger/codegen/cmd/Generate.java | 14 ++++++++++++++ .../java/io/swagger/codegen/DefaultCodegen.java | 16 ++++++++++++++++ .../codegen/config/CodegenConfigurator.java | 2 ++ 3 files changed, 32 insertions(+) diff --git a/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Generate.java b/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Generate.java index 04d60e2ec88..c9375c6dab4 100644 --- a/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Generate.java +++ b/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Generate.java @@ -73,6 +73,12 @@ public class Generate implements Runnable { @Option(name = {"--model-package"}, title = "model package", description = CodegenConstants.MODEL_PACKAGE_DESC) private String modelPackage; + @Option(name = {"--model-name-prefix"}, title = "model name prefix", description = CodegenConstants.MODEL_NAME_PREFIX_DESC) + private String modelNamePrefix; + + @Option(name = {"--model-name-suffix"}, title = "model name suffix", description = CodegenConstants.MODEL_NAME_SUFFIX_DESC) + private String modelNameSuffix; + @Option(name = {"--instantiation-types"}, title = "instantiation types", description = "sets instantiation type mappings in the format of type=instantiatedType,type=instantiatedType." + "For example (in Java): array=ArrayList,map=HashMap. In other words array types will get instantiated as ArrayList in generated code.") private String instantiationTypes; @@ -156,6 +162,14 @@ public class Generate implements Runnable { configurator.setModelPackage(modelPackage); } + if(isNotEmpty(modelNamePrefix)){ + configurator.setModelNamePrefix(modelNamePrefix); + } + + if(isNotEmpty(modelNameSuffix)){ + configurator.setModelNameSuffix(modelNameSuffix); + } + if(isNotEmpty(invokerPackage)) { configurator.setInvokerPackage(invokerPackage); } 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 9e692a1c80b..37793bb2fb7 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 @@ -108,6 +108,14 @@ public class DefaultCodegen { this.setEnsureUniqueParams(Boolean.valueOf(additionalProperties .get(CodegenConstants.ENSURE_UNIQUE_PARAMS).toString())); } + + if(additionalProperties.containsKey(CodegenConstants.MODEL_NAME_PREFIX)){ + this.setModelNamePrefix((String) additionalProperties.get(CodegenConstants.MODEL_NAME_PREFIX)); + } + + if(additionalProperties.containsKey(CodegenConstants.MODEL_NAME_SUFFIX)){ + this.setModelNameSuffix((String) additionalProperties.get(CodegenConstants.MODEL_NAME_SUFFIX)); + } } // override with any special post-processing for all models @@ -284,6 +292,14 @@ public class DefaultCodegen { this.modelPackage = modelPackage; } + public void setModelNamePrefix(String modelNamePrefix){ + this.modelNamePrefix = modelNamePrefix; + } + + public void setModelNameSuffix(String modelNameSuffix){ + this.modelNameSuffix = modelNameSuffix; + } + public void setApiPackage(String apiPackage) { this.apiPackage = apiPackage; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/config/CodegenConfigurator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/config/CodegenConfigurator.java index eaa3bd21fad..7c73b2cb6b0 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/config/CodegenConfigurator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/config/CodegenConfigurator.java @@ -320,6 +320,8 @@ public class CodegenConfigurator { checkAndSetAdditionalProperty(artifactId, CodegenConstants.ARTIFACT_ID); checkAndSetAdditionalProperty(artifactVersion, CodegenConstants.ARTIFACT_VERSION); checkAndSetAdditionalProperty(templateDir, toAbsolutePathStr(templateDir), CodegenConstants.TEMPLATE_DIR); + checkAndSetAdditionalProperty(modelNamePrefix, CodegenConstants.MODEL_NAME_PREFIX); + checkAndSetAdditionalProperty(modelNameSuffix, CodegenConstants.MODEL_NAME_SUFFIX); handleDynamicProperties(config); From 087b9118c181de300747aab3de5bda0fb6c188d6 Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Thu, 18 Feb 2016 13:07:42 -0500 Subject: [PATCH 3/6] [feature #1255] support model name prefix + suffix also for C#. AbstractCSharpCodegen does override toModelName, which made the change to DefaultCodegen have no effect. --- .../io/swagger/codegen/languages/AbstractCSharpCodegen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractCSharpCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractCSharpCodegen.java index 67c30289510..119782212d0 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractCSharpCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractCSharpCodegen.java @@ -468,7 +468,7 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co @Override public String toModelName(String name) { - name = sanitizeName(name); + name = sanitizeName(modelNamePrefix + name + modelNameSuffix); // model name cannot use reserved keyword, e.g. return if (isReservedWord(name)) { From 0ee77636a3c298158b8db8fba3e43e536b70b194 Mon Sep 17 00:00:00 2001 From: Paul Ebermann Date: Mon, 22 Feb 2016 11:44:29 +0100 Subject: [PATCH 4/6] [feature #1255] Java: Use super.toModelName to allow prefix/Suffix addition. This allows using the model name prefix and suffix parameters also in Java generators. We add List and Map to the "language specific primitives" so they don't get mangled by the suffixes/prefixes in `getSwaggerType` --- .../java/io/swagger/codegen/languages/JavaClientCodegen.java | 4 ++++ 1 file changed, 4 insertions(+) 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 e8a5f811bef..821f77ca179 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 @@ -219,6 +219,9 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { importMapping.remove("DateTime"); instantiationTypes.put("array", "java.util.ArrayList"); instantiationTypes.put("map", "java.util.HashMap"); + } else { + languageSpecificPrimitives.add("List"); + languageSpecificPrimitives.add("Map"); } this.sanitizeConfig(); @@ -377,6 +380,7 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { @Override public String toModelName(String name) { + name = super.toModelName(name); name = sanitizeName(name); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. // camelize the model name From 70bcf22c82970fbacf737bd110913294ac0fb348 Mon Sep 17 00:00:00 2001 From: Paul Ebermann Date: Wed, 24 Feb 2016 16:43:20 +0100 Subject: [PATCH 5/6] [feature #1255] fix import problem pointed out during review. Instead of declaring `Map` and `List` as primitive (which caused them to be not imported anymore), now we exclude them from the model name transformation in `JavaClientCodegen.getSwaggerType`. --- .../io/swagger/codegen/languages/JavaClientCodegen.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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 821f77ca179..3ea6a28afe0 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 @@ -219,9 +219,6 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { importMapping.remove("DateTime"); instantiationTypes.put("array", "java.util.ArrayList"); instantiationTypes.put("map", "java.util.HashMap"); - } else { - languageSpecificPrimitives.add("List"); - languageSpecificPrimitives.add("Map"); } this.sanitizeConfig(); @@ -490,7 +487,8 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { String type = null; if (typeMapping.containsKey(swaggerType)) { type = typeMapping.get(swaggerType); - if (languageSpecificPrimitives.contains(type) || type.indexOf(".") >= 0) { + if (languageSpecificPrimitives.contains(type) || type.indexOf(".") >= 0 || + type.equals("Map") || type.equals("List")) { return type; } } else { From 36f7ffd6eb25d0767c6b4c418a68073cd4c57525 Mon Sep 17 00:00:00 2001 From: Paul Ebermann Date: Wed, 24 Feb 2016 16:47:08 +0100 Subject: [PATCH 6/6] [feature #1255] make JavaClientCodegen.toModelName independent from super implementation. As pointed out in the review, using a super.toModelName call makes future changes harder to review, therefore we are implementing the addition of suffix and prefix here again. In addition, I fixed the FIXME about assigning the parameter. --- .../codegen/languages/JavaClientCodegen.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) 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 3ea6a28afe0..19f352ae0a5 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 @@ -376,22 +376,21 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { } @Override - public String toModelName(String name) { - name = super.toModelName(name); - name = sanitizeName(name); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. + public String toModelName(final String name) { + final String sanitizedName = sanitizeName(modelNamePrefix + name + modelNameSuffix); // camelize the model name // phone_number => PhoneNumber - name = camelize(name); + final String camelizedName = camelize(sanitizedName); // model name cannot use reserved keyword, e.g. return - if (isReservedWord(name)) { - String modelName = "Object" + name; - LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + modelName); + if (isReservedWord(camelizedName)) { + final String modelName = "Object" + camelizedName; + LOGGER.warn(camelizedName + " (reserved word) cannot be used as model name. Renamed to " + modelName); return modelName; } - return name; + return camelizedName; } @Override