You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rm...@apache.org on 2019/10/18 08:25:31 UTC

[johnzon] branch master updated: JOHNZON-290 configuration of jaxrs provider for polymorphic config

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

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


The following commit(s) were added to refs/heads/master by this push:
     new daba4ef  JOHNZON-290 configuration of jaxrs provider for polymorphic config
daba4ef is described below

commit daba4efc98096783f8e857a01fed473e32a11932
Author: Romain Manni-Bucau <rm...@gmail.com>
AuthorDate: Fri Oct 18 10:25:11 2019 +0200

    JOHNZON-290 configuration of jaxrs provider for polymorphic config
---
 .../johnzon/jaxrs/ConfigurableJohnzonProvider.java | 55 ++++++++++++++++
 .../jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java      | 73 ++++++++++++++++++++++
 2 files changed, 128 insertions(+)

diff --git a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java
index 9b853db..edcf545 100644
--- a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java
+++ b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java
@@ -20,6 +20,7 @@ package org.apache.johnzon.jaxrs;
 
 import static java.util.Arrays.asList;
 import static java.util.stream.Collectors.toMap;
+import static java.util.stream.Collectors.toSet;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -30,8 +31,10 @@ import java.lang.reflect.Type;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Function;
+import java.util.stream.Stream;
 
 import javax.json.JsonReaderFactory;
 import javax.json.stream.JsonGeneratorFactory;
@@ -134,6 +137,46 @@ public class ConfigurableJohnzonProvider<T> implements MessageBodyWriter<T>, Mes
         builder.setFailOnUnknownProperties(active);
     }
 
+    public void setPolymorphicSerializationPredicate(final String classes) {
+        final Set<Class<?>> set = asSet(classes);
+        builder.setPolymorphicSerializationPredicate(set::contains);
+    }
+
+    public void setPolymorphicDeserializationPredicate(final String classes) {
+        final Set<Class<?>> set = asSet(classes);
+        builder.setPolymorphicDeserializationPredicate(set::contains);
+    }
+
+    public void setPolymorphicDiscriminatorMapper(final Map<String, String> discriminatorMapper) {
+        final ClassLoader loader = Thread.currentThread().getContextClassLoader();
+        final Map<Class<?>, String> map = discriminatorMapper.entrySet().stream()
+                .collect(toMap(e -> {
+                    try {
+                        return loader.loadClass(e.getKey().trim());
+                    } catch (final ClassNotFoundException ex) {
+                        throw new IllegalArgumentException(ex);
+                    }
+                }, Map.Entry::getValue));
+        builder.setPolymorphicDiscriminatorMapper(map::get);
+    }
+
+    public void setPolymorphicTypeLoader(final Map<String, String> aliasTypeMapping) {
+        final ClassLoader loader = Thread.currentThread().getContextClassLoader();
+        final Map<String, Class<?>> map = aliasTypeMapping.entrySet().stream()
+                .collect(toMap(Map.Entry::getKey, e -> {
+                    try {
+                        return loader.loadClass(e.getValue().trim());
+                    } catch (final ClassNotFoundException ex) {
+                        throw new IllegalArgumentException(ex);
+                    }
+                }));
+        builder.setPolymorphicTypeLoader(map::get);
+    }
+
+    public void setPolymorphicDiscriminator(final String value) {
+        builder.setPolymorphicDiscriminator(value);
+    }
+
     public void setSupportConstructors(final boolean supportConstructors) {
         builder.setSupportConstructors(supportConstructors);
     }
@@ -269,4 +312,16 @@ public class ConfigurableJohnzonProvider<T> implements MessageBodyWriter<T>, Mes
     public void setAutoAdjustStringBuffers(final boolean autoAdjustStringBuffers) {
         builder.setAutoAdjustStringBuffers(autoAdjustStringBuffers);
     }
+
+    private Set<Class<?>> asSet(final String classes) {
+        final ClassLoader loader = Thread.currentThread().getContextClassLoader();
+        return Stream.of(classes.split(" *, *"))
+                .map(n -> {
+                    try {
+                        return loader.loadClass(n.trim());
+                    } catch (final ClassNotFoundException ex) {
+                        throw new IllegalArgumentException(ex);
+                    }
+                }).collect(toSet());
+    }
 }
