Skip to content

Commit e56a708

Browse files
committed
Fix generation for java, jaxrs-cxf-cdi and kotlin
1 parent c671370 commit e56a708

File tree

9 files changed

+98
-36
lines changed

9 files changed

+98
-36
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public class CodegenModel {
4444
public String defaultValue;
4545
public String arrayModelType;
4646
public boolean isAlias; // Is this effectively an alias of another simple type
47-
public boolean isInteger;
47+
public boolean isString, isInteger;
4848
public List<CodegenProperty> vars = new ArrayList<CodegenProperty>();
4949
public List<CodegenProperty> requiredVars = new ArrayList<CodegenProperty>(); // a list of required properties
5050
public List<CodegenProperty> optionalVars = new ArrayList<CodegenProperty>(); // a list of optional properties

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

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -250,11 +250,11 @@ public Map<String, Object> postProcessModelsEnum(Map<String, Object> objs) {
250250
if (Boolean.TRUE.equals(cm.isEnum) && cm.allowableValues != null) {
251251
Map<String, Object> allowableValues = cm.allowableValues;
252252
List<Object> values = (List<Object>) allowableValues.get("values");
253-
List<Map<String, String>> enumVars = new ArrayList<Map<String, String>>();
253+
List<Map<String, Object>> enumVars = new ArrayList<Map<String, Object>>();
254254
String commonPrefix = findCommonPrefixOfVars(values);
255255
int truncateIdx = commonPrefix.length();
256256
for (Object value : values) {
257-
Map<String, String> enumVar = new HashMap<String, String>();
257+
Map<String, Object> enumVar = new HashMap<String, Object>();
258258
String enumName;
259259
if (truncateIdx == 0) {
260260
enumName = value.toString();
@@ -266,6 +266,7 @@ public Map<String, Object> postProcessModelsEnum(Map<String, Object> objs) {
266266
}
267267
enumVar.put("name", toEnumVarName(enumName, cm.dataType));
268268
enumVar.put("value", toEnumValue(value.toString(), cm.dataType));
269+
enumVar.put("isString", isDataTypeString(cm.dataType));
269270
enumVars.add(enumVar);
270271
}
271272
cm.allowableValues.put("enumVars", enumVars);
@@ -1523,8 +1524,14 @@ public CodegenModel fromModel(String name, Schema schema, Map<String, Schema> al
15231524
addAdditionPropertiesToCodeGenModel(m, schema);
15241525
}
15251526
if (ModelUtils.isIntegerSchema(schema)) { // integer type
1526-
m.isInteger = Boolean.TRUE;
1527+
if (!ModelUtils.isLongSchema(schema)) { // long type is not integer
1528+
m.isInteger = Boolean.TRUE;
1529+
}
1530+
}
1531+
if (ModelUtils.isStringSchema(schema)){
1532+
m.isString = Boolean.TRUE;
15271533
}
1534+
15281535
addVars(m, schema.getProperties(), schema.getRequired());
15291536
}
15301537

@@ -3661,11 +3668,11 @@ public void updateCodegenPropertyEnum(CodegenProperty var) {
36613668
}
36623669

36633670
// put "enumVars" map into `allowableValues", including `name` and `value`
3664-
List<Map<String, String>> enumVars = new ArrayList<>();
3671+
List<Map<String, Object>> enumVars = new ArrayList<>();
36653672
String commonPrefix = findCommonPrefixOfVars(values);
36663673
int truncateIdx = commonPrefix.length();
36673674
for (Object value : values) {
3668-
Map<String, String> enumVar = new HashMap<>();
3675+
Map<String, Object> enumVar = new HashMap<>();
36693676
String enumName;
36703677
if (truncateIdx == 0) {
36713678
enumName = value.toString();
@@ -3679,16 +3686,17 @@ public void updateCodegenPropertyEnum(CodegenProperty var) {
36793686
final String dataType = var.mostInnerItems != null ? var.mostInnerItems.dataType : var.dataType;
36803687
enumVar.put("name", toEnumVarName(enumName, dataType));
36813688
enumVar.put("value", toEnumValue(value.toString(), dataType));
3689+
enumVar.put("isString", isDataTypeString(dataType));
36823690
enumVars.add(enumVar);
36833691
}
36843692
allowableValues.put("enumVars", enumVars);
36853693

36863694
// handle default value for enum, e.g. available => StatusEnum.AVAILABLE
36873695
if (var.defaultValue != null) {
36883696
String enumName = null;
3689-
for (Map<String, String> enumVar : enumVars) {
3697+
for (Map<String, Object> enumVar : enumVars) {
36903698
if (toEnumValue(var.defaultValue, var.dataType).equals(enumVar.get("value"))) {
3691-
enumName = enumVar.get("name");
3699+
enumName = (String) enumVar.get("name");
36923700
break;
36933701
}
36943702
}
@@ -4348,4 +4356,7 @@ public void generateYAMLSpecFile(Map<String, Object> objs) {
43484356
}
43494357
}
43504358

4359+
public boolean isDataTypeString(String dataType) {
4360+
return "String".equals(dataType);
4361+
}
43514362
}

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,4 +557,26 @@ protected boolean needToImport(String type) {
557557
boolean imports = !type.startsWith("kotlin.") && !type.startsWith("java.") && !defaultIncludes.contains(type) && !languageSpecificPrimitives.contains(type);
558558
return imports;
559559
}
560+
561+
@Override
562+
public String toEnumValue(String value, String datatype) {
563+
if ("kotlin.Int".equals(datatype) || "kotlin.Long".equals(datatype)) {
564+
return value;
565+
} else if ("kotlin.Double".equals(datatype)) {
566+
if (value.contains(".")) {
567+
return value;
568+
} else {
569+
return value + ".0"; // Float and double must have .0
570+
}
571+
} else if ("kotlin.Float".equals(datatype)) {
572+
return value + "f";
573+
} else {
574+
return "\"" + escapeText(value) + "\"";
575+
}
576+
}
577+
578+
@Override
579+
public boolean isDataTypeString(final String dataType) {
580+
return "String".equals(dataType) || "kotlin.String".equals(dataType);
581+
}
560582
}

modules/openapi-generator/src/main/resources/JavaJaxRS/cxf-cdi/enumClass.mustache

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
public enum {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} {
44
55
{{#allowableValues}}
6-
{{#enumVars}}@XmlEnumValue({{{value}}}) {{name}}({{dataType}}.valueOf({{{value}}})){{^-last}}, {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}
6+
{{#enumVars}}@XmlEnumValue({{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{name}}({{dataType}}.valueOf({{{value}}})){{^-last}}, {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}
77
{{/allowableValues}}
88

99

@@ -13,7 +13,7 @@ public enum {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum
1313
value = v;
1414
}
1515

16-
public String value() {
16+
public {{dataType}} value() {
1717
return value;
1818
}
1919

modules/openapi-generator/src/main/resources/kotlin-client/enum_class.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ import com.squareup.moshi.Json
66
*/
77
enum class {{classname}}(val value: {{dataType}}){
88
{{#allowableValues}}{{#enumVars}}
9-
@Json(name = {{{value}}}) {{&name}}({{{value}}}){{^-last}},{{/-last}}{{#-last}};{{/-last}}
9+
@Json(name = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{&name}}({{{value}}}){{^-last}},{{/-last}}{{#-last}};{{/-last}}
1010
{{/enumVars}}{{/allowableValues}}
1111
}

modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,12 +224,13 @@ public void updateCodegenPropertyEnum() {
224224

225225
codegen.updateCodegenPropertyEnum(array);
226226

227-
List<Map<String, String>> enumVars = (List<Map<String, String>>) array.getItems().getAllowableValues().get("enumVars");
227+
List<Map<String, Object>> enumVars = (List<Map<String, Object>>) array.getItems().getAllowableValues().get("enumVars");
228228
Assert.assertNotNull(enumVars);
229-
Map<String, String> testedEnumVar = enumVars.get(0);
229+
Map<String, Object> testedEnumVar = enumVars.get(0);
230230
Assert.assertNotNull(testedEnumVar);
231231
Assert.assertEquals(testedEnumVar.getOrDefault("name", ""),"_1");
232232
Assert.assertEquals(testedEnumVar.getOrDefault("value", ""), "\"1\"");
233+
Assert.assertEquals(testedEnumVar.getOrDefault("isString", ""), false);
233234
}
234235

235236
private CodegenProperty codegenPropertyWithArrayOfIntegerValues() {

modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/AbstractKotlinCodegenTest.java

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
import org.testng.annotations.Test;
77

88
import static org.openapitools.codegen.CodegenConstants.ENUM_PROPERTY_NAMING_TYPE.*;
9+
import static org.testng.Assert.assertEquals;
10+
import static org.testng.Assert.assertFalse;
11+
import static org.testng.Assert.assertTrue;
912

1013
public class AbstractKotlinCodegenTest {
1114

@@ -14,41 +17,51 @@ public class AbstractKotlinCodegenTest {
1417
@Test
1518
public void camlCaseEnumConverter() {
1619
codegen.setEnumPropertyNaming(camelCase.name());
17-
Assert.assertEquals(codegen.toEnumVarName("long Name", null), "longName");
18-
Assert.assertEquals(codegen.toEnumVarName("1long Name", null), "_1longName");
19-
Assert.assertEquals(codegen.toEnumVarName("not1long Name", null), "not1longName");
20+
assertEquals(codegen.toEnumVarName("long Name", null), "longName");
21+
assertEquals(codegen.toEnumVarName("1long Name", null), "_1longName");
22+
assertEquals(codegen.toEnumVarName("not1long Name", null), "not1longName");
2023
}
2124

2225
@Test
2326
public void uppercasEnumConverter() {
2427
codegen.setEnumPropertyNaming(UPPERCASE.name());
25-
Assert.assertEquals(codegen.toEnumVarName("long Name", null), "LONG_NAME");
26-
Assert.assertEquals(codegen.toEnumVarName("1long Name", null), "_1LONG_NAME");
27-
Assert.assertEquals(codegen.toEnumVarName("not1long Name", null), "NOT1LONG_NAME");
28+
assertEquals(codegen.toEnumVarName("long Name", null), "LONG_NAME");
29+
assertEquals(codegen.toEnumVarName("1long Name", null), "_1LONG_NAME");
30+
assertEquals(codegen.toEnumVarName("not1long Name", null), "NOT1LONG_NAME");
2831
}
2932
@Test
3033
public void snake_caseEnumConverter() {
3134
codegen.setEnumPropertyNaming(snake_case.name());
32-
Assert.assertEquals(codegen.toEnumVarName("long Name", null), "long_name");
33-
Assert.assertEquals(codegen.toEnumVarName("1long Name", null), "_1long_name");
34-
Assert.assertEquals(codegen.toEnumVarName("not1long Name", null), "not1long_name");
35+
assertEquals(codegen.toEnumVarName("long Name", null), "long_name");
36+
assertEquals(codegen.toEnumVarName("1long Name", null), "_1long_name");
37+
assertEquals(codegen.toEnumVarName("not1long Name", null), "not1long_name");
3538
}
3639

3740
@Test
3841
public void originalEnumConverter() {
3942
codegen.setEnumPropertyNaming(original.name());
40-
Assert.assertEquals(codegen.toEnumVarName("long Name", null), "long_Name");
41-
Assert.assertEquals(codegen.toEnumVarName("1long Name", null), "_1long_Name");
42-
Assert.assertEquals(codegen.toEnumVarName("not1long Name", null), "not1long_Name");
43+
assertEquals(codegen.toEnumVarName("long Name", null), "long_Name");
44+
assertEquals(codegen.toEnumVarName("1long Name", null), "_1long_Name");
45+
assertEquals(codegen.toEnumVarName("not1long Name", null), "not1long_Name");
4346
}
4447
@Test
4548
public void pascalCaseEnumConverter() {
4649
codegen.setEnumPropertyNaming(PascalCase.name());
47-
Assert.assertEquals(codegen.toEnumVarName("long Name", null), "LongName");
48-
Assert.assertEquals(codegen.toEnumVarName("1long Name", null), "_1longName");
49-
Assert.assertEquals(codegen.toEnumVarName("not1long Name", null), "Not1longName");
50+
assertEquals(codegen.toEnumVarName("long Name", null), "LongName");
51+
assertEquals(codegen.toEnumVarName("1long Name", null), "_1longName");
52+
assertEquals(codegen.toEnumVarName("not1long Name", null), "Not1longName");
5053
}
5154

55+
@Test
56+
public void toEnumValue(){
57+
assertEquals(codegen.toEnumValue("1", "kotlin.Int"), "1");
58+
assertEquals(codegen.toEnumValue("1", "kotlin.Double"), "1.0");
59+
assertEquals(codegen.toEnumValue("1.3", "kotlin.Double"), "1.3");
60+
assertEquals(codegen.toEnumValue("1337", "kotlin.Long"), "1337");
61+
assertEquals(codegen.toEnumValue("5", "kotlin.Float"), "5f");
62+
assertEquals(codegen.toEnumValue("1.0", "kotlin.Float"), "1.0f");
63+
assertEquals(codegen.toEnumValue("data", "Something"), "\"data\"");
64+
}
5265

5366
private class P_AbstractKotlinCodegen extends AbstractKotlinCodegen {
5467
@Override
@@ -66,4 +79,11 @@ public String getHelp() {
6679
return null;
6780
}
6881
}
82+
83+
@Test
84+
public void isDataTypeString(){
85+
assertFalse(codegen.isDataTypeString("kotlin.Int"));
86+
assertTrue(codegen.isDataTypeString("kotlin.String"));
87+
assertTrue(codegen.isDataTypeString("String"));
88+
}
6989
}

modules/openapi-generator/src/test/java/org/openapitools/codegen/php/PhpModelTest.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -310,12 +310,14 @@ public void enumArrayModelTest() {
310310
Assert.assertTrue(prope.isEnum);
311311
Assert.assertEquals(prope.allowableValues.get("values"), Arrays.asList("fish", "crab"));
312312

313-
HashMap<String, String> fish= new HashMap<String, String>();
313+
HashMap<String, Object> fish= new HashMap<String, Object>();
314314
fish.put("name", "FISH");
315315
fish.put("value", "\'fish\'");
316-
HashMap<String, String> crab= new HashMap<String, String>();
316+
fish.put("isString", false);
317+
HashMap<String, Object> crab= new HashMap<String, Object>();
317318
crab.put("name", "CRAB");
318319
crab.put("value", "\'crab\'");
320+
crab.put("isString", false);
319321
Assert.assertEquals(prope.allowableValues.get("enumVars"), Arrays.asList(fish, crab));
320322

321323
// assert inner items
@@ -343,12 +345,14 @@ public void enumMdoelValueTest() {
343345
Assert.assertNull(prope.items);
344346
Assert.assertEquals(prope.allowableValues.get("values"), Arrays.asList(1, -1));
345347

346-
HashMap<String, String> one = new HashMap<String, String>();
348+
HashMap<String, Object> one = new HashMap<String, Object>();
347349
one.put("name", "1");
348350
one.put("value", "1");
349-
HashMap<String, String> minusOne = new HashMap<String, String>();
351+
one.put("isString", false);
352+
HashMap<String, Object> minusOne = new HashMap<String, Object>();
350353
minusOne.put("name", "MINUS_1");
351354
minusOne.put("value", "-1");
355+
minusOne.put("isString", false);
352356
Assert.assertEquals(prope.allowableValues.get("enumVars"), Arrays.asList(one, minusOne));
353357
}
354358

modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/fetch/TypeScriptFetchModelTest.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -234,12 +234,14 @@ public void enumArrayMdoelTest() {
234234
Assert.assertTrue(prope.isEnum);
235235
Assert.assertEquals(prope.allowableValues.get("values"), Arrays.asList("fish", "crab"));
236236

237-
HashMap<String, String> fish = new HashMap<String, String>();
237+
HashMap<String, Object> fish = new HashMap<String, Object>();
238238
fish.put("name", "Fish");
239239
fish.put("value", "'fish'");
240-
HashMap<String, String> crab = new HashMap<String, String>();
240+
fish.put("isString", false);
241+
HashMap<String, Object> crab = new HashMap<String, Object>();
241242
crab.put("name", "Crab");
242243
crab.put("value", "'crab'");
244+
crab.put("isString", false);
243245
Assert.assertEquals(prope.allowableValues.get("enumVars"), Arrays.asList(fish, crab));
244246

245247
// assert inner items
@@ -270,12 +272,14 @@ public void enumMdoelValueTest() {
270272
Assert.assertNull(prope.items);
271273
Assert.assertEquals(prope.allowableValues.get("values"), Arrays.asList(1, -1));
272274

273-
HashMap<String, String> one = new HashMap<String, String>();
275+
HashMap<String, Object> one = new HashMap<String, Object>();
274276
one.put("name", "NUMBER_1");
275277
one.put("value", "1");
276-
HashMap<String, String> minusOne = new HashMap<String, String>();
278+
one.put("isString", false);
279+
HashMap<String, Object> minusOne = new HashMap<String, Object>();
277280
minusOne.put("name", "NUMBER_MINUS_1");
278281
minusOne.put("value", "-1");
282+
minusOne.put("isString", false);
279283
Assert.assertEquals(prope.allowableValues.get("enumVars"), Arrays.asList(one, minusOne));
280284

281285
//IMPORTANT: these are not final enum values, which may be further updated

0 commit comments

Comments
 (0)