Skip to content

Commit bbc4269

Browse files
authoredFeb 7, 2023
[java] Fix enum ref issue in array default value (OpenAPITools#14638)
* fix enum ref issue in array default value (java) * update samples * update tests * update samples
1 parent cda3517 commit bbc4269

File tree

38 files changed

+918
-18
lines changed

38 files changed

+918
-18
lines changed
 

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -3946,7 +3946,7 @@ public CodegenProperty fromProperty(String name, Schema p, boolean required, boo
39463946

39473947
if (!ModelUtils.isArraySchema(p) && !ModelUtils.isMapSchema(p) && !isFreeFormObject(p) && !isAnyTypeWithNothingElseSet) {
39483948
/* schemas that are not Array, not ModelUtils.isMapSchema, not isFreeFormObject, not AnyType with nothing else set
3949-
* so primitive schemas int, str, number, referenced schemas, AnyType schemas with properties, enums, or composition
3949+
* so primitive schemas int, str, number, referenced schemas, AnyType schemas with properties, enums, or composition
39503950
*/
39513951
String type = getSchemaType(p);
39523952
setNonArrayMapProperty(property, type);

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -1004,7 +1004,7 @@ public String toArrayDefaultValue(CodegenProperty cp, Schema schema) {
10041004

10051005
String defaultValue = "";
10061006

1007-
if (cp.items.isEnum) { // enum
1007+
if (cp.items.getIsEnumOrRef()) { // inline or ref enum
10081008
List<String> defaultValues = new ArrayList<>();
10091009
for (String _value : _values) {
10101010
defaultValues.add(cp.items.datatypeWithEnum + "." + toEnumVarName(_value, cp.items.dataType));

‎modules/openapi-generator/src/test/resources/3_0/echo_api.yaml

+13
Original file line numberDiff line numberDiff line change
@@ -365,10 +365,23 @@ components:
365365
- sold
366366
xml:
367367
name: pet
368+
StringEnumRef:
369+
type: string
370+
enum:
371+
- success
372+
- failure
373+
- unclassified
368374
DefaultValue:
369375
type: object
370376
description: to test the default value of properties
371377
properties:
378+
array_string_enum_ref_default:
379+
type: array
380+
items:
381+
$ref: '#/components/schemas/StringEnumRef'
382+
default:
383+
- success
384+
- failure
372385
array_string_enum_default:
373386
type: array
374387
items:

‎openapitools.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22
"$schema": "node_modules/@openapitools/openapi-generator-cli/config.schema.json",
33
"spaces": 2,
44
"generator-cli": {
5-
"version": "6.2.1"
5+
"version": "6.3.0"
66
}
77
}

‎samples/client/echo_api/java/apache-httpclient/.openapi-generator/FILES

+2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ docs/PathApi.md
1717
docs/Pet.md
1818
docs/Query.md
1919
docs/QueryApi.md
20+
docs/StringEnumRef.md
2021
docs/Tag.md
2122
docs/TestQueryStyleDeepObjectExplodeTrueObjectAllOfQueryObjectParameter.md
2223
docs/TestQueryStyleFormExplodeTrueArrayStringQueryObjectParameter.md
@@ -54,6 +55,7 @@ src/main/java/org/openapitools/client/model/DataQueryAllOf.java
5455
src/main/java/org/openapitools/client/model/DefaultValue.java
5556
src/main/java/org/openapitools/client/model/Pet.java
5657
src/main/java/org/openapitools/client/model/Query.java
58+
src/main/java/org/openapitools/client/model/StringEnumRef.java
5759
src/main/java/org/openapitools/client/model/Tag.java
5860
src/main/java/org/openapitools/client/model/TestQueryStyleDeepObjectExplodeTrueObjectAllOfQueryObjectParameter.java
5961
src/main/java/org/openapitools/client/model/TestQueryStyleFormExplodeTrueArrayStringQueryObjectParameter.java

‎samples/client/echo_api/java/apache-httpclient/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ Class | Method | HTTP request | Description
128128
- [DefaultValue](docs/DefaultValue.md)
129129
- [Pet](docs/Pet.md)
130130
- [Query](docs/Query.md)
131+
- [StringEnumRef](docs/StringEnumRef.md)
131132
- [Tag](docs/Tag.md)
132133
- [TestQueryStyleDeepObjectExplodeTrueObjectAllOfQueryObjectParameter](docs/TestQueryStyleDeepObjectExplodeTrueObjectAllOfQueryObjectParameter.md)
133134
- [TestQueryStyleFormExplodeTrueArrayStringQueryObjectParameter](docs/TestQueryStyleFormExplodeTrueArrayStringQueryObjectParameter.md)

‎samples/client/echo_api/java/apache-httpclient/api/openapi.yaml

+13
Original file line numberDiff line numberDiff line change
@@ -377,9 +377,22 @@ components:
377377
type: object
378378
xml:
379379
name: pet
380+
StringEnumRef:
381+
enum:
382+
- success
383+
- failure
384+
- unclassified
385+
type: string
380386
DefaultValue:
381387
description: to test the default value of properties
382388
properties:
389+
array_string_enum_ref_default:
390+
default:
391+
- success
392+
- failure
393+
items:
394+
$ref: '#/components/schemas/StringEnumRef'
395+
type: array
383396
array_string_enum_default:
384397
default:
385398
- success

‎samples/client/echo_api/java/apache-httpclient/docs/DefaultValue.md

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ to test the default value of properties
88

99
| Name | Type | Description | Notes |
1010
|------------ | ------------- | ------------- | -------------|
11+
|**arrayStringEnumRefDefault** | **List&lt;StringEnumRef&gt;** | | [optional] |
1112
|**arrayStringEnumDefault** | [**List&lt;ArrayStringEnumDefaultEnum&gt;**](#List&lt;ArrayStringEnumDefaultEnum&gt;) | | [optional] |
1213
|**arrayStringDefault** | **List&lt;String&gt;** | | [optional] |
1314
|**arrayIntegerDefault** | **List&lt;Integer&gt;** | | [optional] |
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
2+
3+
# StringEnumRef
4+
5+
## Enum
6+
7+
8+
* `SUCCESS` (value: `"success"`)
9+
10+
* `FAILURE` (value: `"failure"`)
11+
12+
* `UNCLASSIFIED` (value: `"unclassified"`)
13+
14+
15+

‎samples/client/echo_api/java/apache-httpclient/src/main/java/org/openapitools/client/model/DefaultValue.java

+59-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.fasterxml.jackson.annotation.JsonValue;
2323
import java.util.ArrayList;
2424
import java.util.List;
25+
import org.openapitools.client.model.StringEnumRef;
2526
import org.openapitools.jackson.nullable.JsonNullable;
2627
import com.fasterxml.jackson.annotation.JsonIgnore;
2728
import org.openapitools.jackson.nullable.JsonNullable;
@@ -36,6 +37,7 @@
3637
* to test the default value of properties
3738
*/
3839
@JsonPropertyOrder({
40+
DefaultValue.JSON_PROPERTY_ARRAY_STRING_ENUM_REF_DEFAULT,
3941
DefaultValue.JSON_PROPERTY_ARRAY_STRING_ENUM_DEFAULT,
4042
DefaultValue.JSON_PROPERTY_ARRAY_STRING_DEFAULT,
4143
DefaultValue.JSON_PROPERTY_ARRAY_INTEGER_DEFAULT,
@@ -45,6 +47,9 @@
4547
})
4648
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen")
4749
public class DefaultValue {
50+
public static final String JSON_PROPERTY_ARRAY_STRING_ENUM_REF_DEFAULT = "array_string_enum_ref_default";
51+
private List<StringEnumRef> arrayStringEnumRefDefault = new ArrayList<>(Arrays.asList(StringEnumRef.SUCCESS, StringEnumRef.FAILURE));
52+
4853
/**
4954
* Gets or Sets arrayStringEnumDefault
5055
*/
@@ -103,6 +108,40 @@ public static ArrayStringEnumDefaultEnum fromValue(String value) {
103108
public DefaultValue() {
104109
}
105110

111+
public DefaultValue arrayStringEnumRefDefault(List<StringEnumRef> arrayStringEnumRefDefault) {
112+
113+
this.arrayStringEnumRefDefault = arrayStringEnumRefDefault;
114+
return this;
115+
}
116+
117+
public DefaultValue addArrayStringEnumRefDefaultItem(StringEnumRef arrayStringEnumRefDefaultItem) {
118+
if (this.arrayStringEnumRefDefault == null) {
119+
this.arrayStringEnumRefDefault = new ArrayList<>(Arrays.asList(StringEnumRef.SUCCESS, StringEnumRef.FAILURE));
120+
}
121+
this.arrayStringEnumRefDefault.add(arrayStringEnumRefDefaultItem);
122+
return this;
123+
}
124+
125+
/**
126+
* Get arrayStringEnumRefDefault
127+
* @return arrayStringEnumRefDefault
128+
**/
129+
@javax.annotation.Nullable
130+
@JsonProperty(JSON_PROPERTY_ARRAY_STRING_ENUM_REF_DEFAULT)
131+
@JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
132+
133+
public List<StringEnumRef> getArrayStringEnumRefDefault() {
134+
return arrayStringEnumRefDefault;
135+
}
136+
137+
138+
@JsonProperty(JSON_PROPERTY_ARRAY_STRING_ENUM_REF_DEFAULT)
139+
@JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
140+
public void setArrayStringEnumRefDefault(List<StringEnumRef> arrayStringEnumRefDefault) {
141+
this.arrayStringEnumRefDefault = arrayStringEnumRefDefault;
142+
}
143+
144+
106145
public DefaultValue arrayStringEnumDefault(List<ArrayStringEnumDefaultEnum> arrayStringEnumDefault) {
107146

108147
this.arrayStringEnumDefault = arrayStringEnumDefault;
@@ -328,7 +367,8 @@ public boolean equals(Object o) {
328367
return false;
329368
}
330369
DefaultValue defaultValue = (DefaultValue) o;
331-
return Objects.equals(this.arrayStringEnumDefault, defaultValue.arrayStringEnumDefault) &&
370+
return Objects.equals(this.arrayStringEnumRefDefault, defaultValue.arrayStringEnumRefDefault) &&
371+
Objects.equals(this.arrayStringEnumDefault, defaultValue.arrayStringEnumDefault) &&
332372
Objects.equals(this.arrayStringDefault, defaultValue.arrayStringDefault) &&
333373
Objects.equals(this.arrayIntegerDefault, defaultValue.arrayIntegerDefault) &&
334374
Objects.equals(this.arrayString, defaultValue.arrayString) &&
@@ -342,7 +382,7 @@ private static <T> boolean equalsNullable(JsonNullable<T> a, JsonNullable<T> b)
342382

343383
@Override
344384
public int hashCode() {
345-
return Objects.hash(arrayStringEnumDefault, arrayStringDefault, arrayIntegerDefault, arrayString, hashCodeNullable(arrayStringNullable), hashCodeNullable(stringNullable));
385+
return Objects.hash(arrayStringEnumRefDefault, arrayStringEnumDefault, arrayStringDefault, arrayIntegerDefault, arrayString, hashCodeNullable(arrayStringNullable), hashCodeNullable(stringNullable));
346386
}
347387

348388
private static <T> int hashCodeNullable(JsonNullable<T> a) {
@@ -356,6 +396,7 @@ private static <T> int hashCodeNullable(JsonNullable<T> a) {
356396
public String toString() {
357397
StringBuilder sb = new StringBuilder();
358398
sb.append("class DefaultValue {\n");
399+
sb.append(" arrayStringEnumRefDefault: ").append(toIndentedString(arrayStringEnumRefDefault)).append("\n");
359400
sb.append(" arrayStringEnumDefault: ").append(toIndentedString(arrayStringEnumDefault)).append("\n");
360401
sb.append(" arrayStringDefault: ").append(toIndentedString(arrayStringDefault)).append("\n");
361402
sb.append(" arrayIntegerDefault: ").append(toIndentedString(arrayIntegerDefault)).append("\n");
@@ -409,6 +450,22 @@ public String toUrlQueryString(String prefix) {
409450

410451
StringJoiner joiner = new StringJoiner("&");
411452

453+
// add `array_string_enum_ref_default` to the URL query string
454+
if (getArrayStringEnumRefDefault() != null) {
455+
for (int i = 0; i < getArrayStringEnumRefDefault().size(); i++) {
456+
if (getArrayStringEnumRefDefault().get(i) != null) {
457+
try {
458+
joiner.add(String.format("%sarray_string_enum_ref_default%s%s=%s", prefix, suffix,
459+
"".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix),
460+
URLEncoder.encode(String.valueOf(getArrayStringEnumRefDefault().get(i)), "UTF-8").replaceAll("\\+", "%20")));
461+
} catch (UnsupportedEncodingException e) {
462+
// Should never happen, UTF-8 is always supported
463+
throw new RuntimeException(e);
464+
}
465+
}
466+
}
467+
}
468+
412469
// add `array_string_enum_default` to the URL query string
413470
if (getArrayStringEnumDefault() != null) {
414471
for (int i = 0; i < getArrayStringEnumDefault().size(); i++) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/*
2+
* Echo Server API
3+
* Echo Server API
4+
*
5+
* The version of the OpenAPI document: 0.1.0
6+
* Contact: team@openapitools.org
7+
*
8+
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
9+
* https://openapi-generator.tech
10+
* Do not edit the class manually.
11+
*/
12+
13+
14+
package org.openapitools.client.model;
15+
16+
import java.util.Objects;
17+
import java.util.Arrays;
18+
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
19+
import com.fasterxml.jackson.annotation.JsonTypeName;
20+
import java.io.UnsupportedEncodingException;
21+
import java.net.URLEncoder;
22+
import java.util.StringJoiner;
23+
24+
import com.fasterxml.jackson.annotation.JsonCreator;
25+
import com.fasterxml.jackson.annotation.JsonValue;
26+
27+
/**
28+
* Gets or Sets StringEnumRef
29+
*/
30+
public enum StringEnumRef {
31+
32+
SUCCESS("success"),
33+
34+
FAILURE("failure"),
35+
36+
UNCLASSIFIED("unclassified");
37+
38+
private String value;
39+
40+
StringEnumRef(String value) {
41+
this.value = value;
42+
}
43+
44+
@JsonValue
45+
public String getValue() {
46+
return value;
47+
}
48+
49+
@Override
50+
public String toString() {
51+
return String.valueOf(value);
52+
}
53+
54+
@JsonCreator
55+
public static StringEnumRef fromValue(String value) {
56+
for (StringEnumRef b : StringEnumRef.values()) {
57+
if (b.value.equals(value)) {
58+
return b;
59+
}
60+
}
61+
throw new IllegalArgumentException("Unexpected value '" + value + "'");
62+
}
63+
64+
/**
65+
* Convert the instance into URL query string.
66+
*
67+
* @param prefix prefix of the query string
68+
* @return URL query string
69+
*/
70+
public String toUrlQueryString(String prefix) {
71+
if (prefix == null) {
72+
prefix = "";
73+
}
74+
75+
return String.format("%s=%s", prefix, this.toString());
76+
}
77+
}
78+

‎samples/client/echo_api/java/apache-httpclient/src/test/java/org/openapitools/client/CustomTest.java

+14-3
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,10 @@ public void testQueryIntegerBooleanString() throws ApiException {
158158
public void testArrayDefaultValues() {
159159
// test array default values
160160
DefaultValue d = new DefaultValue();
161+
Assert.assertEquals(d.getArrayStringEnumRefDefault().size(), 2);
162+
Assert.assertEquals(d.getArrayStringEnumRefDefault().get(0), StringEnumRef.SUCCESS);
163+
Assert.assertEquals(d.getArrayStringEnumRefDefault().get(1), StringEnumRef.FAILURE);
164+
161165
Assert.assertEquals(d.getArrayStringEnumDefault().size(), 2);
162166
Assert.assertEquals(d.getArrayStringEnumDefault().get(0), DefaultValue.ArrayStringEnumDefaultEnum.SUCCESS);
163167
Assert.assertEquals(d.getArrayStringEnumDefault().get(1), DefaultValue.ArrayStringEnumDefaultEnum.FAILURE);
@@ -197,6 +201,10 @@ public void testDefaultValuesSerializationWithEmptyPayload() throws IOException
197201
DefaultValue d = apiClient.getObjectMapper().readValue(str, new TypeReference<DefaultValue>() {
198202
});
199203

204+
Assert.assertEquals(d.getArrayStringEnumRefDefault().size(), 2);
205+
Assert.assertEquals(d.getArrayStringEnumRefDefault().get(0), StringEnumRef.SUCCESS);
206+
Assert.assertEquals(d.getArrayStringEnumRefDefault().get(1), StringEnumRef.FAILURE);
207+
200208
Assert.assertEquals(d.getArrayStringEnumDefault().size(), 2);
201209
Assert.assertEquals(d.getArrayStringEnumDefault().get(0), DefaultValue.ArrayStringEnumDefaultEnum.SUCCESS);
202210
Assert.assertEquals(d.getArrayStringEnumDefault().get(1), DefaultValue.ArrayStringEnumDefaultEnum.FAILURE);
@@ -212,18 +220,21 @@ public void testDefaultValuesSerializationWithEmptyPayload() throws IOException
212220
Assert.assertNull(d.getArrayStringNullable());
213221
Assert.assertEquals(d.getArrayString().size(), 0);
214222

215-
Assert.assertEquals(apiClient.getObjectMapper().writeValueAsString(d), "{\"array_string_enum_default\":[\"success\",\"failure\"],\"array_string_default\":[\"failure\",\"skipped\"],\"array_integer_default\":[1,3],\"array_string\":[],\"array_string_nullable\":{\"present\":false},\"string_nullable\":{\"present\":false}}");
223+
Assert.assertEquals(apiClient.getObjectMapper().writeValueAsString(d), "{\"array_string_enum_ref_default\":[\"success\",\"failure\"],\"array_string_enum_default\":[\"success\",\"failure\"],\"array_string_default\":[\"failure\",\"skipped\"],\"array_integer_default\":[1,3],\"array_string\":[],\"array_string_nullable\":{\"present\":false},\"string_nullable\":{\"present\":false}}");
216224
}
217225

218226
@Test
219227
public void testDefaultValuesSerializationWithJSONString() throws IOException {
220228
ApiClient apiClient = new ApiClient();
221229

222-
String str = "{ \"array_string_enum_default\": [\"unclassified\"], \"array_string_default\": [\"failure\"] }";
230+
String str = "{ \"array_string_enum_ref_default\": [\"unclassified\"], \"array_string_enum_default\": [\"unclassified\"], \"array_string_default\": [\"failure\"] }";
223231

224232
DefaultValue d = apiClient.getObjectMapper().readValue(str, new TypeReference<DefaultValue>() {
225233
});
226234

235+
Assert.assertEquals(d.getArrayStringEnumRefDefault().size(), 1);
236+
Assert.assertEquals(d.getArrayStringEnumRefDefault().get(0), StringEnumRef.UNCLASSIFIED);
237+
227238
Assert.assertEquals(d.getArrayStringEnumDefault().size(), 1);
228239
Assert.assertEquals(d.getArrayStringEnumDefault().get(0), DefaultValue.ArrayStringEnumDefaultEnum.UNCLASSIFIED);
229240

@@ -237,7 +248,7 @@ public void testDefaultValuesSerializationWithJSONString() throws IOException {
237248
Assert.assertNull(d.getArrayStringNullable());
238249
Assert.assertEquals(d.getArrayString().size(), 0);
239250

240-
Assert.assertEquals(apiClient.getObjectMapper().writeValueAsString(d), "{\"array_string_enum_default\":[\"unclassified\"],\"array_string_default\":[\"failure\"],\"array_integer_default\":[1,3],\"array_string\":[],\"array_string_nullable\":{\"present\":false},\"string_nullable\":{\"present\":false}}");
251+
Assert.assertEquals(apiClient.getObjectMapper().writeValueAsString(d), "{\"array_string_enum_ref_default\":[\"unclassified\"],\"array_string_enum_default\":[\"unclassified\"],\"array_string_default\":[\"failure\"],\"array_integer_default\":[1,3],\"array_string\":[],\"array_string_nullable\":{\"present\":false},\"string_nullable\":{\"present\":false}}");
241252
}
242253

243254
@Test

0 commit comments

Comments
 (0)
Please sign in to comment.