Repository: johnzon Updated Branches: refs/heads/master 2893743f2 -> a7c03892d
JOHNZON-196 support of LocalTime in JSON-B Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/a7c03892 Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/a7c03892 Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/a7c03892 Branch: refs/heads/master Commit: a7c03892d75e42756afdb08ccf14e2a98f3d1308 Parents: 2893743 Author: Romain Manni-Bucau <[email protected]> Authored: Sun Dec 2 17:07:16 2018 +0100 Committer: Romain Manni-Bucau <[email protected]> Committed: Sun Dec 2 17:07:16 2018 +0100 ---------------------------------------------------------------------- .../apache/johnzon/jsonb/JohnzonBuilder.java | 111 +++++++++++-------- .../apache/johnzon/jsonb/JsonbTypesTest.java | 48 +++++--- 2 files changed, 95 insertions(+), 64 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/johnzon/blob/a7c03892/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java ---------------------------------------------------------------------- diff --git a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java index 495e7b7..50be3ed 100644 --- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java +++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java @@ -18,40 +18,19 @@ */ package org.apache.johnzon.jsonb; -import org.apache.johnzon.core.AbstractJsonFactory; -import org.apache.johnzon.core.JsonGeneratorFactoryImpl; -import org.apache.johnzon.core.JsonParserFactoryImpl; -import org.apache.johnzon.jsonb.cdi.CDIs; -import org.apache.johnzon.jsonb.converter.JohnzonJsonbAdapter; -import org.apache.johnzon.jsonb.factory.SimpleJohnzonAdapterFactory; -import org.apache.johnzon.jsonb.serializer.JohnzonDeserializationContext; -import org.apache.johnzon.jsonb.serializer.JohnzonSerializationContext; -import org.apache.johnzon.jsonb.spi.JohnzonAdapterFactory; -import org.apache.johnzon.mapper.Adapter; -import org.apache.johnzon.mapper.Converter; -import org.apache.johnzon.mapper.Mapper; -import org.apache.johnzon.mapper.MapperBuilder; -import org.apache.johnzon.mapper.ObjectConverter; -import org.apache.johnzon.mapper.SerializeValueFilter; -import org.apache.johnzon.mapper.access.AccessMode; -import org.apache.johnzon.mapper.access.FieldAndMethodAccessMode; -import org.apache.johnzon.mapper.internal.AdapterKey; -import org.apache.johnzon.mapper.internal.ConverterAdapter; +import static java.time.format.DateTimeFormatter.ofPattern; +import static java.time.temporal.ChronoField.DAY_OF_MONTH; +import static java.time.temporal.ChronoField.HOUR_OF_DAY; +import static java.time.temporal.ChronoField.MILLI_OF_SECOND; +import static java.time.temporal.ChronoField.MINUTE_OF_HOUR; +import static java.time.temporal.ChronoField.MONTH_OF_YEAR; +import static java.time.temporal.ChronoField.SECOND_OF_MINUTE; +import static java.time.temporal.ChronoField.YEAR; +import static java.util.Collections.emptyMap; +import static java.util.Optional.ofNullable; +import static javax.json.bind.config.PropertyNamingStrategy.IDENTITY; +import static javax.json.bind.config.PropertyOrderStrategy.LEXICOGRAPHICAL; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; -import javax.json.bind.adapter.JsonbAdapter; -import javax.json.bind.annotation.JsonbProperty; -import javax.json.bind.annotation.JsonbVisibility; -import javax.json.bind.config.BinaryDataStrategy; -import javax.json.bind.config.PropertyNamingStrategy; -import javax.json.bind.config.PropertyVisibilityStrategy; -import javax.json.bind.serializer.JsonbDeserializer; -import javax.json.bind.serializer.JsonbSerializer; -import javax.json.spi.JsonProvider; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParserFactory; import java.io.Closeable; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; @@ -64,6 +43,7 @@ import java.time.Duration; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.LocalTime; import java.time.OffsetDateTime; import java.time.OffsetTime; import java.time.Period; @@ -72,6 +52,8 @@ import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; +import java.time.temporal.TemporalAccessor; +import java.time.temporal.TemporalQueries; import java.util.Base64; import java.util.Calendar; import java.util.Comparator; @@ -80,31 +62,51 @@ import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.SimpleTimeZone; import java.util.TimeZone; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Supplier; import java.util.stream.Stream; -import static java.time.format.DateTimeFormatter.ofPattern; -import static java.time.temporal.ChronoField.DAY_OF_MONTH; -import static java.time.temporal.ChronoField.HOUR_OF_DAY; -import static java.time.temporal.ChronoField.MILLI_OF_SECOND; -import static java.time.temporal.ChronoField.MINUTE_OF_HOUR; -import static java.time.temporal.ChronoField.MONTH_OF_YEAR; -import static java.time.temporal.ChronoField.SECOND_OF_MINUTE; -import static java.time.temporal.ChronoField.YEAR; -import java.time.temporal.TemporalAccessor; -import java.time.temporal.TemporalQueries; -import static java.util.Collections.emptyMap; -import java.util.Objects; -import static java.util.Optional.ofNullable; -import java.util.concurrent.TimeUnit; -import static javax.json.bind.config.PropertyNamingStrategy.IDENTITY; -import static javax.json.bind.config.PropertyOrderStrategy.LEXICOGRAPHICAL; +import javax.json.bind.Jsonb; +import javax.json.bind.JsonbBuilder; +import javax.json.bind.JsonbConfig; +import javax.json.bind.adapter.JsonbAdapter; +import javax.json.bind.annotation.JsonbProperty; +import javax.json.bind.annotation.JsonbVisibility; +import javax.json.bind.config.BinaryDataStrategy; +import javax.json.bind.config.PropertyNamingStrategy; +import javax.json.bind.config.PropertyVisibilityStrategy; +import javax.json.bind.serializer.JsonbDeserializer; +import javax.json.bind.serializer.JsonbSerializer; +import javax.json.spi.JsonProvider; +import javax.json.stream.JsonGenerator; +import javax.json.stream.JsonParserFactory; + +import org.apache.johnzon.core.AbstractJsonFactory; +import org.apache.johnzon.core.JsonGeneratorFactoryImpl; +import org.apache.johnzon.core.JsonParserFactoryImpl; +import org.apache.johnzon.jsonb.cdi.CDIs; +import org.apache.johnzon.jsonb.converter.JohnzonJsonbAdapter; +import org.apache.johnzon.jsonb.factory.SimpleJohnzonAdapterFactory; +import org.apache.johnzon.jsonb.serializer.JohnzonDeserializationContext; +import org.apache.johnzon.jsonb.serializer.JohnzonSerializationContext; +import org.apache.johnzon.jsonb.spi.JohnzonAdapterFactory; +import org.apache.johnzon.mapper.Adapter; +import org.apache.johnzon.mapper.Converter; +import org.apache.johnzon.mapper.Mapper; +import org.apache.johnzon.mapper.MapperBuilder; +import org.apache.johnzon.mapper.ObjectConverter; +import org.apache.johnzon.mapper.SerializeValueFilter; +import org.apache.johnzon.mapper.access.AccessMode; +import org.apache.johnzon.mapper.access.FieldAndMethodAccessMode; +import org.apache.johnzon.mapper.internal.AdapterKey; +import org.apache.johnzon.mapper.internal.ConverterAdapter; public class JohnzonBuilder implements JsonbBuilder { private static final Object NO_BM = new Object(); @@ -586,6 +588,17 @@ public class JohnzonBuilder implements JsonbBuilder { return LocalDate.parse(text); } })); + converters.put(new AdapterKey(LocalTime.class, String.class), new ConverterAdapter<>(new Converter<LocalTime>() { + @Override + public String toString(final LocalTime instance) { + return instance.toString(); + } + + @Override + public LocalTime fromString(final String text) { + return LocalTime.parse(text); + } + })); converters.put(new AdapterKey(LocalDateTime.class, String.class), new ConverterAdapter<>(new Converter<LocalDateTime>() { @Override public String toString(final LocalDateTime instance) { http://git-wip-us.apache.org/repos/asf/johnzon/blob/a7c03892/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JsonbTypesTest.java ---------------------------------------------------------------------- diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JsonbTypesTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JsonbTypesTest.java index ad5b6d2..d6d7817 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JsonbTypesTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JsonbTypesTest.java @@ -18,11 +18,8 @@ */ package org.apache.johnzon.jsonb; -import org.junit.Test; +import static org.junit.Assert.assertEquals; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbConfig; -import javax.json.bind.spi.JsonbProvider; import java.io.StringReader; import java.net.URI; import java.net.URL; @@ -30,6 +27,7 @@ import java.time.Duration; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.LocalTime; import java.time.OffsetDateTime; import java.time.OffsetTime; import java.time.Period; @@ -51,27 +49,33 @@ import java.util.OptionalLong; import java.util.SimpleTimeZone; import java.util.TimeZone; import java.util.concurrent.TimeUnit; -import org.apache.cxf.common.util.StringUtils; -import static org.junit.Assert.assertEquals; +import javax.json.bind.Jsonb; +import javax.json.bind.JsonbConfig; +import javax.json.bind.spi.JsonbProvider; + +import org.apache.cxf.common.util.StringUtils; +import org.junit.Test; public class JsonbTypesTest { @Test - public void readAndWrite() { + public void readAndWrite() throws Exception { final LocalDate localDate = LocalDate.of(2015, 1, 1); + final LocalTime localTime = LocalTime.of(1, 2, 3); final LocalDateTime localDateTime = LocalDateTime.of(2015, 1, 1, 1, 1); final String dateTime = localDateTime.toString(); final ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.of("UTC")); final String expected = "{" + - "\"calendar\":\"" + zonedDateTime.toString() + "\"," + - "\"date\":\"" + localDateTime.toString() + "\"," + + "\"calendar\":\"" + zonedDateTime + "\"," + + "\"date\":\"" + localDateTime + "\"," + "\"duration\":\"PT30S\"," + "\"gregorianCalendar\":\"" + zonedDateTime.toString() + "\"," + - "\"instant\":\"" + Instant.ofEpochMilli(TimeUnit.DAYS.toMillis(localDate.toEpochDay())).toString() + "\"," + - "\"localDate\":\"" + localDate.toString() + "\"," + + "\"instant\":\"" + Instant.ofEpochMilli(TimeUnit.DAYS.toMillis(localDate.toEpochDay())) + "\"," + + "\"localDate\":\"" + localDate + "\"," + "\"localDateTime\":\"" + dateTime + "\"," + - "\"offsetDateTime\":\"" + OffsetDateTime.of(localDateTime, ZoneOffset.UTC).toString() + "\"," + - "\"offsetTime\":\"" + OffsetTime.of(localDateTime.toLocalTime(), ZoneOffset.UTC).toString() + "\"," + + "\"localTime\":\"" + localTime + "\"," + + "\"offsetDateTime\":\"" + OffsetDateTime.of(localDateTime, ZoneOffset.UTC) + "\"," + + "\"offsetTime\":\"" + OffsetTime.of(localDateTime.toLocalTime(), ZoneOffset.UTC) + "\"," + "\"optionalDouble\":3.4," + "\"optionalInt\":1," + "\"optionalLong\":2," + @@ -97,6 +101,7 @@ public class JsonbTypesTest { assertEquals(localDateTime.toInstant(ZoneOffset.UTC).toEpochMilli(), types.date.getTime()); assertEquals(localDateTime.toInstant(ZoneOffset.UTC).toEpochMilli(), types.calendar.getTime().getTime()); assertEquals(localDateTime, types.localDateTime); + assertEquals(localTime, types.localTime); assertEquals(localDate, types.localDate); assertEquals(OffsetDateTime.of(localDateTime, ZoneOffset.UTC), types.offsetDateTime); assertEquals(OffsetTime.of(localDateTime.toLocalTime(), ZoneOffset.UTC), types.offsetTime); @@ -110,16 +115,18 @@ public class JsonbTypesTest { assertEquals(Period.of(0, 1, 10), types.period); assertEquals(expected, jsonb.toJson(types)); + + jsonb.close(); } @Test - public void readAndWriteWithDateFormats() { + public void readAndWriteWithDateFormats() throws Exception { readAndWriteWithDateFormat(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"), "yyyy-MM-dd'T'HH:mm:ss.SSSZ"); readAndWriteWithDateFormat(DateTimeFormatter.ofPattern("yyyyMMdd+HHmmssZ"), "yyyyMMdd+HHmmssZ"); readAndWriteWithDateFormat(DateTimeFormatter.ofPattern("yyyy-MM-dd"), "yyyy-MM-dd"); } - private void readAndWriteWithDateFormat(DateTimeFormatter dateTimeFormatter, String dateFormat) { + private void readAndWriteWithDateFormat(DateTimeFormatter dateTimeFormatter, String dateFormat) throws Exception { final LocalDate localDate = LocalDate.of(2015, 1, 1); final LocalDateTime localDateTime = LocalDateTime.of(2015, 1, 1, 1, 1); final ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.of("UTC")); @@ -138,6 +145,8 @@ public class JsonbTypesTest { final DateTypes types = jsonb.fromJson(new StringReader(expected), DateTypes.class); assertEquals(localDate, types.localDate); assertEquals(expected, jsonb.toJson(types)); + + jsonb.close(); } private static Jsonb newJsonb() { @@ -175,10 +184,19 @@ public class JsonbTypesTest { private Duration duration; private Period period; private LocalDateTime localDateTime; + private LocalTime localTime; private LocalDate localDate; private OffsetDateTime offsetDateTime; private OffsetTime offsetTime; + public LocalTime getLocalTime() { + return localTime; + } + + public void setLocalTime(final LocalTime localTime) { + this.localTime = localTime; + } + public URL getUrl() { return url; }
