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 3b88feba1c214e91a5c0c479e17f0822092b3d3a
Merge: 0550d6bcde 13b5debd17
Author: Andi Huber <[email protected]>
AuthorDate: Fri Apr 12 12:22:00 2024 +0200

    Merge remote-tracking branch 'origin/master' into v3

 .../commons/internal/reflection/_Generics.java     | 54 ++++++++++++++++-
 .../org/apache/causeway/commons/io/JsonUtils.java  | 67 +++++++++++++++++++++-
 2 files changed, 117 insertions(+), 4 deletions(-)

diff --cc commons/src/main/java/org/apache/causeway/commons/io/JsonUtils.java
index dd07eb9ec2,fa96958803..3477c3e6b8
--- a/commons/src/main/java/org/apache/causeway/commons/io/JsonUtils.java
+++ b/commons/src/main/java/org/apache/causeway/commons/io/JsonUtils.java
@@@ -24,7 -24,10 +24,10 @@@ import java.util.List
  import java.util.Optional;
  import java.util.function.UnaryOperator;
  
 -import javax.xml.bind.annotation.adapters.XmlAdapter;
++import jakarta.xml.bind.annotation.adapters.XmlAdapter;
+ 
  import com.fasterxml.jackson.annotation.JsonInclude.Include;
+ import com.fasterxml.jackson.core.JacksonException;
  import com.fasterxml.jackson.core.JsonGenerator;
  import com.fasterxml.jackson.core.JsonParser;
  import com.fasterxml.jackson.databind.BeanProperty;
@@@ -46,7 -50,8 +50,9 @@@ import org.springframework.lang.Nullabl
  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 lombok.NonNull;
  import lombok.SneakyThrows;
@@@ -60,25 -64,29 +66,44 @@@ import lombok.extern.log4j.Log4j2
   * @since 2.0 {@index}
   */
  @UtilityClass
 +@Log4j2
  public class JsonUtils {
  
 +    /**
 +     * Consumers of the framework may choose to use a different provider.
 +     */
 +    public Optional<Class<?>> getPlatformDefaultJsonProviderForJaxb() {
 +        return 
Try.call(()->_Context.loadClass("org.eclipse.persistence.jaxb.rs.MOXyJsonProvider"))
 +                .ifFailure(cause->
 +                      log.warn("This implementation of RestfulClient does 
require the class 'MOXyJsonProvider'"
 +                          + " on the class-path."
 +                          + " Are you missing a maven dependency?")
 +                )
 +                .getValue()
 +                .map(x->x);
 +    }
 +
      @FunctionalInterface
-     public interface JacksonCustomizer extends UnaryOperator<ObjectMapper> {}
+     public interface JacksonCustomizer extends UnaryOperator<ObjectMapper> {
+         public static <T> JacksonCustomizer wrapXmlAdapter(final 
XmlAdapter<String, T> xmlAdapter) {
+             @SuppressWarnings("unchecked")
+             var type = (Class<T>) 
_Generics.streamGenericTypeArgumentsOfType(xmlAdapter.getClass(), 
XmlAdapter.class)
+                 .skip(1)
+                 .findFirst()
+                 .orElseThrow(()->_Exceptions.unsupportedOperation(
+                         "Failed to autodetect second generic type argument of 
class %s. "
+                         + "Use variant JacksonCustomizer.wrapXmlAdapter(type, 
xmlAdapter) "
+                         + "to provide the type explicitely.",
+                         xmlAdapter.getClass().getName()));
+             return wrapXmlAdapter(type, xmlAdapter);
+         }
+         public static <T> JacksonCustomizer wrapXmlAdapter(final Class<T> 
type, final XmlAdapter<String, T> xmlAdapter) {
+             return mapper->
+                 mapper.registerModule(new SimpleModule()
+                         .addSerializer(new XSerializer<T>(type, xmlAdapter))
+                         .addDeserializer(type, new XDeserializer<T>(type, 
xmlAdapter)));
+         }
+     }
  
      // -- READING
  

Reply via email to