This is an automated email from the ASF dual-hosted git repository. ahuber pushed a commit to branch v3 in repository https://gitbox.apache.org/repos/asf/causeway.git
commit a9db07b37a9d468fa0357833fdf9b6393b8c4450 Merge: b2ef59460b 8da4588df3 Author: Andi Huber <[email protected]> AuthorDate: Mon May 27 17:55:17 2024 +0200 merge from master commons/pom.xml | 4 ++++ commons/src/main/java/module-info.java | 1 + .../main/java/org/apache/causeway/commons/io/JsonUtils.java | 13 +++++++++++++ .../main/java/org/apache/causeway/commons/io/YamlUtils.java | 2 ++ .../java/org/apache/causeway/commons/io/JsonUtilsTest.java | 12 ++++++++---- .../JsonUtilsTest.toStringUtf8_indentedOutput.approved.txt | 4 ++++ .../java/org/apache/causeway/commons/io/YamlUtilsTest.java | 3 +++ .../commons/io/YamlUtilsTest.toStringUtf8.approved.txt | 3 +++ .../java/org/apache/causeway/commons/io/_TestDomain.java | 13 +++++++++++-- 9 files changed, 49 insertions(+), 6 deletions(-) diff --cc commons/pom.xml index faa650777a,8f1f6d3437..802ce2ec76 --- a/commons/pom.xml +++ b/commons/pom.xml @@@ -123,14 -130,14 +123,18 @@@ <artifactId>jackson-dataformat-yaml</artifactId> </dependency> <dependency> - <groupId>com.fasterxml.jackson.module</groupId> - <artifactId>jackson-module-jaxb-annotations</artifactId> - </dependency> + <groupId>com.fasterxml.jackson.module</groupId> + <artifactId>jackson-module-jakarta-xmlbind-annotations</artifactId> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.datatype</groupId> + <artifactId>jackson-datatype-jdk8</artifactId> + </dependency> <dependency> + <groupId>com.fasterxml.jackson.jakarta.rs</groupId> + <artifactId>jackson-jakarta-rs-json-provider</artifactId> + </dependency> + <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency> diff --cc commons/src/main/java/module-info.java index baa299e6e4,4d09aa72aa..2b7f925a8c --- a/commons/src/main/java/module-info.java +++ b/commons/src/main/java/module-info.java @@@ -72,15 -73,14 +72,16 @@@ module org.apache.causeway.commons requires transitive spring.beans; requires transitive spring.context; requires transitive spring.core; - requires java.inject; - requires java.annotation; + requires transitive jakarta.xml.bind; + requires transitive jakarta.inject; + requires jakarta.annotation; requires com.sun.xml.bind; - requires com.fasterxml.jackson.datatype.jsr310; requires com.fasterxml.jackson.dataformat.yaml; + requires com.fasterxml.jackson.datatype.jsr310; + requires com.fasterxml.jackson.datatype.jdk8; - opens org.apache.causeway.commons.internal.resources to java.xml.bind, com.sun.xml.bind; // JUnit test - opens org.apache.causeway.commons.io to java.xml.bind, com.sun.xml.bind; + // JAXB JUnit test + opens org.apache.causeway.commons.internal.resources to jakarta.xml.bind; + opens org.apache.causeway.commons.io to jakarta.xml.bind; } diff --cc commons/src/main/java/org/apache/causeway/commons/io/JsonUtils.java index 3477c3e6b8,59b12ee070..09faa348bb --- a/commons/src/main/java/org/apache/causeway/commons/io/JsonUtils.java +++ b/commons/src/main/java/org/apache/causeway/commons/io/JsonUtils.java @@@ -42,17 -42,22 +42,23 @@@ import com.fasterxml.jackson.databind.d import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.StdSerializer; + import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule; +import com.fasterxml.jackson.module.jakarta.xmlbind.JakartaXmlBindAnnotationModule; import org.springframework.lang.Nullable; import org.apache.causeway.commons.collections.Can; import org.apache.causeway.commons.functional.Try; import org.apache.causeway.commons.internal.base._Casts; +import org.apache.causeway.commons.internal.context._Context; import org.apache.causeway.commons.internal.exceptions._Exceptions; import org.apache.causeway.commons.internal.reflection._Generics; + import org.apache.causeway.commons.io.JsonUtils.CanDeserializer; + import org.apache.causeway.commons.io.JsonUtils.CanSerializer; + import org.apache.causeway.commons.io.JsonUtils.JacksonCustomizer; + import org.apache.causeway.commons.io.JsonUtils.XDeserializer; + import org.apache.causeway.commons.io.JsonUtils.XSerializer; import lombok.NonNull; import lombok.SneakyThrows; @@@ -188,9 -177,14 +194,14 @@@ public class JsonUtils return mapper.setSerializationInclusion(Include.NON_NULL); } + /** add support for JDK 8, e.g. {@link Optional} */ + public ObjectMapper jdk8Support(final ObjectMapper mapper) { + return mapper.registerModule(new Jdk8Module()); + } + /** add support for JAXB annotations */ public ObjectMapper jaxbAnnotationSupport(final ObjectMapper mapper) { - return mapper.registerModule(new JaxbAnnotationModule()); + return mapper.registerModule(new JakartaXmlBindAnnotationModule()); } /** add support for reading java.time (ISO) */ diff --cc commons/src/main/java/org/apache/causeway/commons/io/YamlUtils.java index 14e26a7e96,9e7d3a7982..a6b590bfab --- a/commons/src/main/java/org/apache/causeway/commons/io/YamlUtils.java +++ b/commons/src/main/java/org/apache/causeway/commons/io/YamlUtils.java @@@ -176,17 -112,11 +176,18 @@@ public class YamlUtils /** * SnakeYaml as of 2.2 does not support Java records. So we use Jackson instead. + * @param loadCustomizer */ private ObjectMapper createJacksonReader( + final Optional<YamlLoadCustomizer> loadCustomizer, final JsonUtils.JacksonCustomizer ... customizers) { - var mapper = new ObjectMapper(new YAMLFactory()); + var yamlFactory = YAMLFactory.builder() + .loaderOptions(loadCustomizer + .map(YamlUtils::createLoaderOptions) + .orElseGet(YamlUtils::createLoaderOptions)) + .build(); + var mapper = new ObjectMapper(yamlFactory); + mapper = JsonUtils.jdk8Support(mapper); mapper = JsonUtils.readingJavaTimeSupport(mapper); mapper = JsonUtils.readingCanSupport(mapper); for(JsonUtils.JacksonCustomizer customizer : customizers) { @@@ -200,15 -130,10 +201,16 @@@ * Use Jackson to write YAML. */ private ObjectMapper createJacksonWriter( + final Optional<YamlDumpCustomizer> dumpCustomizer, final JsonUtils.JacksonCustomizer ... customizers) { - var mapper = new ObjectMapper(new YAMLFactory() - .disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER)); + var yamlFactory = YAMLFactory.builder() + .dumperOptions(dumpCustomizer + .map(YamlUtils::createDumperOptions) + .orElseGet(YamlUtils::createDumperOptions)) + .build() + .disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER); + var mapper = new ObjectMapper(yamlFactory); + mapper = JsonUtils.jdk8Support(mapper); mapper = JsonUtils.writingJavaTimeSupport(mapper); mapper = JsonUtils.writingCanSupport(mapper); for(JsonUtils.JacksonCustomizer customizer : customizers) { diff --cc commons/src/test/java/org/apache/causeway/commons/io/JsonUtilsTest.java index 1320045390,ecf1b38b9b..3e7cf20488 --- a/commons/src/test/java/org/apache/causeway/commons/io/JsonUtilsTest.java +++ b/commons/src/test/java/org/apache/causeway/commons/io/JsonUtilsTest.java @@@ -57,32 -57,34 +57,36 @@@ class JsonUtilsTest @Test void parseRecord() { var jsonTemplate = - " {\r\n" - + " \"name\": \"sven\",\r\n" - + " \"java8Time\": {\r\n" - + " \"localTime\" : \"${localTime}\",\r\n" - + " \"localDate\" : \"${localDate}\",\r\n" - + " \"localDateTime\" : \"${localDateTime}\",\r\n" - + " \"offsetTime\" : \"${offsetTime}\",\r\n" - + " \"offsetDateTime\" : \"${offsetDateTime}\",\r\n" - + " \"zonedDateTime\" : \"${zonedDateTime}\"\r\n" - + " },\r\n" - + " \"address\": {\r\n" - + " \"zip\":1234,\r\n" - + " \"street\":\"backerstreet\"\r\n" - + " },\r\n" - + " \"additionalAddresses\" : [ {\r\n" - + " \"zip\" : 23,\r\n" - + " \"street\" : \"brownstreet\"\r\n" - + " }, {\r\n" - + " \"zip\" : 34,\r\n" - + " \"street\" : \"bluestreet\"\r\n" - + " } ],\r\n" - + " \"phone\" : {\r\n" - + " \"home\" : \"+99 1234\",\r\n" - + " \"work\" : null\r\n" - + " }" - + " }"; + """ + { + "name": "sven", + "java8Time": { + "localTime" : "${localTime}", + "localDate" : "${localDate}", + "localDateTime" : "${localDateTime}", + "offsetTime" : "${offsetTime}", + "offsetDateTime" : "${offsetDateTime}", + "zonedDateTime" : "${zonedDateTime}" + }, + "address": { + "zip":1234, + "street":"backerstreet" + }, + "additionalAddresses" : [ { + "zip" : 23, + "street" : "brownstreet" + }, { + "zip" : 34, + "street" : "bluestreet" - } ] ++ } ], ++ "phone" : { ++ "home" : "+99 1234", ++ "work" : null ++ } + } + """; - var json = person.getJava8Time().interpolator().applyTo(jsonTemplate); + var json = person.java8Time().interpolator().applyTo(jsonTemplate); //debug //System.err.printf("%s%n", json); diff --cc commons/src/test/java/org/apache/causeway/commons/io/YamlUtilsTest.java index 66966a580e,0ea013848d..d427d7e060 --- a/commons/src/test/java/org/apache/causeway/commons/io/YamlUtilsTest.java +++ b/commons/src/test/java/org/apache/causeway/commons/io/YamlUtilsTest.java @@@ -45,24 -45,26 +45,27 @@@ class YamlUtilsTest @Test void parseRecord() { - var yamlTemplate = "" - + "name: sven\r\n" - + "address: {street: backerstreet, zip: 1234}\r\n" - + "additionalAddresses:\r\n" - + "- zip: 23\r\n" - + " street: \"brownstreet\"\r\n" - + "- zip: 34\r\n" - + " street: \"bluestreet\"\r\n" - + "java8Time:\r\n" - + " localTime: ${localTime}\r\n" - + " localDate: ${localDate}\r\n" - + " localDateTime: ${localDateTime}\r\n" - + " offsetTime: ${offsetTime}\r\n" - + " offsetDateTime: ${offsetDateTime}\r\n" - + " zonedDateTime: ${zonedDateTime}\r\n" - + "phone:\r\n" - + " home: \"+99 1234\"\r\n" - + " work: null"; + var yamlTemplate = """ + name: sven + address: {street: backerstreet, zip: 1234} + additionalAddresses: + - zip: 23 + street: "brownstreet" + - zip: 34 + street: "bluestreet" + java8Time: + localTime: ${localTime} + localDate: ${localDate} + localDateTime: ${localDateTime} + offsetTime: ${offsetTime} + offsetDateTime: ${offsetDateTime} + zonedDateTime: ${zonedDateTime} ++ phone: ++ home: "+99 1234" ++ work: null + """; - var yaml = person.getJava8Time().interpolator().applyTo(yamlTemplate); + var yaml = person.java8Time().interpolator().applyTo(yamlTemplate); // debug //System.err.printf("%s%n", yaml); diff --cc commons/src/test/java/org/apache/causeway/commons/io/_TestDomain.java index 43f2540354,25a72857ab..1181e75ce8 --- a/commons/src/test/java/org/apache/causeway/commons/io/_TestDomain.java +++ b/commons/src/test/java/org/apache/causeway/commons/io/_TestDomain.java @@@ -38,25 -42,35 +39,31 @@@ import lombok.experimental.UtilityClass @UtilityClass class _TestDomain { - @Data @AllArgsConstructor @NoArgsConstructor - public static class Person { - String name; - Address address; - Can<Address> additionalAddresses; - Java8Time java8Time; - Phone phone; + public static record Person( + String name, + Address address, + Can<Address> additionalAddresses, - Java8Time java8Time) { ++ Java8Time java8Time, ++ Phone phone) { } - @Data @AllArgsConstructor @NoArgsConstructor - public static class Address { - int zip; - String street; + public static record Address( + int zip, + String street) { } - @Data @AllArgsConstructor @NoArgsConstructor - public static class Phone { - Optional<String> home; - Optional<String> work; ++ public static record Phone( ++ Optional<String> home, ++ Optional<String> work) { + } + - @Data @AllArgsConstructor @NoArgsConstructor - public static class Java8Time { - LocalTime localTime; - LocalDate localDate; - LocalDateTime localDateTime; - OffsetTime offsetTime; - OffsetDateTime offsetDateTime; - ZonedDateTime zonedDateTime; + public static record Java8Time( + LocalTime localTime, + LocalDate localDate, + LocalDateTime localDateTime, + OffsetTime offsetTime, + OffsetDateTime offsetDateTime, + ZonedDateTime zonedDateTime) { _StringInterpolation interpolator() { return new _StringInterpolation(Map.of(
