Skip to content
Merged
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 @@ -288,4 +288,8 @@ public interface CodegenConfig {
FeatureSet getFeatureSet();

void setFeatureSet(FeatureSet featureSet);

boolean isRemoveEnumValuePrefix();

void setRemoveEnumValuePrefix(boolean removeEnumValuePrefix);
}
Original file line number Diff line number Diff line change
Expand Up @@ -342,4 +342,7 @@ public static enum ENUM_PROPERTY_NAMING_TYPE {camelCase, PascalCase, snake_case,

public static final String PACKAGE_TAGS = "packageTags";
public static final String PACKAGE_TAGS_DESC = "Tags to identify the package";

public static final String REMOVE_ENUM_VALUE_PREFIX = "removeEnumValuePrefix";
public static final String REMOVE_ENUM_VALUE_PREFIX_DESC = "Remove the common prefix of enum values";
}
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,8 @@ apiTemplateFiles are for API outputs only (controllers/handlers).

// acts strictly upon a spec, potentially modifying it to have consistent behavior across generators.
protected boolean strictSpecBehavior = true;
// flag to indicate whether enum value prefixes are removed
protected boolean removeEnumValuePrefix = true;

// make openapi available to all methods
protected OpenAPI openAPI;
Expand Down Expand Up @@ -276,6 +278,11 @@ public void processOpts() {
ModelUtils.setGenerateAliasAsModel(Boolean.valueOf(additionalProperties
.get(CodegenConstants.GENERATE_ALIAS_AS_MODEL).toString()));
}

if (additionalProperties.containsKey(CodegenConstants.REMOVE_ENUM_VALUE_PREFIX)) {
this.setRemoveEnumValuePrefix(Boolean.valueOf(additionalProperties
.get(CodegenConstants.REMOVE_ENUM_VALUE_PREFIX).toString()));
}
}

/***
Expand Down Expand Up @@ -480,25 +487,7 @@ public Map<String, Object> postProcessModelsEnum(Map<String, Object> objs) {
if (Boolean.TRUE.equals(cm.isEnum) && cm.allowableValues != null) {
Map<String, Object> allowableValues = cm.allowableValues;
List<Object> values = (List<Object>) allowableValues.get("values");
List<Map<String, Object>> enumVars = new ArrayList<Map<String, Object>>();
String commonPrefix = findCommonPrefixOfVars(values);
int truncateIdx = commonPrefix.length();
for (Object value : values) {
Map<String, Object> enumVar = new HashMap<String, Object>();
String enumName;
if (truncateIdx == 0) {
enumName = value.toString();
} else {
enumName = value.toString().substring(truncateIdx);
if ("".equals(enumName)) {
enumName = value.toString();
}
}
enumVar.put("name", toEnumVarName(enumName, cm.dataType));
enumVar.put("value", toEnumValue(value.toString(), cm.dataType));
enumVar.put("isString", isDataTypeString(cm.dataType));
enumVars.add(enumVar);
}
List<Map<String, Object>> enumVars = buildEnumVars(values, cm.dataType);
// if "x-enum-varnames" or "x-enum-descriptions" defined, update varnames
updateEnumVarsWithExtensions(enumVars, cm.getVendorExtensions());
cm.allowableValues.put("enumVars", enumVars);
Expand Down Expand Up @@ -4572,28 +4561,8 @@ 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);

// put "enumVars" map into `allowableValues", including `name` and `value`
List<Map<String, Object>> enumVars = new ArrayList<>();
String commonPrefix = findCommonPrefixOfVars(values);
int truncateIdx = commonPrefix.length();
for (Object value : values) {
Map<String, Object> enumVar = new HashMap<>();
String enumName;
if (truncateIdx == 0) {
enumName = value.toString();
} else {
enumName = value.toString().substring(truncateIdx);
if ("".equals(enumName)) {
enumName = value.toString();
}
}

enumVar.put("name", toEnumVarName(enumName, dataType));
enumVar.put("value", toEnumValue(value.toString(), dataType));
enumVar.put("isString", isDataTypeString(dataType));
enumVars.add(enumVar);
}
// if "x-enum-varnames" or "x-enum-descriptions" defined, update varnames
Map<String, Object> extensions = var.mostInnerItems != null ? var.mostInnerItems.getVendorExtensions() : var.getVendorExtensions();
if (referencedSchema.isPresent()) {
Expand Down Expand Up @@ -4623,6 +4592,34 @@ public void updateCodegenPropertyEnum(CodegenProperty var) {
}
}

protected List<Map<String, Object>> buildEnumVars(List<Object> values, String dataType) {
List<Map<String, Object>> enumVars = new ArrayList<>();
int truncateIdx = 0;
if (isRemoveEnumValuePrefix()) {
String commonPrefix = findCommonPrefixOfVars(values);
truncateIdx = commonPrefix.length();
}
for (Object value : values) {
Map<String, Object> enumVar = new HashMap<>();
String enumName;
if (truncateIdx == 0) {
enumName = value.toString();
}
else {
enumName = value.toString().substring(truncateIdx);
if ("".equals(enumName)) {
enumName = value.toString();
}
}

enumVar.put("name", toEnumVarName(enumName, dataType));
enumVar.put("value", toEnumValue(value.toString(), dataType));
enumVar.put("isString", isDataTypeString(dataType));
enumVars.add(enumVar);
}
return enumVars;
}

protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions) {
if (vendorExtensions != null) {
updateEnumVarsWithExtensions(enumVars, vendorExtensions, "x-enum-varnames", "name");
Expand Down Expand Up @@ -5519,4 +5516,22 @@ public FeatureSet getFeatureSet() {
public void setFeatureSet(final FeatureSet featureSet) {
this.featureSet = featureSet == null ? DefaultFeatureSet : featureSet;
}
}

/**
* Get the boolean value indicating whether to remove enum value prefixes
*/
@Override
public boolean isRemoveEnumValuePrefix() {
return this.removeEnumValuePrefix;
}

