Skip to content

Commit 5181ddc

Browse files
janweinschenkerwing328
authored andcommitted
fix: prevent ClassCastException when handling options of (issue #4468) (#4495)
* issue 4468 fix: prevent ClassCastException when handling options of type boolean * #4468 fix: remove duplicate code
1 parent a1a9e70 commit 5181ddc

File tree

10 files changed

+243
-33
lines changed

10 files changed

+243
-33
lines changed

.travis.yml

+1
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ script:
139139
- mvn clean compile -f modules/openapi-generator-maven-plugin/examples/java-client.xml
140140
- mvn clean compile -f modules/openapi-generator-maven-plugin/examples/multi-module/pom.xml
141141
- mvn clean compile -f modules/openapi-generator-maven-plugin/examples/kotlin.xml
142+
- mvn clean compile -f modules/openapi-generator-maven-plugin/examples/spring.xml
142143
# test gradle plugin
143144
- (cd modules/openapi-generator-gradle-plugin/samples/local-spec && ./gradlew buildGoSdk)
144145
- (cd modules/openapi-generator-gradle-plugin/samples/local-spec && ./gradlew openApiGenerate)

bin/springboot-petstore-server.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ fi
2727

2828
# if you've executed sbt assembly previously it will use that instead.
2929
export JAVA_OPTS="${JAVA_OPTS} -Xmx1024M -DloggerPath=conf/log4j.properties"
30-
ags="generate --artifact-id springboot -t modules/openapi-generator/src/main/resources/JavaSpring -i modules/openapi-generator/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml -g spring -o samples/server/petstore/springboot --additional-properties hideGenerationTimestamp=true $@"
30+
ags="generate --artifact-id springboot -t modules/openapi-generator/src/main/resources/JavaSpring -i modules/openapi-generator/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml -g spring -o samples/server/petstore/springboot --additional-properties hideGenerationTimestamp=true,snapshotVersion=true $@"
3131

3232
echo "Removing files and folders under samples/server/petstore/springboot/src/main"
3333
rm -rf samples/server/petstore/springboot/src/main
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
<groupId>org.openapitools</groupId>
5+
<artifactId>sample-project</artifactId>
6+
<packaging>jar</packaging>
7+
<version>1.0-SNAPSHOT</version>
8+
<name>sample-project</name>
9+
<url>http://maven.apache.org</url>
10+
11+
<parent>
12+
<groupId>org.springframework.boot</groupId>
13+
<artifactId>spring-boot-starter-parent</artifactId>
14+
<version>2.2.1.RELEASE</version>
15+
</parent>
16+
<build>
17+
<plugins>
18+
<!-- activate the plugin -->
19+
<plugin>
20+
<groupId>org.openapitools</groupId>
21+
<artifactId>openapi-generator-maven-plugin</artifactId>
22+
<!-- RELEASE_VERSION -->
23+
<version>4.2.1-SNAPSHOT</version>
24+
<!-- /RELEASE_VERSION -->
25+
<executions>
26+
<execution>
27+
<id>spring-server</id>
28+
<goals>
29+
<goal>generate</goal>
30+
</goals>
31+
<configuration>
32+
<!-- specify the swagger yaml -->
33+
<inputSpec>${project.basedir}/swagger.yaml</inputSpec>
34+
35+
<!-- target to generate java client code -->
36+
<generatorName>spring</generatorName>
37+
38+
<!-- hint: if you want to generate java server code, e.g. based on Spring Boot,
39+
you can use the following target: <generatorName>spring</generatorName> -->
40+
41+
<!-- pass any necessary config options -->
42+
<configOptions>
43+
<serializableModel>true</serializableModel>
44+
<snapshotVersion>true</snapshotVersion>
45+
</configOptions>
46+
47+
</configuration>
48+
</execution>
49+
50+
</executions>
51+
</plugin>
52+
<plugin>
53+
<groupId>org.apache.maven.plugins</groupId>
54+
<artifactId>maven-compiler-plugin</artifactId>
55+
<version>3.8.1</version>
56+
<configuration>
57+
<source>1.8</source>
58+
<target>1.8</target>
59+
<proc>none</proc>
60+
</configuration>
61+
</plugin>
62+
</plugins>
63+
<pluginManagement>
64+
</pluginManagement>
65+
</build>
66+
<pluginRepositories>
67+
<pluginRepository>
68+
<id>sonatype-snapshots</id>
69+
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
70+
</pluginRepository>
71+
</pluginRepositories>
72+
<dependencies>
73+
<!-- dependencies are needed for the client being generated -->
74+
75+
<dependency>
76+
<groupId>io.swagger</groupId>
77+
<artifactId>swagger-annotations</artifactId>
78+
<version>${swagger-annotations-version}</version>
79+
</dependency>
80+
81+
<!-- You can find the dependencies for the library configuation you chose by looking in JavaClientCodegen.
82+
Then find the corresponding dependency on Maven Central, and set the versions in the property section below -->
83+
84+
<dependency>
85+
<groupId>org.springframework.boot</groupId>
86+
<artifactId>spring-boot-starter-web</artifactId>
87+
</dependency>
88+
<!--SpringFox dependencies -->
89+
<dependency>
90+
<groupId>io.springfox</groupId>
91+
<artifactId>springfox-swagger2</artifactId>
92+
<version>${springfox-version}</version>
93+
</dependency>
94+
<dependency>
95+
<groupId>io.springfox</groupId>
96+
<artifactId>springfox-swagger-ui</artifactId>
97+
<version>${springfox-version}</version>
98+
</dependency>
99+
<dependency>
100+
<groupId>javax.xml.bind</groupId>
101+
<artifactId>jaxb-api</artifactId>
102+
<version>2.2.11</version>
103+
</dependency>
104+
<dependency>
105+
<groupId>com.fasterxml.jackson.datatype</groupId>
106+
<artifactId>jackson-datatype-jsr310</artifactId>
107+
</dependency>
108+
<dependency>
109+
<groupId>org.openapitools</groupId>
110+
<artifactId>jackson-databind-nullable</artifactId>
111+
<version>0.1.0</version>
112+
</dependency>
113+
<!-- Bean Validation API support -->
114+
<dependency>
115+
<groupId>javax.validation</groupId>
116+
<artifactId>validation-api</artifactId>
117+
</dependency>
118+
</dependencies>
119+
120+
<properties>
121+
<swagger-annotations-version>1.5.8</swagger-annotations-version>
122+
123+
<spring-boot-starter-web.version>2.2.1.RELEASE</spring-boot-starter-web.version>
124+
<springfox-version>2.8.0</springfox-version>
125+
</properties>
126+
</project>

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

+10-13
Original file line numberDiff line numberDiff line change
@@ -4401,14 +4401,9 @@ public String addRegularExpressionDelimiter(String pattern) {
44014401
* @return property value as boolean
44024402
*/
44034403
public boolean convertPropertyToBooleanAndWriteBack(String propertyKey) {
4404-
boolean booleanValue = false;
4405-
if (additionalProperties.containsKey(propertyKey)) {
4406-
booleanValue = convertPropertyToBoolean(propertyKey);
4407-
// write back as boolean
4408-
writePropertyBack(propertyKey, booleanValue);
4409-
}
4410-
4411-
return booleanValue;
4404+
boolean result = convertPropertyToBoolean(propertyKey);
4405+
writePropertyBack(propertyKey, result);
4406+
return result;
44124407
}
44134408

44144409
/**
@@ -4432,12 +4427,14 @@ public void setIgnoreFilePathOverride(final String ignoreFileOverride) {
44324427
}
44334428

44344429
public boolean convertPropertyToBoolean(String propertyKey) {
4435-
boolean booleanValue = false;
4436-
if (additionalProperties.containsKey(propertyKey)) {
4437-
booleanValue = Boolean.valueOf(additionalProperties.get(propertyKey).toString());
4430+
final Object booleanValue = additionalProperties.get(propertyKey);
4431+
Boolean result = Boolean.FALSE;
4432+
if (booleanValue instanceof Boolean) {
4433+
result = (Boolean) booleanValue;
4434+
} else if (booleanValue instanceof String) {
4435+
result = Boolean.parseBoolean((String) booleanValue);
44384436
}
4439-
4440-
return booleanValue;
4437+
return result;
44414438
}
44424439

44434440
public void writePropertyBack(String propertyKey, boolean value) {

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

+1-2
Original file line numberDiff line numberDiff line change
@@ -1055,8 +1055,7 @@ public void preprocessOpenAPI(OpenAPI openAPI) {
10551055
}
10561056

10571057
if (additionalProperties.containsKey(CodegenConstants.SNAPSHOT_VERSION)) {
1058-
Boolean useSnapshotVersion = Boolean.valueOf((String) additionalProperties.get(CodegenConstants.SNAPSHOT_VERSION));
1059-
if (useSnapshotVersion) {
1058+
if (convertPropertyToBooleanAndWriteBack(CodegenConstants.SNAPSHOT_VERSION)) {
10601059
this.setArtifactVersion(this.buildSnapshotVersion(this.getArtifactVersion()));
10611060
}
10621061
}

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

+3-15
Original file line numberDiff line numberDiff line change
@@ -434,19 +434,19 @@ public void processOpts() {
434434
}
435435

436436
if (additionalProperties.containsKey(CodegenConstants.SERIALIZABLE_MODEL)) {
437-
this.setSerializableModel(getBooleanOption(CodegenConstants.SERIALIZABLE_MODEL));
437+
this.setSerializableModel(convertPropertyToBooleanAndWriteBack(CodegenConstants.SERIALIZABLE_MODEL));
438438
} else {
439439
additionalProperties.put(CodegenConstants.SERIALIZABLE_MODEL, serializableModel);
440440
}
441441

442442
if (additionalProperties.containsKey(CodegenConstants.PARCELIZE_MODELS)) {
443-
this.setParcelizeModels(getBooleanOption(CodegenConstants.PARCELIZE_MODELS));
443+
this.setParcelizeModels(convertPropertyToBooleanAndWriteBack(CodegenConstants.PARCELIZE_MODELS));
444444
} else {
445445
additionalProperties.put(CodegenConstants.PARCELIZE_MODELS, parcelizeModels);
446446
}
447447

448448
if (additionalProperties.containsKey(CodegenConstants.NON_PUBLIC_API)) {
449-
this.setNonPublicApi(getBooleanOption(CodegenConstants.NON_PUBLIC_API));
449+
this.setNonPublicApi(convertPropertyToBooleanAndWriteBack(CodegenConstants.NON_PUBLIC_API));
450450
} else {
451451
additionalProperties.put(CodegenConstants.NON_PUBLIC_API, nonPublicApi);
452452
}
@@ -458,18 +458,6 @@ public void processOpts() {
458458
additionalProperties.put("modelDocPath", modelDocPath);
459459
}
460460

461-
private boolean getBooleanOption(String key) {
462-
final Object booleanValue = additionalProperties.get(key);
463-
Boolean result = Boolean.FALSE;
464-
if (booleanValue instanceof Boolean) {
465-
result = (Boolean) booleanValue;
466-
} else if (booleanValue instanceof String) {
467-
result = Boolean.parseBoolean((String) booleanValue);
468-
}
469-
additionalProperties.put(key, result);
470-
return result;
471-
}
472-
473461
public void setArtifactId(String artifactId) {
474462
this.artifactId = artifactId;
475463
}

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

+45
Original file line numberDiff line numberDiff line change
@@ -1030,5 +1030,50 @@ public void setShouldExplode() {
10301030
CodegenParameter parameter = codegenParameter("/set_should_explode");
10311031
assertTrue(parameter.isExplode);
10321032
}
1033+
1034+
@Test
1035+
public void testConvertPropertyToBooleanAndWriteBack_Boolean_true() {
1036+
final DefaultCodegen codegen = new DefaultCodegen();
1037+
Map<String, Object> additionalProperties = codegen.additionalProperties();
1038+
additionalProperties.put(CodegenConstants.SERIALIZABLE_MODEL, true);
1039+
boolean result = codegen.convertPropertyToBooleanAndWriteBack(CodegenConstants.SERIALIZABLE_MODEL);
1040+
Assert.assertTrue(result);
1041+
}
1042+
1043+
@Test
1044+
public void testConvertPropertyToBooleanAndWriteBack_Boolean_false() {
1045+
final DefaultCodegen codegen = new DefaultCodegen();
1046+
Map<String, Object> additionalProperties = codegen.additionalProperties();
1047+
additionalProperties.put(CodegenConstants.SERIALIZABLE_MODEL, false);
1048+
boolean result = codegen.convertPropertyToBooleanAndWriteBack(CodegenConstants.SERIALIZABLE_MODEL);
1049+
Assert.assertFalse(result);
1050+
}
1051+
1052+
@Test
1053+
public void testConvertPropertyToBooleanAndWriteBack_String_true() {
1054+
final DefaultCodegen codegen = new DefaultCodegen();
1055+
Map<String, Object> additionalProperties = codegen.additionalProperties();
1056+
additionalProperties.put(CodegenConstants.SERIALIZABLE_MODEL, "true");
1057+
boolean result = codegen.convertPropertyToBooleanAndWriteBack(CodegenConstants.SERIALIZABLE_MODEL);
1058+
Assert.assertTrue(result);
1059+
}
1060+
1061+
@Test
1062+
public void testConvertPropertyToBooleanAndWriteBack_String_false() {
1063+
final DefaultCodegen codegen = new DefaultCodegen();
1064+
Map<String, Object> additionalProperties = codegen.additionalProperties();
1065+
additionalProperties.put(CodegenConstants.SERIALIZABLE_MODEL, "false");
1066+
boolean result = codegen.convertPropertyToBooleanAndWriteBack(CodegenConstants.SERIALIZABLE_MODEL);
1067+
Assert.assertFalse(result);
1068+
}
1069+
1070+
@Test
1071+
public void testConvertPropertyToBooleanAndWriteBack_String_blibb() {
1072+
final DefaultCodegen codegen = new DefaultCodegen();
1073+
Map<String, Object> additionalProperties = codegen.additionalProperties();
1074+
additionalProperties.put(CodegenConstants.SERIALIZABLE_MODEL, "blibb");
1075+
boolean result = codegen.convertPropertyToBooleanAndWriteBack(CodegenConstants.SERIALIZABLE_MODEL);
1076+
Assert.assertFalse(result);
1077+
}
10331078
}
10341079
}

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

+54
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,60 @@ public void getTypeDeclarationTest() {
372372
Assert.assertEquals(defaultValue, "Object");
373373
}
374374

375+
@Test
376+
public void processOptsBooleanTrueFromString() {
377+
final P_AbstractJavaCodegen codegen = new P_AbstractJavaCodegen();
378+
final OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/petstore.yaml");
379+
codegen.additionalProperties().put(CodegenConstants.SNAPSHOT_VERSION, "true");
380+
codegen.preprocessOpenAPI(openAPI);
381+
Assert.assertTrue((boolean) codegen.additionalProperties().get(CodegenConstants.SNAPSHOT_VERSION));
382+
}
383+
384+
@Test
385+
public void processOptsBooleanTrueFromBoolean() {
386+
final P_AbstractJavaCodegen codegen = new P_AbstractJavaCodegen();
387+
final OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/petstore.yaml");
388+
codegen.additionalProperties().put(CodegenConstants.SNAPSHOT_VERSION, true);
389+
codegen.preprocessOpenAPI(openAPI);
390+
Assert.assertTrue((boolean) codegen.additionalProperties().get(CodegenConstants.SNAPSHOT_VERSION));
391+
}
392+
393+
@Test
394+
public void processOptsBooleanFalseFromString() {
395+
final P_AbstractJavaCodegen codegen = new P_AbstractJavaCodegen();
396+
final OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/petstore.yaml");
397+
codegen.additionalProperties().put(CodegenConstants.SNAPSHOT_VERSION, "false");
398+
codegen.preprocessOpenAPI(openAPI);
399+
Assert.assertFalse((boolean) codegen.additionalProperties().get(CodegenConstants.SNAPSHOT_VERSION));
400+
}
401+
402+
@Test
403+
public void processOptsBooleanFalseFromBoolean() {
404+
final P_AbstractJavaCodegen codegen = new P_AbstractJavaCodegen();
405+
final OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/petstore.yaml");
406+
codegen.additionalProperties().put(CodegenConstants.SNAPSHOT_VERSION, false);
407+
codegen.preprocessOpenAPI(openAPI);
408+
Assert.assertFalse((boolean) codegen.additionalProperties().get(CodegenConstants.SNAPSHOT_VERSION));
409+
}
410+
411+
@Test
412+
public void processOptsBooleanFalseFromGarbage() {
413+
final P_AbstractJavaCodegen codegen = new P_AbstractJavaCodegen();
414+
final OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/petstore.yaml");
415+
codegen.additionalProperties().put(CodegenConstants.SNAPSHOT_VERSION, "blibb");
416+
codegen.preprocessOpenAPI(openAPI);
417+
Assert.assertFalse((boolean) codegen.additionalProperties().get(CodegenConstants.SNAPSHOT_VERSION));
418+
}
419+
420+
@Test
421+
public void processOptsBooleanFalseFromNumeric() {
422+
final P_AbstractJavaCodegen codegen = new P_AbstractJavaCodegen();
423+
final OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/petstore.yaml");
424+
codegen.additionalProperties().put(CodegenConstants.SNAPSHOT_VERSION, 42L);
425+
codegen.preprocessOpenAPI(openAPI);
426+
Assert.assertFalse((boolean) codegen.additionalProperties().get(CodegenConstants.SNAPSHOT_VERSION));
427+
}
428+
375429
private static Schema<?> createObjectSchemaWithMinItems() {
376430
return new ObjectSchema()
377431
.addProperties("id", new IntegerSchema().format("int32"))
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4.1.3-SNAPSHOT
1+
4.2.1-SNAPSHOT

samples/server/petstore/springboot/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<artifactId>springboot</artifactId>
55
<packaging>jar</packaging>
66
<name>springboot</name>
7-
<version>1.0.0</version>
7+
<version>1.0.0-SNAPSHOT</version>
88
<properties>
99
<java.version>1.8</java.version>
1010
<maven.compiler.source>${java.version}</maven.compiler.source>

0 commit comments

Comments
 (0)