diff --git a/lombok.config b/lombok.config new file mode 100644 index 0000000..890f812 --- /dev/null +++ b/lombok.config @@ -0,0 +1,10 @@ +# https://projectlombok.org/features/configuration + +# configuration file is in the root of the workspace directory only +config.stopBubbling = true +# If true, lombok will generate a @java.beans.ConstructorProperties annotation when generating constructors. +lombok.anyConstructor.addConstructorProperties=true +# Do not use experimental annotations +lombok.experimental.flagUsage=ERROR +# Lombok marks generated code with @lombok.Generated, so JaCoCo can understand it +lombok.addLombokGeneratedAnnotation = true diff --git a/src/main/java/ru/olegcherednik/json/impl/StaticJsonEngineFactory.java b/src/main/java/ru/olegcherednik/json/impl/StaticJsonEngineFactory.java index 8bd795d..a9ae4fd 100644 --- a/src/main/java/ru/olegcherednik/json/impl/StaticJsonEngineFactory.java +++ b/src/main/java/ru/olegcherednik/json/impl/StaticJsonEngineFactory.java @@ -116,13 +116,15 @@ private static ObjectMapper registerModules(ObjectMapper mapper, JsonSettings se mapper.registerModule(module); if ("jackson-datatype-jsr310".equals(module.getModuleName())) - mapper.registerModule(new JacksonJavaTimeModule(settings.getInstantFormatter(), - settings.getLocalDateFormatter(), - settings.getLocalTimeFormatter(), - settings.getLocalDateTimeFormatter(), - settings.getOffsetTimeFormatter(), - settings.getOffsetDateTimeFormatter(), - settings.getZonedDateTimeFormatter())); + mapper.registerModule(JacksonJavaTimeModule.builder() + .instant(settings.getInstantFormatter()) + .localDate(settings.getLocalDateFormatter()) + .localTime(settings.getLocalTimeFormatter()) + .localDateTime(settings.getLocalDateTimeFormatter()) + .offsetTime(settings.getOffsetTimeFormatter()) + .offsetDateTime(settings.getOffsetDateTimeFormatter()) + .zonedDateTime(settings.getZonedDateTimeFormatter()) + .build()); }); return mapper; diff --git a/src/main/java/ru/olegcherednik/json/jackson/JacksonEngine.java b/src/main/java/ru/olegcherednik/json/jackson/JacksonEngine.java index da0e451..d39fc3f 100644 --- a/src/main/java/ru/olegcherednik/json/jackson/JacksonEngine.java +++ b/src/main/java/ru/olegcherednik/json/jackson/JacksonEngine.java @@ -27,7 +27,7 @@ import ru.olegcherednik.json.api.JsonEngine; import ru.olegcherednik.json.api.iterator.AutoCloseableIterator; import ru.olegcherednik.json.jackson.types.ListMapTypeReference; -import ru.olegcherednik.json.jackson.types.MappingIteratorDecorator; +import ru.olegcherednik.json.jackson.types.MappingAutoCloseableIterator; import java.io.IOException; import java.io.Reader; @@ -111,13 +111,13 @@ public List> readListOfMap(Reader reader) throws IOException @Override public AutoCloseableIterator readListLazy(Reader reader, Class valueClass) throws IOException { MappingIterator it = mapper.readerFor(valueClass).readValues(reader); - return new MappingIteratorDecorator<>(it); + return new MappingAutoCloseableIterator<>(it); } @Override public AutoCloseableIterator> readListOfMapLazy(Reader reader) throws IOException { MappingIterator> it = mapper.readerFor(Map.class).readValues(reader); - return new MappingIteratorDecorator<>(it); + return new MappingAutoCloseableIterator<>(it); } @Override diff --git a/src/main/java/ru/olegcherednik/json/jackson/datetime/JacksonJavaTimeModule.java b/src/main/java/ru/olegcherednik/json/jackson/datetime/JacksonJavaTimeModule.java index ba4968c..96cbea6 100644 --- a/src/main/java/ru/olegcherednik/json/jackson/datetime/JacksonJavaTimeModule.java +++ b/src/main/java/ru/olegcherednik/json/jackson/datetime/JacksonJavaTimeModule.java @@ -26,6 +26,8 @@ import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; +import lombok.AccessLevel; +import lombok.Builder; import lombok.RequiredArgsConstructor; import ru.olegcherednik.json.jackson.datetime.deserializers.JacksonInstantDeserializer; import ru.olegcherednik.json.jackson.datetime.deserializers.JacksonJsr310KeyDeserializer; @@ -60,7 +62,8 @@ * @author Oleg Cherednik * @since 14.12.2023 */ -@RequiredArgsConstructor +@Builder +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) public class JacksonJavaTimeModule extends SimpleModule { private static final long serialVersionUID = 7443855953089866124L; diff --git a/src/main/java/ru/olegcherednik/json/jackson/types/MappingIteratorDecorator.java b/src/main/java/ru/olegcherednik/json/jackson/types/MappingAutoCloseableIterator.java similarity index 94% rename from src/main/java/ru/olegcherednik/json/jackson/types/MappingIteratorDecorator.java rename to src/main/java/ru/olegcherednik/json/jackson/types/MappingAutoCloseableIterator.java index f609425..7e239c5 100644 --- a/src/main/java/ru/olegcherednik/json/jackson/types/MappingIteratorDecorator.java +++ b/src/main/java/ru/olegcherednik/json/jackson/types/MappingAutoCloseableIterator.java @@ -29,7 +29,7 @@ * @since 03.01.2024 */ @RequiredArgsConstructor -public class MappingIteratorDecorator implements AutoCloseableIterator { +public class MappingAutoCloseableIterator implements AutoCloseableIterator { protected final MappingIterator delegate; diff --git a/src/test/java/ru/olegcherednik/json/jackson/WriterTest.java b/src/test/java/ru/olegcherednik/json/jackson/WriterTest.java index 38c59d5..6a62c83 100644 --- a/src/test/java/ru/olegcherednik/json/jackson/WriterTest.java +++ b/src/test/java/ru/olegcherednik/json/jackson/WriterTest.java @@ -28,6 +28,7 @@ import java.io.OutputStream; import java.io.StringWriter; import java.io.Writer; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; @@ -87,6 +88,13 @@ public void shouldRetrieveJsonWhenWriteListObject() { assertThat(actual).isEqualTo("[{\"intVal\":555,\"strVal\":\"victory\"},{\"intVal\":666,\"strVal\":\"omen\"}]"); } + public void shouldRetrieveJsonWhenWriteIterator() { + List data = new ArrayList<>(ListUtils.of(Data.VICTORY, Data.OMEN)); + String actual = Json.writeValue(data.iterator()); + assertThat(actual).isNotNull(); + assertThat(actual).isEqualTo("[{\"intVal\":555,\"strVal\":\"victory\"},{\"intVal\":666,\"strVal\":\"omen\"}]"); + } + public void shouldRetrieveEmptyJsonWhenWriteEmptyCollection() { assertThat(Json.writeValue(Collections.emptyList())).isEqualTo("[]"); assertThat(Json.writeValue(Collections.emptyMap())).isEqualTo("{}"); diff --git a/src/test/java/ru/olegcherednik/json/jackson/datetime/OffsetDateTimeTest.java b/src/test/java/ru/olegcherednik/json/jackson/datetime/OffsetDateTimeTest.java new file mode 100644 index 0000000..433cbb2 --- /dev/null +++ b/src/test/java/ru/olegcherednik/json/jackson/datetime/OffsetDateTimeTest.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package ru.olegcherednik.json.jackson.datetime; + +import org.testng.annotations.Test; +import ru.olegcherednik.json.api.Json; +import ru.olegcherednik.json.api.JsonSettings; +import ru.olegcherednik.json.jackson.LocalZoneId; +import ru.olegcherednik.json.jackson.MapUtils; + +import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author Oleg Cherednik + * @since 03.01.2024 + */ +@Test +public class OffsetDateTimeTest { + + public void shouldRetrieveJsonOriginalWhenWriteDefaultSettings() { + String actual = Json.writeValue(createData()); + assertThat(actual).isNotNull().isEqualTo( + "{\"UTC\":\"2017-07-23T13:57:14.225Z\"," + + "\"Asia/Singapore\":\"2017-07-23T13:57:14.225+08:00\"," + + "\"Australia/Sydney\":\"2017-07-23T13:57:14.225+10:00\"}"); + } + + public void shouldRetrieveJsonUtcWhenWriteOffsetDateTimeWithUtcZoneId() { + JsonSettings settings = JsonSettings.builder().zoneId(ZoneOffset.UTC).build(); + String actual = Json.createWriter(settings).writeValue(createData()); + assertThat(actual).isNotNull().isEqualTo( + "{\"UTC\":\"2017-07-23T13:57:14.225Z\"," + + "\"Asia/Singapore\":\"2017-07-23T05:57:14.225Z\"," + + "\"Australia/Sydney\":\"2017-07-23T03:57:14.225Z\"}"); + } + + public void shouldRetrieveJsonSingaporeWhenWriteOffsetDateTimeWithSingaporeZoneId() { + JsonSettings settings = JsonSettings.builder().zoneId(LocalZoneId.ASIA_SINGAPORE).build(); + String actual = Json.createWriter(settings).writeValue(createData()); + assertThat(actual).isNotNull().isEqualTo( + "{\"UTC\":\"2017-07-23T21:57:14.225+08:00\"," + + "\"Asia/Singapore\":\"2017-07-23T13:57:14.225+08:00\"," + + "\"Australia/Sydney\":\"2017-07-23T11:57:14.225+08:00\"}"); + } + + public void shouldRetrieveDeserializedOffsetDateTimeMapWhenReadJsonAsMap() { + String json = "{\"UTC\":\"2017-07-23T13:57:14.225Z\"," + + "\"Asia/Singapore\":\"2017-07-23T13:57:14.225+08:00\"," + + "\"Australia/Sydney\":\"2017-07-23T13:57:14.225+10:00\"}"; + + Map actual = Json.readMap(json, String.class, OffsetDateTime.class); + Map expected = createData(); + assertThat(actual).isNotNull().isEqualTo(expected); + } + + private static Map createData() { + return MapUtils.of("UTC", OffsetDateTime.parse("2017-07-23T13:57:14.225Z"), + "Asia/Singapore", OffsetDateTime.parse("2017-07-23T13:57:14.225+08:00"), + "Australia/Sydney", OffsetDateTime.parse("2017-07-23T13:57:14.225+10:00")); + } + +} diff --git a/src/test/java/ru/olegcherednik/json/jackson/datetime/ZonedDateTimePrettyPrintTest.java b/src/test/java/ru/olegcherednik/json/jackson/datetime/ZonedDateTimePrettyPrintTest.java index 1996e6c..1d5cc5f 100644 --- a/src/test/java/ru/olegcherednik/json/jackson/datetime/ZonedDateTimePrettyPrintTest.java +++ b/src/test/java/ru/olegcherednik/json/jackson/datetime/ZonedDateTimePrettyPrintTest.java @@ -23,6 +23,7 @@ import ru.olegcherednik.json.api.Json; import ru.olegcherednik.json.api.JsonSettings; import ru.olegcherednik.json.jackson.LocalZoneId; +import ru.olegcherednik.json.jackson.MapUtils; import ru.olegcherednik.json.jackson.ResourceData; import java.io.IOException; @@ -40,12 +41,8 @@ public class ZonedDateTimePrettyPrintTest { public void shouldRetrievePrettyPrintJsonUtcZoneWhenWriteZonedDateTimeMapWithPrettyPrint() throws IOException { - JsonSettings settings = JsonSettings.builder() - .zoneId(ZoneOffset.UTC) - .build(); - - Map map = ZonedDateTimeTest.createData(); - String actual = Json.createPrettyPrint(settings).writeValue(map); + JsonSettings settings = JsonSettings.builder().zoneId(ZoneOffset.UTC).build(); + String actual = Json.createPrettyPrint(settings).writeValue(createData()); String expected = ResourceData.getResourceAsString("/datetime/zoned_date_time_utc.json").trim(); assertThat(actual).isNotEqualTo(expected); @@ -54,16 +51,18 @@ public void shouldRetrievePrettyPrintJsonUtcZoneWhenWriteZonedDateTimeMapWithPre public void shouldRetrievePrettyPrintJsonSingaporeZoneWhenWriteZonedDateTimeMapWithPrettyPrint() throws IOException { - JsonSettings settings = JsonSettings.builder() - .zoneId(LocalZoneId.ASIA_SINGAPORE) - .build(); - - Map map = ZonedDateTimeTest.createData(); - String actual = Json.createPrettyPrint(settings).writeValue(map); + JsonSettings settings = JsonSettings.builder().zoneId(LocalZoneId.ASIA_SINGAPORE).build(); + String actual = Json.createPrettyPrint(settings).writeValue(createData()); String expected = ResourceData.getResourceAsString("/datetime/zoned_date_time_singapore.json").trim(); assertThat(actual).isNotEqualTo(expected); assertThat(Json.readMap(actual)).isEqualTo(Json.readMap(expected)); } + private static Map createData() { + return MapUtils.of("UTC", ZonedDateTime.parse("2017-07-23T13:57:14.225Z"), + "Asia/Singapore", ZonedDateTime.parse("2017-07-23T13:57:14.225+08:00[Asia/Singapore]"), + "Australia/Sydney", ZonedDateTime.parse("2017-07-23T13:57:14.225+10:00[Australia/Sydney]")); + } + } diff --git a/src/test/java/ru/olegcherednik/json/jackson/datetime/ZonedDateTimeTest.java b/src/test/java/ru/olegcherednik/json/jackson/datetime/ZonedDateTimeTest.java index 9847c6b..d1a5a9a 100644 --- a/src/test/java/ru/olegcherednik/json/jackson/datetime/ZonedDateTimeTest.java +++ b/src/test/java/ru/olegcherednik/json/jackson/datetime/ZonedDateTimeTest.java @@ -27,7 +27,6 @@ import java.time.ZoneOffset; import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; @@ -40,24 +39,20 @@ public class ZonedDateTimeTest { public void shouldRetrieveJsonOriginalZoneWhenWriteDefaultSettings() { - String actual = Json.createWriter().writeValue(createData()); - assertThat(actual).isNotNull(); - assertThat(actual).isEqualTo( + String actual = Json.writeValue(createData()); + assertThat(actual).isNotNull().isEqualTo( "{\"UTC\":\"2017-07-23T13:57:14.225Z\"," + "\"Asia/Singapore\":\"2017-07-23T13:57:14.225+08:00[Asia/Singapore]\"," + "\"Australia/Sydney\":\"2017-07-23T13:57:14.225+10:00[Australia/Sydney]\"}"); } public void shouldRetrieveJsonUtcZoneWhenWriteZonedDateTimeWithUtcZoneId() { - JsonSettings settings = JsonSettings.builder() - .zoneId(ZoneOffset.UTC) - .build(); + JsonSettings settings = JsonSettings.builder().zoneId(ZoneOffset.UTC).build(); String actual = Json.createWriter(settings).writeValue(createData()); - assertThat(actual).isNotNull(); - assertThat(actual).isEqualTo("{\"UTC\":\"2017-07-23T13:57:14.225Z\"," - + "\"Asia/Singapore\":\"2017-07-23T05:57:14.225Z\"," - + "\"Australia/Sydney\":\"2017-07-23T03:57:14.225Z\"}"); + assertThat(actual).isNotNull().isEqualTo("{\"UTC\":\"2017-07-23T13:57:14.225Z\"," + + "\"Asia/Singapore\":\"2017-07-23T05:57:14.225Z\"," + + "\"Australia/Sydney\":\"2017-07-23T03:57:14.225Z\"}"); } public void shouldRetrieveJsonSingaporeWhenWriteZonedDateTimeWithSingaporeZoneId() { @@ -66,8 +61,7 @@ public void shouldRetrieveJsonSingaporeWhenWriteZonedDateTimeWithSingaporeZoneId .build(); String actual = Json.createWriter(settings).writeValue(createData()); - assertThat(actual).isNotNull(); - assertThat(actual).isEqualTo( + assertThat(actual).isNotNull().isEqualTo( "{\"UTC\":\"2017-07-23T21:57:14.225+08:00[Asia/Singapore]\"," + "\"Asia/Singapore\":\"2017-07-23T13:57:14.225+08:00[Asia/Singapore]\"," + "\"Australia/Sydney\":\"2017-07-23T11:57:14.225+08:00[Asia/Singapore]\"}"); @@ -80,17 +74,13 @@ public void shouldRetrieveDeserializedZonedDateTimeMapWhenReadJsonAsMap() { Map actual = Json.readMap(json, String.class, ZonedDateTime.class); Map expected = createData(); - assertThat(actual).isNotNull(); - assertThat(actual).isEqualTo(expected); + assertThat(actual).isNotNull().isEqualTo(expected); } - static Map createData() { - String str = "2017-07-23T13:57:14.225"; - DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS"); - - return MapUtils.of("UTC", ZonedDateTime.parse(str, df.withZone(ZoneOffset.UTC)), - "Asia/Singapore", ZonedDateTime.parse(str, df.withZone(LocalZoneId.ASIA_SINGAPORE)), - "Australia/Sydney", ZonedDateTime.parse(str, df.withZone(LocalZoneId.AUSTRALIA_SYDNEY))); + private static Map createData() { + return MapUtils.of("UTC", ZonedDateTime.parse("2017-07-23T13:57:14.225Z"), + "Asia/Singapore", ZonedDateTime.parse("2017-07-23T13:57:14.225+08:00[Asia/Singapore]"), + "Australia/Sydney", ZonedDateTime.parse("2017-07-23T13:57:14.225+10:00[Australia/Sydney]")); } }