Skip to content

Commit bd19a51

Browse files
committed
enhanced Configuration.mustache (thread-safe, lazy-eval, plugable factory
1 parent 5f92de4 commit bd19a51

File tree

35 files changed

+1855
-770
lines changed

35 files changed

+1855
-770
lines changed

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

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

33
package {{invokerPackage}};
44

5+
import java.util.Objects;
6+
import java.util.concurrent.atomic.AtomicReference;
7+
import java.util.function.Supplier;
8+
9+
/**
10+
* modified version of the java-native version with planned enhancements:
11+
* <ul>
12+
* <li>private ctor (Effective Java item 4)</li>
13+
* <li>thread-safe storage of ApIClient ref</li>
14+
* <li>lazy eval of ApiClient</li>
15+
* <li>configurable callback to create ApiClient on demand</li>
16+
* </ul>
17+
*/
518
{{>generatedAnnotation}}
619
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-
}
20+
public static final String VERSION = "{{{artifactVersion}}}";
21+
22+
private static final AtomicReference<ApiClient> defaultApiClient = new AtomicReference<>();
23+
private static volatile Supplier<ApiClient> apiClientFactory = ApiClient::new;
2024
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;
25+
/**
26+
* Get the default API client, which would be used when creating API instances without providing an API client.
27+
*
28+
* @return Default API client
29+
*/
30+
public static ApiClient getDefaultApiClient() {
31+
ApiClient client = defaultApiClient.get();
32+
if (client == null) {
33+
client = defaultApiClient.updateAndGet(val -> {
34+
if (val != null) { // changed by another thread
35+
return val;
36+
}
37+
return apiClientFactory.get();
38+
});
2939
}
30-
}
40+
return client;
41+
}
42+
43+
/**
44+
* Set the default API client, which would be used when creating API instances without providing an API client.
45+
*
46+
* @param apiClient API client
47+
*/
48+
public static void setDefaultApiClient(ApiClient apiClient) {
49+
defaultApiClient.set(apiClient);
50+
}
51+
52+
/**
53+
* set the callback used to create new ApiClient objects
54+
*/
55+
public static void setApiClientFactory(Supplier<ApiClient> factory) {
56+
apiClientFactory = Objects.requireNonNull(factory);
57+
}
58+
59+
private Configuration() {
60+
}
61+
}

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

Lines changed: 53 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,29 +13,60 @@
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+
20+
/**
21+
* modified version of the java-native version with planned enhancements:
22+
* <ul>
23+
* <li>private ctor (Effective Java item 4)</li>
24+
* <li>thread-safe storage of ApIClient ref</li>
25+
* <li>lazy eval of ApiClient</li>
26+
* <li>configurable callback to create ApiClient on demand</li>
27+
* </ul>
28+
*/
1629
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.12.0-SNAPSHOT")
1730
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-
}
31+
public static final String VERSION = "0.1.0";
32+
33+
private static final AtomicReference<ApiClient> defaultApiClient = new AtomicReference<>();
34+
private static volatile Supplier<ApiClient> apiClientFactory = ApiClient::new;
3135

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;
36+
/**
37+
* Get the default API client, which would be used when creating API instances without providing an API client.
38+
*
39+
* @return Default API client
40+
*/
41+
public static ApiClient getDefaultApiClient() {
42+
ApiClient client = defaultApiClient.get();
43+
if (client == null) {
44+
client = defaultApiClient.updateAndGet(val -> {
45+
if (val != null) { // changed by another thread
46+
return val;
47+
}
48+
return apiClientFactory.get();
49+
});
4050
}
41-
}
51+
return client;
52+
}
53+
54+
/**
55+
* Set the default API client, which would be used when creating API instances without providing an API client.
56+
*
57+
* @param apiClient API client
58+
*/
59+
public static void setDefaultApiClient(ApiClient apiClient) {
60+
defaultApiClient.set(apiClient);
61+
}
62+
63+
/**
64+
* set the callback used to create new ApiClient objects
65+
*/
66+
public static void setApiClientFactory(Supplier<ApiClient> factory) {
67+
apiClientFactory = Objects.requireNonNull(factory);
68+
}
69+
70+
private Configuration() {
71+
}
72+
}

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

