diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 0574a7bcc084..0181846492d8 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -287,6 +287,8 @@ public Map postProcessModelsEnum(Map objs) { enumVar.put("isString", isDataTypeString(cm.dataType)); enumVars.add(enumVar); } + // if "x-enum-varnames" defined, update varnames + updateEnumVarsWithExtensions(enumVars, cm.getVendorExtensions()); cm.allowableValues.put("enumVars", enumVars); } @@ -4003,6 +4005,8 @@ public void updateCodegenPropertyEnum(CodegenProperty var) { enumVar.put("isString", isDataTypeString(dataType)); enumVars.add(enumVar); } + // if "x-enum-varnames" defined, update varnames + updateEnumVarsWithExtensions(enumVars, var.getVendorExtensions()); allowableValues.put("enumVars", enumVars); // handle default value for enum, e.g. available => StatusEnum.AVAILABLE @@ -4020,6 +4024,16 @@ public void updateCodegenPropertyEnum(CodegenProperty var) { } } + private void updateEnumVarsWithExtensions(List> enumVars, Map vendorExtensions) { + if (vendorExtensions != null && vendorExtensions.containsKey("x-enum-varnames")) { + List alias = (List) vendorExtensions.get("x-enum-varnames"); + int size = Math.min(enumVars.size(), alias.size()); + for (int i = 0; i < size; i++) { + enumVars.get(i).put("name", alias.get(i)); + } + } + } + /** * If the pattern misses the delimiter, add "/" to the beginning and end * Otherwise, return the original pattern diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index cf78dbc1a995..425eb7a23ab0 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -306,6 +306,66 @@ public void updateCodegenPropertyEnum() { Assert.assertEquals(testedEnumVar.getOrDefault("isString", ""), false); } + @Test + public void updateCodegenPropertyEnumWithExtention() { + { + CodegenProperty enumProperty = codegenPropertyWithXEnumVarName(Arrays.asList("dog", "cat"), Arrays.asList("DOGVAR", "CATVAR")); + (new DefaultCodegen()).updateCodegenPropertyEnum(enumProperty); + List> enumVars = (List>) enumProperty.getAllowableValues().get("enumVars"); + Assert.assertNotNull(enumVars); + Assert.assertNotNull(enumVars.get(0)); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "DOGVAR"); + Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"dog\""); + Assert.assertNotNull(enumVars.get(1)); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "CATVAR"); + Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"cat\""); + } + { + CodegenProperty enumProperty = codegenPropertyWithXEnumVarName(Arrays.asList("1", "2"), Arrays.asList("ONE", "TWO")); + (new DefaultCodegen()).updateCodegenPropertyEnum(enumProperty); + List> enumVars = (List>) enumProperty.getAllowableValues().get("enumVars"); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "ONE"); + Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"1\""); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "TWO"); + Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"2\""); + } + { + CodegenProperty enumProperty = codegenPropertyWithXEnumVarName(Arrays.asList("a", "b", "c", "d"), Arrays.asList("FOO", "BAR")); + (new DefaultCodegen()).updateCodegenPropertyEnum(enumProperty); + List> enumVars = (List>) enumProperty.getAllowableValues().get("enumVars"); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "FOO"); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "BAR"); + Assert.assertEquals(enumVars.get(2).getOrDefault("name", ""), "C"); + Assert.assertEquals(enumVars.get(3).getOrDefault("name", ""), "D"); + } + { + CodegenProperty enumProperty = codegenPropertyWithXEnumVarName(Arrays.asList("a", "b"), Arrays.asList("FOO", "BAR", "BAZ")); + (new DefaultCodegen()).updateCodegenPropertyEnum(enumProperty); + List> enumVars = (List>) enumProperty.getAllowableValues().get("enumVars"); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "FOO"); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "BAR"); + Assert.assertEquals(enumVars.size(), 2); + } + } + + @Test + public void postProcessModelsEnumWithExtention() { + final DefaultCodegen codegen = new DefaultCodegen(); + Map objs = codegenModelWithXEnumVarName(); + CodegenModel cm = (CodegenModel) ((Map) ((List) objs.get("models")).get(0)).get("model"); + + codegen.postProcessModelsEnum(objs); + + List> enumVars = (List>) cm.getAllowableValues().get("enumVars"); + Assert.assertNotNull(enumVars); + Assert.assertNotNull(enumVars.get(0)); + Assert.assertEquals(enumVars.get(0).getOrDefault("name", ""), "DOGVAR"); + Assert.assertEquals(enumVars.get(0).getOrDefault("value", ""), "\"dog\""); + Assert.assertNotNull(enumVars.get(1)); + Assert.assertEquals(enumVars.get(1).getOrDefault("name", ""), "CATVAR"); + Assert.assertEquals(enumVars.get(1).getOrDefault("value", ""), "\"cat\""); + } + @Test public void testExample1() { final OpenAPI openAPI = new OpenAPIParser().readLocation("src/test/resources/3_0/examples.yaml", null, new ParseOptions()).getOpenAPI(); @@ -478,4 +538,30 @@ private CodegenProperty codegenPropertyWithArrayOfIntegerValues() { array.dataType = "Array"; return array; } + + private CodegenProperty codegenPropertyWithXEnumVarName(List values, List aliases) { + final CodegenProperty var = new CodegenProperty(); + final HashMap allowableValues = new HashMap<>(); + allowableValues.put("values", values); + var.setAllowableValues(allowableValues); + var.dataType = "String"; + Map extentions = Collections.singletonMap("x-enum-varnames", aliases); + var.setVendorExtensions(extentions); + return var; + } + + private Map codegenModelWithXEnumVarName() { + final CodegenModel cm = new CodegenModel(); + cm.isEnum = true; + final HashMap allowableValues = new HashMap<>(); + allowableValues.put("values", Arrays.asList("dog", "cat")); + cm.setAllowableValues(allowableValues); + cm.dataType = "String"; + final List aliases = Arrays.asList("DOGVAR", "CATVAR"); + Map extentions = Collections.singletonMap("x-enum-varnames", aliases); + cm.setVendorExtensions(extentions); + cm.setVars(Collections.emptyList()); + Map objs = Collections.singletonMap("models", Collections.singletonList(Collections.singletonMap("model", cm))); + return objs; + } }