Issue 4416 (Assist escapeReservedWord with custom mappings) (#4480)

* Preliminary implementation for issue-4416

* Updated README.md with  reserved-words-mappings  parameter.
This commit is contained in:
Alex Nolasco 2017-01-09 05:22:25 -05:00 committed by wing328
parent 81b5b78fc2
commit 26ead9b58f
41 changed files with 214 additions and 64 deletions

View File

@ -289,6 +289,10 @@ OPTIONS
the format of swaggerType=generatedType,swaggerType=generatedType. the format of swaggerType=generatedType,swaggerType=generatedType.
For example: array=List,map=Map,string=String For example: array=List,map=Map,string=String
--reserved-words-mappings <import mappings>
specifies how a reserved name should be escaped to. Otherwise, the
default _<name> is used. For example id=identifier
-v, --verbose -v, --verbose
verbose mode verbose mode

View File

@ -118,6 +118,10 @@ public class Generate implements Runnable {
@Option(name = {"--http-user-agent"}, title = "http user agent", description = CodegenConstants.HTTP_USER_AGENT_DESC) @Option(name = {"--http-user-agent"}, title = "http user agent", description = CodegenConstants.HTTP_USER_AGENT_DESC)
private String httpUserAgent; private String httpUserAgent;
@Option(name = {"--reserved-words-mappings"}, title = "import mappings",
description = "specifies how a reserved name should be escaped to. Otherwise, the default _<name> is used. For example id=identifier")
private String reservedWordsMappings;
@Override @Override
public void run() { public void run() {
@ -217,7 +221,7 @@ public class Generate implements Runnable {
applyTypeMappingsKvp(typeMappings, configurator); applyTypeMappingsKvp(typeMappings, configurator);
applyAdditionalPropertiesKvp(additionalProperties, configurator); applyAdditionalPropertiesKvp(additionalProperties, configurator);
applyLanguageSpecificPrimitivesCsv(languageSpecificPrimitives, configurator); applyLanguageSpecificPrimitivesCsv(languageSpecificPrimitives, configurator);
applyReservedWordsMappingsKvp(reservedWordsMappings, configurator);
final ClientOptInput clientOptInput = configurator.toClientOptInput(); final ClientOptInput clientOptInput = configurator.toClientOptInput();
new DefaultGenerator().opts(clientOptInput).generate(); new DefaultGenerator().opts(clientOptInput).generate();

View File

@ -21,6 +21,7 @@ import static io.swagger.codegen.config.CodegenConfiguratorUtils.applyImportMapp
import static io.swagger.codegen.config.CodegenConfiguratorUtils.applyInstantiationTypesKvp; import static io.swagger.codegen.config.CodegenConfiguratorUtils.applyInstantiationTypesKvp;
import static io.swagger.codegen.config.CodegenConfiguratorUtils.applyLanguageSpecificPrimitivesCsv; import static io.swagger.codegen.config.CodegenConfiguratorUtils.applyLanguageSpecificPrimitivesCsv;
import static io.swagger.codegen.config.CodegenConfiguratorUtils.applyTypeMappingsKvp; import static io.swagger.codegen.config.CodegenConfiguratorUtils.applyTypeMappingsKvp;
import static io.swagger.codegen.config.CodegenConfiguratorUtils.applyReservedWordsMappingsKvp;
import static org.apache.commons.lang3.StringUtils.isNotEmpty; import static org.apache.commons.lang3.StringUtils.isNotEmpty;
import java.io.File; import java.io.File;
@ -284,6 +285,10 @@ public class CodeGenMojo extends AbstractMojo {
if(configOptions.containsKey("additional-properties")) { if(configOptions.containsKey("additional-properties")) {
applyAdditionalPropertiesKvp(configOptions.get("additional-properties").toString(), configurator); applyAdditionalPropertiesKvp(configOptions.get("additional-properties").toString(), configurator);
} }
if(configOptions.containsKey("reserved-words-mappings")) {
applyReservedWordsMappingsKvp(configOptions.get("reserved-words-mappings").toString(), configurator);
}
} }
if (environmentVariables != null) { if (environmentVariables != null) {

View File

@ -119,6 +119,8 @@ public interface CodegenConfig {
Set<String> languageSpecificPrimitives(); Set<String> languageSpecificPrimitives();
Map<String, String> reservedWordsMappings();
void preprocessSwagger(Swagger swagger); void preprocessSwagger(Swagger swagger);
void processSwagger(Swagger swagger); void processSwagger(Swagger swagger);
@ -197,4 +199,5 @@ public interface CodegenConfig {
String getHttpUserAgent(); String getHttpUserAgent();
String getCommonTemplateDir(); String getCommonTemplateDir();
} }

View File

@ -92,6 +92,7 @@ public class DefaultCodegen {
protected Map<String, String> modelTestTemplateFiles = new HashMap<String, String>(); protected Map<String, String> modelTestTemplateFiles = new HashMap<String, String>();
protected Map<String, String> apiDocTemplateFiles = new HashMap<String, String>(); protected Map<String, String> apiDocTemplateFiles = new HashMap<String, String>();
protected Map<String, String> modelDocTemplateFiles = new HashMap<String, String>(); protected Map<String, String> modelDocTemplateFiles = new HashMap<String, String>();
protected Map<String, String> reservedWordsMappings = new HashMap<String, String>();
protected String templateDir; protected String templateDir;
protected String embeddedTemplateDir; protected String embeddedTemplateDir;
protected String commonTemplateDir = "_common"; protected String commonTemplateDir = "_common";
@ -469,6 +470,10 @@ public class DefaultCodegen {
return modelDocTemplateFiles; return modelDocTemplateFiles;
} }
public Map<String, String> reservedWordsMappings() {
return reservedWordsMappings;
}
public Map<String, String> apiTestTemplateFiles() { public Map<String, String> apiTestTemplateFiles() {
return apiTestTemplateFiles; return apiTestTemplateFiles;
} }

View File

@ -60,6 +60,8 @@ public class CodegenConfigurator {
private Map<String, Object> additionalProperties = new HashMap<String, Object>(); private Map<String, Object> additionalProperties = new HashMap<String, Object>();
private Map<String, String> importMappings = new HashMap<String, String>(); private Map<String, String> importMappings = new HashMap<String, String>();
private Set<String> languageSpecificPrimitives = new HashSet<String>(); private Set<String> languageSpecificPrimitives = new HashSet<String>();
private Map<String, String> reservedWordMappings = new HashMap<String, String>();
private String gitUserId="GIT_USER_ID"; private String gitUserId="GIT_USER_ID";
private String gitRepoId="GIT_REPO_ID"; private String gitRepoId="GIT_REPO_ID";
private String releaseNote="Minor update"; private String releaseNote="Minor update";
@ -342,6 +344,20 @@ public class CodegenConfigurator {
return this; return this;
} }
public Map<String, String> getReservedWordsMappings() {
return reservedWordMappings;
}
public CodegenConfigurator setReservedWordsMappings(Map<String, String> reservedWordsMappings) {
this.reservedWordMappings = reservedWordsMappings;
return this;
}
public CodegenConfigurator addAdditionalReservedWordMapping(String key, String value) {
this.reservedWordMappings.put(key, value);
return this;
}
public ClientOptInput toClientOptInput() { public ClientOptInput toClientOptInput() {
Validate.notEmpty(lang, "language must be specified"); Validate.notEmpty(lang, "language must be specified");
@ -360,6 +376,7 @@ public class CodegenConfigurator {
config.typeMapping().putAll(typeMappings); config.typeMapping().putAll(typeMappings);
config.importMapping().putAll(importMappings); config.importMapping().putAll(importMappings);
config.languageSpecificPrimitives().addAll(languageSpecificPrimitives); config.languageSpecificPrimitives().addAll(languageSpecificPrimitives);
config.reservedWordsMappings().putAll(reservedWordMappings);
checkAndSetAdditionalProperty(apiPackage, CodegenConstants.API_PACKAGE); checkAndSetAdditionalProperty(apiPackage, CodegenConstants.API_PACKAGE);
checkAndSetAdditionalProperty(modelPackage, CodegenConstants.MODEL_PACKAGE); checkAndSetAdditionalProperty(modelPackage, CodegenConstants.MODEL_PACKAGE);

View File

@ -58,6 +58,13 @@ public final class CodegenConfiguratorUtils {
} }
} }
public static void applyReservedWordsMappingsKvp(String reservedWordMappings, CodegenConfigurator configurator) {
final Map<String, String> map = createMapFromKeyValuePairs(reservedWordMappings);
for (Map.Entry<String, String> entry : map.entrySet()) {
configurator.addAdditionalReservedWordMapping(entry.getKey(), entry.getValue());
}
}
private static Set<String> createSetFromCsvList(String csvProperty) { private static Set<String> createSetFromCsvList(String csvProperty) {
final List<String> values = OptionUtils.splitCommaSeparatedList(csvProperty); final List<String> values = OptionUtils.splitCommaSeparatedList(csvProperty);
return new HashSet<String>(values); return new HashSet<String>(values);
@ -74,4 +81,6 @@ public final class CodegenConfiguratorUtils {
return result; return result;
} }
} }

View File

@ -405,6 +405,9 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; return "_" + name;
} }

View File

@ -329,6 +329,9 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; return "_" + name;
} }

View File

@ -253,6 +253,9 @@ public abstract class AbstractPhpCodegen extends DefaultCodegen implements Codeg
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; return "_" + name;
} }