diff --git a/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java
index 20d547a..43fbe70 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java
@@ -20,6 +20,7 @@ package org.apache.johnzon.jaxrs.jsonb.jaxrs;
 
 import static java.util.Optional.ofNullable;
 import static java.util.stream.Collectors.toMap;
+import static java.util.stream.Collectors.toSet;
 
 import javax.json.JsonStructure;
 import javax.json.bind.Jsonb;
@@ -47,14 +48,18 @@ import java.lang.reflect.Type;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Properties;
+import java.util.Set;
 import java.util.function.Function;
 import java.util.logging.Logger;
+import java.util.stream.Stream;
 
 import javax.annotation.Priority;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.ext.ContextResolver;
 import javax.ws.rs.ext.Providers;
 
+import org.apache.johnzon.jsonb.api.experimental.PolymorphicConfig;
+
 // here while we dont compile in java 8 jaxrs module, when migrated we'll merge it with IgnorableTypes hierarchy at least
 @Provider
 @Produces(MediaType.APPLICATION_JSON)
@@ -165,6 +170,74 @@ public class JsonbJaxrsProvider<T> implements MessageBodyWriter<T>, MessageBodyR
         customized = true;
     }
 
+
+    public void setPolymorphicSerializationPredicate(final String classes) {
+        final Set<Class<?>> set = asSet(classes);
+        getOrCreatePolymorphicConfig().withSerializationPredicate(set::contains);
+        customized = true;
+    }
+
+    public void setPolymorphicDeserializationPredicate(final String classes) {
+        final Set<Class<?>> set = asSet(classes);
+        getOrCreatePolymorphicConfig().withDeserializationPredicate(set::contains);
+        customized = true;
+    }
+
+    public void setPolymorphicDiscriminatorMapper(final Map<String, String> discriminatorMapper) {
+        final ClassLoader loader = Thread.currentThread().getContextClassLoader();
+        final Map<Class<?>, String> map = discriminatorMapper.entrySet().stream()
+                .collect(toMap(e -> {
+                    try {
+                        return loader.loadClass(e.getKey().trim());
+                    } catch (final ClassNotFoundException ex) {
+                        throw new IllegalArgumentException(ex);
+                    }
+                }, Map.Entry::getValue));
+        getOrCreatePolymorphicConfig().withDiscriminatorMapper(map::get);
+        customized = true;
+    }
+
+    public void setPolymorphicTypeLoader(final Map<String, String> aliasTypeMapping) {
+        final ClassLoader loader = Thread.currentThread().getContextClassLoader();
+        final Map<String, Class<?>> map = aliasTypeMapping.entrySet().stream()
+                .collect(toMap(Map.Entry::getKey, e -> {
+                    try {
+                        return loader.loadClass(e.getValue().trim());
+                    } catch (final ClassNotFoundException ex) {
+                        throw new IllegalArgumentException(ex);
+                    }
+                }));
+        getOrCreatePolymorphicConfig().withTypeLoader(map::get);
+        customized = true;
+    }
+
+    public void setPolymorphicDiscriminator(final String value) {
+        getOrCreatePolymorphicConfig().withDiscriminator(value);
+        customized = true;
+    }
+
+    private PolymorphicConfig getOrCreatePolymorphicConfig() {
+        return config.getProperty(PolymorphicConfig.class.getName())
+                .map(PolymorphicConfig.class::cast)
+                .orElseGet(() -> {
+                    final PolymorphicConfig config = new PolymorphicConfig();
+                    this.config.setProperty(PolymorphicConfig.class.getName(), config);
+                    return config;
+                });
+    }
+
+    private Set<Class<?>> asSet(final String classes) {
+        final ClassLoader loader = Thread.currentThread().getContextClassLoader();
+        return Stream.of(classes.split(" *, *"))
+                .map(n -> {
+                    try {
+                        return loader.loadClass(n.trim());
+                    } catch (final ClassNotFoundException ex) {
+                        throw new IllegalArgumentException(ex);
+                    }
+                }).collect(toSet());
+    }
+
     // actual impl
 
     @Override