/**
* Set the boolean value indicating whether to remove enum value prefixes
*
* @param removeEnumValuePrefix true to enable enum value prefix removal
*/
@Override
public void setRemoveEnumValuePrefix(final boolean removeEnumValuePrefix) {
this.removeEnumValuePrefix = removeEnumValuePrefix;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -469,25 +469,7 @@ private boolean buildEnumFromValues(CodegenModel cm) {
}
Map<String, Object> allowableValues = cm.allowableValues;
List<Object> values = (List<Object>) allowableValues.get("values");
List<Map<String, String>> enumVars =
new ArrayList<Map<String, String>>();
String commonPrefix = findCommonPrefixOfVars(values);
int truncateIdx = commonPrefix.length();
for (Object value : values) {
Map<String, String> enumVar = new HashMap<String, String>();
String enumName;
if (truncateIdx == 0) {
enumName = value.toString();
} else {
enumName = value.toString().substring(truncateIdx);
if ("".equals(enumName)) {
enumName = value.toString();
}
}
enumVar.put("name", toEnumVarName(enumName, cm.dataType));
enumVar.put("value", toEnumValue(value.toString(), cm.dataType));
enumVars.add(enumVar);
}
List<Map<String, Object>> enumVars = buildEnumVars(values, cm.dataType);
cm.allowableValues.put("enumVars", enumVars);
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -463,26 +463,8 @@ public void updateCodegenPropertyEnum(CodegenProperty var) {
String dataType = (referencedSchema.isPresent()) ? getTypeDeclaration(referencedSchema.get()) : varDataType;

// put "enumVars" map into `allowableValues", including `name` and `value`
List<Map<String, Object>> enumVars = new ArrayList<>();
String commonPrefix = findCommonPrefixOfVars(values);
int truncateIdx = commonPrefix.length();
for (Object value : values) {
Map<String, Object> enumVar = new HashMap<>();
String enumName;
if (truncateIdx == 0) {
enumName = value.toString();
} else {
enumName = value.toString().substring(truncateIdx);
if ("".equals(enumName)) {
enumName = value.toString();
}
}
List<Map<String, Object>> enumVars = buildEnumVars(values, dataType);

enumVar.put("name", toEnumVarName(enumName, dataType));
enumVar.put("value", toEnumValue(value.toString(), dataType));
enumVar.put("isString", isDataTypeString(dataType));
enumVars.add(enumVar);
}
// if "x-enum-varnames" or "x-enum-descriptions" defined, update varnames
Map<String, Object> extensions = var.mostInnerItems != null ? var.mostInnerItems.getVendorExtensions() : var.getVendorExtensions();
if (referencedSchema.isPresent()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -388,6 +388,79 @@ public void updateCodegenPropertyEnumWithExtention() {
}
}

@Test
public void updateCodegenPropertyEnumWithPrefixRemoved() {
final DefaultCodegen codegen = new DefaultCodegen();
CodegenProperty enumProperty = codegenProperty(Arrays.asList("animal_dog", "animal_cat"));

codegen.updateCodegenPropertyEnum(enumProperty);

List<Map<String, Object>> enumVars = (List<Map<String, Object>>) enumProperty.getItems().getAllowableValues().get("enumVars");
Assert.assertNotNull(enumVars);
Assert.assertNotNull(enumVars.get(0));
Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "DOG");
Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"animal_dog\"");
Assert.assertNotNull(enumVars.get(1));
Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "CAT");
Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"animal_cat\"");
}

