Skip to content

Commit 889607d

Browse files
refactor: introduce EnumVarMap for improved enum handling across code generators
1 parent 930fc61 commit 889607d

28 files changed

Lines changed: 206 additions & 146 deletions

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

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -488,19 +488,6 @@ public static enum ENUM_PROPERTY_NAMING_TYPE {camelCase, PascalCase, snake_case,
488488
public static final String DEFAULT_TO_EMPTY_CONTAINER = "defaultToEmptyContainer";
489489
public static final String DEFAULT_TO_EMPTY_CONTAINER_DESC = "Initialize containers (array/set/map) to empty containers instead of null by default. Usage: https://github.com/OpenAPITools/openapi-generator/blob/master/docs/customization.md#default-values";
490490

491-
// The raw enum values from the OpenAPI specification
492-
public static final String ENUM_VALUES = "values";
493-
// The map that stores all enum values and their metadata (name, value, enumDescription...)
494-
public static final String ENUM_VARS = "enumVars";
495-
// The name of the enum, for example NAME("value") in Java
496-
public static final String ENUM_NAME = "name";
497-
// The on-the-line value, i.e., the one present in the "values"
498-
public static final String ENUM_VALUE = "value";
499-
// If the enum is typed as a string
500-
public static final String ENUM_IS_STRING = "isString";
501-
// The description that should be attached to an entry in "enumVars"
502-
public static final String ENUM_DESCRIPTION = "enumDescription";
503-
504491
// Vendor extensions
505492
public static final String X_EXAMPLE = "x-example";
506493
public static final String X_INTERNAL = "x-internal";

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

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
import org.openapitools.codegen.model.ModelsMap;
6464
import org.openapitools.codegen.model.OperationsMap;
6565
import org.openapitools.codegen.model.WebhooksMap;
66+
import org.openapitools.codegen.model.EnumVarMap;
6667
import org.openapitools.codegen.serializer.SerializerUtils;
6768
import org.openapitools.codegen.templating.MustacheEngineAdapter;
6869
import org.openapitools.codegen.templating.mustache.*;
@@ -92,6 +93,7 @@
9293
import java.util.stream.Stream;
9394

9495
import static org.openapitools.codegen.CodegenConstants.*;
96+
import static org.openapitools.codegen.model.EnumVarMap.*;
9597
import static org.openapitools.codegen.utils.CamelizeOption.LOWERCASE_FIRST_LETTER;
9698
import static org.openapitools.codegen.utils.DiscriminatorUtils.*;
9799
import static org.openapitools.codegen.utils.EnumUtils.*;
@@ -901,7 +903,7 @@ public ModelsMap postProcessModelsEnum(ModelsMap objs) {
901903
// for enum model
902904
if (cm.isEnum && cm.allowableValues != null) {
903905
List<Object> values = getEnumValues(cm.allowableValues);
904-
List<Map<String, Object>> enumVars = buildEnumVars(values, cm.dataType);
906+
List<EnumVarMap> enumVars = buildEnumVars(values, cm.dataType);
905907
postProcessEnumVars(enumVars);
906908
// if "x-enum-varnames" or "x-enum-descriptions" defined, update varnames
907909
updateEnumVarsWithExtensions(enumVars, cm.getVendorExtensions(), cm.dataType);
@@ -7008,7 +7010,7 @@ public void setParameterBooleanFlagWithCodegenProperty(CodegenParameter paramete
70087010
}
70097011

70107012
/**
7011-
* Update codegen property's enum by adding {@value CodegenConstants#ENUM_VARS} (with name and value)
7013+
* Update codegen property's enum by adding {@value EnumVarMap#ENUM_VARS} (with name and value)
70127014
*
70137015
* @param var list of CodegenProperty
70147016
*/
@@ -7035,7 +7037,7 @@ public void updateCodegenPropertyEnum(CodegenProperty var) {
70357037
.map(Map.Entry::getValue)
70367038
.findFirst();
70377039
String dataType = (referencedSchema.isPresent()) ? getTypeDeclaration(referencedSchema.get()) : varDataType;
7038-
List<Map<String, Object>> enumVars = buildEnumVars(values, dataType);
7040+
List<EnumVarMap> enumVars = buildEnumVars(values, dataType);
70397041
postProcessEnumVars(enumVars);
70407042

70417043
// if "x-enum-varnames" or "x-enum-descriptions" defined, update varnames
@@ -7051,9 +7053,9 @@ public void updateCodegenPropertyEnum(CodegenProperty var) {
70517053
final String enumDefaultValue = getEnumDefaultValue(var.defaultValue, dataType);
70527054

70537055
String enumName = null;
7054-
for (Map<String, Object> enumVar : enumVars) {
7055-
if (enumDefaultValue.equals(enumVar.get(ENUM_VALUE))) {
7056-
enumName = (String) enumVar.get(ENUM_NAME);
7056+
for (EnumVarMap enumVar : enumVars) {
7057+
if (enumDefaultValue.equals(enumVar.getEnumValue())) {
7058+
enumName = (String) enumVar.getEnumName();
70577059
break;
70587060
}
70597061
}
@@ -7073,8 +7075,8 @@ protected String getEnumDefaultValue(String defaultValue, String dataType) {
70737075
return enumDefaultValue;
70747076
}
70757077

7076-
protected List<Map<String, Object>> buildEnumVars(List<Object> values, String dataType) {
7077-
List<Map<String, Object>> enumVars = new ArrayList<>();
7078+
protected List<EnumVarMap> buildEnumVars(List<Object> values, String dataType) {
7079+
List<EnumVarMap> enumVars = new ArrayList<>();
70787080
int truncateIdx = isRemoveEnumValuePrefix()
70797081
? findCommonPrefixOfVars(values).length()
70807082
: 0;
@@ -7085,7 +7087,7 @@ protected List<Map<String, Object>> buildEnumVars(List<Object> values, String da
70857087
// attributes, not actual enum values, so we remove them here
70867088
continue;
70877089
}
7088-
Map<String, Object> enumVar = new HashMap<>();
7090+
EnumVarMap enumVar = new EnumVarMap();
70897091
String enumName = truncateIdx == 0
70907092
? String.valueOf(value)
70917093
: value.toString().substring(truncateIdx);
@@ -7096,9 +7098,7 @@ protected List<Map<String, Object>> buildEnumVars(List<Object> values, String da
70967098

70977099
final String finalEnumName = toEnumVarName(enumName, dataType);
70987100

7099-
enumVar.put(ENUM_NAME, finalEnumName);
7100-
enumVar.put(ENUM_VALUE, toEnumValue(String.valueOf(value), dataType));
7101-
enumVar.put(ENUM_IS_STRING, isDataTypeString(dataType));
7101+
enumVar.enumVar(finalEnumName, toEnumValue(String.valueOf(value), dataType), isDataTypeString(dataType));
71027102
// TODO: add isNumeric
71037103
enumVars.add(enumVar);
71047104
}
@@ -7117,8 +7117,8 @@ protected List<Map<String, Object>> buildEnumVars(List<Object> values, String da
71177117
* @param enumVars the enumVars
71187118
* @param dataType the data type of the enum parameter
71197119
*/
7120-
private void injectEnumUnknownDefaultCase(List<Map<String, Object>> enumVars, String dataType) {
7121-
Map<String, Object> enumVar = new HashMap<>();
7120+
private void injectEnumUnknownDefaultCase(List<EnumVarMap> enumVars, String dataType) {
7121+
EnumVarMap enumVar = new EnumVarMap();
71227122
String enumName = enumUnknownDefaultCaseName;
71237123

71247124
String enumValue = isDataTypeString(dataType)
@@ -7131,9 +7131,7 @@ private void injectEnumUnknownDefaultCase(List<Map<String, Object>> enumVars, St
71317131
// https://github.com/OpenAPITools/openapi-generator/pull/11013
71327132
String.valueOf(11184809);
71337133

7134-
enumVar.put(ENUM_NAME, toEnumVarName(enumName, dataType));
7135-
enumVar.put(ENUM_VALUE, toEnumValue(enumValue, dataType));
7136-
enumVar.put(ENUM_IS_STRING, isDataTypeString(dataType));
7134+
enumVar.enumVar(toEnumVarName(enumName, dataType), toEnumValue(enumValue, dataType), isDataTypeString(dataType));
71377135
// TODO: add isNumeric
71387136
enumVars.add(enumVar);
71397137
}
@@ -7148,31 +7146,31 @@ private void injectEnumUnknownDefaultCase(List<Map<String, Object>> enumVars, St
71487146
protected void removeEnumUnknownDefaultCase(CodegenOperation operation) {
71497147
for (CodegenParameter param : operation.allParams) {
71507148
if (!param.isBodyParam && param.isEnum && hasEnumVars(param.allowableValues)) {
7151-
List<Map<String, Object>> enumVars = getEnumVars(param.allowableValues);
7149+
List<EnumVarMap> enumVars = getEnumVars(param.allowableValues);
71527150
if (enumVars != null) {
71537151
String unknownName = toEnumVarName(enumUnknownDefaultCaseName, param.dataType);
7154-
enumVars.removeIf(ev -> unknownName.equals(ev.get(ENUM_NAME)));
7152+
enumVars.removeIf(ev -> unknownName.equals(ev.getEnumName()));
71557153
}
71567154
}
71577155
}
71587156
}
71597157

7160-
protected void postProcessEnumVars(List<Map<String, Object>> enumVars) {
7158+
protected void postProcessEnumVars(List<EnumVarMap> enumVars) {
71617159
Collections.reverse(enumVars);
71627160
enumVars.forEach(v -> {
7163-
String name = (String) v.get(ENUM_NAME);
7164-
long count = enumVars.stream().filter(v1 -> v1.get(ENUM_NAME).equals(name)).count();
7161+
String name = (String) v.getEnumName();
7162+
long count = enumVars.stream().filter(v1 -> v1.getEnumName().equals(name)).count();
71657163
if (count > 1) {
71667164
String uniqueEnumName = getUniqueEnumName(name, enumVars);
7167-
LOGGER.debug("Changing duplicate enumeration name from {} to {}", v.get(ENUM_NAME), uniqueEnumName);
7168-
v.put(ENUM_NAME, uniqueEnumName);
7165+
LOGGER.debug("Changing duplicate enumeration name from {} to {}", v.getEnumName(), uniqueEnumName);
7166+
v.setEnumName(uniqueEnumName);
71697167
}
71707168
});
71717169
Collections.reverse(enumVars);
71727170
}
71737171

7174-
private String getUniqueEnumName(String name, List<Map<String, Object>> enumVars) {
7175-
long count = enumVars.stream().filter(v -> v.get(ENUM_NAME).equals(name)).count();
7172+
private String getUniqueEnumName(String name, List<EnumVarMap> enumVars) {
7173+
long count = enumVars.stream().filter(v -> v.getEnumName().equals(name)).count();
71767174
return count > 1
71777175
? getUniqueEnumName(name + count, enumVars)
71787176
: name;
@@ -7185,7 +7183,7 @@ private String getUniqueEnumName(String name, List<Map<String, Object>> enumVars
71857183
* @param vendorExtensions vendor extensions
71867184
* @param dataType data type
71877185
*/
7188-
protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions, String dataType) {
7186+
protected void updateEnumVarsWithExtensions(List<EnumVarMap> enumVars, Map<String, Object> vendorExtensions, String dataType) {
71897187
if (vendorExtensions != null) {
71907188
updateEnumVarsWithExtensions(enumVars, vendorExtensions, X_ENUM_VARNAMES, ENUM_NAME, dataType);
71917189
updateEnumVarsWithExtensions(enumVars, vendorExtensions, X_ENUM_DESCRIPTIONS, ENUM_DESCRIPTION, dataType);
@@ -7201,7 +7199,7 @@ protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars,
72017199
* @param key key
72027200
* @param dataType data type
72037201
*/
7204-
protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions, String extensionKey, String key, String dataType) {
7202+
protected void updateEnumVarsWithExtensions(List<EnumVarMap> enumVars, Map<String, Object> vendorExtensions, String extensionKey, String key, String dataType) {
72057203
updateEnumVarsWithExtensions(enumVars, vendorExtensions, extensionKey, key, dataType, (a, b) -> a);
72067204
}
72077205

@@ -7214,7 +7212,7 @@ protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars,
72147212
* @param dataType data type
72157213
* @param enumDataTypeMapping functions that accepts 2 arguments
72167214
*/
7217-
protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars,
7215+
protected void updateEnumVarsWithExtensions(List<EnumVarMap> enumVars,
72187216
Map<String, Object> vendorExtensions,
72197217
String extensionKey,
72207218
String key,
@@ -7230,8 +7228,8 @@ protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars,
72307228
}
72317229
} else if (extensionValue instanceof Map) {
72327230
Map<String, String> valueMap = (Map<String, String>) extensionValue;
7233-
for (Map<String, Object> enumVar : enumVars) {
7234-
String enumValue = (String) enumVar.get(ENUM_VALUE);
7231+
for (EnumVarMap enumVar : enumVars) {
7232+
String enumValue = (String) enumVar.getEnumValue();
72357233
for (Map.Entry<String, String> entry : valueMap.entrySet()) {
72367234
if (toEnumValue(entry.getKey(), dataType).equals(enumValue)) {
72377235
enumVar.put(key, enumDataTypeMapping.apply(entry.getValue(), dataType));

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.openapitools.codegen.model.OperationMap;
3333
import org.openapitools.codegen.model.OperationsMap;
3434
import org.openapitools.codegen.model.WebhooksMap;
35+
import org.openapitools.codegen.model.EnumVarMap;
3536
import org.openapitools.codegen.templating.mustache.*;
3637
import org.openapitools.codegen.templating.mustache.CopyLambda.CopyContent;
3738
import org.openapitools.codegen.templating.mustache.CopyLambda.WhiteSpaceStrategy;
@@ -899,15 +900,15 @@ protected void patchProperty(Map<String, CodegenModel> enumRefs, CodegenModel mo
899900
}
900901

901902
@Override
902-
protected List<Map<String, Object>> buildEnumVars(List<Object> values, String dataType) {
903-
List<Map<String, Object>> enumVars = super.buildEnumVars(values, dataType);
903+
protected List<EnumVarMap> buildEnumVars(List<Object> values, String dataType) {
904+
List<EnumVarMap> enumVars = super.buildEnumVars(values, dataType);
904905

905906
// this is needed for enumRefs like OuterEnum marked as nullable and also have string values
906907
// keep isString true so that the index will be used as the enum value instead of a string
907908
// this is inline with C# enums with string values
908909
if ("string?".equals(dataType)) {
909910
enumVars.forEach((enumVar) -> {
910-
enumVar.put(ENUM_IS_STRING, true);
911+
enumVar.isString(true);
911912
});
912913
}
913914

@@ -920,7 +921,7 @@ protected List<Map<String, Object>> buildEnumVars(List<Object> values, String da
920921
}
921922

922923
/**
923-
* Update codegen property's enum by adding {@value CodegenConstants#ENUM_VARS} (with name and value)
924+
* Update codegen property's enum by adding {@value EnumVarMap#ENUM_VARS} (with name and value)
924925
*
925926
* @param var list of CodegenProperty
926927
*/

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.apache.commons.lang3.StringUtils;
1414
import org.openapitools.codegen.*;
1515
import org.openapitools.codegen.meta.features.*;
16+
import org.openapitools.codegen.model.EnumVarMap;
1617
import org.openapitools.codegen.model.ModelMap;
1718
import org.openapitools.codegen.model.ModelsMap;
1819
import org.openapitools.codegen.model.OperationMap;
@@ -28,7 +29,7 @@
2829
import java.util.*;
2930
import java.util.stream.Stream;
3031

31-
import static org.openapitools.codegen.CodegenConstants.*;
32+
import static org.openapitools.codegen.model.EnumVarMap.*;
3233
import static org.openapitools.codegen.utils.CamelizeOption.LOWERCASE_FIRST_LETTER;
3334
import static org.openapitools.codegen.utils.EnumUtils.BUNGIE_X_ENUM_VALUES;
3435
import static org.openapitools.codegen.utils.EnumUtils.getBungieEnumValues;
@@ -860,7 +861,7 @@ private List<Map<String, String>> prioritizeContentTypes(List<Map<String, String
860861
}
861862

862863
@Override
863-
protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions, String dataType) {
864+
protected void updateEnumVarsWithExtensions(List<EnumVarMap> enumVars, Map<String, Object> vendorExtensions, String dataType) {
864865
if (vendorExtensions != null && useEnumExtension && vendorExtensions.containsKey(BUNGIE_X_ENUM_VALUES)) {
865866
// Use the x-enum-values extension for this enum
866867
// Existing enumVars added by the default handling need to be removed first
@@ -870,10 +871,8 @@ protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars,
870871

871872
boolean isString = isDataTypeString(dataType);
872873
for (Map<String, String> value : bungieEnumValues) {
873-
Map<String, Object> enumVar = new HashMap<>(value);
874-
enumVar.put(ENUM_NAME, toEnumVarName(value.get(ENUM_NAME), dataType));
875-
enumVar.put(ENUM_VALUE, toEnumValue(value.get(ENUM_VALUE), dataType));
876-
enumVar.put(ENUM_IS_STRING, isString);
874+
EnumVarMap enumVar = new EnumVarMap(value);
875+
enumVar.enumVar(toEnumVarName(value.get(ENUM_NAME), dataType), toEnumValue(value.get(ENUM_VALUE), dataType), isString);
877876
enumVars.add(enumVar);
878877
}
879878
} else {

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

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.apache.commons.io.FilenameUtils;
2626
import org.apache.commons.lang3.StringUtils;
2727
import org.openapitools.codegen.*;
28+
import org.openapitools.codegen.model.EnumVarMap;
2829
import org.openapitools.codegen.model.ModelMap;
2930
import org.openapitools.codegen.model.ModelsMap;
3031
import org.openapitools.codegen.model.OperationMap;
@@ -39,6 +40,7 @@
3940

4041
import static org.openapitools.codegen.CodegenConstants.X_ENUM_BYTE;
4142
import static org.openapitools.codegen.CodegenConstants.X_EXAMPLE;
43+
import static org.openapitools.codegen.model.EnumVarMap.ENUM_VARS;
4244
import static org.openapitools.codegen.utils.CamelizeOption.LOWERCASE_FIRST_LETTER;
4345
import static org.openapitools.codegen.utils.EnumUtils.getEnumVars;
4446
import static org.openapitools.codegen.utils.StringUtils.camelize;
@@ -450,12 +452,12 @@ private void postProcessEnumRefs(final Map<String, ModelsMap> models) {
450452

451453
// Since we iterate enumVars for modelInnerEnum and enumClass templates, and CodegenModel is missing some of CodegenProperty's properties,
452454
// we can take advantage of Mustache's contextual lookup to add the same "properties" to the model's enumVars scope rather than CodegenProperty's scope.
453-
List<Map<String, Object>> enumVars = getEnumVars(model.allowableValues);
454-
List<Map<String, Object>> newEnumVars = new ArrayList<>();
455-
for (Map<String, Object> enumVar : enumVars) {
456-
Map<String, Object> mixedVars = new HashMap<>(enumVar);
455+
List<EnumVarMap> enumVars = getEnumVars(model.allowableValues);
456+
List<EnumVarMap> newEnumVars = new ArrayList<>();
457+
for (EnumVarMap enumVar : enumVars) {
458+
EnumVarMap mixedVars = new EnumVarMap(enumVar);
457459

458-
mixedVars.put(ENUM_IS_STRING, isString);
460+
mixedVars.isString(isString);
459461
mixedVars.put("isLong", isLong);
460462
mixedVars.put("isInteger", isInteger);
461463
mixedVars.put("isByte", isByte);
@@ -474,7 +476,7 @@ private void postProcessEnumRefs(final Map<String, ModelsMap> models) {
474476
}
475477

476478
/**
477-
* Update codegen property's enum by adding {@value CodegenConstants#ENUM_VARS} (with name and value)
479+
* Update codegen property's enum by adding {@value EnumVarMap#ENUM_VARS} (with name and value)
478480
*
479481
* @param var list of CodegenProperty
480482
*/

0 commit comments

Comments
 (0)