This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/causeway.git


The following commit(s) were added to refs/heads/master by this push:
     new 8da4588df3 CAUSEWAY-3748: [Commons] Json/YamlUtils support for Optional
8da4588df3 is described below

commit 8da4588df3533401619e8cb2446258260e4ee45a
Author: Andi Huber <[email protected]>
AuthorDate: Mon May 27 17:41:04 2024 +0200

    CAUSEWAY-3748: [Commons] Json/YamlUtils support for Optional
---
 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  |  5 ++++-
 .../commons/io/YamlUtilsTest.toStringUtf8.approved.txt      |  3 +++
 .../java/org/apache/causeway/commons/io/_TestDomain.java    | 12 +++++++++++-
 9 files changed, 50 insertions(+), 6 deletions(-)

diff --git a/commons/pom.xml b/commons/pom.xml
index bcf40b9495..8f1f6d3437 100644
--- a/commons/pom.xml
+++ b/commons/pom.xml
@@ -133,6 +133,10 @@
             <groupId>com.fasterxml.jackson.module</groupId>
             <artifactId>jackson-module-jaxb-annotations</artifactId>
         </dependency>
+               <dependency>
+                       <groupId>com.fasterxml.jackson.datatype</groupId>
+                       <artifactId>jackson-datatype-jdk8</artifactId>
+               </dependency>
         <dependency>
                    <groupId>com.fasterxml.jackson.datatype</groupId>
                    <artifactId>jackson-datatype-jsr310</artifactId>
