Skip to content

Commit 85f1557

Browse files
committed
1 parent ca8b4b5 commit 85f1557

8 files changed

Lines changed: 169 additions & 9 deletions

File tree

modules/swagger-core/src/main/java/io/swagger/v3/core/util/ModelDeserializer.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import io.swagger.v3.oas.models.media.BooleanSchema;
1313
import io.swagger.v3.oas.models.media.ComposedSchema;
1414
import io.swagger.v3.oas.models.media.DateSchema;
15+
import io.swagger.v3.oas.models.media.DateTimeLocalSchema;
1516
import io.swagger.v3.oas.models.media.DateTimeSchema;
1617
import io.swagger.v3.oas.models.media.EmailSchema;
1718
import io.swagger.v3.oas.models.media.IntegerSchema;
@@ -85,6 +86,8 @@ public Schema deserialize(JsonParser jp, DeserializationContext ctxt)
8586
schema = Json.mapper().convertValue(node, DateSchema.class);
8687
} else if ("date-time".equals(format)) {
8788
schema = Json.mapper().convertValue(node, DateTimeSchema.class);
89+
} else if ("date-time-local".equals(format)) {
90+
schema = Json.mapper().convertValue(node, DateTimeLocalSchema.class);
8891
} else if ("email".equals(format)) {
8992
schema = Json.mapper().convertValue(node, EmailSchema.class);
9093
} else if ("password".equals(format)) {

modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import io.swagger.v3.oas.models.media.BooleanSchema;
66
import io.swagger.v3.oas.models.media.ByteArraySchema;
77
import io.swagger.v3.oas.models.media.DateSchema;
8+
import io.swagger.v3.oas.models.media.DateTimeLocalSchema;
89
import io.swagger.v3.oas.models.media.DateTimeSchema;
910
import io.swagger.v3.oas.models.media.FileSchema;
1011
import io.swagger.v3.oas.models.media.IntegerSchema;
@@ -221,6 +222,16 @@ public Schema createProperty31() {
221222
return new JsonSchema().typesItem("string").format("partial-time");
222223
}
223224
},
225+
DATE_TIME_LOCAL(java.time.LocalDateTime.class, "date-time-local") {
226+
@Override
227+
public Schema createProperty() {
228+
return new DateTimeLocalSchema();
229+
}
230+
@Override
231+
public Schema createProperty31() {
232+
return new JsonSchema().typesItem("string").format("date-time-local");
233+
}
234+
},
224235
FILE(java.io.File.class, "file") {
225236
@Override
226237
public FileSchema createProperty() {
@@ -316,6 +327,7 @@ public Schema createProperty31() {
316327
dms.put("string_date", "date");
317328
dms.put("string_date-time", "date-time");
318329
dms.put("string_partial-time", "partial-time");
330+
dms.put("string_date-time-local", "date-time-local");
319331
dms.put("string_password", "password");
320332
dms.put("boolean_", "boolean");
321333
dms.put("object_", "object");
@@ -353,14 +365,13 @@ public Schema createProperty31() {
353365
final Map<String, PrimitiveType> externalClasses = new HashMap<>();
354366
addKeys(externalClasses, DATE, "org.joda.time.LocalDate", "java.time.LocalDate");
355367
addKeys(externalClasses, DATE_TIME,
356-
"java.time.LocalDateTime",
357368
"java.time.ZonedDateTime",
358369
"java.time.OffsetDateTime",
359370
"javax.xml.datatype.XMLGregorianCalendar",
360-
"org.joda.time.LocalDateTime",
361371
"org.joda.time.ReadableDateTime",
362372
"org.joda.time.DateTime",
363373
"java.time.Instant");
374+
addKeys(externalClasses, DATE_TIME_LOCAL, "java.time.LocalDateTime", "org.joda.time.LocalDateTime");
364375
EXTERNAL_CLASSES = Collections.unmodifiableMap(externalClasses);
365376

366377
final Map<String, PrimitiveType> names = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);

modules/swagger-core/src/test/java/io/swagger/v3/core/deserialization/JsonDeserializationTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ public void deserializeDateExample() throws IOException {
273273
Map<String, Schema> props = swagger.getComponents().getSchemas().get("MyModel").getProperties();
274274
assertTrue(Yaml.pretty().writeValueAsString(props.get("date")).contains("example: 2019-08-05"));
275275
assertTrue(Yaml.pretty().writeValueAsString(props.get("dateTime")).contains("example: 2019-08-05T12:34:56Z"));
276+
assertTrue(Yaml.pretty().writeValueAsString(props.get("dateTimeLocal")).contains("example: 2019-08-05T12:34:56"));
276277

277278
}
278279

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package io.swagger.v3.core.resolving;
2+
3+
import io.swagger.v3.core.converter.AnnotatedType;
4+
import io.swagger.v3.core.converter.ModelConverterContextImpl;
5+
import io.swagger.v3.core.jackson.ModelResolver;
6+
import io.swagger.v3.core.matchers.SerializationMatchers;
7+
import org.testng.annotations.Test;
8+
9+
import java.time.LocalDateTime;
10+
11+
public class DateTimeLocalTest extends SwaggerTestBase {
12+
@Test
13+
public void testLocalDateTimeDefaultMapping() {
14+
final ModelResolver modelResolver = new ModelResolver(mapper());
15+
ModelConverterContextImpl context = new ModelConverterContextImpl(modelResolver);
16+
17+
context.resolve(new AnnotatedType(TestObjectDateTimeLocal.class));
18+
19+
SerializationMatchers.assertEqualsToYaml(context.getDefinedModels(), "TestObjectDateTimeLocal:\n" +
20+
" type: object\n" +
21+
" properties:\n" +
22+
" localDateTime:\n" +
23+
" type: string\n" +
24+
" format: date-time-local");
25+
}
26+
27+
static class TestObjectDateTimeLocal {
28+
private LocalDateTime localDateTime;
29+
30+
public LocalDateTime getLocalDateTime() {
31+
return localDateTime;
32+
}
33+
34+
public void setLocalDateTime(LocalDateTime localDateTime) {
35+
this.localDateTime = localDateTime;
36+
}
37+
}
38+
}

modules/swagger-core/src/test/java/io/swagger/v3/core/resolving/Ticket2992Test.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,13 @@ public void testLocalTime() throws Exception {
4949
" $ref: \"#/components/schemas/LocalTime\"\n" +
5050
" d:\n" +
5151
" type: string\n" +
52-
" format: date-time\n" +
52+
" format: date-time-local\n" +
5353
" e:\n" +
5454
" type: string\n" +
55-
" format: date-time\n" +
55+
" format: date-time-local\n" +
5656
" f:\n" +
5757
" type: string\n" +
58-
" format: date-time");
58+
" format: date-time-local");
5959

6060
PrimitiveType.enablePartialTime();
6161
context = new ModelConverterContextImpl(modelResolver);
@@ -79,13 +79,13 @@ public void testLocalTime() throws Exception {
7979
" format: partial-time\n" +
8080
" d:\n" +
8181
" type: string\n" +
82-
" format: date-time\n" +
82+
" format: date-time-local\n" +
8383
" e:\n" +
8484
" type: string\n" +
85-
" format: date-time\n" +
85+
" format: date-time-local\n" +
8686
" f:\n" +
8787
" type: string\n" +
88-
" format: date-time");
88+
" format: date-time-local");
8989
}
9090

