Skip to content

Commit a6c570d

Browse files
authored
Merge pull request #1179 from swagger-api/swos-126
ref swagger-api/swagger-core#3273 - updates DateTimeSchema type to OffsetDateTime
2 parents 13ce51d + 8b8876a commit a6c570d

File tree

2 files changed

+22
-69
lines changed

2 files changed

+22
-69
lines changed

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/OpenAPIDeserializer.java

Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,12 @@
6161
import java.net.URISyntaxException;
6262
import java.net.URL;
6363
import java.text.ParseException;
64+
import java.time.OffsetDateTime;
6465
import java.util.*;
6566
import java.util.regex.Matcher;
6667
import java.util.regex.Pattern;
6768
import java.util.stream.Collectors;
6869
import java.util.stream.Stream;
69-
import static java.util.Calendar.*;
7070

7171

7272
public class OpenAPIDeserializer {
@@ -2448,37 +2448,12 @@ private Object getDecodedObject( Schema schema, String objectString) throws Pars
24482448
* Returns the Date represented by the given RFC3339 date-time string.
24492449
* Returns null if this string can't be parsed as Date.
24502450
*/
2451-
private Date toDateTime( String dateString) {
2452-
// Note: For this conversion, regex matching is better than SimpleDateFormat, etc.
2453-
// Optional elements (e.g. milliseconds) are not directly handled by SimpleDateFormat.
2454-
// Also, SimpleDateFormat is not thread-safe.
2455-
Matcher matcher = RFC3339_DATE_TIME_PATTERN.matcher( dateString);
2451+
private OffsetDateTime toDateTime(String dateString) {
24562452

2457-
Date dateTime = null;
2458-
if( matcher.matches()) {
2459-
try {
2460-
String year = matcher.group(1);
2461-
String month = matcher.group(2);
2462-
String day = matcher.group(3);
2463-
String hour = matcher.group(4);
2464-
String min = matcher.group(5);
2465-
String sec = matcher.group(6);
2466-
String ms = matcher.group(7);
2467-
String zone = matcher.group(10);
2468-
2469-
Calendar calendar = Calendar.getInstance( TimeZone.getTimeZone( zone == null? "GMT" : "GMT" + zone));
2470-
calendar.set( YEAR, Integer.parseInt( year));
2471-
calendar.set( MONTH, Integer.parseInt( month) - 1);
2472-
calendar.set( DAY_OF_MONTH, Integer.parseInt( day));
2473-
calendar.set( HOUR_OF_DAY, Integer.parseInt( hour));
2474-
calendar.set( MINUTE, Integer.parseInt( min));
2475-
calendar.set( SECOND, Integer.parseInt( sec));
2476-
calendar.set( MILLISECOND, ms == null? 0 : (int) (Double.parseDouble( ms) * 1000));
2477-
2478-
dateTime = calendar.getTime();
2479-
}
2480-
catch( Exception ignore) {
2481-
}
2453+
OffsetDateTime dateTime = null;
2454+
try {
2455+
dateTime = OffsetDateTime.parse(dateString);
2456+
} catch (Exception ignore) {
24822457
}
24832458

24842459
return dateTime;

modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/util/OpenAPIDeserializerTest.java

Lines changed: 16 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import com.fasterxml.jackson.databind.ObjectMapper;
55
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
66
import io.swagger.v3.core.util.Json;
7-
import io.swagger.v3.core.util.Yaml;
87
import io.swagger.v3.oas.models.Components;
98
import io.swagger.v3.oas.models.ExternalDocumentation;
109
import io.swagger.v3.oas.models.OpenAPI;
@@ -50,14 +49,15 @@
5049

5150
import java.math.BigDecimal;
5251
import java.nio.file.Files;
52+
import java.time.OffsetDateTime;
53+
import java.time.ZoneOffset;
5354
import java.util.Arrays;
5455
import java.util.Calendar;
5556
import java.util.Date;
5657
import java.util.HashSet;
5758
import java.util.List;
5859
import java.util.Map;
5960
import java.util.Set;
60-
import java.util.TimeZone;
6161

6262
import static java.util.Collections.emptyList;
6363
import static org.testng.Assert.assertEquals;
@@ -1085,52 +1085,30 @@ public void testDeserializeDateTimeString() {
10851085

10861086
Schema dateTimeModel = resolved.getComponents().getSchemas().get("DateTimeString");
10871087
assertTrue(dateTimeModel instanceof DateTimeSchema);
1088-
List<Date> dateTimeValues = dateTimeModel.getEnum();
1088+
List<OffsetDateTime> dateTimeValues = dateTimeModel.getEnum();
10891089
assertEquals(dateTimeValues.size(), 5);
10901090
assertEquals(
10911091
dateTimeValues.get(0),
10921092
null);
10931093
assertEquals(
1094-
dateTimeValues.get(1),
1095-
new Calendar.Builder()
1096-
.setDate( 2019, 0, 1)
1097-
.setTimeOfDay( 0, 0, 0, 0)
1098-
.setTimeZone( TimeZone.getTimeZone( "GMT"))
1099-
.build()
1100-
.getTime());
1094+
dateTimeValues.get(1),
1095+
OffsetDateTime.of(2019,1,1,0,0,0,0, ZoneOffset.UTC));
1096+
11011097
assertEquals(
1102-
dateTimeValues.get(2),
1103-
new Calendar.Builder()
1104-
.setDate( 2018, 1, 2)
1105-
.setTimeOfDay( 23, 59, 59, 999)
1106-
.setTimeZone( TimeZone.getTimeZone( "GMT-05:00"))
1107-
.build()
1108-
.getTime());
1098+
dateTimeValues.get(2),
1099+
OffsetDateTime.of(2018,2,2,23,59,59,999000000, ZoneOffset.ofHours(-5)));
1100+
11091101
assertEquals(
1110-
dateTimeValues.get(3),
1111-
new Calendar.Builder()
1112-
.setDate( 2017, 2, 3)
1113-
.setTimeOfDay( 11, 22, 33, 0)
1114-
.setTimeZone( TimeZone.getTimeZone( "GMT+06:00"))
1115-
.build()
1116-
.getTime());
1102+
dateTimeValues.get(3),
1103+
OffsetDateTime.of(2017,3,3,11,22,33,0, ZoneOffset.ofHours(6)));
1104+
11171105
assertEquals(
1118-
dateTimeValues.get(4),
1119-
new Calendar.Builder()
1120-
.setDate( 2016, 3, 4)
1121-
.setTimeOfDay( 22, 33, 44, 555)
1122-
.setTimeZone( TimeZone.getTimeZone( "GMT"))
1123-
.build()
1124-
.getTime());
1106+
dateTimeValues.get(4),
1107+
OffsetDateTime.of(2016,4,4,22,33,44,555000000, ZoneOffset.UTC));
11251108

11261109
assertEquals(
1127-
dateTimeModel.getDefault(),
1128-
new Calendar.Builder()
1129-
.setDate( 2019, 0, 1)
1130-
.setTimeOfDay( 0, 0, 0, 0)
1131-
.setTimeZone( TimeZone.getTimeZone( "GMT"))
1132-
.build()
1133-
.getTime());
1110+
dateTimeModel.getDefault(),
1111+
OffsetDateTime.of(2019,1,1,0,0,0,0, ZoneOffset.UTC));
11341112

11351113
assertEquals(
11361114
result.getMessages(),

0 commit comments

Comments
 (0)