Skip to content

Commit 4cae6d9

Browse files
committed
fixed java enumeration issue
1 parent e9cf755 commit 4cae6d9

File tree

6 files changed

+80
-4
lines changed

6 files changed

+80
-4
lines changed

modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,14 @@ public class CodegenModel {
5656
allMandatory = mandatory;
5757
}
5858

59+
public boolean getIsInteger() {
60+
return "Integer".equalsIgnoreCase(this.dataType);
61+
}
62+
63+
public boolean getIsNumber() {
64+
return "BigDecimal".equalsIgnoreCase(this.dataType);
65+
}
66+
5967
@Override
6068
public String toString() {
6169
return String.format("%s(%s)", name, classname);

modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.util.regex.Pattern;
1212

1313
import io.swagger.models.properties.UntypedProperty;
14+
import io.swagger.util.Yaml;
1415
import org.apache.commons.lang3.ObjectUtils;
1516
import org.apache.commons.lang3.StringEscapeUtils;
1617
import org.apache.commons.lang3.StringUtils;
@@ -1529,6 +1530,9 @@ public CodegenModel fromModel(String name, Model model, Map<String, Model> allDe
15291530
// comment out below as allowableValues is not set in post processing model enum
15301531
m.allowableValues = new HashMap<String, Object>();
15311532
m.allowableValues.put("values", impl.getEnum());
1533+
if (m.dataType.equals("BigDecimal")) {
1534+
addImport(m, "BigDecimal");
1535+
}
15321536
}
15331537
if (impl.getAdditionalProperties() != null) {
15341538
addAdditionPropertiesToCodeGenModel(m, impl);

modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractJavaCodegen.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1212,8 +1212,7 @@ public String toEnumVarName(String value, String datatype) {
12121212
}
12131213

12141214
// number
1215-
if ("Integer".equals(datatype) || "Long".equals(datatype) ||
1216-
"Float".equals(datatype) || "Double".equals(datatype)) {
1215+
if ("Integer".equals(datatype) || "Long".equals(datatype) || "Float".equals(datatype) || "Double".equals(datatype) || "BigDecimal".equals(datatype)) {
12171216
String varName = "NUMBER_" + value;
12181217
varName = varName.replaceAll("-", "MINUS_");
12191218
varName = varName.replaceAll("\\+", "PLUS_");
@@ -1232,14 +1231,16 @@ public String toEnumVarName(String value, String datatype) {
12321231

12331232
@Override
12341233
public String toEnumValue(String value, String datatype) {
1235-
if ("Integer".equals(datatype) || "Double".equals(datatype)) {
1234+
if ("Integer".equals(datatype) || "Double".equals(datatype) || "Boolean".equals(datatype)) {
12361235
return value;
12371236
} else if ("Long".equals(datatype)) {
12381237
// add l to number, e.g. 2048 => 2048l
12391238
return value + "l";
12401239
} else if ("Float".equals(datatype)) {
12411240
// add f to number, e.g. 3.14 => 3.14f
12421241
return value + "f";
1242+
} else if ("BigDecimal".equals(datatype)) {
1243+
return "new BigDecimal(" + escapeText(value) + ")";
12431244
} else {
12441245
return "\"" + escapeText(value) + "\"";
12451246
}

modules/swagger-codegen/src/main/resources/Java/modelEnum.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public enum {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum
6060

6161
@Override
6262
public {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} read(final JsonReader jsonReader) throws IOException {
63-
{{{dataType}}} value = jsonReader.{{#isInteger}}nextInt(){{/isInteger}}{{^isInteger}}next{{{dataType}}}(){{/isInteger}};
63+
{{{dataType}}} value = {{#isNumber}}new BigDecimal(jsonReader.nextDouble()){{/isNumber}}{{^isNumber}}jsonReader.{{#isInteger}}nextInt(){{/isInteger}}{{^isInteger}}next{{{dataType}}}(){{/isInteger}}{{/isNumber}};
6464
return {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.fromValue(String.valueOf(value));
6565
}
6666
}

modules/swagger-codegen/src/test/java/io/swagger/codegen/java/JavaModelEnumTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.swagger.codegen.java;
22

3+
import io.swagger.codegen.CodegenConfig;
34
import io.swagger.codegen.CodegenModel;
45
import io.swagger.codegen.CodegenProperty;
56
import io.swagger.codegen.DefaultCodegen;
@@ -8,8 +9,10 @@
89
import io.swagger.models.Model;
910
import io.swagger.models.ModelImpl;
1011
import io.swagger.models.RefModel;
12+
import io.swagger.models.Swagger;
1113
import io.swagger.models.properties.Property;
1214
import io.swagger.models.properties.StringProperty;
15+
import io.swagger.parser.SwaggerParser;
1316
import org.testng.Assert;
1417
import org.testng.annotations.Test;
1518

@@ -92,4 +95,18 @@ public void overrideEnumTest() {
9295
Assert.assertEquals(enumVar.datatypeWithEnum, "UnsharedThingEnum");
9396
Assert.assertTrue(enumVar.isEnum);
9497
}
98+
99+
@Test(description = "not override identical parent enums")
100+
public void testEnumTypes() {
101+
//final Swagger swagger = parser.read("src/test/resources/issue-913/BS/ApiSpecification.yaml");
102+
final CodegenConfig codegenConfig = new JavaClientCodegen();
103+
104+
final Swagger swagger = new SwaggerParser().read("2_0/issue-10546.yaml", null, true);
105+
final Model booleanModel = swagger.getDefinitions().get("Boolean");
106+
107+
CodegenModel codegenModel = codegenConfig.fromModel("Boolean", booleanModel);
108+
109+
Assert.assertTrue(codegenModel.isEnum);
110+
Assert.assertEquals(codegenModel.dataType, "Boolean");
111+
}
95112
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
swagger: '2.0'
2+
info:
3+
description: Demo
4+
version: 1.0.0
5+
title: Demo for Boolean-element Bug
6+
schemes:
7+
- https
8+
consumes:
9+
- application/json
10+
produces:
11+
- application/json
12+
paths:
13+
/types:
14+
get:
15+
produces:
16+
- application/json
17+
responses:
18+
200:
19+
description: OK
20+
definitions:
21+
Boolean:
22+
type: boolean
23+
description: True or False indicator
24+
enum:
25+
- true
26+
- false
27+
Interos:
28+
type: integer
29+
format: int32
30+
description: True or False indicator
31+
enum:
32+
- 0
33+
- 1
34+
- 2
35+
- 3
36+
- 4
37+
- 5
38+
- 6
39+
Numeros:
40+
type: number
41+
description: some number
42+
enum:
43+
- 7
44+
- 8
45+
- 9
46+
- 10

0 commit comments

Comments
 (0)