View File

@ -68,6 +68,9 @@ public abstract class AbstractScalaCodegen extends DefaultCodegen {
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; return "_" + name;
} }

View File

@ -116,6 +116,9 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; return "_" + name;
} }

View File

@ -154,6 +154,9 @@ public class AkkaScalaClientCodegen extends AbstractScalaCodegen implements Code
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "`" + name + "`"; return "`" + name + "`";
} }

View File

@ -120,6 +120,9 @@ public class AndroidClientCodegen extends DefaultCodegen implements CodegenConfi
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; return "_" + name;
} }

View File

@ -171,6 +171,9 @@ public class CsharpDotNet2ClientCodegen extends DefaultCodegen implements Codege
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; return "_" + name;
} }

View File

@ -175,6 +175,9 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig {
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; return "_" + name;
} }

View File

@ -183,7 +183,10 @@ public class ErlangServerCodegen extends DefaultCodegen implements CodegenConfig
*/ */
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
return name + "_"; // add an underscore to the name if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name;
} }
/** /**

View File

@ -178,7 +178,10 @@ public class FlashClientCodegen extends DefaultCodegen implements CodegenConfig
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
return name + "_"; if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name;
} }
@Override @Override

View File

@ -237,6 +237,9 @@ public class FlaskConnexionCodegen extends DefaultCodegen implements CodegenConf
*/ */
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; // add an underscore to the name return "_" + name; // add an underscore to the name
} }

