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(

Reply via email to