Skip to content

Commit 6bbefca

Browse files
ronreynoldsJacobOJ
authored andcommitted
Java client enhanced Configuration with ApiClient Supplier (#20738)
* enhanced Configuration.mustache (thread-safe, lazy-eval, plugable factory * removed comment in Configuration.mustache * fresh samples
1 parent 118ac7b commit 6bbefca

File tree

35 files changed

+1540
-770
lines changed

35 files changed

+1540
-770
lines changed

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

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,51 @@
22

33
package {{invokerPackage}};
44

5+
import java.util.Objects;
6+
import java.util.concurrent.atomic.AtomicReference;
7+
import java.util.function.Supplier;
8+
59
{{>generatedAnnotation}}
610
public class Configuration {
7-
public static final String VERSION = "{{{artifactVersion}}}";
8-
9-
private static volatile ApiClient defaultApiClient = new ApiClient();
10-
11-
/**
12-
* Get the default API client, which would be used when creating API
13-
* instances without providing an API client.
14-
*
15-
* @return Default API client
16-
*/
17-
public static ApiClient getDefaultApiClient() {
18-
return defaultApiClient;
19-
}
11+
public static final String VERSION = "{{{artifactVersion}}}";
12+
13+
private static final AtomicReference<ApiClient> defaultApiClient = new AtomicReference<>();
14+
private static volatile Supplier<ApiClient> apiClientFactory = ApiClient::new;
2015
21-
/**
22-
* Set the default API client, which would be used when creating API
23-
* instances without providing an API client.
24-
*
25-
* @param apiClient API client
26-
*/
27-
public static void setDefaultApiClient(ApiClient apiClient) {
28-
defaultApiClient = apiClient;
16+
/**
17+
* Get the default API client, which would be used when creating API instances without providing an API client.
18+
*
19+
* @return Default API client
20+
*/
21+
public static ApiClient getDefaultApiClient() {
22+
ApiClient client = defaultApiClient.get();
23+
if (client == null) {
24+
client = defaultApiClient.updateAndGet(val -> {
25+
if (val != null) { // changed by another thread
26+
return val;
27+
}
28+
return apiClientFactory.get();
29+
});
2930
}
30-
}
31+
return client;
32+
}
33+
34+
/**
35+
* Set the default API client, which would be used when creating API instances without providing an API client.
36+
*
37+
* @param apiClient API client
38+
*/
39+
public static void setDefaultApiClient(ApiClient apiClient) {
40+
defaultApiClient.set(apiClient);
41+
}
42+
43+
/**
44+
* set the callback used to create new ApiClient objects
45+
*/
46+
public static void setApiClientFactory(Supplier<ApiClient> factory) {
47+
apiClientFactory = Objects.requireNonNull(factory);
48+
}
49+
50+
private Configuration() {
51+
}
52+
}

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

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,29 +13,51 @@
1313

1414
package org.openapitools.client;
1515

16+
import java.util.Objects;
17+
import java.util.concurrent.atomic.AtomicReference;
18+
import java.util.function.Supplier;
19+
1620
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.13.0-SNAPSHOT")
1721
public class Configuration {
18-
public static final String VERSION = "0.1.0";
19-
20-
private static volatile ApiClient defaultApiClient = new ApiClient();
21-
22-
/**
23-
* Get the default API client, which would be used when creating API
24-
* instances without providing an API client.
25-
*
26-
* @return Default API client
27-
*/
28-
public static ApiClient getDefaultApiClient() {
29-
return defaultApiClient;
30-
}
22+
public static final String VERSION = "0.1.0";
23+
24+
private static final AtomicReference<ApiClient> defaultApiClient = new AtomicReference<>();
25+
private static volatile Supplier<ApiClient> apiClientFactory = ApiClient::new;
3126

32-
/**
33-
* Set the default API client, which would be used when creating API
34-
* instances without providing an API client.
35-
*
36-
* @param apiClient API client
37-
*/
38-
public static void setDefaultApiClient(ApiClient apiClient) {
39-
defaultApiClient = apiClient;
27+
/**
28+
* Get the default API client, which would be used when creating API instances without providing an API client.
29+
*
30+
* @return Default API client
31+
*/
32+
public static ApiClient getDefaultApiClient() {
33+
ApiClient client = defaultApiClient.get();
34+
if (client == null) {
35+
client = defaultApiClient.updateAndGet(val -> {
36+
if (val != null) { // changed by another thread
37+
return val;
38+
}
39+
return apiClientFactory.get();
40+
});
4041
}
41-
}
42+
return client;
43+
}
44+
45+
/**
46+
* Set the default API client, which would be used when creating API instances without providing an API client.
47+
*
48+
* @param apiClient API client
49+
*/
50+
public static void setDefaultApiClient(ApiClient apiClient) {
51+
defaultApiClient.set(apiClient);
52+
}
53+
54+
/**
55+
* set the callback used to create new ApiClient objects
56+
*/
57+
public static void setApiClientFactory(Supplier<ApiClient> factory) {
58+
apiClientFactory = Objects.requireNonNull(factory);
59+
}
60+
61+
private Configuration() {
62+
}
63+
}

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

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,29 +13,51 @@
1313

1414
package org.openapitools.client;
1515

16+
import java.util.Objects;
17+
import java.util.concurrent.atomic.AtomicReference;
18+
import java.util.function.Supplier;
19+
1620
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.13.0-SNAPSHOT")
1721
public class Configuration {
18-
public static final String VERSION = "0.1.0";
19-
20-
private static volatile ApiClient defaultApiClient = new ApiClient();
21-
22-
/**
23-
* Get the default API client, which would be used when creating API
24-
* instances without providing an API client.
25-
*
26-
* @return Default API client
27-
*/
28-
public static ApiClient getDefaultApiClient() {
29-
return defaultApiClient;
30-
}
22+
public static final String VERSION = "0.1.0";
23+
24+
private static final AtomicReference<ApiClient> defaultApiClient = new AtomicReference<>();
25+
private static volatile Supplier<ApiClient> apiClientFactory = ApiClient::new;
3126

32-
/**
33-
* Set the default API client, which would be used when creating API
34-
* instances without providing an API client.
35-
*
36-
* @param apiClient API client
37-
*/
38-
public static void setDefaultApiClient(ApiClient apiClient) {
39-
defaultApiClient = apiClient;
27+
/**
28+
* Get the default API client, which would be used when creating API instances without providing an API client.
29+
*
30+
* @return Default API client
31+
*/
32+
public static ApiClient getDefaultApiClient() {
33+
ApiClient client = defaultApiClient.get();
34+
if (client == null) {
35+
client = defaultApiClient.updateAndGet(val -> {
36+
if (val != null) { // changed by another thread
37+
return val;
38+
}
39+
return apiClientFactory.get();
40+
});
4041
}
41-
}
42+
return client;
43+
}
44+
45+
/**
46+
* Set the default API client, which would be used when creating API instances without providing an API client.
47+
*
48+
* @param apiClient API client
49+
*/
50+
public static void setDefaultApiClient(ApiClient apiClient) {
51+
defaultApiClient.set(apiClient);
52+
}
53+
54+
/**
55+
* set the callback used to create new ApiClient objects
56+
*/
57+
public static void setApiClientFactory(Supplier<ApiClient> factory) {
58+
apiClientFactory = Objects.requireNonNull(factory);
59+
}
60+
61+
private Configuration() {
62+
}
63+
}

samples/client/echo_api/java/okhttp-gson-user-defined-templates/src/main/java/org/openapitools/client/Configuration.java

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,29 +13,51 @@
1313

1414
package org.openapitools.client;
1515

16+
import java.util.Objects;
17+
import java.util.concurrent.atomic.AtomicReference;
18+
import java.util.function.Supplier;
19+
1620
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.13.0-SNAPSHOT")
1721
public class Configuration {
18-
public static final String VERSION = "1.0.0";
19-
20-
private static volatile ApiClient defaultApiClient = new ApiClient();
21-
22-
/**
23-
* Get the default API client, which would be used when creating API
24-
* instances without providing an API client.
25-
*
26-
* @return Default API client
27-
*/
28-
public static ApiClient getDefaultApiClient() {
29-
return defaultApiClient;
30-
}
22+
public static final String VERSION = "1.0.0";
23+
24+
private static final AtomicReference<ApiClient> defaultApiClient = new AtomicReference<>();
25+
private static volatile Supplier<ApiClient> apiClientFactory = ApiClient::new;
3126

32-
/**
33-
* Set the default API client, which would be used when creating API
34-
* instances without providing an API client.
35-
*
36-
* @param apiClient API client
37-
*/
38-
public static void setDefaultApiClient(ApiClient apiClient) {
39-
defaultApiClient = apiClient;
27+
/**
28+
* Get the default API client, which would be used when creating API instances without providing an API client.
29+
*
30+
* @return Default API client
31+
*/
32+
public static ApiClient getDefaultApiClient() {
33+
ApiClient client = defaultApiClient.get();
34+
if (client == null) {
35+
client = defaultApiClient.updateAndGet(val -> {
36+
if (val != null) { // changed by another thread
37+
return val;
38+
}
39+
return apiClientFactory.get();
40+
});
4041
}
41-
}
42+
return client;
43+
}
44+
45+
/**
46+
* Set the default API client, which would be used when creating API instances without providing an API client.
47+
*
48+
* @param apiClient API client
49+
*/
50+
public static void setDefaultApiClient(ApiClient apiClient) {
51+
defaultApiClient.set(apiClient);
52+
}
53+
54+
/**
55+
* set the callback used to create new ApiClient objects
56+
*/
57+
public static void setApiClientFactory(Supplier<ApiClient> factory) {
58+
apiClientFactory = Objects.requireNonNull(factory);
59+
}
60+
61+
private Configuration() {
62+
}
63+
}

samples/client/echo_api/java/okhttp-gson/src/main/java/org/openapitools/client/Configuration.java

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,29 +13,51 @@
1313

1414
package org.openapitools.client;
1515

16+
import java.util.Objects;
17+
import java.util.concurrent.atomic.AtomicReference;
18+
import java.util.function.Supplier;
19+
1620
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.13.0-SNAPSHOT")
1721
public class Configuration {
18-
public static final String VERSION = "0.1.0";
19-
20-
private static volatile ApiClient defaultApiClient = new ApiClient();
21-
22-
/**
23-
* Get the default API client, which would be used when creating API
24-
* instances without providing an API client.
25-
*
26-
* @return Default API client
27-
*/
28-
public static ApiClient getDefaultApiClient() {
29-
return defaultApiClient;
30-
}
22+
public static final String VERSION = "0.1.0";
23+
24+
private static final AtomicReference<ApiClient> defaultApiClient = new AtomicReference<>();
25+
private static volatile Supplier<ApiClient> apiClientFactory = ApiClient::new;
3126

32-
/**
33-
* Set the default API client, which would be used when creating API
34-
* instances without providing an API client.
35-
*
36-
* @param apiClient API client
37-
*/
38-
public static void setDefaultApiClient(ApiClient apiClient) {
39-
defaultApiClient = apiClient;
27+
/**
28+
* Get the default API client, which would be used when creating API instances without providing an API client.
29+
*
30+
* @return Default API client
31+
*/
32+
public static ApiClient getDefaultApiClient() {
33+
ApiClient client = defaultApiClient.get();
34+
if (client == null) {
35+
client = defaultApiClient.updateAndGet(val -> {
36+
if (val != null) { // changed by another thread
37+
return val;
38+
}
39+
return apiClientFactory.get();
40+
});
4041
}
41-
}
42+
return client;
43+
}
44+
45+
/**
46+
* Set the default API client, which would be used when creating API instances without providing an API client.
47+
*
48+
* @param apiClient API client
49+
*/
50+
public static void setDefaultApiClient(ApiClient apiClient) {
51+
defaultApiClient.set(apiClient);
52+
}
53+
54+
/**
55+
* set the callback used to create new ApiClient objects
56+
*/
57+
public static void setApiClientFactory(Supplier<ApiClient> factory) {
58+
apiClientFactory = Objects.requireNonNull(factory);
59+
}
60+
61+
private Configuration() {
62+
}
63+
}

0 commit comments

Comments
 (0)