Skip to content

Commit 14a500c

Browse files
authored
[Java][Client] Use java8 OffsetDateTime for clients (#7190)
* use java8 OffsetDateTime for clients * use java8 OffsetDateTime for clients * fix javadoc * add javadoc to JavaTimeFormatter.mustache * add javadoc to JavaTimeFormatter.mustache * add javadoc to JavaTimeFormatter.mustache
1 parent b9662dc commit 14a500c

24 files changed

Lines changed: 452 additions & 19 deletions

File tree

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4973,6 +4973,15 @@ public String getLibrary() {
49734973
return library;
49744974
}
49754975

4976+
/**
4977+
* check if current active library equals to passed
4978+
* @param library - library to be compared with
4979+
* @return {@code true} if passed library is active, {@code false} otherwise
4980+
*/
4981+
public final boolean isLibrary(String library) {
4982+
return library.equals(this.library);
4983+
}
4984+
49764985
/**
49774986
* Set Git host.
49784987
*

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,13 +325,16 @@ public void processOpts() {
325325
supportingFiles.add(new SupportingFile("ServerVariable.mustache", invokerFolder, "ServerVariable.java"));
326326
supportingFiles.add(new SupportingFile("openapi.mustache", "api", "openapi.yaml"));
327327

328+
if (dateLibrary.equals("java8") && (isLibrary(WEBCLIENT) || isLibrary(VERTX) || isLibrary(RESTTEMPLATE) || isLibrary(RESTEASY) || isLibrary(MICROPROFILE) || isLibrary(JERSEY2))) {
329+
supportingFiles.add(new SupportingFile("JavaTimeFormatter.mustache", invokerFolder, "JavaTimeFormatter.java"));
330+
}
328331

329-
if (!(RESTTEMPLATE.equals(getLibrary()) || REST_ASSURED.equals(getLibrary()) || NATIVE.equals(getLibrary()) || MICROPROFILE.equals(getLibrary()))) {
332+
if (!(RESTTEMPLATE.equals(getLibrary()) || isLibrary(REST_ASSURED) || isLibrary(NATIVE) || isLibrary(MICROPROFILE))) {
330333
supportingFiles.add(new SupportingFile("StringUtil.mustache", invokerFolder, "StringUtil.java"));
331334
}
332335

333336
// google-api-client doesn't use the OpenAPI auth, because it uses Google Credential directly (HttpRequestInitializer)
334-
if (!(GOOGLE_API_CLIENT.equals(getLibrary()) || REST_ASSURED.equals(getLibrary()) || NATIVE.equals(getLibrary()) || MICROPROFILE.equals(getLibrary()))) {
337+
if (!(isLibrary(GOOGLE_API_CLIENT) || isLibrary(REST_ASSURED) || isLibrary(NATIVE) || isLibrary(MICROPROFILE))) {
335338
supportingFiles.add(new SupportingFile("auth/HttpBasicAuth.mustache", authFolder, "HttpBasicAuth.java"));
336339
supportingFiles.add(new SupportingFile("auth/HttpBearerAuth.mustache", authFolder, "HttpBearerAuth.java"));
337340
supportingFiles.add(new SupportingFile("auth/ApiKeyAuth.mustache", authFolder, "ApiKeyAuth.java"));

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.fasterxml.jackson.datatype.joda.JodaModule;
1212
{{/joda}}
1313
{{#java8}}
1414
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
15+
import java.time.OffsetDateTime;
1516
{{/java8}}
1617
{{#threetenbp}}
1718
import com.fasterxml.jackson.datatype.threetenbp.ThreeTenModule;
@@ -67,7 +68,7 @@ import {{invokerPackage}}.auth.OAuth;
6768
{{/hasOAuthMethods}}
6869

6970
{{>generatedAnnotation}}
70-
public class ApiClient {
71+
public class ApiClient{{#java8}} extends JavaTimeFormatter{{/java8}} {
7172
private Map<String, String> defaultHeaderMap = new HashMap<String, String>();
7273
private Map<String, String> defaultCookieMap = new HashMap<String, String>();
7374
private String basePath = "{{{basePath}}}";
@@ -499,7 +500,9 @@ public class ApiClient {
499500
return "";
500501
} else if (param instanceof Date) {
501502
return formatDate((Date) param);
502-
} else if (param instanceof Collection) {
503+
} {{#java8}}else if (param instanceof OffsetDateTime) {
504+
return formatOffsetDateTime((OffsetDateTime) param);
505+
} {{/java8}}else if (param instanceof Collection) {
503506
StringBuilder b = new StringBuilder();
504507
for(Object o : (Collection<?>)param) {
505508
if(b.length() > 0) {
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
{{>licenseInfo}}
2+
package {{invokerPackage}};
3+
4+
import java.time.OffsetDateTime;
5+
import java.time.format.DateTimeFormatter;
6+
import java.time.format.DateTimeParseException;
7+
8+
/**
9+
* Class that add parsing/formatting support for Java 8+ {@code OffsetDateTime} class.
10+
* It's generated for java clients when {@code AbstractJavaCodegen#dateLibrary} specified as {@code java8}.
11+
*/
12+
{{>generatedAnnotation}}
13+
public class JavaTimeFormatter {
14+
15+
private DateTimeFormatter offsetDateTimeFormatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
16+
17+
/**
18+
* Get the date format used to parse/format {@code OffsetDateTime} parameters.
19+
* @return DateTimeFormatter
20+
*/
21+
public DateTimeFormatter getOffsetDateTimeFormatter() {
22+
return offsetDateTimeFormatter;
23+
}
24+
25+
/**
26+
* Set the date format used to parse/format {@code OffsetDateTime} parameters.
27+
* @param offsetDateTimeFormatter {@code DateTimeFormatter}
28+
*/
29+
public void setOffsetDateTimeFormatter(DateTimeFormatter offsetDateTimeFormatter) {
30+
this.offsetDateTimeFormatter = offsetDateTimeFormatter;
31+
}
32+
33+
/**
34+
* Parse the given string into {@code OffsetDateTime} object.
35+
* @param str String
36+
* @return {@code OffsetDateTime}
37+
*/
38+
public OffsetDateTime parseOffsetDateTime(String str) {
39+
try {
40+
return OffsetDateTime.parse(str, offsetDateTimeFormatter);
41+
} catch (DateTimeParseException e) {
42+
throw new RuntimeException(e);
43+
}
44+
}
45+
/**
46+
* Format the given {@code OffsetDateTime} object into string.
47+
* @param offsetDateTime {@code OffsetDateTime}
48+
* @return {@code OffsetDateTime} in string format
49+
*/
50+
public String formatOffsetDateTime(OffsetDateTime offsetDateTime) {
51+
return offsetDateTimeFormatter.format(offsetDateTime);
52+
}
53+
}

modules/openapi-generator/src/main/resources/Java/libraries/jersey2/ApiClient.mustache

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ import java.util.List;
5555
import java.util.Arrays;
5656
import java.util.ArrayList;
5757
import java.util.Date;
58+
{{#java8}}
59+
import java.time.OffsetDateTime;
60+
{{/java8}}
5861

5962
import java.net.URLEncoder;
6063

@@ -77,7 +80,7 @@ import {{invokerPackage}}.auth.OAuth;
7780
{{/hasOAuthMethods}}
7881

7982
{{>generatedAnnotation}}
80-
public class ApiClient {
83+
public class ApiClient{{#java8}} extends JavaTimeFormatter{{/java8}} {
8184
protected Map<String, String> defaultHeaderMap = new HashMap<String, String>();
8285
protected Map<String, String> defaultCookieMap = new HashMap<String, String>();
8386
protected String basePath = "{{{basePath}}}";
@@ -695,7 +698,9 @@ public class ApiClient {
695698
return "";
696699
} else if (param instanceof Date) {
697700
return formatDate((Date) param);
698-
} else if (param instanceof Collection) {
701+
} {{#java8}}else if (param instanceof OffsetDateTime) {
702+
return formatOffsetDateTime((OffsetDateTime) param);
703+
} {{/java8}}else if (param instanceof Collection) {
699704
StringBuilder b = new StringBuilder();
700705
for(Object o : (Collection)param) {
701706
if(b.length() > 0) {

modules/openapi-generator/src/main/resources/Java/libraries/resteasy/ApiClient.mustache

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ import java.util.Map.Entry;
2222
import java.util.TimeZone;
2323
import java.util.regex.Matcher;
2424
import java.util.regex.Pattern;
25+
{{#java8}}
26+
import java.time.OffsetDateTime;
27+
{{/java8}}
2528

2629
import javax.ws.rs.client.Client;
2730
import javax.ws.rs.client.ClientBuilder;
@@ -48,7 +51,7 @@ import {{invokerPackage}}.auth.OAuth;
4851
{{/hasOAuthMethods}}
4952

5053
{{>generatedAnnotation}}
51-
public class ApiClient {
54+
public class ApiClient{{#java8}} extends JavaTimeFormatter{{/java8}} {
5255
private Map<String, String> defaultHeaderMap = new HashMap<String, String>();
5356
private Map<String, String> defaultCookieMap = new HashMap<String, String>();
5457
private String basePath = "{{{basePath}}}";
@@ -333,7 +336,9 @@ public class ApiClient {
333336
return "";
334337
} else if (param instanceof Date) {
335338
return formatDate((Date) param);
336-
} else if (param instanceof Collection) {
339+
} {{#java8}}else if (param instanceof OffsetDateTime) {
340+
return formatOffsetDateTime((OffsetDateTime) param);
341+
} {{/java8}}else if (param instanceof Collection) {
337342
StringBuilder b = new StringBuilder();
338343
for(Object o : (Collection)param) {
339344
if(b.length() > 0) {

modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ import java.util.List;
6666
import java.util.Map;
6767
import java.util.Map.Entry;
6868
import java.util.TimeZone;
69+
{{#java8}}
70+
import java.time.OffsetDateTime;
71+
{{/java8}}
6972

7073
import {{invokerPackage}}.auth.Authentication;
7174
{{#hasHttpBasicMethods}}
@@ -83,7 +86,7 @@ import {{invokerPackage}}.auth.OAuth;
8386

8487
{{>generatedAnnotation}}
8588
@Component("{{invokerPackage}}.ApiClient")
86-
public class ApiClient {
89+
public class ApiClient{{#java8}} extends JavaTimeFormatter{{/java8}} {
8790
public enum CollectionFormat {
8891
CSV(","), TSV("\t"), SSV(" "), PIPES("|"), MULTI(null);
8992
@@ -404,7 +407,9 @@ public class ApiClient {
404407
return "";
405408
} else if (param instanceof Date) {
406409
return formatDate( (Date) param);
407-
} else if (param instanceof Collection) {
410+
} {{#java8}}else if (param instanceof OffsetDateTime) {
411+
return formatOffsetDateTime((OffsetDateTime) param);
412+
} {{/java8}}else if (param instanceof Collection) {
408413
StringBuilder b = new StringBuilder();
409414
for(Object o : (Collection<?>) param) {
410415
if(b.length() > 0) {

modules/openapi-generator/src/main/resources/Java/libraries/vertx/ApiClient.mustache

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ import io.vertx.ext.web.client.HttpResponse;
3333
import io.vertx.ext.web.client.WebClient;
3434
import io.vertx.ext.web.client.WebClientOptions;
3535

36+
{{#java8}}
37+
import java.time.OffsetDateTime;
38+
{{/java8}}
3639
import java.text.DateFormat;
3740
import java.util.*;
3841
import java.util.function.Consumer;
@@ -42,7 +45,7 @@ import java.util.regex.Pattern;
4245
import static java.util.stream.Collectors.toMap;
4346

4447
{{>generatedAnnotation}}
45-
public class ApiClient {
48+
public class ApiClient{{#java8}} extends JavaTimeFormatter{{/java8}} {
4649
4750
private static final Pattern CONTENT_DISPOSITION_PATTERN = Pattern.compile("filename=['\"]?([^'\"\\s]+)['\"]?");
4851
private static final OpenOptions FILE_DOWNLOAD_OPTIONS = new OpenOptions().setCreate(true).setTruncateExisting(true);
@@ -295,7 +298,9 @@ public class ApiClient {
295298
return "";
296299
} else if (param instanceof Date) {
297300
return formatDate((Date) param);
298-
} else if (param instanceof Collection) {
301+
} {{#java8}}else if (param instanceof OffsetDateTime) {
302+
return formatOffsetDateTime((OffsetDateTime) param);
303+
} {{/java8}}else if (param instanceof Collection) {
299304
StringBuilder b = new StringBuilder();
300305
for (Object o : (Collection) param) {
301306
if (b.length() > 0) {

modules/openapi-generator/src/main/resources/Java/libraries/webclient/ApiClient.mustache

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ import java.util.List;
5959
import java.util.Map;
6060
import java.util.Map.Entry;
6161
import java.util.TimeZone;
62+
{{#java8}}
63+
import java.time.OffsetDateTime;
64+
{{/java8}}
6265

6366
import {{invokerPackage}}.auth.Authentication;
6467
import {{invokerPackage}}.auth.HttpBasicAuth;
@@ -69,7 +72,7 @@ import {{invokerPackage}}.auth.OAuth;
6972
{{/hasOAuthMethods}}
7073

7174
{{>generatedAnnotation}}
72-
public class ApiClient {
75+
public class ApiClient{{#java8}} extends JavaTimeFormatter{{/java8}} {
7376
public enum CollectionFormat {
7477
CSV(","), TSV("\t"), SSV(" "), PIPES("|"), MULTI(null);
7578
@@ -354,7 +357,9 @@ public class ApiClient {
354357
return "";
355358
} else if (param instanceof Date) {
356359
return formatDate( (Date) param);
357-
} else if (param instanceof Collection) {
360+
} {{#java8}}else if (param instanceof OffsetDateTime) {
361+
return formatOffsetDateTime((OffsetDateTime) param);
362+
} {{/java8}}else if (param instanceof Collection) {
358363
StringBuilder b = new StringBuilder();
359364
for(Object o : (Collection<?>) param) {
360365
if(b.length() > 0) {

samples/client/petstore/java/jersey2-java8/.openapi-generator/FILES

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ src/main/java/org/openapitools/client/ApiException.java
7070
src/main/java/org/openapitools/client/ApiResponse.java
7171
src/main/java/org/openapitools/client/Configuration.java
7272
src/main/java/org/openapitools/client/JSON.java
73+
src/main/java/org/openapitools/client/JavaTimeFormatter.java
7374
src/main/java/org/openapitools/client/Pair.java
7475
src/main/java/org/openapitools/client/RFC3339DateFormat.java
7576
src/main/java/org/openapitools/client/ServerConfiguration.java

0 commit comments

Comments
 (0)