Skip to content

Commit e2f20b9

Browse files
OpenAPITools#3428 I made the generator compatible to register ignoreCase keywords as well as case sensitive keywords. Java, PHP and Python had changed, 65 unversioned sample files and 6 changed files. I also added a lot of TODOs to check whether the keywords of a gnerator should be registered case sensitive or not. DefaultCodegen got a new test where I demonstrated that the feature should work as intended. There could be a few bugs fixed in here where the input was lower cased but the reserved word not when comparing them I removed the old reservedWord and replaced it with two new version with case and without. They are also private so that they can not be used directly to assure consistent usage across the different generators
1 parent fabe021 commit e2f20b9

File tree

79 files changed

+1154
-357
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+1154
-357
lines changed

modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.openapitools.codegen.meta.GeneratorMetadata;
2929

3030
import java.io.File;
31+
import java.util.Collection;
3132
import java.util.List;
3233
import java.util.Map;
3334
import java.util.Set;
@@ -101,8 +102,6 @@ public interface CodegenConfig {
101102

102103
String generateExamplePath(String path, Operation operation);
103104

104-
Set<String> reservedWords();
105-
106105
List<SupportingFile> supportingFiles();
107106

108107
String getInputSpec();
@@ -277,4 +276,10 @@ public interface CodegenConfig {
277276
boolean isStrictSpecBehavior();
278277

279278
void setStrictSpecBehavior(boolean strictSpecBehavior);
279+
280+
boolean isReservedWord(String word);
281+
282+
void registerReservedWordsCaseInsensitive(Collection<String> reserved);
283+
284+
void registerReservedWordsCaseSensitive(Collection<String> reserved);
280285
}

modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java

Lines changed: 57 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,24 @@
2323
import com.samskivert.mustache.Mustache;
2424
import com.samskivert.mustache.Mustache.Compiler;
2525
import com.samskivert.mustache.Mustache.Lambda;
26-
2726
import io.swagger.v3.core.util.Json;
2827
import io.swagger.v3.oas.models.OpenAPI;
2928
import io.swagger.v3.oas.models.Operation;
3029
import io.swagger.v3.oas.models.callbacks.Callback;
3130
import io.swagger.v3.oas.models.examples.Example;
3231
import io.swagger.v3.oas.models.headers.Header;
33-
import io.swagger.v3.oas.models.media.*;
34-
import io.swagger.v3.oas.models.parameters.*;
32+
import io.swagger.v3.oas.models.media.ArraySchema;
33+
import io.swagger.v3.oas.models.media.ComposedSchema;
34+
import io.swagger.v3.oas.models.media.Content;
35+
import io.swagger.v3.oas.models.media.MediaType;
36+
import io.swagger.v3.oas.models.media.Schema;
37+
import io.swagger.v3.oas.models.media.StringSchema;
38+
import io.swagger.v3.oas.models.parameters.CookieParameter;
39+
import io.swagger.v3.oas.models.parameters.HeaderParameter;
40+
import io.swagger.v3.oas.models.parameters.Parameter;
41+
import io.swagger.v3.oas.models.parameters.PathParameter;
42+
import io.swagger.v3.oas.models.parameters.QueryParameter;
43+
import io.swagger.v3.oas.models.parameters.RequestBody;
3544
import io.swagger.v3.oas.models.responses.ApiResponse;
3645
import io.swagger.v3.oas.models.responses.ApiResponses;
3746
import io.swagger.v3.oas.models.security.OAuthFlow;
@@ -62,14 +71,32 @@
6271
import org.slf4j.LoggerFactory;
6372

6473
import java.io.File;
65-
import java.util.*;
74+
import java.util.ArrayList;
75+
import java.util.Arrays;
76+
import java.util.Collection;
77+
import java.util.Collections;
78+
import java.util.Comparator;
79+
import java.util.HashMap;
80+
import java.util.HashSet;
81+
import java.util.Iterator;
82+
import java.util.LinkedHashMap;
83+
import java.util.LinkedList;
84+
import java.util.List;
85+
import java.util.Locale;
86+
import java.util.Map;
6687
import java.util.Map.Entry;
88+
import java.util.Objects;
89+
import java.util.Optional;
90+
import java.util.Set;
91+
import java.util.TreeSet;
6792
import java.util.regex.Matcher;
6893
import java.util.regex.Pattern;
6994
import java.util.stream.Collectors;
7095
import java.util.stream.Stream;
7196

72-
import static org.openapitools.codegen.utils.StringUtils.*;
97+
import static org.openapitools.codegen.utils.StringUtils.camelize;
98+
import static org.openapitools.codegen.utils.StringUtils.escape;
99+
import static org.openapitools.codegen.utils.StringUtils.underscore;
73100

74101
public class DefaultCodegen implements CodegenConfig {
75102
private static final Logger LOGGER = LoggerFactory.getLogger(DefaultCodegen.class);
@@ -80,7 +107,8 @@ public class DefaultCodegen implements CodegenConfig {
80107
protected Set<String> defaultIncludes = new HashSet<String>();
81108
protected Map<String, String> typeMapping = new HashMap<String, String>();
82109
protected Map<String, String> instantiationTypes = new HashMap<String, String>();
83-
protected Set<String> reservedWords = new HashSet<String>();
110+
private final Set<String> reservedWordsCaseSensitive = new HashSet<String>();
111+
private final Set<String> reservedWordsCaseInsensitive = new HashSet<String>();
84112
protected Set<String> languageSpecificPrimitives = new HashSet<String>();
85113
protected Map<String, String> importMapping = new HashMap<String, String>();
86114
protected String modelPackage = "", apiPackage = "", fileSuffix;
@@ -621,10 +649,6 @@ public Map<String, String> instantiationTypes() {
621649
return instantiationTypes;
622650
}
623651

624-
public Set<String> reservedWords() {
625-
return reservedWords;
626-
}
627-
628652
public Set<String> languageSpecificPrimitives() {
629653
return languageSpecificPrimitives;
630654
}
@@ -927,7 +951,7 @@ public String toOperationId(String operationId) {
927951
* @return the sanitized variable name
928952
*/
929953
public String toVarName(String name) {
930-
if (reservedWords.contains(name)) {
954+
if (this.isReservedWord(name)) {
931955
return escapeReservedWord(name);
932956
} else if (((CharSequence) name).chars().anyMatch(character -> specialCharReplacements.keySet().contains("" + ((char) character)))) {
933957
return escape(name, specialCharReplacements, null, null);
@@ -945,7 +969,7 @@ public String toVarName(String name) {
945969
*/
946970
public String toParamName(String name) {
947971
name = removeNonNameElementToCamelCase(name); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'.
948-
if (reservedWords.contains(name)) {
972+
if (this.isReservedWord(name)) {
949973
return escapeReservedWord(name);
950974
} else if (((CharSequence) name).chars().anyMatch(character -> specialCharReplacements.keySet().contains("" + ((char) character)))) {
951975
return escape(name, specialCharReplacements, null, null);
@@ -1071,8 +1095,6 @@ public DefaultCodegen() {
10711095

10721096
instantiationTypes = new HashMap<String, String>();
10731097

1074-
reservedWords = new HashSet<String>();
1075-
10761098
importMapping = new HashMap<String, String>();
10771099
importMapping.put("BigDecimal", "java.math.BigDecimal");
10781100
importMapping.put("UUID", "java.util.UUID");
@@ -1729,7 +1751,7 @@ public CodegenModel fromModel(String name, Schema schema) {
17291751

17301752
CodegenModel m = CodegenModelFactory.newInstance(CodegenModelType.MODEL);
17311753

1732-
if (reservedWords.contains(name)) {
1754+
if (this.isReservedWord(name)) {
17331755
m.name = escapeReservedWord(name);
17341756
} else {
17351757
m.name = name;
@@ -3412,15 +3434,28 @@ public int compare(CodegenSecurity one, CodegenSecurity another) {
34123434
return codegenSecurities;
34133435
}
34143436

3415-
protected void setReservedWordsLowerCase(List<String> words) {
3416-
reservedWords = new HashSet<String>();
3417-
for (String word : words) {
3418-
reservedWords.add(word.toLowerCase(Locale.ROOT));
3419-
}
3437+
public void registerReservedWordsCaseInsensitive(Collection<String> reserved) {
3438+
reserved.forEach(it -> this.reservedWordsCaseInsensitive.add(it.toLowerCase(Locale.ROOT)));
3439+
}
3440+
3441+
public void registerReservedWordsCaseSensitive(Collection<String> reserved) {
3442+
this.reservedWordsCaseSensitive.addAll(reserved);
34203443
}
34213444

3422-
protected boolean isReservedWord(String word) {
3423-
return word != null && reservedWords.contains(word.toLowerCase(Locale.ROOT));
3445+
/**
3446+
* This function tests the word against the two sets reservedWordsCaseInsensitive and reservedWordsCaseSensitive.
3447+
* If the word is in any of these lists the method will return true.
3448+
* Attention: The method will return false if word is null!
3449+
*
3450+
* @param word The key which should be checked against the reserved words sets.
3451+
* @return Whether the word is in the reserved sets.
3452+
*/
3453+
public final boolean isReservedWord(String word) {
3454+
if (word == null) {
3455+
return false;
3456+
}
3457+
return this.reservedWordsCaseSensitive.contains(word)
3458+
|| this.reservedWordsCaseInsensitive.contains(word.toLowerCase(Locale.ROOT));
34243459
}
34253460

34263461
/**

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractAdaCodegen.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,26 @@
2626
import io.swagger.v3.oas.models.security.SecurityRequirement;
2727
import io.swagger.v3.oas.models.security.SecurityScheme;
2828
import io.swagger.v3.oas.models.servers.Server;
29-
import org.openapitools.codegen.*;
29+
import org.openapitools.codegen.CodegenConfig;
30+
import org.openapitools.codegen.CodegenConstants;
31+
import org.openapitools.codegen.CodegenModel;
32+
import org.openapitools.codegen.CodegenOperation;
33+
import org.openapitools.codegen.CodegenParameter;
34+
import org.openapitools.codegen.CodegenProperty;
35+
import org.openapitools.codegen.CodegenSecurity;
36+
import org.openapitools.codegen.DefaultCodegen;
3037
import org.openapitools.codegen.utils.ModelUtils;
3138
import org.slf4j.Logger;
3239
import org.slf4j.LoggerFactory;
3340

34-
import java.util.*;
41+
import java.util.ArrayList;
42+
import java.util.Arrays;
43+
import java.util.HashMap;
44+
import java.util.HashSet;
45+
import java.util.List;
46+
import java.util.Locale;
47+
import java.util.Map;
48+
import java.util.Optional;
3549

3650
import static org.openapitools.codegen.utils.StringUtils.camelize;
3751

@@ -52,7 +66,8 @@ public AbstractAdaCodegen() {
5266
/*
5367
* Reserved words. Override this with reserved words specific to your language
5468
*/
55-
setReservedWordsLowerCase(
69+
// TODO Are those case sensitive or insensitive
70+
super.registerReservedWordsCaseInsensitive(
5671
Arrays.asList(
5772
"abort",
5873
"abs",

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,33 @@
1919

2020
import com.google.common.collect.ImmutableMap.Builder;
2121
import com.samskivert.mustache.Mustache.Lambda;
22-
2322
import io.swagger.v3.core.util.Json;
2423
import io.swagger.v3.oas.models.media.ArraySchema;
2524
import io.swagger.v3.oas.models.media.Schema;
2625
import org.apache.commons.io.FilenameUtils;
2726
import org.apache.commons.lang3.StringUtils;
28-
import org.openapitools.codegen.*;
29-
import org.openapitools.codegen.templating.mustache.*;
27+
import org.openapitools.codegen.CodegenConfig;
28+
import org.openapitools.codegen.CodegenConstants;
29+
import org.openapitools.codegen.CodegenModel;
30+
import org.openapitools.codegen.CodegenOperation;
31+
import org.openapitools.codegen.CodegenParameter;
32+
import org.openapitools.codegen.CodegenProperty;
33+
import org.openapitools.codegen.DefaultCodegen;
34+
import org.openapitools.codegen.DefaultGenerator;
35+
import org.openapitools.codegen.templating.mustache.CamelCaseLambda;
3036
import org.openapitools.codegen.utils.ModelUtils;
3137
import org.slf4j.Logger;
3238
import org.slf4j.LoggerFactory;
3339

3440
import java.io.File;
35-
import java.util.*;
41+
import java.util.ArrayList;
42+
import java.util.Arrays;
43+
import java.util.HashMap;
44+
import java.util.HashSet;
45+
import java.util.List;
46+
import java.util.Locale;
47+
import java.util.Map;
48+
import java.util.Set;
3649

3750
import static org.openapitools.codegen.utils.StringUtils.camelize;
3851

@@ -103,8 +116,7 @@ public AbstractCSharpCodegen() {
103116
Arrays.asList("IDictionary")
104117
);
105118

106-
// NOTE: C# uses camel cased reserved words, while models are title cased. We don't want lowercase comparisons.
107-
reservedWords.addAll(
119+
super.registerReservedWordsCaseSensitive(
108120
Arrays.asList(
109121
// set "client" as a reserved word to avoid conflicts with Org.OpenAPITools.Client
110122
// this is a workaround and can be removed if c# api client is updated to use
@@ -823,12 +835,6 @@ public String toDefaultValue(Schema p) {
823835
return null;
824836
}
825837

826-
@Override
827-
protected boolean isReservedWord(String word) {
828-
// NOTE: This differs from super's implementation in that C# does _not_ want case insensitive matching.
829-
return reservedWords.contains(word);
830-
}
831-
832838
public String getNullableType(Schema p, String type) {
833839
if (languageSpecificPrimitives.contains(type)) {
834840
return type;

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCppCodegen.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
import com.google.common.collect.ImmutableMap.Builder;
2121
import com.samskivert.mustache.Mustache.Lambda;
22-
2322
import io.swagger.v3.oas.models.OpenAPI;
2423
import io.swagger.v3.oas.models.media.Schema;
2524
import org.apache.commons.io.FilenameUtils;
@@ -45,7 +44,8 @@ public AbstractCppCodegen() {
4544
/*
4645
* Reserved words. Override this with reserved words specific to your language
4746
*/
48-
setReservedWordsLowerCase(
47+
// TODO Are those case sensitive or insensitive
48+
super.registerReservedWordsCaseInsensitive(
4949
Arrays.asList(
5050
"alignas",
5151
"alignof",

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractEiffelCodegen.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,28 @@
2323
import io.swagger.v3.oas.models.media.ArraySchema;
2424
import io.swagger.v3.oas.models.media.Schema;
2525
import org.apache.commons.lang3.StringUtils;
26-
import org.openapitools.codegen.*;
26+
import org.openapitools.codegen.CliOption;
27+
import org.openapitools.codegen.CodegenConfig;
28+
import org.openapitools.codegen.CodegenConstants;
29+
import org.openapitools.codegen.CodegenModel;
30+
import org.openapitools.codegen.CodegenOperation;
31+
import org.openapitools.codegen.CodegenParameter;
32+
import org.openapitools.codegen.CodegenProperty;
33+
import org.openapitools.codegen.DefaultCodegen;
2734
import org.openapitools.codegen.utils.ModelUtils;
2835
import org.slf4j.Logger;
2936
import org.slf4j.LoggerFactory;
3037

31-
import java.util.*;
38+
import java.util.Arrays;
39+
import java.util.Collection;
40+
import java.util.HashMap;
41+
import java.util.HashSet;
42+
import java.util.Iterator;
43+
import java.util.List;
44+
import java.util.ListIterator;
45+
import java.util.Locale;
46+
import java.util.Map;
47+
import java.util.Set;
3248

3349
import static com.google.common.base.Strings.isNullOrEmpty;
3450
import static org.openapitools.codegen.utils.StringUtils.camelize;
@@ -45,7 +61,8 @@ public AbstractEiffelCodegen() {
4561

4662
hideGenerationTimestamp = Boolean.FALSE;
4763

48-
setReservedWordsLowerCase(Arrays.asList(
64+
// TODO Are those case sensitive or insensitive
65+
super.registerReservedWordsCaseInsensitive(Arrays.asList(
4966
// language reserved words
5067
"across", "agent", "alias", "all", "and", "as", "assign", "attribute", "check", "class", "convert",
5168
"create", "Current", "debug", "deferred", "do", "else", "elseif", "end", "ensure", "expanded", "export",

0 commit comments

Comments
 (0)