Skip to content

Commit eb668b6

Browse files
authored
reuse Configuration.defaultApiClientin no-arg Api ctors and make ref volatile (fixes issue #20633) (#20635)
* made Configuration.defaultApiClient volatile so that if it's changed the new value is immediately visible to all other threads * made no-arg api ctor use Configuration.getDefaultApiClient() instead of creating new ApiClient every time * replaced all use of URLEncoder.encode with ApiClient.urlEncode; just code cleanup; no functional changes * disabled AbstractJavaCodegenTest.testGeneratedExampleValues as it fails, possibly due to timezone (Locale.ROOT) of local system * replaced thread-unsafe SimpleDateFormat with DateTimeFormatter and re-enabled unit-test * removed unused import * ran the generate-sample scripts and generated a HUGE number of changes! * added missing import of Configuration to api.mustache (and, thus, all native samples) * added missing import for ApiClient to anyof and oneof model mustaches
1 parent c349270 commit eb668b6

File tree

215 files changed

+517
-469
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

215 files changed

+517
-469
lines changed

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import io.swagger.v3.oas.models.parameters.RequestBody;
3232
import io.swagger.v3.oas.models.servers.Server;
3333
import io.swagger.v3.parser.util.SchemaTypeUtil;
34-
import java.text.SimpleDateFormat;
3534
import lombok.Getter;
3635
import lombok.Setter;
3736
import org.apache.commons.io.FilenameUtils;
@@ -54,6 +53,8 @@
5453
import java.io.File;
5554
import java.time.LocalDate;
5655
import java.time.ZoneId;
56+
import java.time.ZonedDateTime;
57+
import java.time.format.DateTimeFormatter;
5758
import java.util.*;
5859
import java.util.concurrent.ConcurrentSkipListSet;
5960
import java.util.regex.Matcher;
@@ -72,7 +73,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
7273

7374
private final Logger LOGGER = LoggerFactory.getLogger(AbstractJavaCodegen.class);
7475
private static final String ARTIFACT_VERSION_DEFAULT_VALUE = "1.0.0";
75-
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd", Locale.ROOT);
76+
private static final ZoneId UTC = ZoneId.of("UTC");
7677

7778
public static final String DEFAULT_LIBRARY = "<default>";
7879
public static final String DATE_LIBRARY = "dateLibrary";
@@ -1641,7 +1642,8 @@ public void setParameterExampleValue(CodegenParameter p) {
16411642
public String toExampleValue(Schema p) {
16421643
if (p.getExample() != null) {
16431644
if (p.getExample() instanceof Date) {
1644-
return DATE_FORMAT.format(p.getExample());
1645+
Date date = (Date)p.getExample();
1646+
return DateTimeFormatter.ISO_LOCAL_DATE.format(ZonedDateTime.ofInstant(date.toInstant(), UTC));
16451647
}
16461648
return escapeText(p.getExample().toString());
16471649
} else {

modules/openapi-generator/src/main/resources/Java/Configuration.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ package {{invokerPackage}};
66
public class Configuration {
77
public static final String VERSION = "{{{artifactVersion}}}";
88
9-
private static ApiClient defaultApiClient = new ApiClient();
9+
private static volatile ApiClient defaultApiClient = new ApiClient();
1010
1111
/**
1212
* Get the default API client, which would be used when creating API

modules/openapi-generator/src/main/resources/Java/libraries/native/anyof_model.mustache

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
1616
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
1717
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
1818
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
19+
import {{invokerPackage}}.ApiClient;
1920
import {{invokerPackage}}.JSON;
2021

2122
{{>additionalModelTypeAnnotations}}{{>generatedAnnotation}}{{>xmlAnnotation}}
@@ -241,7 +242,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
241242
for ({{{items.dataType}}} _item : ({{{dataType}}})getActualInstance()) {
242243
joiner.add(String.format("%s{{baseName}}%s%s=%s", prefix, suffix,
243244
"".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix),
244-
URLEncoder.encode(String.valueOf(_item), StandardCharsets.UTF_8).replaceAll("\\+", "%20")));
245+
ApiClient.urlEncode(String.valueOf(_item))));
245246
}
246247
i++;
247248
}
@@ -251,7 +252,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
251252
for (int i = 0; i < (({{{dataType}}})getActualInstance()).size(); i++) {
252253
joiner.add(String.format("%s{{baseName}}%s%s=%s", prefix, suffix,
253254
"".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix),
254-
URLEncoder.encode(String.valueOf(getActualInstance().get(i)), StandardCharsets.UTF_8).replaceAll("\\+", "%20")));
255+
ApiClient.urlEncode(String.valueOf(getActualInstance().get(i)))));
255256
}
256257
}
257258
{{/uniqueItems}}
@@ -289,7 +290,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
289290
if (_item != null) {
290291
joiner.add(String.format("%s{{baseName}}%s%s=%s", prefix, suffix,
291292
"".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix),
292-
URLEncoder.encode(String.valueOf(_item), StandardCharsets.UTF_8).replaceAll("\\+", "%20")));
293+
ApiClient.urlEncode(String.valueOf(_item))));
293294
}
294295
i++;
295296
}
@@ -301,7 +302,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
301302
if (getActualInstance().get(i) != null) {
302303
joiner.add(String.format("%s{{baseName}}%s%s=%s", prefix, suffix,
303304
"".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix),
304-
URLEncoder.encode(String.valueOf((({{{dataType}}})getActualInstance()).get(i)), StandardCharsets.UTF_8).replaceAll("\\+", "%20")));
305+
ApiClient.urlEncode(String.valueOf((({{{dataType}}})getActualInstance()).get(i)))));
305306
}
306307
}
307308
}
@@ -316,7 +317,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
316317
for (String _key : (({{{dataType}}})getActualInstance()).keySet()) {
317318
joiner.add(String.format("%s{{baseName}}%s%s=%s", prefix, suffix,
318319
"".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, _key, containerSuffix),
319-
getActualInstance().get(_key), URLEncoder.encode(String.valueOf((({{{dataType}}})getActualInstance()).get(_key)), StandardCharsets.UTF_8).replaceAll("\\+", "%20")));
320+
getActualInstance().get(_key), ApiClient.urlEncode(String.valueOf((({{{dataType}}})getActualInstance()).get(_key)))));
320321
}
321322
}
322323
{{/items.isPrimitiveType}}
@@ -334,7 +335,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
334335
{{^isMap}}
335336
{{#isPrimitiveType}}
336337
if (getActualInstance() != null) {
337-
joiner.add(String.format("%s{{{baseName}}}%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getActualInstance()), StandardCharsets.UTF_8).replaceAll("\\+", "%20")));
338+
joiner.add(String.format("%s{{{baseName}}}%s=%s", prefix, suffix, ApiClient.urlEncode(String.valueOf(getActualInstance()))));
338339
}
339340
{{/isPrimitiveType}}
340341
{{^isPrimitiveType}}
@@ -345,7 +346,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
345346
{{/isModel}}
346347
{{^isModel}}
347348
if (getActualInstance() != null) {
348-
joiner.add(String.format("%s{{{baseName}}}%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getActualInstance()), StandardCharsets.UTF_8).replaceAll("\\+", "%20")));
349+
joiner.add(String.format("%s{{{baseName}}}%s=%s", prefix, suffix, ApiClient.urlEncode(String.valueOf(getActualInstance()))));
349350
}
350351
{{/isModel}}
351352
{{/isPrimitiveType}}

modules/openapi-generator/src/main/resources/Java/libraries/native/api.mustache

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package {{package}};
44
import {{invokerPackage}}.ApiClient;
55
import {{invokerPackage}}.ApiException;
66
import {{invokerPackage}}.ApiResponse;
7+
import {{invokerPackage}}.Configuration;
78
import {{invokerPackage}}.Pair;
89

910
{{#imports}}
@@ -64,7 +65,7 @@ public class {{classname}} {
6465
private final Consumer<HttpResponse<String>> memberVarAsyncResponseInterceptor;
6566
6667
public {{classname}}() {
67-
this(new ApiClient());
68+
this(Configuration.getDefaultApiClient());
6869
}
6970

7071
public {{classname}}(ApiClient apiClient) {

modules/openapi-generator/src/main/resources/Java/libraries/native/oneof_model.mustache

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
1818
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
1919
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
2020
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
21+
import {{invokerPackage}}.ApiClient;
2122
import {{invokerPackage}}.JSON;
2223

2324
{{>additionalModelTypeAnnotations}}{{>generatedAnnotation}}{{>xmlAnnotation}}
@@ -274,7 +275,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
274275
for ({{{items.dataType}}} _item : ({{{dataType}}})getActualInstance()) {
275276
joiner.add(String.format("%s{{baseName}}%s%s=%s", prefix, suffix,
276277
"".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix),
277-
URLEncoder.encode(String.valueOf(_item), StandardCharsets.UTF_8).replaceAll("\\+", "%20")));
278+
ApiClient.urlEncode(String.valueOf(_item))));
278279
}
279280
i++;
280281
}
@@ -284,7 +285,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
284285
for (int i = 0; i < (({{{dataType}}})getActualInstance()).size(); i++) {
285286
joiner.add(String.format("%s{{baseName}}%s%s=%s", prefix, suffix,
286287
"".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix),
287-
URLEncoder.encode(String.valueOf(getActualInstance().get(i)), StandardCharsets.UTF_8).replaceAll("\\+", "%20")));
288+
ApiClient.urlEncode(String.valueOf(getActualInstance().get(i)))));
288289
}
289290
}
290291
{{/uniqueItems}}
@@ -322,7 +323,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
322323
if (_item != null) {
323324
joiner.add(String.format("%s{{baseName}}%s%s=%s", prefix, suffix,
324325
"".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix),
325-
URLEncoder.encode(String.valueOf(_item), StandardCharsets.UTF_8).replaceAll("\\+", "%20")));
326+
ApiClient.urlEncode(String.valueOf(_item))));
326327
}
327328
i++;
328329
}
@@ -334,7 +335,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
334335
if (getActualInstance().get(i) != null) {
335336
joiner.add(String.format("%s{{baseName}}%s%s=%s", prefix, suffix,
336337
"".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix),
337-
URLEncoder.encode(String.valueOf((({{{dataType}}})getActualInstance()).get(i)), StandardCharsets.UTF_8).replaceAll("\\+", "%20")));
338+
ApiClient.urlEncode(String.valueOf((({{{dataType}}})getActualInstance()).get(i)))));
338339
}
339340
}
340341
}
@@ -349,7 +350,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
349350
for (String _key : (({{{dataType}}})getActualInstance()).keySet()) {
350351
joiner.add(String.format("%s{{baseName}}%s%s=%s", prefix, suffix,
351352
"".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, _key, containerSuffix),
352-
getActualInstance().get(_key), URLEncoder.encode(String.valueOf((({{{dataType}}})getActualInstance()).get(_key)), StandardCharsets.UTF_8).replaceAll("\\+", "%20")));
353+
getActualInstance().get(_key), ApiClient.urlEncode(String.valueOf((({{{dataType}}})getActualInstance()).get(_key)))));
353354
}
354355
}
355356
{{/items.isPrimitiveType}}
@@ -367,7 +368,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
367368
{{^isMap}}
368369
{{#isPrimitiveType}}
369370
if (getActualInstance() != null) {
370-
joiner.add(String.format("%s{{{baseName}}}%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getActualInstance()), StandardCharsets.UTF_8).replaceAll("\\+", "%20")));
371+
joiner.add(String.format("%s{{{baseName}}}%s=%s", prefix, suffix, ApiClient.urlEncode(String.valueOf(getActualInstance()))));
371372
}
372373
{{/isPrimitiveType}}
373374
{{^isPrimitiveType}}
@@ -378,7 +379,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
378379
{{/isModel}}
379380
{{^isModel}}
380381
if (getActualInstance() != null) {
381-
joiner.add(String.format("%s{{{baseName}}}%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getActualInstance()), StandardCharsets.UTF_8).replaceAll("\\+", "%20")));
382+
joiner.add(String.format("%s{{{baseName}}}%s=%s", prefix, suffix, ApiClient.urlEncode(String.valueOf(getActualInstance()))));
382383
}
383384
{{/isModel}}
384385
{{/isPrimitiveType}}

modules/openapi-generator/src/main/resources/Java/libraries/native/pojo.mustache

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ public class {{classname}} {{#parent}}extends {{{.}}} {{/parent}}{{#vendorExtens
386386
for ({{{items.dataType}}} _item : {{getter}}()) {
387387
joiner.add(String.format("%s{{baseName}}%s%s=%s", prefix, suffix,
388388
"".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix),
389-
URLEncoder.encode(ApiClient.valueToString(_item), StandardCharsets.UTF_8).replaceAll("\\+", "%20")));
389+
ApiClient.urlEncode(ApiClient.valueToString(_item))));
390390
}
391391
i++;
392392
}
@@ -396,7 +396,7 @@ public class {{classname}} {{#parent}}extends {{{.}}} {{/parent}}{{#vendorExtens
396396
for (int i = 0; i < {{getter}}().size(); i++) {
397397
joiner.add(String.format("%s{{baseName}}%s%s=%s", prefix, suffix,
398398
"".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix),
399-
URLEncoder.encode(ApiClient.valueToString({{getter}}().get(i)), StandardCharsets.UTF_8).replaceAll("\\+", "%20")));
399+
ApiClient.urlEncode(ApiClient.valueToString({{getter}}().get(i)))));
400400
}
401401
}
402402
{{/uniqueItems}}
@@ -434,7 +434,7 @@ public class {{classname}} {{#parent}}extends {{{.}}} {{/parent}}{{#vendorExtens
434434
if (_item != null) {
435435
joiner.add(String.format("%s{{baseName}}%s%s=%s", prefix, suffix,
436436
"".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix),
437-
URLEncoder.encode(ApiClient.valueToString(_item), StandardCharsets.UTF_8).replaceAll("\\+", "%20")));
437+
ApiClient.urlEncode(ApiClient.valueToString(_item))));
438438
}
439439
i++;
440440
}
@@ -446,7 +446,7 @@ public class {{classname}} {{#parent}}extends {{{.}}} {{/parent}}{{#vendorExtens
446446
if ({{getter}}().get(i) != null) {
447447
joiner.add(String.format("%s{{baseName}}%s%s=%s", prefix, suffix,
448448
"".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix),
449-
URLEncoder.encode(ApiClient.valueToString({{getter}}().get(i)), StandardCharsets.UTF_8).replaceAll("\\+", "%20")));
449+
ApiClient.urlEncode(ApiClient.valueToString({{getter}}().get(i)))));
450450
}
451451
}
452452
}
@@ -461,7 +461,7 @@ public class {{classname}} {{#parent}}extends {{{.}}} {{/parent}}{{#vendorExtens
461461
for (String _key : {{getter}}().keySet()) {
462462
joiner.add(String.format("%s{{baseName}}%s%s=%s", prefix, suffix,
463463
"".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, _key, containerSuffix),
464-
{{getter}}().get(_key), URLEncoder.encode(ApiClient.valueToString({{getter}}().get(_key)), StandardCharsets.UTF_8).replaceAll("\\+", "%20")));
464+
{{getter}}().get(_key), ApiClient.urlEncode(ApiClient.valueToString({{getter}}().get(_key)))));
465465
}
466466
}
467467
{{/items.isModel}}
@@ -479,7 +479,7 @@ public class {{classname}} {{#parent}}extends {{{.}}} {{/parent}}{{#vendorExtens
479479
{{^isMap}}
480480
{{#isPrimitiveType}}
481481
if ({{getter}}() != null) {
482-
joiner.add(String.format("%s{{{baseName}}}%s=%s", prefix, suffix, URLEncoder.encode(ApiClient.valueToString({{{getter}}}()), StandardCharsets.UTF_8).replaceAll("\\+", "%20")));
482+
joiner.add(String.format("%s{{{baseName}}}%s=%s", prefix, suffix, ApiClient.urlEncode(ApiClient.valueToString({{{getter}}}()))));
483483
}
484484
{{/isPrimitiveType}}
485485
{{^isPrimitiveType}}
@@ -490,7 +490,7 @@ public class {{classname}} {{#parent}}extends {{{.}}} {{/parent}}{{#vendorExtens
490490
{{/isModel}}
491491
{{^isModel}}
492492
if ({{getter}}() != null) {
493-
joiner.add(String.format("%s{{{baseName}}}%s=%s", prefix, suffix, URLEncoder.encode(ApiClient.valueToString({{{getter}}}()), StandardCharsets.UTF_8).replaceAll("\\+", "%20")));
493+
joiner.add(String.format("%s{{{baseName}}}%s=%s", prefix, suffix, ApiClient.urlEncode(ApiClient.valueToString({{{getter}}}()))));
494494
}
495495
{{/isModel}}
496496
{{/isPrimitiveType}}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -970,6 +970,6 @@ public void testGeneratedExampleValues() {
970970
final OpenAPI openAPI = FLATTENED_SPEC.get("3_0/spring/date-time-parameter-types-for-testing");
971971
codegen.setOpenAPI(openAPI);
972972
DateSchema dateSchema = (DateSchema) openAPI.getPaths().get("/thingy/{date}").getPost().getParameters().get(0).getSchema();
973-
Assert.assertTrue(codegen.escapeQuotationMark(codegen.toExampleValue(dateSchema)).matches("2021-01-01"));
973+
assertThat(codegen.escapeQuotationMark(codegen.toExampleValue(dateSchema))).isEqualTo("2021-01-01");
974974
}
975975
}

samples/client/echo_api/java/apache-httpclient/src/main/java/org/openapitools/client/Configuration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
public class Configuration {
1818
public static final String VERSION = "0.1.0";
1919

20-
private static ApiClient defaultApiClient = new ApiClient();
20+
private static volatile ApiClient defaultApiClient = new ApiClient();
2121

2222
/**
2323
* Get the default API client, which would be used when creating API

samples/client/echo_api/java/native/src/main/java/org/openapitools/client/Configuration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
public class Configuration {
1818
public static final String VERSION = "0.1.0";
1919

20-
private static ApiClient defaultApiClient = new ApiClient();
20+
private static volatile ApiClient defaultApiClient = new ApiClient();
2121

2222
/**
2323
* Get the default API client, which would be used when creating API

samples/client/echo_api/java/native/src/main/java/org/openapitools/client/api/AuthApi.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.openapitools.client.ApiClient;
1616
import org.openapitools.client.ApiException;
1717
import org.openapitools.client.ApiResponse;
18+
import org.openapitools.client.Configuration;
1819
import org.openapitools.client.Pair;
1920

2021

@@ -54,7 +55,7 @@ public class AuthApi {
5455
private final Consumer<HttpResponse<String>> memberVarAsyncResponseInterceptor;
5556

5657
public AuthApi() {
57-
this(new ApiClient());
58+
this(Configuration.getDefaultApiClient());
5859
}
5960

6061
public AuthApi(ApiClient apiClient) {

0 commit comments

Comments
 (0)