9191
}

modules/swagger-core/src/test/java/io/swagger/v3/core/serialization/properties/PropertySerializationTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.swagger.v3.oas.models.media.ArraySchema;
77
import io.swagger.v3.oas.models.media.BooleanSchema;
88
import io.swagger.v3.oas.models.media.DateSchema;
9+
import io.swagger.v3.oas.models.media.DateTimeLocalSchema;
910
import io.swagger.v3.oas.models.media.DateTimeSchema;
1011
import io.swagger.v3.oas.models.media.IntegerSchema;
1112
import io.swagger.v3.oas.models.media.MapSchema;
@@ -81,6 +82,23 @@ public void deserializeDateTimeProperty() throws IOException {
8182
JsonAssert.assertJsonEquals(m, m.writeValueAsString(p), json);
8283
}
8384

85+
@Test(description = "it should serialize a DateTimeLocalProperty")
86+
public void serializeDateTimeLocalProperty() throws IOException {
87+
final DateTimeLocalSchema p = new DateTimeLocalSchema();
88+
final String json = "{\"type\":\"string\",\"format\":\"date-time-local\"}";
89+
JsonAssert.assertJsonEquals(m, m.writeValueAsString(p), json);
90+
}
91+
92+
@Test(description = "it should deserialize a DateTimeLocalProperty")
93+
public void deserializeDateTimeLocalProperty() throws IOException {
94+
final String json = "{\"type\":\"string\",\"format\":\"date-time-local\"}";
95+
final Schema p = m.readValue(json, Schema.class);
96+
assertEquals(p.getType(), "string");
97+
assertEquals(p.getFormat(), "date-time-local");
98+
assertEquals(p.getClass(), DateTimeLocalSchema.class);
99+
JsonAssert.assertJsonEquals(m, m.writeValueAsString(p), json);
100+
}
101+
84102
@Test(description = "it should serialize a DoubleProperty")
85103
public void serializeDoubleProperty() throws IOException {
86104
final NumberSchema p = new NumberSchema()

modules/swagger-core/src/test/resources/specFiles/swos-126.yaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,8 @@ components:
1616
dateTime:
1717
type: string
1818
format: date-time
19-
example: '2019-08-05T12:34:56Z'
19+
example: '2019-08-05T12:34:56Z'
20+
dateTimeLocal:
21+
type: string
22+
format: date-time-local
23+
example: '2019-08-05T12:34:56'
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package io.swagger.v3.oas.models.media;
2+
3+
import java.time.LocalDateTime;
4+
import java.util.List;
5+
import java.util.Objects;
6+
7+
/**
8+
* DateTimeLocalSchema
9+
* <p>
10+
* Schema for date-time-local format as defined in the Format Registry
11+
* <a href="https://spec.openapis.org/registry/format/date-time-local.html">date-time-local</a>
12+
*/
13+
public class DateTimeLocalSchema extends Schema<LocalDateTime> {
14+
15+
public DateTimeLocalSchema() {
16+
super("string", "date-time-local");
17+
}
18+
19+
@Override
20+
public DateTimeLocalSchema type(String type) {
21+
super.setType(type);
22+
return this;
23+
}
24+
25+
@Override
26+
public DateTimeLocalSchema format(String format) {
27+
super.setFormat(format);
28+
return this;
29+
}
30+
31+
public DateTimeLocalSchema _default(LocalDateTime _default) {
32+
super.setDefault(_default);
33+
return this;
34+
}
35+
36+
@Override
37+
protected LocalDateTime cast(Object value) {
38+
if (value != null) {
39+
try {
40+
if (value instanceof String) {
41+
return LocalDateTime.parse((String) value);
42+
} else if (value instanceof LocalDateTime) {
43+
return (LocalDateTime) value;
44+
}
45+
} catch (Exception e) {
46+
}
47+
}
48+
return null;
49+
}
50+
51+
public DateTimeLocalSchema _enum(List<LocalDateTime> _enum) {
52+
super.setEnum(_enum);
53+
return this;
54+
}
55+
56+
public DateTimeLocalSchema addEnumItem(LocalDateTime _enumItem) {
57+
super.addEnumItemObject(_enumItem);
58+
return this;
59+
}
60+
61+
@Override
62+
public boolean equals(java.lang.Object o) {
63+
if (this == o) {
64+
return true;
65+
}
66+
if (o == null || getClass() != o.getClass()) {
67+
return false;
68+
}
69+
return super.equals(o);
70+
}
71+
72+
@Override
73+
public int hashCode() {
74+
return Objects.hash(super.hashCode());
75+
}
76+
77+
@Override
78+
public String toString() {
79+
StringBuilder sb = new StringBuilder();
80+
sb.append("class DateTimeLocalSchema {\n");
81+
sb.append(" ").append(toIndentedString(super.toString())).append("\n");
82+
sb.append("}");
83+
return sb.toString();
84+
}
85+
}

0 commit comments

Comments
 (0)