@Test
public void updateCodegenPropertyEnumWithoutPrefixRemoved() {
final DefaultCodegen codegen = new DefaultCodegen();
codegen.setRemoveEnumValuePrefix(false);

CodegenProperty enumProperty = codegenProperty(Arrays.asList("animal_dog", "animal_cat"));

codegen.updateCodegenPropertyEnum(enumProperty);

List<Map<String, Object>> enumVars = (List<Map<String, Object>>) enumProperty.getItems().getAllowableValues().get("enumVars");
Assert.assertNotNull(enumVars);
Assert.assertNotNull(enumVars.get(0));
Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "ANIMAL_DOG");
Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"animal_dog\"");
Assert.assertNotNull(enumVars.get(1));
Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "ANIMAL_CAT");
Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"animal_cat\"");
}

@Test
public void postProcessModelsEnumWithPrefixRemoved() {
final DefaultCodegen codegen = new DefaultCodegen();
Map<String, Object> objs = codegenModel(Arrays.asList("animal_dog", "animal_cat"));
CodegenModel cm = (CodegenModel) ((Map<String, Object>) ((List<Object>) objs.get("models")).get(0)).get("model");

codegen.postProcessModelsEnum(objs);

List<Map<String, Object>> enumVars = (List<Map<String, Object>>) cm.getAllowableValues().get("enumVars");
Assert.assertNotNull(enumVars);
Assert.assertNotNull(enumVars.get(0));
Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "DOG");
Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"animal_dog\"");
Assert.assertNotNull(enumVars.get(1));
Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "CAT");
Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"animal_cat\"");
}

@Test
public void postProcessModelsEnumWithoutPrefixRemoved() {
final DefaultCodegen codegen = new DefaultCodegen();
codegen.setRemoveEnumValuePrefix(false);
Map<String, Object> objs = codegenModel(Arrays.asList("animal_dog", "animal_cat"));
CodegenModel cm = (CodegenModel) ((Map<String, Object>) ((List<Object>) objs.get("models")).get(0)).get("model");

codegen.postProcessModelsEnum(objs);

List<Map<String, Object>> enumVars = (List<Map<String, Object>>) cm.getAllowableValues().get("enumVars");
Assert.assertNotNull(enumVars);
Assert.assertNotNull(enumVars.get(0));
Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "ANIMAL_DOG");
Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"animal_dog\"");
Assert.assertNotNull(enumVars.get(1));
Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "ANIMAL_CAT");
Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"animal_cat\"");
}

@Test
public void postProcessModelsEnumWithExtention() {
final DefaultCodegen codegen = new DefaultCodegen();
Expand Down Expand Up @@ -879,6 +952,19 @@ private CodegenProperty codegenPropertyWithArrayOfIntegerValues() {
return array;
}

private CodegenProperty codegenProperty(List<String> values) {
CodegenProperty array = new CodegenProperty();
final CodegenProperty items = new CodegenProperty();
final HashMap<String, Object> allowableValues = new HashMap<>();
allowableValues.put("values", values);
items.setAllowableValues(allowableValues);
items.dataType = "String";
array.items = items;
array.mostInnerItems = items;
array.dataType = "Array";
return array;
}

private CodegenProperty codegenPropertyWithXEnumVarName(List<String> values, List<String> aliases) {
final CodegenProperty var = new CodegenProperty();
final HashMap<String, Object> allowableValues = new HashMap<>();
Expand All @@ -890,6 +976,17 @@ private CodegenProperty codegenPropertyWithXEnumVarName(List<String> values, Lis
return var;
}

private Map<String, Object> codegenModel(List<String> values) {
final CodegenModel cm = new CodegenModel();
cm.isEnum = true;
final HashMap<String, Object> allowableValues = new HashMap<>();
allowableValues.put("values", values);
cm.setAllowableValues(allowableValues);
cm.dataType = "String";
Map<String, Object> objs = Collections.singletonMap("models", Collections.singletonList(Collections.singletonMap("model", cm)));
return objs;
}

private Map<String, Object> codegenModelWithXEnumVarName() {
final CodegenModel cm = new CodegenModel();
cm.isEnum = true;
Expand Down