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 <rmannibu...@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