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