Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import io.swagger.v3.oas.models.media.BooleanSchema;
import io.swagger.v3.oas.models.media.ComposedSchema;
import io.swagger.v3.oas.models.media.DateSchema;
import io.swagger.v3.oas.models.media.DateTimeLocalSchema;
import io.swagger.v3.oas.models.media.DateTimeSchema;
import io.swagger.v3.oas.models.media.EmailSchema;
import io.swagger.v3.oas.models.media.IntegerSchema;
Expand Down Expand Up @@ -85,6 +86,8 @@ public Schema deserialize(JsonParser jp, DeserializationContext ctxt)
schema = Json.mapper().convertValue(node, DateSchema.class);
} else if ("date-time".equals(format)) {
schema = Json.mapper().convertValue(node, DateTimeSchema.class);
} else if ("date-time-local".equals(format)) {
schema = Json.mapper().convertValue(node, DateTimeLocalSchema.class);
} else if ("email".equals(format)) {
schema = Json.mapper().convertValue(node, EmailSchema.class);
} else if ("password".equals(format)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import io.swagger.v3.oas.models.media.BooleanSchema;
import io.swagger.v3.oas.models.media.ByteArraySchema;
import io.swagger.v3.oas.models.media.DateSchema;
import io.swagger.v3.oas.models.media.DateTimeLocalSchema;
import io.swagger.v3.oas.models.media.DateTimeSchema;
import io.swagger.v3.oas.models.media.FileSchema;
import io.swagger.v3.oas.models.media.IntegerSchema;
Expand Down Expand Up @@ -221,6 +222,16 @@ public Schema createProperty31() {
return new JsonSchema().typesItem("string").format("partial-time");
}
},
DATE_TIME_LOCAL(java.time.LocalDateTime.class, "date-time-local") {
@Override
public Schema createProperty() {
return new DateTimeLocalSchema();
}
@Override
public Schema createProperty31() {
return new JsonSchema().typesItem("string").format("date-time-local");
}
},
FILE(java.io.File.class, "file") {
@Override
public FileSchema createProperty() {
Expand Down Expand Up @@ -316,6 +327,7 @@ public Schema createProperty31() {
dms.put("string_date", "date");
dms.put("string_date-time", "date-time");
dms.put("string_partial-time", "partial-time");
dms.put("string_date-time-local", "date-time-local");
dms.put("string_password", "password");
dms.put("boolean_", "boolean");
dms.put("object_", "object");
Expand Down Expand Up @@ -353,14 +365,13 @@ public Schema createProperty31() {
final Map<String, PrimitiveType> externalClasses = new HashMap<>();
addKeys(externalClasses, DATE, "org.joda.time.LocalDate", "java.time.LocalDate");
addKeys(externalClasses, DATE_TIME,
"java.time.LocalDateTime",
"java.time.ZonedDateTime",
"java.time.OffsetDateTime",
"javax.xml.datatype.XMLGregorianCalendar",
"org.joda.time.LocalDateTime",
"org.joda.time.ReadableDateTime",
"org.joda.time.DateTime",
"java.time.Instant");
addKeys(externalClasses, DATE_TIME_LOCAL, "java.time.LocalDateTime", "org.joda.time.LocalDateTime");
EXTERNAL_CLASSES = Collections.unmodifiableMap(externalClasses);

final Map<String, PrimitiveType> names = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,7 @@ public void deserializeDateExample() throws IOException {
Map<String, Schema> props = swagger.getComponents().getSchemas().get("MyModel").getProperties();
assertTrue(Yaml.pretty().writeValueAsString(props.get("date")).contains("example: 2019-08-05"));
assertTrue(Yaml.pretty().writeValueAsString(props.get("dateTime")).contains("example: 2019-08-05T12:34:56Z"));
assertTrue(Yaml.pretty().writeValueAsString(props.get("dateTimeLocal")).contains("example: 2019-08-05T12:34:56"));

}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package io.swagger.v3.core.resolving;

import io.swagger.v3.core.converter.AnnotatedType;
import io.swagger.v3.core.converter.ModelConverterContextImpl;
import io.swagger.v3.core.jackson.ModelResolver;
import io.swagger.v3.core.matchers.SerializationMatchers;
import org.testng.annotations.Test;

import java.time.LocalDateTime;

public class DateTimeLocalTest extends SwaggerTestBase {
@Test
public void testLocalDateTimeDefaultMapping() {
final ModelResolver modelResolver = new ModelResolver(mapper());
ModelConverterContextImpl context = new ModelConverterContextImpl(modelResolver);

context.resolve(new AnnotatedType(TestObjectDateTimeLocal.class));

SerializationMatchers.assertEqualsToYaml(context.getDefinedModels(), "TestObjectDateTimeLocal:\n" +
" type: object\n" +
" properties:\n" +
" localDateTime:\n" +
" type: string\n" +
" format: date-time-local");
}

static class TestObjectDateTimeLocal {
private LocalDateTime localDateTime;

public LocalDateTime getLocalDateTime() {
return localDateTime;
}

public void setLocalDateTime(LocalDateTime localDateTime) {
this.localDateTime = localDateTime;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,13 @@ public void testLocalTime() throws Exception {
" $ref: \"#/components/schemas/LocalTime\"\n" +
" d:\n" +
" type: string\n" +
" format: date-time\n" +
" format: date-time-local\n" +
" e:\n" +
" type: string\n" +
" format: date-time\n" +
" format: date-time-local\n" +
" f:\n" +
" type: string\n" +
" format: date-time");
" format: date-time-local");

PrimitiveType.enablePartialTime();
context = new ModelConverterContextImpl(modelResolver);
Expand All @@ -79,13 +79,13 @@ public void testLocalTime() throws Exception {
" format: partial-time\n" +
" d:\n" +
" type: string\n" +
" format: date-time\n" +
" format: date-time-local\n" +
" e:\n" +
" type: string\n" +
" format: date-time\n" +
" format: date-time-local\n" +
" f:\n" +
" type: string\n" +
" format: date-time");
" format: date-time-local");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import io.swagger.v3.oas.models.media.ArraySchema;
import io.swagger.v3.oas.models.media.BooleanSchema;
import io.swagger.v3.oas.models.media.DateSchema;
import io.swagger.v3.oas.models.media.DateTimeLocalSchema;
import io.swagger.v3.oas.models.media.DateTimeSchema;
import io.swagger.v3.oas.models.media.IntegerSchema;
import io.swagger.v3.oas.models.media.MapSchema;
Expand Down Expand Up @@ -81,6 +82,23 @@ public void deserializeDateTimeProperty() throws IOException {
JsonAssert.assertJsonEquals(m, m.writeValueAsString(p), json);
}

@Test(description = "it should serialize a DateTimeLocalProperty")
public void serializeDateTimeLocalProperty() throws IOException {
final DateTimeLocalSchema p = new DateTimeLocalSchema();
final String json = "{\"type\":\"string\",\"format\":\"date-time-local\"}";
JsonAssert.assertJsonEquals(m, m.writeValueAsString(p), json);
}

@Test(description = "it should deserialize a DateTimeLocalProperty")
public void deserializeDateTimeLocalProperty() throws IOException {
final String json = "{\"type\":\"string\",\"format\":\"date-time-local\"}";
final Schema p = m.readValue(json, Schema.class);
assertEquals(p.getType(), "string");
assertEquals(p.getFormat(), "date-time-local");
assertEquals(p.getClass(), DateTimeLocalSchema.class);
JsonAssert.assertJsonEquals(m, m.writeValueAsString(p), json);
}

@Test(description = "it should serialize a DoubleProperty")
public void serializeDoubleProperty() throws IOException {
final NumberSchema p = new NumberSchema()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,8 @@ components:
dateTime:
type: string
format: date-time
example: '2019-08-05T12:34:56Z'
example: '2019-08-05T12:34:56Z'
dateTimeLocal:
type: string
format: date-time-local
example: '2019-08-05T12:34:56'
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package io.swagger.v3.oas.models.media;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;

/**
* DateTimeLocalSchema
* <p>
* Schema for date-time-local format as defined in the Format Registry
* <a href="https://spec.openapis.org/registry/format/date-time-local.html">date-time-local</a>
*/
public class DateTimeLocalSchema extends Schema<LocalDateTime> {

public DateTimeLocalSchema() {
super("string", "date-time-local");
}

@Override
public DateTimeLocalSchema type(String type) {
super.setType(type);
return this;
}

@Override
public DateTimeLocalSchema format(String format) {
super.setFormat(format);
return this;
}

public DateTimeLocalSchema _default(LocalDateTime _default) {
super.setDefault(_default);
return this;
}

@Override
protected LocalDateTime cast(Object value) {
if (value != null) {
try {
if (value instanceof String) {
return LocalDateTime.parse((String) value);
} else if (value instanceof LocalDateTime) {
return (LocalDateTime) value;
}
} catch (Exception e) {
}
}
return null;
}

public DateTimeLocalSchema _enum(List<LocalDateTime> _enum) {
super.setEnum(_enum);
return this;
}

public DateTimeLocalSchema addEnumItem(LocalDateTime _enumItem) {
super.addEnumItemObject(_enumItem);
return this;
}

@Override
public boolean equals(java.lang.Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
return super.equals(o);
}

@Override
public int hashCode() {
return Objects.hash(super.hashCode());
}

@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("class DateTimeLocalSchema {\n");
sb.append(" ").append(toIndentedString(super.toString())).append("\n");
sb.append("}");
return sb.toString();
}
}