View File

@ -181,8 +181,9 @@ public class GoClientCodegen extends DefaultCodegen implements CodegenConfig {
// - X_Name // - X_Name
// ... or maybe a suffix? // ... or maybe a suffix?
// - Name_ ... think this will work. // - Name_ ... think this will work.
if(this.reservedWordsMappings().containsKey(name)) {
// FIXME: This should also really be a customizable option return this.reservedWordsMappings().get(name);
}
return camelize(name) + '_'; return camelize(name) + '_';
} }

View File

@ -204,6 +204,9 @@ public class GoServerCodegen extends DefaultCodegen implements CodegenConfig {
*/ */
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; // add an underscore to the name return "_" + name; // add an underscore to the name
} }

View File

@ -155,7 +155,10 @@ public class HaskellServantCodegen extends DefaultCodegen implements CodegenConf
*/ */
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
return name + "_"; if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name;
} }
public String firstLetterToUpper(String word) { public String firstLetterToUpper(String word) {

View File

@ -121,7 +121,10 @@ public class JMeterCodegen extends DefaultCodegen implements CodegenConfig {
*/ */
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
return "_" + name; // add an underscore to the name if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name;
} }
/** /**

View File

@ -314,6 +314,9 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; return "_" + name;
} }

View File

@ -103,6 +103,9 @@ public class JavascriptClosureAngularClientCodegen extends DefaultCodegen implem
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; return "_" + name;
} }

View File

@ -147,13 +147,16 @@ public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig
/** /**
* Escapes a reserved word as defined in the `reservedWords` array. Handle escaping * Escapes a reserved word as defined in the `reservedWords` array. Handle escaping
* those terms here. This logic is only called if a variable matches the reseved words * those terms here. This logic is only called if a variable matches the reserved words
* *
* @return the escaped term * @return the escaped term
*/ */
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
return "_" + name; // add an underscore to the name if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name;
} }
/** /**

View File

@ -538,8 +538,17 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig {
return toVarName(name); return toVarName(name);
} }
/**
* Escapes a reserved word as defined in the `reservedWords` array. Handle escaping
* those terms here. This logic is only called if a variable matches the reserved words
*
* @return the escaped term
*/
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; return "_" + name;
} }