Lines changed: 53 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,29 +13,60 @@
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+
20+
/**
21+
* modified version of the java-native version with planned enhancements:
22+
* <ul>
23+
* <li>private ctor (Effective Java item 4)</li>
24+
* <li>thread-safe storage of ApIClient ref</li>
25+
* <li>lazy eval of ApiClient</li>
26+
* <li>configurable callback to create ApiClient on demand</li>
27+
* </ul>
28+
*/
1629
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.12.0-SNAPSHOT")
1730
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-
}
31+
public static final String VERSION = "0.1.0";
32+
33+
private static final AtomicReference<ApiClient> defaultApiClient = new AtomicReference<>();
34+
private static volatile Supplier<ApiClient> apiClientFactory = ApiClient::new;
3135

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;
36+
/**
37+
* Get the default API client, which would be used when creating API instances without providing an API client.
38+
*
39+
* @return Default API client
40+
*/
41+
public static ApiClient getDefaultApiClient() {
42+
ApiClient client = defaultApiClient.get();
43+
if (client == null) {
44+
client = defaultApiClient.updateAndGet(val -> {
45+
if (val != null) { // changed by another thread
46+
return val;
47+
}
48+
return apiClientFactory.get();
49+
});
4050
}
41-
}
51+
return client;
52+
}
53+
54+
/**
55+
* Set the default API client, which would be used when creating API instances without providing an API client.
56+
*
57+
* @param apiClient API client
58+
*/
59+
public static void setDefaultApiClient(ApiClient apiClient) {
60+
defaultApiClient.set(apiClient);
61+
}
62+
63+
/**
64+
* set the callback used to create new ApiClient objects
65+
*/
66+
public static void setApiClientFactory(Supplier<ApiClient> factory) {
67+
apiClientFactory = Objects.requireNonNull(factory);
68+
}
69+
70+
private Configuration() {
71+
}
72+
}

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

Lines changed: 53 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,29 +13,60 @@
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+
20+
/**
21+
* modified version of the java-native version with planned enhancements:
22+
* <ul>
23+
* <li>private ctor (Effective Java item 4)</li>
24+
* <li>thread-safe storage of ApIClient ref</li>
25+
* <li>lazy eval of ApiClient</li>
26+
* <li>configurable callback to create ApiClient on demand</li>
27+
* </ul>
28+
*/
1629
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.12.0-SNAPSHOT")
1730
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-
}
31+
public static final String VERSION = "1.0.0";
32+
33+
private static final AtomicReference<ApiClient> defaultApiClient = new AtomicReference<>();
34+
private static volatile Supplier<ApiClient> apiClientFactory = ApiClient::new;
3135

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;
36+
/**
37+
* Get the default API client, which would be used when creating API instances without providing an API client.
38+
*
39+
* @return Default API client
40+
*/
41+
public static ApiClient getDefaultApiClient() {
42+
ApiClient client = defaultApiClient.get();
43+
if (client == null) {
44+
client = defaultApiClient.updateAndGet(val -> {
45+
if (val != null) { // changed by another thread
46+
return val;
47+
}
48+
return apiClientFactory.get();
49+
});
4050
}
41-
}
51+
return client;
52+
}
53+
54+
/**
55+
* Set the default API client, which would be used when creating API instances without providing an API client.
56+
*
57+
* @param apiClient API client
58+
*/
59+
public static void setDefaultApiClient(ApiClient apiClient) {
60+
defaultApiClient.set(apiClient);
61+
}
62+
63+
/**
64+
* set the callback used to create new ApiClient objects
65+
*/
66+
public static void setApiClientFactory(Supplier<ApiClient> factory) {
67+
apiClientFactory = Objects.requireNonNull(factory);
68+
}
69+
70+
private Configuration() {
71+
}
72+
}

0 commit comments

Comments
 (0)