Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -488,19 +488,6 @@ public static enum ENUM_PROPERTY_NAMING_TYPE {camelCase, PascalCase, snake_case,
public static final String DEFAULT_TO_EMPTY_CONTAINER = "defaultToEmptyContainer";
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";

// The raw enum values from the OpenAPI specification
public static final String ENUM_VALUES = "values";
// The map that stores all enum values and their metadata (name, value, enumDescription...)
public static final String ENUM_VARS = "enumVars";
// The name of the enum, for example NAME("value") in Java
public static final String ENUM_NAME = "name";
// The on-the-line value, i.e., the one present in the "values"
public static final String ENUM_VALUE = "value";
// If the enum is typed as a string
public static final String ENUM_IS_STRING = "isString";
// The description that should be attached to an entry in "enumVars"
public static final String ENUM_DESCRIPTION = "enumDescription";

// Vendor extensions
public static final String X_EXAMPLE = "x-example";
public static final String X_INTERNAL = "x-internal";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
import org.openapitools.codegen.model.ModelsMap;
import org.openapitools.codegen.model.OperationsMap;
import org.openapitools.codegen.model.WebhooksMap;
import org.openapitools.codegen.model.EnumVarMap;
import org.openapitools.codegen.serializer.SerializerUtils;
import org.openapitools.codegen.templating.MustacheEngineAdapter;
import org.openapitools.codegen.templating.mustache.*;
Expand Down Expand Up @@ -92,6 +93,7 @@
import java.util.stream.Stream;

import static org.openapitools.codegen.CodegenConstants.*;
import static org.openapitools.codegen.model.EnumVarMap.*;
import static org.openapitools.codegen.utils.CamelizeOption.LOWERCASE_FIRST_LETTER;
import static org.openapitools.codegen.utils.DiscriminatorUtils.*;
import static org.openapitools.codegen.utils.EnumUtils.*;
Expand Down Expand Up @@ -901,7 +903,7 @@ public ModelsMap postProcessModelsEnum(ModelsMap objs) {
// for enum model
if (cm.isEnum && cm.allowableValues != null) {
List<Object> values = getEnumValues(cm.allowableValues);
List<Map<String, Object>> enumVars = buildEnumVars(values, cm.dataType);
List<EnumVarMap> enumVars = buildEnumVars(values, cm.dataType);
postProcessEnumVars(enumVars);
// if "x-enum-varnames" or "x-enum-descriptions" defined, update varnames
updateEnumVarsWithExtensions(enumVars, cm.getVendorExtensions(), cm.dataType);
Expand Down Expand Up @@ -7008,7 +7010,7 @@ public void setParameterBooleanFlagWithCodegenProperty(CodegenParameter paramete
}

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

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

String enumName = null;
for (Map<String, Object> enumVar : enumVars) {
if (enumDefaultValue.equals(enumVar.get(ENUM_VALUE))) {
enumName = (String) enumVar.get(ENUM_NAME);
for (EnumVarMap enumVar : enumVars) {
if (enumDefaultValue.equals(enumVar.getEnumValue())) {
enumName = (String) enumVar.getEnumName();
break;
}
}
Expand All @@ -7073,8 +7075,8 @@ protected String getEnumDefaultValue(String defaultValue, String dataType) {
return enumDefaultValue;
}

protected List<Map<String, Object>> buildEnumVars(List<Object> values, String dataType) {
List<Map<String, Object>> enumVars = new ArrayList<>();
protected List<EnumVarMap> buildEnumVars(List<Object> values, String dataType) {
List<EnumVarMap> enumVars = new ArrayList<>();
int truncateIdx = isRemoveEnumValuePrefix()
? findCommonPrefixOfVars(values).length()
: 0;
Expand All @@ -7085,7 +7087,7 @@ protected List<Map<String, Object>> buildEnumVars(List<Object> values, String da
// attributes, not actual enum values, so we remove them here
continue;
}
Map<String, Object> enumVar = new HashMap<>();
EnumVarMap enumVar = new EnumVarMap();
String enumName = truncateIdx == 0
? String.valueOf(value)
: value.toString().substring(truncateIdx);
Expand All @@ -7096,9 +7098,7 @@ protected List<Map<String, Object>> buildEnumVars(List<Object> values, String da

final String finalEnumName = toEnumVarName(enumName, dataType);

enumVar.put(ENUM_NAME, finalEnumName);
enumVar.put(ENUM_VALUE, toEnumValue(String.valueOf(value), dataType));
enumVar.put(ENUM_IS_STRING, isDataTypeString(dataType));
enumVar.enumVar(finalEnumName, toEnumValue(String.valueOf(value), dataType), isDataTypeString(dataType));
// TODO: add isNumeric
enumVars.add(enumVar);
}
Expand All @@ -7117,8 +7117,8 @@ protected List<Map<String, Object>> buildEnumVars(List<Object> values, String da
* @param enumVars the enumVars
* @param dataType the data type of the enum parameter
*/
private void injectEnumUnknownDefaultCase(List<Map<String, Object>> enumVars, String dataType) {
Map<String, Object> enumVar = new HashMap<>();
private void injectEnumUnknownDefaultCase(List<EnumVarMap> enumVars, String dataType) {
EnumVarMap enumVar = new EnumVarMap();
String enumName = enumUnknownDefaultCaseName;

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

enumVar.put(ENUM_NAME, toEnumVarName(enumName, dataType));
enumVar.put(ENUM_VALUE, toEnumValue(enumValue, dataType));
enumVar.put(ENUM_IS_STRING, isDataTypeString(dataType));
enumVar.enumVar(toEnumVarName(enumName, dataType), toEnumValue(enumValue, dataType), isDataTypeString(dataType));
// TODO: add isNumeric
enumVars.add(enumVar);
}
Expand All @@ -7148,31 +7146,31 @@ private void injectEnumUnknownDefaultCase(List<Map<String, Object>> enumVars, St
protected void removeEnumUnknownDefaultCase(CodegenOperation operation) {
for (CodegenParameter param : operation.allParams) {
if (!param.isBodyParam && param.isEnum && hasEnumVars(param.allowableValues)) {
List<Map<String, Object>> enumVars = getEnumVars(param.allowableValues);
List<EnumVarMap> enumVars = getEnumVars(param.allowableValues);
if (enumVars != null) {
String unknownName = toEnumVarName(enumUnknownDefaultCaseName, param.dataType);
enumVars.removeIf(ev -> unknownName.equals(ev.get(ENUM_NAME)));
enumVars.removeIf(ev -> unknownName.equals(ev.getEnumName()));
}
}
}
}

protected void postProcessEnumVars(List<Map<String, Object>> enumVars) {
protected void postProcessEnumVars(List<EnumVarMap> enumVars) {
Collections.reverse(enumVars);
enumVars.forEach(v -> {
String name = (String) v.get(ENUM_NAME);
long count = enumVars.stream().filter(v1 -> v1.get(ENUM_NAME).equals(name)).count();
String name = (String) v.getEnumName();
long count = enumVars.stream().filter(v1 -> v1.getEnumName().equals(name)).count();
if (count > 1) {
String uniqueEnumName = getUniqueEnumName(name, enumVars);
LOGGER.debug("Changing duplicate enumeration name from {} to {}", v.get(ENUM_NAME), uniqueEnumName);
v.put(ENUM_NAME, uniqueEnumName);
LOGGER.debug("Changing duplicate enumeration name from {} to {}", v.getEnumName(), uniqueEnumName);
v.setEnumName(uniqueEnumName);
}
});
Collections.reverse(enumVars);
}

private String getUniqueEnumName(String name, List<Map<String, Object>> enumVars) {
long count = enumVars.stream().filter(v -> v.get(ENUM_NAME).equals(name)).count();
private String getUniqueEnumName(String name, List<EnumVarMap> enumVars) {
long count = enumVars.stream().filter(v -> v.getEnumName().equals(name)).count();
return count > 1
? getUniqueEnumName(name + count, enumVars)
: name;
Expand All @@ -7185,7 +7183,7 @@ private String getUniqueEnumName(String name, List<Map<String, Object>> enumVars
* @param vendorExtensions vendor extensions
* @param dataType data type
*/
protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions, String dataType) {
protected void updateEnumVarsWithExtensions(List<EnumVarMap> enumVars, Map<String, Object> vendorExtensions, String dataType) {
if (vendorExtensions != null) {
updateEnumVarsWithExtensions(enumVars, vendorExtensions, X_ENUM_VARNAMES, ENUM_NAME, dataType);
updateEnumVarsWithExtensions(enumVars, vendorExtensions, X_ENUM_DESCRIPTIONS, ENUM_DESCRIPTION, dataType);
Expand All @@ -7201,7 +7199,7 @@ protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars,
* @param key key
* @param dataType data type
*/
protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions, String extensionKey, String key, String dataType) {
protected void updateEnumVarsWithExtensions(List<EnumVarMap> enumVars, Map<String, Object> vendorExtensions, String extensionKey, String key, String dataType) {
updateEnumVarsWithExtensions(enumVars, vendorExtensions, extensionKey, key, dataType, (a, b) -> a);
}

Expand All @@ -7214,7 +7212,7 @@ protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars,
* @param dataType data type
* @param enumDataTypeMapping functions that accepts 2 arguments
*/
protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars,
protected void updateEnumVarsWithExtensions(List<EnumVarMap> enumVars,
Map<String, Object> vendorExtensions,
String extensionKey,
String key,
Expand All @@ -7230,8 +7228,8 @@ protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars,
}
} else if (extensionValue instanceof Map) {
Map<String, String> valueMap = (Map<String, String>) extensionValue;
for (Map<String, Object> enumVar : enumVars) {
String enumValue = (String) enumVar.get(ENUM_VALUE);
for (EnumVarMap enumVar : enumVars) {
String enumValue = (String) enumVar.getEnumValue();
for (Map.Entry<String, String> entry : valueMap.entrySet()) {
if (toEnumValue(entry.getKey(), dataType).equals(enumValue)) {
enumVar.put(key, enumDataTypeMapping.apply(entry.getValue(), dataType));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import org.openapitools.codegen.model.OperationMap;
import org.openapitools.codegen.model.OperationsMap;
import org.openapitools.codegen.model.WebhooksMap;
import org.openapitools.codegen.model.EnumVarMap;
import org.openapitools.codegen.templating.mustache.*;
import org.openapitools.codegen.templating.mustache.CopyLambda.CopyContent;
import org.openapitools.codegen.templating.mustache.CopyLambda.WhiteSpaceStrategy;
Expand Down Expand Up @@ -899,15 +900,15 @@ protected void patchProperty(Map<String, CodegenModel> enumRefs, CodegenModel mo
}

@Override
protected List<Map<String, Object>> buildEnumVars(List<Object> values, String dataType) {
List<Map<String, Object>> enumVars = super.buildEnumVars(values, dataType);
protected List<EnumVarMap> buildEnumVars(List<Object> values, String dataType) {
List<EnumVarMap> enumVars = super.buildEnumVars(values, dataType);

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

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

/**
* Update codegen property's enum by adding {@value CodegenConstants#ENUM_VARS} (with name and value)
* Update codegen property's enum by adding {@value EnumVarMap#ENUM_VARS} (with name and value)
*
* @param var list of CodegenProperty
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.apache.commons.lang3.StringUtils;
import org.openapitools.codegen.*;
import org.openapitools.codegen.meta.features.*;
import org.openapitools.codegen.model.EnumVarMap;
import org.openapitools.codegen.model.ModelMap;
import org.openapitools.codegen.model.ModelsMap;
import org.openapitools.codegen.model.OperationMap;
Expand All @@ -28,7 +29,7 @@
import java.util.*;
import java.util.stream.Stream;

import static org.openapitools.codegen.CodegenConstants.*;
import static org.openapitools.codegen.model.EnumVarMap.*;
import static org.openapitools.codegen.utils.CamelizeOption.LOWERCASE_FIRST_LETTER;
import static org.openapitools.codegen.utils.EnumUtils.BUNGIE_X_ENUM_VALUES;
import static org.openapitools.codegen.utils.EnumUtils.getBungieEnumValues;
Expand Down Expand Up @@ -860,7 +861,7 @@ private List<Map<String, String>> prioritizeContentTypes(List<Map<String, String
}

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

boolean isString = isDataTypeString(dataType);
for (Map<String, String> value : bungieEnumValues) {
Map<String, Object> enumVar = new HashMap<>(value);
enumVar.put(ENUM_NAME, toEnumVarName(value.get(ENUM_NAME), dataType));
enumVar.put(ENUM_VALUE, toEnumValue(value.get(ENUM_VALUE), dataType));
enumVar.put(ENUM_IS_STRING, isString);
EnumVarMap enumVar = new EnumVarMap(value);
enumVar.enumVar(toEnumVarName(value.get(ENUM_NAME), dataType), toEnumValue(value.get(ENUM_VALUE), dataType), isString);
enumVars.add(enumVar);
}
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.openapitools.codegen.*;
import org.openapitools.codegen.model.EnumVarMap;
import org.openapitools.codegen.model.ModelMap;
import org.openapitools.codegen.model.ModelsMap;
import org.openapitools.codegen.model.OperationMap;
Expand All @@ -37,11 +38,11 @@
import java.io.File;
import java.util.*;

import static org.openapitools.codegen.CodegenConstants.ENUM_VARS;
import static org.openapitools.codegen.CodegenConstants.X_ENUM_BYTE;
import static org.openapitools.codegen.CodegenConstants.X_EXAMPLE;
import static org.openapitools.codegen.model.EnumVarMap.ENUM_VARS;
import static org.openapitools.codegen.utils.CamelizeOption.LOWERCASE_FIRST_LETTER;
import static org.openapitools.codegen.utils.EnumUtils.getEnumVarsAsString;
import static org.openapitools.codegen.utils.EnumUtils.getEnumVars;
import static org.openapitools.codegen.utils.StringUtils.camelize;
import static org.openapitools.codegen.utils.StringUtils.underscore;

Expand Down Expand Up @@ -451,12 +452,12 @@ private void postProcessEnumRefs(final Map<String, ModelsMap> models) {

// Since we iterate enumVars for modelInnerEnum and enumClass templates, and CodegenModel is missing some of CodegenProperty's properties,
// 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.
List<Map<String, String>> enumVars = getEnumVarsAsString(model.allowableValues);
List<Map<String, Object>> newEnumVars = new ArrayList<>();
for (Map<String, String> enumVar : enumVars) {
Map<String, Object> mixedVars = new HashMap<>(enumVar);
List<EnumVarMap> enumVars = getEnumVars(model.allowableValues);
List<EnumVarMap> newEnumVars = new ArrayList<>();
for (EnumVarMap enumVar : enumVars) {
EnumVarMap mixedVars = new EnumVarMap(enumVar);

mixedVars.put("isString", isString);
mixedVars.isString(isString);
mixedVars.put("isLong", isLong);
mixedVars.put("isInteger", isInteger);
mixedVars.put("isByte", isByte);
Expand All @@ -475,7 +476,7 @@ private void postProcessEnumRefs(final Map<String, ModelsMap> models) {
}

/**
* Update codegen property's enum by adding {@value CodegenConstants#ENUM_VARS} (with name and value)
* Update codegen property's enum by adding {@value EnumVarMap#ENUM_VARS} (with name and value)
*
* @param var list of CodegenProperty
*/
Expand Down
Loading
Loading