View File

@ -162,6 +162,9 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig {
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; return "_" + name;
} }

View File

@ -308,6 +308,9 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig {
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; return "_" + name;
} }

View File

@ -252,6 +252,9 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; return "_" + name;
} }

View File

@ -199,7 +199,10 @@ public class Qt5CPPGenerator extends DefaultCodegen implements CodegenConfig {
*/ */
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
return "_" + name; // add an underscore to the name if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name;
} }
/** /**

View File

@ -187,6 +187,9 @@ public class Rails5ServerCodegen extends DefaultCodegen implements CodegenConfig
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; return "_" + name;
} }

View File

@ -331,6 +331,9 @@ public class RubyClientCodegen extends DefaultCodegen implements CodegenConfig {
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; return "_" + name;
} }

View File

@ -108,6 +108,9 @@ public class SilexServerCodegen extends DefaultCodegen implements CodegenConfig
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; return "_" + name;
} }

View File

@ -105,6 +105,9 @@ public class SinatraServerCodegen extends DefaultCodegen implements CodegenConfi
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; return "_" + name;
} }

View File

@ -119,6 +119,9 @@ public class SlimFrameworkServerCodegen extends DefaultCodegen implements Codege
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; return "_" + name;
} }

View File

@ -78,6 +78,9 @@ public class StaticDocCodegen extends DefaultCodegen implements CodegenConfig {
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; return "_" + name;
} }

View File

@ -236,6 +236,9 @@ public class Swift3Codegen extends DefaultCodegen implements CodegenConfig {
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; // add an underscore to the name return "_" + name; // add an underscore to the name
} }

View File

@ -235,6 +235,9 @@ public class SwiftCodegen extends DefaultCodegen implements CodegenConfig {
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; // add an underscore to the name return "_" + name; // add an underscore to the name
} }

View File

@ -262,6 +262,9 @@ public class TizenClientCodegen extends DefaultCodegen implements CodegenConfig
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name);
}
return "_" + name; return "_" + name;
} }

View File

@ -1,9 +1,10 @@
package io.swagger.codegen.utils; package io.swagger.codegen.utils;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import joptsimple.internal.Strings;
import static org.apache.commons.lang3.StringUtils.isNotEmpty; import static org.apache.commons.lang3.StringUtils.isNotEmpty;
@ -22,7 +23,7 @@ public class OptionUtils {
results.add(pair); results.add(pair);
} }
} }
//Strings.isNullOrEmpty(input)
return results; return results;
} }
@ -39,5 +40,4 @@ public class OptionUtils {
return results; return results;
} }
} }