diff --git a/commons/src/main/java/module-info.java 
b/commons/src/main/java/module-info.java
index e2a7a0fff7..4d09aa72aa 100644
--- a/commons/src/main/java/module-info.java
+++ b/commons/src/main/java/module-info.java
@@ -78,6 +78,7 @@ module org.apache.causeway.commons {
     requires com.sun.xml.bind;
     requires com.fasterxml.jackson.datatype.jsr310;
     requires com.fasterxml.jackson.dataformat.yaml;
+    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;
diff --git 
a/commons/src/main/java/org/apache/causeway/commons/io/JsonUtils.java 
b/commons/src/main/java/org/apache/causeway/commons/io/JsonUtils.java
index fa96958803..59b12ee070 100644
--- 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,6 +42,7 @@ import 
com.fasterxml.jackson.databind.deser.ContextualDeserializer;
 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;
 
@@ -52,6 +53,11 @@ import org.apache.causeway.commons.functional.Try;
 import org.apache.causeway.commons.internal.base._Casts;
 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;
@@ -171,6 +177,11 @@ 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());
@@ -283,6 +294,7 @@ public class JsonUtils {
     private ObjectMapper createJacksonReader(
             final JsonUtils.JacksonCustomizer ... customizers) {
         var mapper = new ObjectMapper();
+        mapper = jdk8Support(mapper);
         mapper = readingJavaTimeSupport(mapper);
         mapper = readingCanSupport(mapper);
         for(JsonUtils.JacksonCustomizer customizer : customizers) {
@@ -295,6 +307,7 @@ public class JsonUtils {
     private ObjectMapper createJacksonWriter(
             final JsonUtils.JacksonCustomizer ... customizers) {
         var mapper = new ObjectMapper();
+        mapper = jdk8Support(mapper);
         mapper = writingJavaTimeSupport(mapper);
         mapper = writingCanSupport(mapper);
         for(JsonUtils.JacksonCustomizer customizer : customizers) {
diff --git 
a/commons/src/main/java/org/apache/causeway/commons/io/YamlUtils.java 
b/commons/src/main/java/org/apache/causeway/commons/io/YamlUtils.java
index f1976d5d7f..9e7d3a7982 100644
--- a/commons/src/main/java/org/apache/causeway/commons/io/YamlUtils.java
+++ b/commons/src/main/java/org/apache/causeway/commons/io/YamlUtils.java
@@ -116,6 +116,7 @@ public class YamlUtils {
     private ObjectMapper createJacksonReader(
             final JsonUtils.JacksonCustomizer ... customizers) {
         var mapper = new ObjectMapper(new YAMLFactory());
+        mapper = JsonUtils.jdk8Support(mapper);
         mapper = JsonUtils.readingJavaTimeSupport(mapper);
         mapper = JsonUtils.readingCanSupport(mapper);
         for(JsonUtils.JacksonCustomizer customizer : customizers) {
@@ -132,6 +133,7 @@ public class YamlUtils {
             final JsonUtils.JacksonCustomizer ... customizers) {
         var mapper = new ObjectMapper(new YAMLFactory()
                 .disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER));
+        mapper = JsonUtils.jdk8Support(mapper);
         mapper = JsonUtils.writingJavaTimeSupport(mapper);
         mapper = JsonUtils.writingCanSupport(mapper);
         for(JsonUtils.JacksonCustomizer customizer : customizers) {
diff --git 
a/commons/src/test/java/org/apache/causeway/commons/io/JsonUtilsTest.java 
b/commons/src/test/java/org/apache/causeway/commons/io/JsonUtilsTest.java
index f012c7312a..ecf1b38b9b 100644
--- a/commons/src/test/java/org/apache/causeway/commons/io/JsonUtilsTest.java
+++ b/commons/src/test/java/org/apache/causeway/commons/io/JsonUtilsTest.java
@@ -31,16 +31,16 @@ import lombok.val;
 class JsonUtilsTest {
 
     /*
-     * [ERROR] Failed to execute goal 
org.apache.maven.plugins:maven-compiler-plugin:3.11.0:testCompile 
+     * [ERROR] Failed to execute goal 
org.apache.maven.plugins:maven-compiler-plugin:3.11.0:testCompile
      *      on project causeway-commons: Compilation failure:
      * [ERROR] package com.google.gson does not exist
      * [ERROR] cannot find symbol
      * [ERROR]   symbol:   class GsonBuilder
-     * [ERROR]   location: class org.approvaltests.JsonApprovals 
+     * [ERROR]   location: class org.approvaltests.JsonApprovals
      */
     org.approvaltests.JsonApprovals dummy1; // references 
com.google.gson.GsonBuilder
     com.google.gson.GsonBuilder dummy2; // Requires 
(GSON)[https://mvnrepository.com/artifact/com.google.code.gson/gson]
-    
+
     private Person person;
 
     @BeforeEach
@@ -77,7 +77,11 @@ class JsonUtilsTest {
                 + "     }, {\r\n"
                 + "         \"zip\" : 34,\r\n"
                 + "         \"street\" : \"bluestreet\"\r\n"
-                + "     } ]\r\n"
+                + "     } ],\r\n"
+                + "  \"phone\" : {\r\n"
+                + "    \"home\" : \"+99 1234\",\r\n"
+                + "    \"work\" : null\r\n"
+                + "  }"
                 + " }";
 
         var json = person.getJava8Time().interpolator().applyTo(jsonTemplate);
diff --git 
a/commons/src/test/java/org/apache/causeway/commons/io/JsonUtilsTest.toStringUtf8_indentedOutput.approved.txt
 
b/commons/src/test/java/org/apache/causeway/commons/io/JsonUtilsTest.toStringUtf8_indentedOutput.approved.txt
index 4514ff5d4a..520b4bcd0d 100644
--- 
a/commons/src/test/java/org/apache/causeway/commons/io/JsonUtilsTest.toStringUtf8_indentedOutput.approved.txt
+++ 
b/commons/src/test/java/org/apache/causeway/commons/io/JsonUtilsTest.toStringUtf8_indentedOutput.approved.txt
@@ -18,5 +18,9 @@
     "offsetTime" : "17:33:45-02:00",
     "offsetDateTime" : "2007-11-21T17:33:45-02:00",
     "zonedDateTime" : "2007-11-21T17:33:45+01:00"
+  },
+  "phone" : {
+    "home" : "+99 1234",
+    "work" : null
   }
 }
\ No newline at end of file
diff --git 
a/commons/src/test/java/org/apache/causeway/commons/io/YamlUtilsTest.java 
b/commons/src/test/java/org/apache/causeway/commons/io/YamlUtilsTest.java
index 458d7ca0bd..0ea013848d 100644
--- a/commons/src/test/java/org/apache/causeway/commons/io/YamlUtilsTest.java
+++ b/commons/src/test/java/org/apache/causeway/commons/io/YamlUtilsTest.java
@@ -59,7 +59,10 @@ class YamlUtilsTest {
                 + "  localDateTime: ${localDateTime}\r\n"
                 + "  offsetTime: ${offsetTime}\r\n"
                 + "  offsetDateTime: ${offsetDateTime}\r\n"
-                + "  zonedDateTime: ${zonedDateTime}\r\n";
+                + "  zonedDateTime: ${zonedDateTime}\r\n"
+                + "phone:\r\n"
+                + "  home: \"+99 1234\"\r\n"
+                + "  work: null";
 
         var yaml = person.getJava8Time().interpolator().applyTo(yamlTemplate);
 
diff --git 
a/commons/src/test/java/org/apache/causeway/commons/io/YamlUtilsTest.toStringUtf8.approved.txt
 
b/commons/src/test/java/org/apache/causeway/commons/io/YamlUtilsTest.toStringUtf8.approved.txt
index db6037f6be..813ed62c0e 100644
--- 
a/commons/src/test/java/org/apache/causeway/commons/io/YamlUtilsTest.toStringUtf8.approved.txt
+++ 
b/commons/src/test/java/org/apache/causeway/commons/io/YamlUtilsTest.toStringUtf8.approved.txt
@@ -14,3 +14,6 @@ java8Time:
   offsetTime: "17:33:45-02:00"
   offsetDateTime: "2007-11-21T17:33:45-02:00"
   zonedDateTime: "2007-11-21T17:33:45+01:00"
+phone:
+  home: "+99 1234"
+  work: null
diff --git 
a/commons/src/test/java/org/apache/causeway/commons/io/_TestDomain.java 
b/commons/src/test/java/org/apache/causeway/commons/io/_TestDomain.java
index 84e71caf7e..25a72857ab 100644
--- a/commons/src/test/java/org/apache/causeway/commons/io/_TestDomain.java
+++ b/commons/src/test/java/org/apache/causeway/commons/io/_TestDomain.java
@@ -29,6 +29,7 @@ import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.base._StringInterpolation;
@@ -47,6 +48,7 @@ class _TestDomain {
         Address address;
         Can<Address> additionalAddresses;
         Java8Time java8Time;
+        Phone phone;
     }
 
     @Data @AllArgsConstructor @NoArgsConstructor
@@ -55,6 +57,12 @@ class _TestDomain {
         String street;
     }
 
+    @Data @AllArgsConstructor @NoArgsConstructor
+    public static class Phone {
+        Optional<String> home;
+        Optional<String> work;
+    }
+
     @Data @AllArgsConstructor @NoArgsConstructor
     public static class Java8Time {
         LocalTime localTime;
@@ -112,6 +120,8 @@ class _TestDomain {
                         OffsetTime.of(LocalTime.of(17, 33, 45), 
ZoneOffset.ofHours(-2)),
                         OffsetDateTime.of(LocalDateTime.of(2007, 11, 21, 17, 
33, 45), ZoneOffset.ofHours(-2)),
                         ZonedDateTime.of(LocalDateTime.of(2007, 11, 21, 17, 
33, 45), ZoneId.of("Europe/Vienna"))
-                        ));
+                        ),
+                new Phone(Optional.of("+99 1234"), Optional.empty())
+                );
     }
 }

Reply via email to