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 2018/03/27 13:48:02 UTC

[01/12] johnzon git commit: JAX-RS MessageWriter/MessagerReader with Priority (so that user can define and provide his own) JsonbConfig injectable via Jax-RS API Better support for generics types Support for JsonbDeserializers/JsonbSerializers defined in

Repository: johnzon
Updated Branches:
  refs/heads/master fb5d8b7a9 -> eb93b91a5


JAX-RS MessageWriter/MessagerReader with Priority (so that user can define and provide his own)
JsonbConfig injectable via Jax-RS API
Better support for generics types
Support for JsonbDeserializers/JsonbSerializers defined in interfaces or abstract classes
Support for default deserialization from string to enum
Fix to dateformatting (date format was not properly used in deserialization)

Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/028a1644
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/028a1644
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/028a1644

Branch: refs/heads/master
Commit: 028a1644aac2e565fbed007ba85e8f0bede9061f
Parents: fb5d8b7
Author: amoscatelli <dragonide001>
Authored: Mon Mar 26 16:02:31 2018 +0200
Committer: amoscatelli <dragonide001>
Committed: Mon Mar 26 16:02:31 2018 +0200

----------------------------------------------------------------------
 johnzon-jsonb/pom.xml                           |  15 ++
 .../jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java   |  99 ++++-------
 .../apache/johnzon/jsonb/JohnzonBuilder.java    | 167 +++++++++----------
 .../johnzon/mapper/MappingParserImpl.java       |  90 ++++++----
 4 files changed, 181 insertions(+), 190 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/028a1644/johnzon-jsonb/pom.xml
----------------------------------------------------------------------
diff --git a/johnzon-jsonb/pom.xml b/johnzon-jsonb/pom.xml
index d63250e..30585b0 100644
--- a/johnzon-jsonb/pom.xml
+++ b/johnzon-jsonb/pom.xml
@@ -35,6 +35,14 @@
   </properties>
 
   <dependencies>
+      
+    <!-- FOR PRIORITY ANNOTATION NOT FOUND IN GERONIMO (??) -->
+    <dependency>
+        <groupId>javax.annotation</groupId>
+        <artifactId>javax.annotation-api</artifactId>
+        <version>1.3.2</version>
+    </dependency>
+      
     <dependency>
       <groupId>org.apache.geronimo.specs</groupId>
       <artifactId>geronimo-jaxrs_2.0_spec</artifactId>
@@ -62,6 +70,13 @@
       <version>${project.version}</version>
     </dependency>
 
+    <!-- FOR GENERICS DISCOVERY -->
+    <dependency>
+        <groupId>com.googlecode.gentyref</groupId>
+        <artifactId>gentyref</artifactId>
+        <version>1.2.0</version>
+    </dependency>
+
     <dependency>
       <groupId>org.apache.cxf</groupId>
       <artifactId>cxf-rt-rs-client</artifactId>

http://git-wip-us.apache.org/repos/asf/johnzon/blob/028a1644/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java
----------------------------------------------------------------------
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 49cd334..f5b2de8 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
@@ -21,7 +21,6 @@ package org.apache.johnzon.jaxrs.jsonb.jaxrs;
 import javax.json.JsonStructure;
 import javax.json.bind.Jsonb;
 import javax.json.bind.JsonbBuilder;
-import javax.json.bind.JsonbConfig;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
@@ -36,22 +35,29 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.Reader;
-import java.io.StringReader;
 import java.io.Writer;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 import java.util.Collection;
-import java.util.Properties;
 import java.util.concurrent.atomic.AtomicReference;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.ext.ContextResolver;
+import javax.ws.rs.ext.Providers;
+import javax.annotation.Priority;
+import javax.ws.rs.Priorities;
 
 // here while we dont compile in java 8 jaxrs module, when migrated we'll merge it with IgnorableTypes hierarchy at least
 @Provider
-@Produces("application/json")
-@Consumes("application/json")
+@Priority(value = Priorities.USER-100)
+@Produces(MediaType.APPLICATION_JSON)
+@Consumes(MediaType.APPLICATION_JSON)
 public class JsonbJaxrsProvider<T> implements MessageBodyWriter<T>, MessageBodyReader<T> {
+
     protected final Collection<String> ignores;
     protected final AtomicReference<Jsonb> delegate = new AtomicReference<>();
-    protected final JsonbConfig config = new JsonbConfig();
+
+    @Context
+    private Providers providers;
 
     public JsonbJaxrsProvider() {
         this(null);
@@ -61,60 +67,11 @@ public class JsonbJaxrsProvider<T> implements MessageBodyWriter<T>, MessageBodyR
         this.ignores = ignores;
     }
 
-    protected Jsonb createJsonb() {
-        return JsonbBuilder.create(config);
-    }
-
     private boolean isIgnored(final Class<?> type) {
         return ignores != null && ignores.contains(type.getName());
     }
 
-    // config - main containers support the configuration of providers this way
-    public void setFailOnUnknownProperties(final boolean active) {
-        config.setProperty("johnzon.fail-on-unknown-properties", active);
-    }
-
-    public void setOtherProperties(final String others) {
-        final Properties properties = new Properties() {{
-            try {
-                load(new StringReader(others));
-            } catch (final IOException e) {
-                throw new IllegalArgumentException(e);
-            }
-        }};
-        properties.stringPropertyNames().forEach(k -> config.setProperty(k, properties.getProperty(k)));
-    }
-
-    public void setIJson(final boolean active) {
-        config.withStrictIJSON(active);
-    }
-
-    public void setEncoding(final String encoding) {
-        config.withEncoding(encoding);
-    }
-
-    public void setBinaryDataStrategy(final String binaryDataStrategy) {
-        config.withBinaryDataStrategy(binaryDataStrategy);
-    }
-
-    public void setPropertyNamingStrategy(final String propertyNamingStrategy) {
-        config.withPropertyNamingStrategy(propertyNamingStrategy);
-    }
-
-    public void setPropertyOrderStrategy(final String propertyOrderStrategy) {
-        config.withPropertyOrderStrategy(propertyOrderStrategy);
-    }
-
-    public void setNullValues(final boolean nulls) {
-        config.withNullValues(nulls);
-    }
-
-    public void setPretty(final boolean pretty) {
-        config.withFormatting(pretty);
-    }
-
     // actual impl
-
     @Override
     public boolean isReadable(final Class<?> type, final Type genericType, final Annotation[] annotations, final MediaType mediaType) {
         return !isIgnored(type)
@@ -144,26 +101,30 @@ public class JsonbJaxrsProvider<T> implements MessageBodyWriter<T>, MessageBodyR
 
     @Override
     public T readFrom(final Class<T> type, final Type genericType, final Annotation[] annotations, final MediaType mediaType,
-                      final MultivaluedMap<String, String> httpHeaders, final InputStream entityStream) throws IOException, WebApplicationException {
-        return delegate().fromJson(entityStream, genericType);
+            final MultivaluedMap<String, String> httpHeaders, final InputStream entityStream) throws IOException, WebApplicationException {
+        return delegate(type).fromJson(entityStream, genericType);
     }
 
     @Override
     public void writeTo(final T t, final Class<?> type, final Type genericType, final Annotation[] annotations, final MediaType mediaType,
-                        final MultivaluedMap<String, Object> httpHeaders, final OutputStream entityStream) throws IOException, WebApplicationException {
-        delegate().toJson(t, entityStream);
+            final MultivaluedMap<String, Object> httpHeaders, final OutputStream entityStream) throws IOException, WebApplicationException {
+        delegate(type).toJson(t, entityStream);
     }
 
-    private Jsonb delegate() {
-        Jsonb jsonb = delegate.get();
-        if (jsonb == null) {
-            final Jsonb newJsonb = createJsonb();
-            if (delegate.compareAndSet(null, newJsonb)) {
-                jsonb = newJsonb;
-            } else {
-                jsonb = delegate.get();
-            }
+    protected Jsonb getJsonb(Class<?> type) {
+        ContextResolver<Jsonb> contextResolver = providers.getContextResolver(Jsonb.class, MediaType.APPLICATION_JSON_TYPE);
+        if (contextResolver != null) {
+            return contextResolver.getContext(type);
+        } else {
+            return JsonbBuilder.create();
         }
-        return jsonb;
     }
+    
+    private Jsonb delegate(Class<?> type) {
+        if (delegate.get() == null) {
+            delegate.compareAndSet(null, getJsonb(type));
+        }
+        return delegate.get();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/028a1644/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
----------------------------------------------------------------------
diff --git a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
index 1ae554a..eb834b2 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
@@ -18,6 +18,7 @@
  */
 package org.apache.johnzon.jsonb;
 
+import com.googlecode.gentyref.GenericTypeReflector;
 import org.apache.johnzon.core.AbstractJsonFactory;
 import org.apache.johnzon.core.JsonGeneratorFactoryImpl;
 import org.apache.johnzon.core.JsonParserFactoryImpl;
@@ -96,6 +97,7 @@ import static javax.json.bind.config.PropertyNamingStrategy.IDENTITY;
 import static javax.json.bind.config.PropertyOrderStrategy.LEXICOGRAPHICAL;
 
 public class JohnzonBuilder implements JsonbBuilder {
+
     private static final Object NO_BM = new Object();
 
     private final MapperBuilder builder = new MapperBuilder();
@@ -141,52 +143,52 @@ public class JohnzonBuilder implements JsonbBuilder {
         final String orderValue = config.getProperty(JsonbConfig.PROPERTY_ORDER_STRATEGY).map(String::valueOf).orElse(LEXICOGRAPHICAL);
         final PropertyVisibilityStrategy visibilityStrategy = config.getProperty(JsonbConfig.PROPERTY_VISIBILITY_STRATEGY)
                 .map(PropertyVisibilityStrategy.class::cast).orElse(new PropertyVisibilityStrategy() {
-                    private final ConcurrentMap<Class<?>, PropertyVisibilityStrategy> strategies = new ConcurrentHashMap<>();
+            private final ConcurrentMap<Class<?>, PropertyVisibilityStrategy> strategies = new ConcurrentHashMap<>();
 
-                    @Override
-                    public boolean isVisible(final Field field) {
-                        if (field.getAnnotation(JsonbProperty.class) != null) {
-                            return true;
-                        }
-                        final PropertyVisibilityStrategy strategy = strategies.computeIfAbsent(field.getDeclaringClass(), this::visibilityStrategy);
-                        return strategy == this ? Modifier.isPublic(field.getModifiers()) : strategy.isVisible(field);
-                    }
+            @Override
+            public boolean isVisible(final Field field) {
+                if (field.getAnnotation(JsonbProperty.class) != null) {
+                    return true;
+                }
+                final PropertyVisibilityStrategy strategy = strategies.computeIfAbsent(field.getDeclaringClass(), this::visibilityStrategy);
+                return strategy == this ? Modifier.isPublic(field.getModifiers()) : strategy.isVisible(field);
+            }
 
-                    @Override
-                    public boolean isVisible(final Method method) {
-                        final PropertyVisibilityStrategy strategy = strategies.computeIfAbsent(method.getDeclaringClass(), this::visibilityStrategy);
-                        return strategy == this ? Modifier.isPublic(method.getModifiers()) : strategy.isVisible(method);
-                    }
+            @Override
+            public boolean isVisible(final Method method) {
+                final PropertyVisibilityStrategy strategy = strategies.computeIfAbsent(method.getDeclaringClass(), this::visibilityStrategy);
+                return strategy == this ? Modifier.isPublic(method.getModifiers()) : strategy.isVisible(method);
+            }
 
-                    private PropertyVisibilityStrategy visibilityStrategy(final Class<?> type) { // can be cached
-                        JsonbVisibility visibility = type.getAnnotation(JsonbVisibility.class);
-                        if (visibility != null) {
-                            try {
-                                return visibility.value().newInstance();
-                            } catch (final InstantiationException | IllegalAccessException e) {
-                                throw new IllegalArgumentException(e);
-                            }
-                        }
-                        Package p = type.getPackage();
-                        while (p != null) {
-                            visibility = p.getAnnotation(JsonbVisibility.class);
-                            if (visibility != null) {
-                                try {
-                                    return visibility.value().newInstance();
-                                } catch (final InstantiationException | IllegalAccessException e) {
-                                    throw new IllegalArgumentException(e);
-                                }
-                            }
-                            final String name = p.getName();
-                            final int end = name.lastIndexOf('.');
-                            if (end < 0) {
-                                break;
-                            }
-                            p = Package.getPackage(name.substring(0, end));
+            private PropertyVisibilityStrategy visibilityStrategy(final Class<?> type) { // can be cached
+                JsonbVisibility visibility = type.getAnnotation(JsonbVisibility.class);
+                if (visibility != null) {
+                    try {
+                        return visibility.value().newInstance();
+                    } catch (final InstantiationException | IllegalAccessException e) {
+                        throw new IllegalArgumentException(e);
+                    }
+                }
+                Package p = type.getPackage();
+                while (p != null) {
+                    visibility = p.getAnnotation(JsonbVisibility.class);
+                    if (visibility != null) {
+                        try {
+                            return visibility.value().newInstance();
+                        } catch (final InstantiationException | IllegalAccessException e) {
+                            throw new IllegalArgumentException(e);
                         }
-                        return this;
                     }
-                });
+                    final String name = p.getName();
+                    final int end = name.lastIndexOf('.');
+                    if (end < 0) {
+                        break;
+                    }
+                    p = Package.getPackage(name.substring(0, end));
+                }
+                return this;
+            }
+        });
 
         config.getProperty("johnzon.attributeOrder").ifPresent(comp -> builder.setAttributeOrder(Comparator.class.cast(comp)));
         config.getProperty("johnzon.enforceQuoteString")
@@ -227,16 +229,15 @@ public class JohnzonBuilder implements JsonbBuilder {
         final AccessMode accessMode = config.getProperty("johnzon.accessMode")
                 .map(this::toAccessMode)
                 .orElseGet(() -> new JsonbAccessMode(
-                        propertyNamingStrategy, orderValue, visibilityStrategy,
-                        !namingStrategyValue.orElse("").equals(PropertyNamingStrategy.CASE_INSENSITIVE),
-                        defaultConverters,
-                        factory, parserFactoryProvider,
-                        config.getProperty("johnzon.accessModeDelegate")
-                                .map(this::toAccessMode)
-                                .orElseGet(() -> new FieldAndMethodAccessMode(true, true, false))));
+                propertyNamingStrategy, orderValue, visibilityStrategy,
+                !namingStrategyValue.orElse("").equals(PropertyNamingStrategy.CASE_INSENSITIVE),
+                defaultConverters,
+                factory, parserFactoryProvider,
+                config.getProperty("johnzon.accessModeDelegate")
+                        .map(this::toAccessMode)
+                        .orElseGet(() -> new FieldAndMethodAccessMode(true, true, false))));
         builder.setAccessMode(accessMode);
 
-
         // user adapters
         config.getProperty(JsonbConfig.ADAPTERS).ifPresent(adapters -> Stream.of(JsonbAdapter[].class.cast(adapters)).forEach(adapter -> {
             final ParameterizedType pt = ParameterizedType.class.cast(
@@ -306,35 +307,34 @@ public class JohnzonBuilder implements JsonbBuilder {
 
         config.getProperty(JsonbConfig.SERIALIZERS).map(JsonbSerializer[].class::cast).ifPresent(serializers -> {
             Stream.of(serializers).forEach(s -> {
-                final ParameterizedType pt = findPT(s, JsonbSerializer.class);
-                if (pt == null) {
-                    throw new IllegalArgumentException(s + " doesn't implement JsonbSerializer");
-                }
-                final Type[] args = pt.getActualTypeArguments();
-                // TODO: support PT in ObjectConverter (list)
-                if (args.length != 1 || !Class.class.isInstance(args[0])) {
-                    throw new IllegalArgumentException("We only support serializer on Class for now");
+                Type typeParameter = GenericTypeReflector.getTypeParameter(s.getClass(), JsonbDeserializer.class.getTypeParameters()[0]);
+                if (typeParameter instanceof Class) {
+                    builder.addObjectConverter(
+                            Class.class.cast(typeParameter),
+                            (ObjectConverter.Writer) (instance, jsonbGenerator)
+                            -> s.serialize(instance, jsonbGenerator.getJsonGenerator(), new JohnzonSerializationContext(jsonbGenerator)));
+                } else if (typeParameter instanceof ParameterizedType) {
+                    builder.addObjectConverter(
+                            Class.class.cast(ParameterizedType.class.cast(typeParameter).getRawType()),
+                            (ObjectConverter.Writer) (instance, jsonbGenerator)
+                            -> s.serialize(instance, jsonbGenerator.getJsonGenerator(), new JohnzonSerializationContext(jsonbGenerator)));
                 }
-                builder.addObjectConverter(
-                        Class.class.cast(args[0]), (ObjectConverter.Writer)
-                                (instance, jsonbGenerator) -> s.serialize(instance, jsonbGenerator.getJsonGenerator(), new JohnzonSerializationContext(jsonbGenerator)));
+
             });
         });
         config.getProperty(JsonbConfig.DESERIALIZERS).map(JsonbDeserializer[].class::cast).ifPresent(deserializers -> {
             Stream.of(deserializers).forEach(d -> {
-                final ParameterizedType pt = findPT(d, JsonbDeserializer.class);
-                if (pt == null) {
-                    throw new IllegalArgumentException(d + " doesn't implement JsonbDeserializer");
-                }
-                final Type[] args = pt.getActualTypeArguments();
-                if (args.length != 1 || !Class.class.isInstance(args[0])) {
-                    throw new IllegalArgumentException("We only support deserializer on Class for now");
-                }
+                Type typeParameter = GenericTypeReflector.getTypeParameter(d.getClass(), JsonbDeserializer.class.getTypeParameters()[0]);
                 // TODO: support PT in ObjectConverter (list)
-                builder.addObjectConverter(
-                        Class.class.cast(args[0]), (ObjectConverter.Reader)
-                                (jsonObject, targetType, parser) -> d.deserialize(
-                                        parserFactoryProvider.get().createParser(jsonObject), new JohnzonDeserializationContext(parser), targetType));
+                if (typeParameter instanceof Class) {
+                    builder.addObjectConverter(
+                            Class.class.cast(typeParameter), (ObjectConverter.Reader) (jsonObject, targetType, parser) -> d.deserialize(
+                            parserFactoryProvider.get().createParser(jsonObject), new JohnzonDeserializationContext(parser), targetType));
+                } else if (typeParameter instanceof ParameterizedType) {
+                    builder.addObjectConverter(
+                            Class.class.cast(ParameterizedType.class.cast(typeParameter).getRawType()), (ObjectConverter.Reader) (jsonObject, targetType, parser) -> d.deserialize(
+                            parserFactoryProvider.get().createParser(jsonObject), new JohnzonDeserializationContext(parser), targetType));
+                }
             });
         });
 
@@ -398,13 +398,6 @@ public class JohnzonBuilder implements JsonbBuilder {
         };
     }
 
-    private ParameterizedType findPT(final Object s, final Class<?> type) {
-        return ParameterizedType.class.cast(
-                Stream.of(s.getClass().getGenericInterfaces())
-                        .filter(i -> ParameterizedType.class.isInstance(i) && ParameterizedType.class.cast(i).getRawType() == type)
-                        .findFirst().orElse(null));
-    }
-
     private Object getBeanManager() {
         if (beanManager == null) {
             try { // don't trigger CDI is not there
@@ -619,7 +612,6 @@ public class JohnzonBuilder implements JsonbBuilder {
         }));
         addDateFormatConfigConverters(converters, zoneIDUTC);
 
-
         converters.forEach((k, v) -> builder.addAdapter(k.getFrom(), k.getTo(), v));
         return converters;
     }
@@ -632,25 +624,16 @@ public class JohnzonBuilder implements JsonbBuilder {
 
             // Note: we try and fallback in the parsing cause we don't know if the date format provided is
             // for date, datetime, time
-
             converters.put(new AdapterKey(Date.class, String.class), new ConverterAdapter<>(new Converter<Date>() {
-                private volatile boolean useFormatter = true;
 
                 @Override
                 public String toString(final Date instance) {
-                    return LocalDateTime.ofInstant(instance.toInstant(), zoneIDUTC).toString();
+                    return formatter.format(ZonedDateTime.ofInstant(instance.toInstant(), zoneIDUTC));
                 }
 
                 @Override
                 public Date fromString(final String text) {
-                    if (useFormatter) {
-                        try {
-                            return Date.from(LocalDateTime.parse(text, formatter).toInstant(ZoneOffset.UTC));
-                        } catch (final DateTimeParseException dpe) {
-                            useFormatter = false;
-                        }
-                    }
-                    return Date.from(LocalDateTime.parse(text).toInstant(ZoneOffset.UTC));
+                    return Date.from(Instant.from(formatter.parse(text)));
                 }
             }));
             converters.put(new AdapterKey(LocalDateTime.class, String.class), new ConverterAdapter<>(new Converter<LocalDateTime>() {
@@ -721,7 +704,7 @@ public class JohnzonBuilder implements JsonbBuilder {
         if (text.length() == 3) { // don't fail but log it
             Logger.getLogger(JohnzonBuilder.class.getName()).severe("Deprecated timezone: " + text);
         }
-        */
+         */
     }
 
     private Map<String, ?> generatorConfig() {

http://git-wip-us.apache.org/repos/asf/johnzon/blob/028a1644/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
index 8e74e3c..35b303a 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
@@ -18,6 +18,7 @@
  */
 package org.apache.johnzon.mapper;
 
+import java.lang.reflect.AnnotatedType;
 import org.apache.johnzon.mapper.access.AccessMode;
 import org.apache.johnzon.mapper.converter.CharacterConverter;
 import org.apache.johnzon.mapper.converter.EnumConverter;
@@ -40,10 +41,12 @@ import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.ArrayDeque;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Base64;
 import java.util.Collection;
 import java.util.Collections;
@@ -70,9 +73,12 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
 import static java.util.Arrays.asList;
+import java.util.Date;
+import java.util.Optional;
 import static javax.json.JsonValue.ValueType.FALSE;
 import static javax.json.JsonValue.ValueType.NULL;
 import static javax.json.JsonValue.ValueType.NUMBER;
+import static javax.json.JsonValue.ValueType.STRING;
 import static javax.json.JsonValue.ValueType.TRUE;
 
 /**
@@ -93,13 +99,11 @@ public class MappingParserImpl implements MappingParser {
     private final JsonReader jsonReader;
 
     /**
-     * Used for de-referencing JsonPointers during deserialisation.
-     * key: JsonPointer
-     * value: already deserialised Object
+     * Used for de-referencing JsonPointers during deserialisation. key:
+     * JsonPointer value: already deserialised Object
      */
     private Map<String, Object> jsonPointers;
 
-
     public MappingParserImpl(MapperConfig config, Mappings mappings, JsonReader jsonReader, boolean isDeduplicateObjects) {
         this.config = config;
         this.mappings = mappings;
@@ -108,7 +112,6 @@ public class MappingParserImpl implements MappingParser {
 
         reverseAdaptersRegistry = new ConcurrentHashMap<>(config.getAdapters().size());
 
-
         this.isDeduplicateObjects = isDeduplicateObjects;
 
         if (isDeduplicateObjects) {
@@ -118,7 +121,6 @@ public class MappingParserImpl implements MappingParser {
         }
     }
 
-
     @Override
     public <T> T readObject(Type targetType) {
         try {
@@ -143,6 +145,12 @@ public class MappingParserImpl implements MappingParser {
         if (JsonString.class.isInstance(jsonValue) && (targetType == String.class || targetType == Object.class)) {
             return (T) JsonString.class.cast(jsonValue).getString();
         }
+        if (JsonString.class.isInstance(jsonValue) && targetType instanceof Class && Class.class.cast(targetType).isEnum()) {
+            return (T) Enum.valueOf(Class.class.cast(targetType), JsonString.class.cast(jsonValue).getString());
+        }
+        if (JsonString.class.isInstance(jsonValue) && targetType instanceof Class && Date.class.isAssignableFrom(Class.class.cast(targetType))) {
+            return (T) convertTo(config.findAdapter(targetType), jsonValue, null);
+        }
         if (JsonNumber.class.isInstance(jsonValue)) {
             final JsonNumber number = JsonNumber.class.cast(jsonValue);
             if (targetType == int.class || targetType == Integer.class) {
@@ -199,7 +207,6 @@ public class MappingParserImpl implements MappingParser {
         throw new IllegalArgumentException("Unsupported " + jsonValue + " for type " + targetType);
     }
 
-
     private Object buildObject(final Type inType, final JsonObject object, final boolean applyObjectConverter, JsonPointerTracker jsonPointer) {
         Type type = inType;
         if (inType == Object.class) {
@@ -264,7 +271,29 @@ public class MappingParserImpl implements MappingParser {
                         }
                         return map;
                     }
+                } else {
+                
+                    // if a specific mapping has not been declared, let's try finding and using one without generics
+                    ObjectConverter.Reader objectConverter = config.findObjectConverterReader((Class) aType.getRawType());
+                
+                    if (objectConverter != null) {
+                        return objectConverter.fromJson(object, type, new SuppressConversionMappingParser(this, object));
+                    }
+                    
+                }
+            } else if (TypeVariable.class.isInstance(type)) {
+                
+                TypeVariable vType = TypeVariable.class.cast(type);
+                
+                Optional<AnnotatedType> findFirst = Arrays.asList(vType.getAnnotatedBounds()).stream().findFirst();
+
+                if (findFirst.isPresent()) {
+                    ObjectConverter.Reader objectConverter = config.findObjectConverterReader((Class) findFirst.get().getType());
+                    if (objectConverter != null) {
+                        return objectConverter.fromJson(object, type, new SuppressConversionMappingParser(this, object));
+                    }
                 }
+
             } else if (Map.class == type || HashMap.class == type || LinkedHashMap.class == type) {
                 final LinkedHashMap<String, Object> map = new LinkedHashMap<String, Object>();
                 for (final Map.Entry<String, JsonValue> value : object.entrySet()) {
@@ -284,7 +313,7 @@ public class MappingParserImpl implements MappingParser {
         if (classMapping.adapter != null) {
             return classMapping.adapter.from(t);
         }
-        */
+         */
 
         if (classMapping.factory == null) {
             throw new MapperException(classMapping.clazz + " not instantiable");
@@ -292,9 +321,11 @@ public class MappingParserImpl implements MappingParser {
 
         if (config.isFailOnUnknown()) {
             if (!classMapping.setters.keySet().containsAll(object.keySet())) {
-                throw new MapperException("(fail on unknown properties): " + new HashSet<String>(object.keySet()) {{
-                    removeAll(classMapping.setters.keySet());
-                }});
+                throw new MapperException("(fail on unknown properties): " + new HashSet<String>(object.keySet()) {
+                    {
+                        removeAll(classMapping.setters.keySet());
+                    }
+                });
             }
         }
 
@@ -426,6 +457,9 @@ public class MappingParserImpl implements MappingParser {
                 }
             }
         }
+        if (STRING.equals(valueType)) {
+            return converter.to(JsonString.class.cast(jsonValue).getString());
+        }
         return converter.to(jsonValue.toString());
 
     }
@@ -459,10 +493,9 @@ public class MappingParserImpl implements MappingParser {
         return adapterKey;
     }
 
-
     private Object toObject(final Object baseInstance, final JsonValue jsonValue,
-                            final Type type, final Adapter itemConverter, final JsonPointerTracker jsonPointer,
-                            final Type rootType) {
+            final Type type, final Adapter itemConverter, final JsonPointerTracker jsonPointer,
+            final Type rootType) {
         if (jsonValue == null || JsonValue.NULL.equals(jsonValue)) {
             return null;
         }
@@ -506,8 +539,7 @@ public class MappingParserImpl implements MappingParser {
             }
             final boolean typedAdapter = TypeAwareAdapter.class.isInstance(itemConverter);
             final Object object = buildObject(
-                    baseInstance != null ? baseInstance.getClass() : (
-                            typedAdapter ? TypeAwareAdapter.class.cast(itemConverter).getTo() : type),
+                    baseInstance != null ? baseInstance.getClass() : (typedAdapter ? TypeAwareAdapter.class.cast(itemConverter).getTo() : type),
                     JsonObject.class.cast(jsonValue), type instanceof Class,
                     jsonPointer);
             return typedAdapter ? itemConverter.to(object) : object;
@@ -578,8 +610,8 @@ public class MappingParserImpl implements MappingParser {
     }
 
     private Object buildArray(final Type type, final JsonArray jsonArray, final Adapter itemConverter,
-                              final ObjectConverter.Reader objectConverter,
-                              final JsonPointerTracker jsonPointer, final Type rootType) {
+            final ObjectConverter.Reader objectConverter,
+            final JsonPointerTracker jsonPointer, final Type rootType) {
         if (Class.class.isInstance(type)) {
             final Class clazz = Class.class.cast(type);
             if (clazz.isArray()) {
@@ -603,7 +635,7 @@ public class MappingParserImpl implements MappingParser {
     }
 
     private Object buildArrayWithComponentType(final JsonArray jsonArray, final Class<?> componentType, final Adapter itemConverter,
-                                               final JsonPointerTracker jsonPointer, final Type rootType) {
+            final JsonPointerTracker jsonPointer, final Type rootType) {
         final Object array = Array.newInstance(componentType, jsonArray.size());
         int i = 0;
         for (final JsonValue value : jsonArray) {
@@ -615,8 +647,8 @@ public class MappingParserImpl implements MappingParser {
     }
 
     private <T> Collection<T> mapCollection(final Mappings.CollectionMapping mapping, final JsonArray jsonArray,
-                                            final Adapter itemConverter, ObjectConverter.Reader objectConverter,
-                                            final JsonPointerTracker jsonPointer, final Type rootType) {
+            final Adapter itemConverter, ObjectConverter.Reader objectConverter,
+            final JsonPointerTracker jsonPointer, final Type rootType) {
         final Collection collection;
 
         if (SortedSet.class == mapping.raw || NavigableSet.class == mapping.raw || TreeSet.class == mapping.raw) {
@@ -642,7 +674,7 @@ public class MappingParserImpl implements MappingParser {
             collection.add(JsonValue.NULL.equals(value)
                     ? null
                     : toValue(null, value, null, itemConverter, mapping.arg, objectConverter,
-                    isDeduplicateObjects ? new JsonPointerTracker(jsonPointer, i) : null, rootType));
+                            isDeduplicateObjects ? new JsonPointerTracker(jsonPointer, i) : null, rootType));
             i++;
         }
 
@@ -660,7 +692,6 @@ public class MappingParserImpl implements MappingParser {
         return collection;
     }
 
-
     private Object[] createParameters(final Mappings.ClassMapping mapping, final JsonObject object, JsonPointerTracker jsonPointer) {
         final int length = mapping.factory.getParameterTypes().length;
         final Object[] objects = new Object[length];
@@ -682,8 +713,8 @@ public class MappingParserImpl implements MappingParser {
     }
 
     private Object toValue(final Object baseInstance, final JsonValue jsonValue, final Adapter converter,
-                           final Adapter itemConverter, final Type type, final ObjectConverter.Reader objectConverter,
-                           final JsonPointerTracker jsonPointer, final Type rootType) {
+            final Adapter itemConverter, final Type type, final ObjectConverter.Reader objectConverter,
+            final JsonPointerTracker jsonPointer, final Type rootType) {
 
         if (objectConverter != null) {
 
@@ -701,7 +732,6 @@ public class MappingParserImpl implements MappingParser {
                 : convertTo(converter, jsonValue, jsonPointer);
     }
 
-
     /**
      * @deprecated see MapperConfig
      */
@@ -743,8 +773,8 @@ public class MappingParserImpl implements MappingParser {
             }
         }
         if (converter == null) {
-            throw new MapperException("Missing a Converter for type " + aClass + " to convert the JSON String '" +
-                    text + "' . Please register a custom converter for it.");
+            throw new MapperException("Missing a Converter for type " + aClass + " to convert the JSON String '"
+                    + text + "' . Please register a custom converter for it.");
         }
         return converter.to(text);
     }
@@ -770,9 +800,11 @@ public class MappingParserImpl implements MappingParser {
 
     /**
      * Internal class to suppress {@link ObjectConverter} lookup if and only if
-     * the {@link JsonValue} is the same refernece than the lookup was done before.
+     * the {@link JsonValue} is the same refernece than the lookup was done
+     * before.
      */
     private static class SuppressConversionMappingParser implements MappingParser {
+
         private final MappingParserImpl delegate;
         private final JsonObject suppressConversionFor;
 


[03/12] johnzon git commit: JsonbConfig injectable by JAX-RS Provider

Posted by rm...@apache.org.
JsonbConfig injectable by JAX-RS Provider

Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/46314068
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/46314068
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/46314068

Branch: refs/heads/master
Commit: 463140687c354b73846bacebaf9c3cf653357838
Parents: f6f85ed
Author: amoscatelli <al...@live.com>
Authored: Tue Mar 27 11:55:58 2018 +0200
Committer: amoscatelli <al...@live.com>
Committed: Tue Mar 27 11:55:58 2018 +0200

----------------------------------------------------------------------
 johnzon-jsonb/pom.xml                           | 188 ++++++++++---------
 .../jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java   |  43 +++--
 .../johnzon/jsonb/jaxrs/JsonbJaxRsTest.java     |  35 +++-
 3 files changed, 155 insertions(+), 111 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/46314068/johnzon-jsonb/pom.xml
----------------------------------------------------------------------
diff --git a/johnzon-jsonb/pom.xml b/johnzon-jsonb/pom.xml
index d63250e..0ba524d 100644
--- a/johnzon-jsonb/pom.xml
+++ b/johnzon-jsonb/pom.xml
@@ -18,100 +18,108 @@
     under the License.
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <parent>
-    <artifactId>johnzon</artifactId>
-    <groupId>org.apache.johnzon</groupId>
-    <version>1.1.8-SNAPSHOT</version>
-  </parent>
-  <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>johnzon</artifactId>
+        <groupId>org.apache.johnzon</groupId>
+        <version>1.1.8-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
 
-  <artifactId>johnzon-jsonb</artifactId>
-  <name>Johnzon :: JSON-B Implementation</name>
-  <packaging>bundle</packaging>
+    <artifactId>johnzon-jsonb</artifactId>
+    <name>Johnzon :: JSON-B Implementation</name>
+    <packaging>bundle</packaging>
 
-  <properties>
-    <java-compile.version>1.8</java-compile.version>
-    <staging.directory>${project.parent.reporting.outputDirectory}</staging.directory>
-  </properties>
+    <properties>
+        <java-compile.version>1.8</java-compile.version>
+        <staging.directory>${project.parent.reporting.outputDirectory}</staging.directory>
+    </properties>
 
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.geronimo.specs</groupId>
-      <artifactId>geronimo-jaxrs_2.0_spec</artifactId>
-      <version>1.0-alpha-1</version>
-      <scope>provided</scope>
-      <optional>true</optional>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.geronimo.specs</groupId>
-      <artifactId>geronimo-jcdi_1.1_spec</artifactId>
-      <version>1.0</version>
-      <scope>provided</scope>
-      <optional>true</optional>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.geronimo.specs</groupId>
-      <artifactId>geronimo-jsonb_1.0_spec</artifactId>
-      <version>1.0</version>
-      <scope>provided</scope>
-    </dependency>
+    <dependencies>
+      
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-annotation_1.3_spec</artifactId>
+            <version>1.0</version>
+            <scope>provided</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-jaxrs_2.0_spec</artifactId>
+            <version>1.0-alpha-1</version>
+            <scope>provided</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-jcdi_1.1_spec</artifactId>
+            <version>1.0</version>
+            <scope>provided</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-jsonb_1.0_spec</artifactId>
+            <version>1.0</version>
+            <scope>provided</scope>
+        </dependency>
 
-    <dependency>
-      <groupId>org.apache.johnzon</groupId>
-      <artifactId>johnzon-mapper</artifactId>
-      <version>${project.version}</version>
-    </dependency>
+        <dependency>
+            <groupId>org.apache.johnzon</groupId>
+            <artifactId>johnzon-mapper</artifactId>
+            <version>${project.version}</version>
+        </dependency>
 
-    <dependency>
-      <groupId>org.apache.cxf</groupId>
-      <artifactId>cxf-rt-rs-client</artifactId>
-      <version>${cxf.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.cxf</groupId>
-      <artifactId>cxf-rt-frontend-jaxrs</artifactId>
-      <version>${cxf.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.cxf</groupId>
-      <artifactId>cxf-rt-transports-local</artifactId>
-      <version>${cxf.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.geronimo.specs</groupId>
-      <artifactId>geronimo-interceptor_1.2_spec</artifactId>
-      <version>1.0</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.geronimo.specs</groupId>
-      <artifactId>geronimo-atinject_1.0_spec</artifactId>
-      <version>1.0</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.openwebbeans</groupId>
-      <artifactId>openwebbeans-impl</artifactId>
-      <version>1.6.2</version>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-rs-client</artifactId>
+            <version>${cxf.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-frontend-jaxrs</artifactId>
+            <version>${cxf.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-transports-local</artifactId>
+            <version>${cxf.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-interceptor_1.2_spec</artifactId>
+            <version>1.0</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-atinject_1.0_spec</artifactId>
+            <version>1.0</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.openwebbeans</groupId>
+            <artifactId>openwebbeans-impl</artifactId>
+            <version>1.6.2</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <configuration>
-          <instructions>
-            <Require-Capability>osgi.extender;filter:="(osgi.extender=osgi.serviceloader.registrar)"</Require-Capability>
-            <Provide-Capability>osgi.serviceloader;osgi.serviceloader=javax.json.bind.spi.JsonbProvider</Provide-Capability>
-          </instructions>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Require-Capability>osgi.extender;filter:="(osgi.extender=osgi.serviceloader.registrar)"</Require-Capability>
+                        <Provide-Capability>osgi.serviceloader;osgi.serviceloader=javax.json.bind.spi.JsonbProvider</Provide-Capability>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 </project>

http://git-wip-us.apache.org/repos/asf/johnzon/blob/46314068/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java
----------------------------------------------------------------------
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 49cd334..245d1c1 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
@@ -43,16 +43,25 @@ import java.lang.reflect.Type;
 import java.util.Collection;
 import java.util.Properties;
 import java.util.concurrent.atomic.AtomicReference;
+import javax.annotation.Priority;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.ext.ContextResolver;
+import javax.ws.rs.ext.Providers;
 
 // here while we dont compile in java 8 jaxrs module, when migrated we'll merge it with IgnorableTypes hierarchy at least
 @Provider
-@Produces("application/json")
-@Consumes("application/json")
+@Produces(MediaType.APPLICATION_JSON)
+@Consumes(MediaType.APPLICATION_JSON)
+@Priority(value = 4900)
 public class JsonbJaxrsProvider<T> implements MessageBodyWriter<T>, MessageBodyReader<T> {
+
     protected final Collection<String> ignores;
     protected final AtomicReference<Jsonb> delegate = new AtomicReference<>();
     protected final JsonbConfig config = new JsonbConfig();
 
+    @Context
+    private Providers providers;
+
     public JsonbJaxrsProvider() {
         this(null);
     }
@@ -144,26 +153,26 @@ public class JsonbJaxrsProvider<T> implements MessageBodyWriter<T>, MessageBodyR
 
     @Override
     public T readFrom(final Class<T> type, final Type genericType, final Annotation[] annotations, final MediaType mediaType,
-                      final MultivaluedMap<String, String> httpHeaders, final InputStream entityStream) throws IOException, WebApplicationException {
-        return delegate().fromJson(entityStream, genericType);
+            final MultivaluedMap<String, String> httpHeaders, final InputStream entityStream) throws IOException, WebApplicationException {
+        return getJsonb(type).fromJson(entityStream, genericType);
     }
 
     @Override
     public void writeTo(final T t, final Class<?> type, final Type genericType, final Annotation[] annotations, final MediaType mediaType,
-                        final MultivaluedMap<String, Object> httpHeaders, final OutputStream entityStream) throws IOException, WebApplicationException {
-        delegate().toJson(t, entityStream);
-    }
-
-    private Jsonb delegate() {
-        Jsonb jsonb = delegate.get();
-        if (jsonb == null) {
-            final Jsonb newJsonb = createJsonb();
-            if (delegate.compareAndSet(null, newJsonb)) {
-                jsonb = newJsonb;
-            } else {
-                jsonb = delegate.get();
+            final MultivaluedMap<String, Object> httpHeaders, final OutputStream entityStream) throws IOException, WebApplicationException {
+        getJsonb(type).toJson(t, entityStream);
+    }
+
+    protected Jsonb getJsonb(Class<?> type) {
+        ContextResolver<Jsonb> contextResolver = providers.getContextResolver(Jsonb.class, MediaType.APPLICATION_JSON_TYPE);
+        if (contextResolver != null) {
+            return contextResolver.getContext(type);
+        } else {
+            if (delegate.get() == null) {
+                delegate.compareAndSet(null, createJsonb());
             }
+            return delegate.get();
         }
-        return jsonb;
     }
+
 }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/46314068/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
----------------------------------------------------------------------
diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
index d733447..c01155c 100644
--- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
@@ -41,22 +41,40 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
+import java.util.Arrays;
 import java.util.List;
 
 import static java.util.Arrays.asList;
 import static java.util.Collections.singletonList;
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.ws.rs.ext.ContextResolver;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 public class JsonbJaxRsTest {
+
     private final static String ENDPOINT_ADDRESS = "local://johnzon";
     private static Server server;
 
+    public static class JsonBindingProvider implements ContextResolver<Jsonb> {
+
+        private final Jsonb jsonb = JsonbBuilder.create();
+        public static Boolean called = Boolean.FALSE;
+
+        @Override
+        public Jsonb getContext(Class<?> type) {
+            called = Boolean.TRUE;
+            return jsonb;
+        }
+
+    }
+    
     @BeforeClass
     public static void bindEndpoint() throws Exception {
         final JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
         sf.setResourceClasses(JohnzonResource.class);
-        sf.setProviders(singletonList(new JsonbJaxrsProvider<>()));
+        sf.setProviders(Arrays.asList(new JsonbJaxrsProvider<>(), new JsonBindingProvider()));
         sf.setResourceProvider(JohnzonResource.class, new SingletonResourceProvider(new JohnzonResource(), false));
         sf.setAddress(ENDPOINT_ADDRESS);
         server = sf.create();
@@ -75,6 +93,12 @@ public class JsonbJaxRsTest {
     }
 
     @Test
+    public void jsonbconfigProvider() {
+        client().path("johnzon").get(String.class);
+        assertEquals(JsonBindingProvider.called, Boolean.TRUE);
+    }
+    
+    @Test
     public void object() {
         final String output = client().path("johnzon").get(String.class);
         assertEquals("{\"name\":\"johnzon\"}", output);
@@ -112,7 +136,7 @@ public class JsonbJaxRsTest {
                 .get(byte[].class);
 
         Assert.assertEquals(100, content.length);
-        for (int i=0; i < 100; i++) {
+        for (int i = 0; i < 100; i++) {
             Assert.assertEquals((byte) i, content[i]);
         }
     }
@@ -155,6 +179,7 @@ public class JsonbJaxRsTest {
     }
 
     public static class Johnzon {
+
         private String name;
 
         public Johnzon(final String name) {
@@ -176,6 +201,7 @@ public class JsonbJaxRsTest {
 
     @Path("johnzon")
     public static class JohnzonResource {
+
         @GET
         public Johnzon johnzon() {
             return new Johnzon("johnzon");
@@ -184,7 +210,7 @@ public class JsonbJaxRsTest {
         @GET
         @Path("all1")
         public Johnzon[] johnzons1() {
-            return new Johnzon[] { new Johnzon("johnzon1"), new Johnzon("johnzon2") };
+            return new Johnzon[]{new Johnzon("johnzon1"), new Johnzon("johnzon2")};
         }
 
         @GET
@@ -221,11 +247,12 @@ public class JsonbJaxRsTest {
         @Path("mybinary")
         public byte[] binary() {
             byte[] content = new byte[100];
-            for (int i=0; i < 100; i++) {
+            for (int i = 0; i < 100; i++) {
                 content[i] = (byte) i;
             }
 
             return content;
         }
     }
+
 }


[07/12] johnzon git commit: Update JsonbJaxRsTest.java

Posted by rm...@apache.org.
Update JsonbJaxRsTest.java

remove formatting

Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/4fb97c40
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/4fb97c40
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/4fb97c40

Branch: refs/heads/master
Commit: 4fb97c40fe050d7c3618167f9c343289c7510134
Parents: 889de26
Author: amoscatelli <al...@live.com>
Authored: Tue Mar 27 13:03:44 2018 +0200
Committer: GitHub <no...@github.com>
Committed: Tue Mar 27 13:03:44 2018 +0200

----------------------------------------------------------------------
 .../test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java  | 3 ---
 1 file changed, 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/4fb97c40/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
----------------------------------------------------------------------
diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
index adc1198..57a921f 100644
--- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
@@ -179,7 +179,6 @@ public class JsonbJaxRsTest {
     }
 
     public static class Johnzon {
-
         private String name;
 
         public Johnzon(final String name) {
@@ -201,7 +200,6 @@ public class JsonbJaxRsTest {
 
     @Path("johnzon")
     public static class JohnzonResource {
-
         @GET
         public Johnzon johnzon() {
             return new Johnzon("johnzon");
@@ -254,5 +252,4 @@ public class JsonbJaxRsTest {
             return content;
         }
     }
-
 }


[09/12] johnzon git commit: Update JsonbJaxrsProvider.java

Posted by rm...@apache.org.
Update JsonbJaxrsProvider.java

remove formatting

Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/5f01fe2b
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/5f01fe2b
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/5f01fe2b

Branch: refs/heads/master
Commit: 5f01fe2bd753e9f2d8ce48db6c44e84679ce2cc2
Parents: d1919ae
Author: amoscatelli <al...@live.com>
Authored: Tue Mar 27 13:06:41 2018 +0200
Committer: GitHub <no...@github.com>
Committed: Tue Mar 27 13:06:41 2018 +0200

----------------------------------------------------------------------
 .../org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java    | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/5f01fe2b/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java
----------------------------------------------------------------------
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 245d1c1..6b76b6f 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
@@ -174,5 +174,4 @@ public class JsonbJaxrsProvider<T> implements MessageBodyWriter<T>, MessageBodyR
             return delegate.get();
         }
     }
-
 }


[08/12] johnzon git commit: Update JsonbJaxRsTest.java

Posted by rm...@apache.org.
Update JsonbJaxRsTest.java

remove formatting

Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/d1919aeb
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/d1919aeb
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/d1919aeb

Branch: refs/heads/master
Commit: d1919aebe02c51b9ba369f060f91a4423f26916a
Parents: 4fb97c4
Author: amoscatelli <al...@live.com>
Authored: Tue Mar 27 13:04:10 2018 +0200
Committer: GitHub <no...@github.com>
Committed: Tue Mar 27 13:04:10 2018 +0200

----------------------------------------------------------------------
 .../test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java    | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/d1919aeb/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
----------------------------------------------------------------------
diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
index 57a921f..0013f38 100644
--- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
@@ -53,7 +53,6 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 public class JsonbJaxRsTest {
-
     private final static String ENDPOINT_ADDRESS = "local://johnzon";
     private static Server server;
 


[05/12] johnzon git commit: Update JsonbJaxRsTest.java

Posted by rm...@apache.org.
Update JsonbJaxRsTest.java

fix padding

Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/c81c99f7
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/c81c99f7
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/c81c99f7

Branch: refs/heads/master
Commit: c81c99f70c16f6ef18261e641b9bb02a184c8c00
Parents: 5a51ca7
Author: amoscatelli <al...@live.com>
Authored: Tue Mar 27 13:01:13 2018 +0200
Committer: GitHub <no...@github.com>
Committed: Tue Mar 27 13:01:13 2018 +0200

----------------------------------------------------------------------
 .../test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/c81c99f7/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
----------------------------------------------------------------------
diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
index c01155c..79d263d 100644
--- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
@@ -136,7 +136,7 @@ public class JsonbJaxRsTest {
                 .get(byte[].class);
 
         Assert.assertEquals(100, content.length);
-        for (int i = 0; i < 100; i++) {
+        for (int i=0; i < 100; i++) {
             Assert.assertEquals((byte) i, content[i]);
         }
     }
@@ -247,7 +247,7 @@ public class JsonbJaxRsTest {
         @Path("mybinary")
         public byte[] binary() {
             byte[] content = new byte[100];
-            for (int i = 0; i < 100; i++) {
+            for (int i=0; i < 100; i++) {
                 content[i] = (byte) i;
             }
 


[12/12] johnzon git commit: JOHNZON-163 small customizations on Alessandro fix to ensure we don't keep recreating jsonb instances and we log when a config is ignored

Posted by rm...@apache.org.
JOHNZON-163 small customizations on Alessandro fix to ensure we don't keep recreating jsonb instances and we log when a config is ignored


Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/eb93b91a
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/eb93b91a
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/eb93b91a

Branch: refs/heads/master
Commit: eb93b91a5a0adeb494b2a36ee98a0cb7c2c6a229
Parents: 2e4a6ae
Author: Romain Manni-Bucau <rm...@gmail.com>
Authored: Tue Mar 27 15:47:52 2018 +0200
Committer: Romain Manni-Bucau <rm...@gmail.com>
Committed: Tue Mar 27 15:47:52 2018 +0200

----------------------------------------------------------------------
 .../jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java   | 89 ++++++++++++++++----
 1 file changed, 73 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/eb93b91a/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java
----------------------------------------------------------------------
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 15e1194..25cf998 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
@@ -42,8 +42,9 @@ import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 import java.util.Collection;
 import java.util.Properties;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.Supplier;
+import java.util.function.Function;
+import java.util.logging.Logger;
+
 import javax.annotation.Priority;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.ext.ContextResolver;
@@ -54,11 +55,12 @@ import javax.ws.rs.ext.Providers;
 @Produces(MediaType.APPLICATION_JSON)
 @Consumes(MediaType.APPLICATION_JSON)
 @Priority(value = 4900)
-public class JsonbJaxrsProvider<T> implements MessageBodyWriter<T>, MessageBodyReader<T> {
+public class JsonbJaxrsProvider<T> implements MessageBodyWriter<T>, MessageBodyReader<T>, AutoCloseable {
 
     protected final Collection<String> ignores;
-    protected final AtomicReference<Supplier<Jsonb>> delegate = new AtomicReference<>();
     protected final JsonbConfig config = new JsonbConfig();
+    protected volatile Function<Class<?>, Jsonb> delegate = null;
+    private boolean customized;
 
     @Context
     private Providers providers;
@@ -70,10 +72,6 @@ public class JsonbJaxrsProvider<T> implements MessageBodyWriter<T>, MessageBodyR
     protected JsonbJaxrsProvider(final Collection<String> ignores) {
         this.ignores = ignores;
     }
-    
-    protected Jsonb createJsonb() {
-        return JsonbBuilder.create(config);
-    }
 
     private boolean isIgnored(final Class<?> type) {
         return ignores != null && ignores.contains(type.getName());
@@ -82,6 +80,7 @@ public class JsonbJaxrsProvider<T> implements MessageBodyWriter<T>, MessageBodyR
     // config - main containers support the configuration of providers this way
     public void setFailOnUnknownProperties(final boolean active) {
         config.setProperty("johnzon.fail-on-unknown-properties", active);
+        customized = true;
     }
 
     public void setOtherProperties(final String others) {
@@ -93,34 +92,42 @@ public class JsonbJaxrsProvider<T> implements MessageBodyWriter<T>, MessageBodyR
             }
         }};
         properties.stringPropertyNames().forEach(k -> config.setProperty(k, properties.getProperty(k)));
+        customized = true;
     }
 
     public void setIJson(final boolean active) {
         config.withStrictIJSON(active);
+        customized = true;
     }
 
     public void setEncoding(final String encoding) {
         config.withEncoding(encoding);
+        customized = true;
     }
 
     public void setBinaryDataStrategy(final String binaryDataStrategy) {
         config.withBinaryDataStrategy(binaryDataStrategy);
+        customized = true;
     }
 
     public void setPropertyNamingStrategy(final String propertyNamingStrategy) {
         config.withPropertyNamingStrategy(propertyNamingStrategy);
+        customized = true;
     }
 
     public void setPropertyOrderStrategy(final String propertyOrderStrategy) {
         config.withPropertyOrderStrategy(propertyOrderStrategy);
+        customized = true;
     }
 
     public void setNullValues(final boolean nulls) {
         config.withNullValues(nulls);
+        customized = true;
     }
 
     public void setPretty(final boolean pretty) {
         config.withFormatting(pretty);
+        customized = true;
     }
 
     // actual impl
@@ -164,15 +171,65 @@ public class JsonbJaxrsProvider<T> implements MessageBodyWriter<T>, MessageBodyR
         getJsonb(type).toJson(t, entityStream);
     }
 
-    protected Jsonb getJsonb(Class<?> type) {
-        if (delegate.get() == null){
-            ContextResolver<Jsonb> contextResolver = providers.getContextResolver(Jsonb.class, MediaType.APPLICATION_JSON_TYPE);
-            if (contextResolver != null) {
-                delegate.compareAndSet(null, ()-> contextResolver.getContext(type));
-            } else {
-                delegate.compareAndSet(null, ()-> createJsonb());
+    protected Jsonb createJsonb() {
+        return JsonbBuilder.create(config);
+    }
+
+    protected Jsonb getJsonb(final Class<?> type) {
+        if (delegate == null){
+            synchronized (this) {
+                if (delegate == null) {
+                    final ContextResolver<Jsonb> contextResolver = providers.getContextResolver(Jsonb.class, MediaType.APPLICATION_JSON_TYPE);
+                    if (contextResolver != null) {
+                        if (customized) {
+                            Logger.getLogger(JsonbJaxrsProvider.class.getName())
+                                  .warning("Customizations done on the Jsonb instance will be ignored because a ContextResolver<Jsonb> was found");
+                        }
+                        delegate = new DynamicInstance(contextResolver); // faster than contextResolver::getContext
+                    } else {
+                        delegate = new ProvidedInstance(createJsonb()); // don't recreate it
+                    }
+                }
             }
         }
-        return delegate.get().get();
+        return delegate.apply(type);
+    }
+
+    @Override
+    public synchronized void close() throws Exception {
+        if (AutoCloseable.class.isInstance(delegate)) {
+            AutoCloseable.class.cast(delegate).close();
+        }
+    }
+
+    private static final class DynamicInstance implements Function<Class<?>, Jsonb> {
+        private final ContextResolver<Jsonb> contextResolver;
+
+        private DynamicInstance(final ContextResolver<Jsonb> resolver) {
+            this.contextResolver = resolver;
+        }
+
+        @Override
+        public Jsonb apply(final Class<?> type) {
+            return contextResolver.getContext(type);
+        }
+    }
+
+    private static final class ProvidedInstance implements Function<Class<?>, Jsonb>, AutoCloseable {
+        private final Jsonb instance;
+
+        private ProvidedInstance(final Jsonb instance) {
+            this.instance = instance;
+        }
+
+        @Override
+        public Jsonb apply(final Class<?> aClass) {
+            return instance;
+        }
+
+        @Override
+        public void close() throws Exception {
+            instance.close();
+        }
     }
 }


[02/12] johnzon git commit: Revert "JAX-RS MessageWriter/MessagerReader with Priority (so that user can define and provide his own) JsonbConfig injectable via Jax-RS API Better support for generics types Support for JsonbDeserializers/JsonbSerializers de

Posted by rm...@apache.org.
Revert "JAX-RS MessageWriter/MessagerReader with Priority (so that user can define and provide his own) JsonbConfig injectable via Jax-RS API Better support for generics types Support for JsonbDeserializers/JsonbSerializers defined in interfaces or abstract classes Support for default deserialization from string to enum Fix to dateformatting (date format was not properly used in deserialization)"

This reverts commit 028a1644aac2e565fbed007ba85e8f0bede9061f.

Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/f6f85edc
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/f6f85edc
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/f6f85edc

Branch: refs/heads/master
Commit: f6f85edc3336c113065bc2bb63f2f31118792c48
Parents: 028a164
Author: amoscatelli <dragonide001>
Authored: Tue Mar 27 10:52:21 2018 +0200
Committer: amoscatelli <dragonide001>
Committed: Tue Mar 27 10:52:21 2018 +0200

----------------------------------------------------------------------
 johnzon-jsonb/pom.xml                           |  15 --
 .../jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java   |  99 +++++++----
 .../apache/johnzon/jsonb/JohnzonBuilder.java    | 167 ++++++++++---------
 .../johnzon/mapper/MappingParserImpl.java       |  90 ++++------
 4 files changed, 190 insertions(+), 181 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/f6f85edc/johnzon-jsonb/pom.xml
----------------------------------------------------------------------
diff --git a/johnzon-jsonb/pom.xml b/johnzon-jsonb/pom.xml
index 30585b0..d63250e 100644
--- a/johnzon-jsonb/pom.xml
+++ b/johnzon-jsonb/pom.xml
@@ -35,14 +35,6 @@
   </properties>
 
   <dependencies>
-      
-    <!-- FOR PRIORITY ANNOTATION NOT FOUND IN GERONIMO (??) -->
-    <dependency>
-        <groupId>javax.annotation</groupId>
-        <artifactId>javax.annotation-api</artifactId>
-        <version>1.3.2</version>
-    </dependency>
-      
     <dependency>
       <groupId>org.apache.geronimo.specs</groupId>
       <artifactId>geronimo-jaxrs_2.0_spec</artifactId>
@@ -70,13 +62,6 @@
       <version>${project.version}</version>
     </dependency>
 
-    <!-- FOR GENERICS DISCOVERY -->
-    <dependency>
-        <groupId>com.googlecode.gentyref</groupId>
-        <artifactId>gentyref</artifactId>
-        <version>1.2.0</version>
-    </dependency>
-
     <dependency>
       <groupId>org.apache.cxf</groupId>
       <artifactId>cxf-rt-rs-client</artifactId>

http://git-wip-us.apache.org/repos/asf/johnzon/blob/f6f85edc/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java
----------------------------------------------------------------------
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 f5b2de8..49cd334 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
@@ -21,6 +21,7 @@ package org.apache.johnzon.jaxrs.jsonb.jaxrs;
 import javax.json.JsonStructure;
 import javax.json.bind.Jsonb;
 import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
@@ -35,29 +36,22 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.Reader;
+import java.io.StringReader;
 import java.io.Writer;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 import java.util.Collection;
+import java.util.Properties;
 import java.util.concurrent.atomic.AtomicReference;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.ext.ContextResolver;
-import javax.ws.rs.ext.Providers;
-import javax.annotation.Priority;
-import javax.ws.rs.Priorities;
 
 // here while we dont compile in java 8 jaxrs module, when migrated we'll merge it with IgnorableTypes hierarchy at least
 @Provider
-@Priority(value = Priorities.USER-100)
-@Produces(MediaType.APPLICATION_JSON)
-@Consumes(MediaType.APPLICATION_JSON)
+@Produces("application/json")
+@Consumes("application/json")
 public class JsonbJaxrsProvider<T> implements MessageBodyWriter<T>, MessageBodyReader<T> {
-
     protected final Collection<String> ignores;
     protected final AtomicReference<Jsonb> delegate = new AtomicReference<>();
-
-    @Context
-    private Providers providers;
+    protected final JsonbConfig config = new JsonbConfig();
 
     public JsonbJaxrsProvider() {
         this(null);
@@ -67,11 +61,60 @@ public class JsonbJaxrsProvider<T> implements MessageBodyWriter<T>, MessageBodyR
         this.ignores = ignores;
     }
 
+    protected Jsonb createJsonb() {
+        return JsonbBuilder.create(config);
+    }
+
     private boolean isIgnored(final Class<?> type) {
         return ignores != null && ignores.contains(type.getName());
     }
 
+    // config - main containers support the configuration of providers this way
+    public void setFailOnUnknownProperties(final boolean active) {
+        config.setProperty("johnzon.fail-on-unknown-properties", active);
+    }
+
+    public void setOtherProperties(final String others) {
+        final Properties properties = new Properties() {{
+            try {
+                load(new StringReader(others));
+            } catch (final IOException e) {
+                throw new IllegalArgumentException(e);
+            }
+        }};
+        properties.stringPropertyNames().forEach(k -> config.setProperty(k, properties.getProperty(k)));
+    }
+
+    public void setIJson(final boolean active) {
+        config.withStrictIJSON(active);
+    }
+
+    public void setEncoding(final String encoding) {
+        config.withEncoding(encoding);
+    }
+
+    public void setBinaryDataStrategy(final String binaryDataStrategy) {
+        config.withBinaryDataStrategy(binaryDataStrategy);
+    }
+
+    public void setPropertyNamingStrategy(final String propertyNamingStrategy) {
+        config.withPropertyNamingStrategy(propertyNamingStrategy);
+    }
+
+    public void setPropertyOrderStrategy(final String propertyOrderStrategy) {
+        config.withPropertyOrderStrategy(propertyOrderStrategy);
+    }
+
+    public void setNullValues(final boolean nulls) {
+        config.withNullValues(nulls);
+    }
+
+    public void setPretty(final boolean pretty) {
+        config.withFormatting(pretty);
+    }
+
     // actual impl
+
     @Override
     public boolean isReadable(final Class<?> type, final Type genericType, final Annotation[] annotations, final MediaType mediaType) {
         return !isIgnored(type)
@@ -101,30 +144,26 @@ public class JsonbJaxrsProvider<T> implements MessageBodyWriter<T>, MessageBodyR
 
     @Override
     public T readFrom(final Class<T> type, final Type genericType, final Annotation[] annotations, final MediaType mediaType,
-            final MultivaluedMap<String, String> httpHeaders, final InputStream entityStream) throws IOException, WebApplicationException {
-        return delegate(type).fromJson(entityStream, genericType);
+                      final MultivaluedMap<String, String> httpHeaders, final InputStream entityStream) throws IOException, WebApplicationException {
+        return delegate().fromJson(entityStream, genericType);
     }
 
     @Override
     public void writeTo(final T t, final Class<?> type, final Type genericType, final Annotation[] annotations, final MediaType mediaType,
-            final MultivaluedMap<String, Object> httpHeaders, final OutputStream entityStream) throws IOException, WebApplicationException {
-        delegate(type).toJson(t, entityStream);
+                        final MultivaluedMap<String, Object> httpHeaders, final OutputStream entityStream) throws IOException, WebApplicationException {
+        delegate().toJson(t, entityStream);
     }
 
-    protected Jsonb getJsonb(Class<?> type) {
-        ContextResolver<Jsonb> contextResolver = providers.getContextResolver(Jsonb.class, MediaType.APPLICATION_JSON_TYPE);
-        if (contextResolver != null) {
-            return contextResolver.getContext(type);
-        } else {
-            return JsonbBuilder.create();
+    private Jsonb delegate() {
+        Jsonb jsonb = delegate.get();
+        if (jsonb == null) {
+            final Jsonb newJsonb = createJsonb();
+            if (delegate.compareAndSet(null, newJsonb)) {
+                jsonb = newJsonb;
+            } else {
+                jsonb = delegate.get();
+            }
         }
+        return jsonb;
     }
-    
-    private Jsonb delegate(Class<?> type) {
-        if (delegate.get() == null) {
-            delegate.compareAndSet(null, getJsonb(type));
-        }
-        return delegate.get();
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/johnzon/blob/f6f85edc/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
----------------------------------------------------------------------
diff --git a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
index eb834b2..1ae554a 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
@@ -18,7 +18,6 @@
  */
 package org.apache.johnzon.jsonb;
 
-import com.googlecode.gentyref.GenericTypeReflector;
 import org.apache.johnzon.core.AbstractJsonFactory;
 import org.apache.johnzon.core.JsonGeneratorFactoryImpl;
 import org.apache.johnzon.core.JsonParserFactoryImpl;
@@ -97,7 +96,6 @@ import static javax.json.bind.config.PropertyNamingStrategy.IDENTITY;
 import static javax.json.bind.config.PropertyOrderStrategy.LEXICOGRAPHICAL;
 
 public class JohnzonBuilder implements JsonbBuilder {
-
     private static final Object NO_BM = new Object();
 
     private final MapperBuilder builder = new MapperBuilder();
@@ -143,52 +141,52 @@ public class JohnzonBuilder implements JsonbBuilder {
         final String orderValue = config.getProperty(JsonbConfig.PROPERTY_ORDER_STRATEGY).map(String::valueOf).orElse(LEXICOGRAPHICAL);
         final PropertyVisibilityStrategy visibilityStrategy = config.getProperty(JsonbConfig.PROPERTY_VISIBILITY_STRATEGY)
                 .map(PropertyVisibilityStrategy.class::cast).orElse(new PropertyVisibilityStrategy() {
-            private final ConcurrentMap<Class<?>, PropertyVisibilityStrategy> strategies = new ConcurrentHashMap<>();
-
-            @Override
-            public boolean isVisible(final Field field) {
-                if (field.getAnnotation(JsonbProperty.class) != null) {
-                    return true;
-                }
-                final PropertyVisibilityStrategy strategy = strategies.computeIfAbsent(field.getDeclaringClass(), this::visibilityStrategy);
-                return strategy == this ? Modifier.isPublic(field.getModifiers()) : strategy.isVisible(field);
-            }
+                    private final ConcurrentMap<Class<?>, PropertyVisibilityStrategy> strategies = new ConcurrentHashMap<>();
 
-            @Override
-            public boolean isVisible(final Method method) {
-                final PropertyVisibilityStrategy strategy = strategies.computeIfAbsent(method.getDeclaringClass(), this::visibilityStrategy);
-                return strategy == this ? Modifier.isPublic(method.getModifiers()) : strategy.isVisible(method);
-            }
+                    @Override
+                    public boolean isVisible(final Field field) {
+                        if (field.getAnnotation(JsonbProperty.class) != null) {
+                            return true;
+                        }
+                        final PropertyVisibilityStrategy strategy = strategies.computeIfAbsent(field.getDeclaringClass(), this::visibilityStrategy);
+                        return strategy == this ? Modifier.isPublic(field.getModifiers()) : strategy.isVisible(field);
+                    }
 
-            private PropertyVisibilityStrategy visibilityStrategy(final Class<?> type) { // can be cached
-                JsonbVisibility visibility = type.getAnnotation(JsonbVisibility.class);
-                if (visibility != null) {
-                    try {
-                        return visibility.value().newInstance();
-                    } catch (final InstantiationException | IllegalAccessException e) {
-                        throw new IllegalArgumentException(e);
+                    @Override
+                    public boolean isVisible(final Method method) {
+                        final PropertyVisibilityStrategy strategy = strategies.computeIfAbsent(method.getDeclaringClass(), this::visibilityStrategy);
+                        return strategy == this ? Modifier.isPublic(method.getModifiers()) : strategy.isVisible(method);
                     }
-                }
-                Package p = type.getPackage();
-                while (p != null) {
-                    visibility = p.getAnnotation(JsonbVisibility.class);
-                    if (visibility != null) {
-                        try {
-                            return visibility.value().newInstance();
-                        } catch (final InstantiationException | IllegalAccessException e) {
-                            throw new IllegalArgumentException(e);
+
+                    private PropertyVisibilityStrategy visibilityStrategy(final Class<?> type) { // can be cached
+                        JsonbVisibility visibility = type.getAnnotation(JsonbVisibility.class);
+                        if (visibility != null) {
+                            try {
+                                return visibility.value().newInstance();
+                            } catch (final InstantiationException | IllegalAccessException e) {
+                                throw new IllegalArgumentException(e);
+                            }
                         }
+                        Package p = type.getPackage();
+                        while (p != null) {
+                            visibility = p.getAnnotation(JsonbVisibility.class);
+                            if (visibility != null) {
+                                try {
+                                    return visibility.value().newInstance();
+                                } catch (final InstantiationException | IllegalAccessException e) {
+                                    throw new IllegalArgumentException(e);
+                                }
+                            }
+                            final String name = p.getName();
+                            final int end = name.lastIndexOf('.');
+                            if (end < 0) {
+                                break;
+                            }
+                            p = Package.getPackage(name.substring(0, end));
+                        }
+                        return this;
                     }
-                    final String name = p.getName();
-                    final int end = name.lastIndexOf('.');
-                    if (end < 0) {
-                        break;
-                    }
-                    p = Package.getPackage(name.substring(0, end));
-                }
-                return this;
-            }
-        });
+                });
 
         config.getProperty("johnzon.attributeOrder").ifPresent(comp -> builder.setAttributeOrder(Comparator.class.cast(comp)));
         config.getProperty("johnzon.enforceQuoteString")
@@ -229,15 +227,16 @@ public class JohnzonBuilder implements JsonbBuilder {
         final AccessMode accessMode = config.getProperty("johnzon.accessMode")
                 .map(this::toAccessMode)
                 .orElseGet(() -> new JsonbAccessMode(
-                propertyNamingStrategy, orderValue, visibilityStrategy,
-                !namingStrategyValue.orElse("").equals(PropertyNamingStrategy.CASE_INSENSITIVE),
-                defaultConverters,
-                factory, parserFactoryProvider,
-                config.getProperty("johnzon.accessModeDelegate")
-                        .map(this::toAccessMode)
-                        .orElseGet(() -> new FieldAndMethodAccessMode(true, true, false))));
+                        propertyNamingStrategy, orderValue, visibilityStrategy,
+                        !namingStrategyValue.orElse("").equals(PropertyNamingStrategy.CASE_INSENSITIVE),
+                        defaultConverters,
+                        factory, parserFactoryProvider,
+                        config.getProperty("johnzon.accessModeDelegate")
+                                .map(this::toAccessMode)
+                                .orElseGet(() -> new FieldAndMethodAccessMode(true, true, false))));
         builder.setAccessMode(accessMode);
 
+
         // user adapters
         config.getProperty(JsonbConfig.ADAPTERS).ifPresent(adapters -> Stream.of(JsonbAdapter[].class.cast(adapters)).forEach(adapter -> {
             final ParameterizedType pt = ParameterizedType.class.cast(
@@ -307,34 +306,35 @@ public class JohnzonBuilder implements JsonbBuilder {
 
         config.getProperty(JsonbConfig.SERIALIZERS).map(JsonbSerializer[].class::cast).ifPresent(serializers -> {
             Stream.of(serializers).forEach(s -> {
-                Type typeParameter = GenericTypeReflector.getTypeParameter(s.getClass(), JsonbDeserializer.class.getTypeParameters()[0]);
-                if (typeParameter instanceof Class) {
-                    builder.addObjectConverter(
-                            Class.class.cast(typeParameter),
-                            (ObjectConverter.Writer) (instance, jsonbGenerator)
-                            -> s.serialize(instance, jsonbGenerator.getJsonGenerator(), new JohnzonSerializationContext(jsonbGenerator)));
-                } else if (typeParameter instanceof ParameterizedType) {
-                    builder.addObjectConverter(
-                            Class.class.cast(ParameterizedType.class.cast(typeParameter).getRawType()),
-                            (ObjectConverter.Writer) (instance, jsonbGenerator)
-                            -> s.serialize(instance, jsonbGenerator.getJsonGenerator(), new JohnzonSerializationContext(jsonbGenerator)));
+                final ParameterizedType pt = findPT(s, JsonbSerializer.class);
+                if (pt == null) {
+                    throw new IllegalArgumentException(s + " doesn't implement JsonbSerializer");
                 }
-
+                final Type[] args = pt.getActualTypeArguments();
+                // TODO: support PT in ObjectConverter (list)
+                if (args.length != 1 || !Class.class.isInstance(args[0])) {
+                    throw new IllegalArgumentException("We only support serializer on Class for now");
+                }
+                builder.addObjectConverter(
+                        Class.class.cast(args[0]), (ObjectConverter.Writer)
+                                (instance, jsonbGenerator) -> s.serialize(instance, jsonbGenerator.getJsonGenerator(), new JohnzonSerializationContext(jsonbGenerator)));
             });
         });
         config.getProperty(JsonbConfig.DESERIALIZERS).map(JsonbDeserializer[].class::cast).ifPresent(deserializers -> {
             Stream.of(deserializers).forEach(d -> {
-                Type typeParameter = GenericTypeReflector.getTypeParameter(d.getClass(), JsonbDeserializer.class.getTypeParameters()[0]);
-                // TODO: support PT in ObjectConverter (list)
-                if (typeParameter instanceof Class) {
-                    builder.addObjectConverter(
-                            Class.class.cast(typeParameter), (ObjectConverter.Reader) (jsonObject, targetType, parser) -> d.deserialize(
-                            parserFactoryProvider.get().createParser(jsonObject), new JohnzonDeserializationContext(parser), targetType));
-                } else if (typeParameter instanceof ParameterizedType) {
-                    builder.addObjectConverter(
-                            Class.class.cast(ParameterizedType.class.cast(typeParameter).getRawType()), (ObjectConverter.Reader) (jsonObject, targetType, parser) -> d.deserialize(
-                            parserFactoryProvider.get().createParser(jsonObject), new JohnzonDeserializationContext(parser), targetType));
+                final ParameterizedType pt = findPT(d, JsonbDeserializer.class);
+                if (pt == null) {
+                    throw new IllegalArgumentException(d + " doesn't implement JsonbDeserializer");
                 }
+                final Type[] args = pt.getActualTypeArguments();
+                if (args.length != 1 || !Class.class.isInstance(args[0])) {
+                    throw new IllegalArgumentException("We only support deserializer on Class for now");
+                }
+                // TODO: support PT in ObjectConverter (list)
+                builder.addObjectConverter(
+                        Class.class.cast(args[0]), (ObjectConverter.Reader)
+                                (jsonObject, targetType, parser) -> d.deserialize(
+                                        parserFactoryProvider.get().createParser(jsonObject), new JohnzonDeserializationContext(parser), targetType));
             });
         });
 
@@ -398,6 +398,13 @@ public class JohnzonBuilder implements JsonbBuilder {
         };
     }
 
+    private ParameterizedType findPT(final Object s, final Class<?> type) {
+        return ParameterizedType.class.cast(
+                Stream.of(s.getClass().getGenericInterfaces())
+                        .filter(i -> ParameterizedType.class.isInstance(i) && ParameterizedType.class.cast(i).getRawType() == type)
+                        .findFirst().orElse(null));
+    }
+
     private Object getBeanManager() {
         if (beanManager == null) {
             try { // don't trigger CDI is not there
@@ -612,6 +619,7 @@ public class JohnzonBuilder implements JsonbBuilder {
         }));
         addDateFormatConfigConverters(converters, zoneIDUTC);
 
+
         converters.forEach((k, v) -> builder.addAdapter(k.getFrom(), k.getTo(), v));
         return converters;
     }
@@ -624,16 +632,25 @@ public class JohnzonBuilder implements JsonbBuilder {
 
             // Note: we try and fallback in the parsing cause we don't know if the date format provided is
             // for date, datetime, time
+
             converters.put(new AdapterKey(Date.class, String.class), new ConverterAdapter<>(new Converter<Date>() {
+                private volatile boolean useFormatter = true;
 
                 @Override
                 public String toString(final Date instance) {
-                    return formatter.format(ZonedDateTime.ofInstant(instance.toInstant(), zoneIDUTC));
+                    return LocalDateTime.ofInstant(instance.toInstant(), zoneIDUTC).toString();
                 }
 
                 @Override
                 public Date fromString(final String text) {
-                    return Date.from(Instant.from(formatter.parse(text)));
+                    if (useFormatter) {
+                        try {
+                            return Date.from(LocalDateTime.parse(text, formatter).toInstant(ZoneOffset.UTC));
+                        } catch (final DateTimeParseException dpe) {
+                            useFormatter = false;
+                        }
+                    }
+                    return Date.from(LocalDateTime.parse(text).toInstant(ZoneOffset.UTC));
                 }
             }));
             converters.put(new AdapterKey(LocalDateTime.class, String.class), new ConverterAdapter<>(new Converter<LocalDateTime>() {
@@ -704,7 +721,7 @@ public class JohnzonBuilder implements JsonbBuilder {
         if (text.length() == 3) { // don't fail but log it
             Logger.getLogger(JohnzonBuilder.class.getName()).severe("Deprecated timezone: " + text);
         }
-         */
+        */
     }
 
     private Map<String, ?> generatorConfig() {

http://git-wip-us.apache.org/repos/asf/johnzon/blob/f6f85edc/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
index 35b303a..8e74e3c 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
@@ -18,7 +18,6 @@
  */
 package org.apache.johnzon.mapper;
 
-import java.lang.reflect.AnnotatedType;
 import org.apache.johnzon.mapper.access.AccessMode;
 import org.apache.johnzon.mapper.converter.CharacterConverter;
 import org.apache.johnzon.mapper.converter.EnumConverter;
@@ -41,12 +40,10 @@ import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.ArrayDeque;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Base64;
 import java.util.Collection;
 import java.util.Collections;
@@ -73,12 +70,9 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
 import static java.util.Arrays.asList;
-import java.util.Date;
-import java.util.Optional;
 import static javax.json.JsonValue.ValueType.FALSE;
 import static javax.json.JsonValue.ValueType.NULL;
 import static javax.json.JsonValue.ValueType.NUMBER;
-import static javax.json.JsonValue.ValueType.STRING;
 import static javax.json.JsonValue.ValueType.TRUE;
 
 /**
@@ -99,11 +93,13 @@ public class MappingParserImpl implements MappingParser {
     private final JsonReader jsonReader;
 
     /**
-     * Used for de-referencing JsonPointers during deserialisation. key:
-     * JsonPointer value: already deserialised Object
+     * Used for de-referencing JsonPointers during deserialisation.
+     * key: JsonPointer
+     * value: already deserialised Object
      */
     private Map<String, Object> jsonPointers;
 
+
     public MappingParserImpl(MapperConfig config, Mappings mappings, JsonReader jsonReader, boolean isDeduplicateObjects) {
         this.config = config;
         this.mappings = mappings;
@@ -112,6 +108,7 @@ public class MappingParserImpl implements MappingParser {
 
         reverseAdaptersRegistry = new ConcurrentHashMap<>(config.getAdapters().size());
 
+
         this.isDeduplicateObjects = isDeduplicateObjects;
 
         if (isDeduplicateObjects) {
@@ -121,6 +118,7 @@ public class MappingParserImpl implements MappingParser {
         }
     }
 
+
     @Override
     public <T> T readObject(Type targetType) {
         try {
@@ -145,12 +143,6 @@ public class MappingParserImpl implements MappingParser {
         if (JsonString.class.isInstance(jsonValue) && (targetType == String.class || targetType == Object.class)) {
             return (T) JsonString.class.cast(jsonValue).getString();
         }
-        if (JsonString.class.isInstance(jsonValue) && targetType instanceof Class && Class.class.cast(targetType).isEnum()) {
-            return (T) Enum.valueOf(Class.class.cast(targetType), JsonString.class.cast(jsonValue).getString());
-        }
-        if (JsonString.class.isInstance(jsonValue) && targetType instanceof Class && Date.class.isAssignableFrom(Class.class.cast(targetType))) {
-            return (T) convertTo(config.findAdapter(targetType), jsonValue, null);
-        }
         if (JsonNumber.class.isInstance(jsonValue)) {
             final JsonNumber number = JsonNumber.class.cast(jsonValue);
             if (targetType == int.class || targetType == Integer.class) {
@@ -207,6 +199,7 @@ public class MappingParserImpl implements MappingParser {
         throw new IllegalArgumentException("Unsupported " + jsonValue + " for type " + targetType);
     }
 
+
     private Object buildObject(final Type inType, final JsonObject object, final boolean applyObjectConverter, JsonPointerTracker jsonPointer) {
         Type type = inType;
         if (inType == Object.class) {
@@ -271,29 +264,7 @@ public class MappingParserImpl implements MappingParser {
                         }
                         return map;
                     }
-                } else {
-                
-                    // if a specific mapping has not been declared, let's try finding and using one without generics
-                    ObjectConverter.Reader objectConverter = config.findObjectConverterReader((Class) aType.getRawType());
-                
-                    if (objectConverter != null) {
-                        return objectConverter.fromJson(object, type, new SuppressConversionMappingParser(this, object));
-                    }
-                    
-                }
-            } else if (TypeVariable.class.isInstance(type)) {
-                
-                TypeVariable vType = TypeVariable.class.cast(type);
-                
-                Optional<AnnotatedType> findFirst = Arrays.asList(vType.getAnnotatedBounds()).stream().findFirst();
-
-                if (findFirst.isPresent()) {
-                    ObjectConverter.Reader objectConverter = config.findObjectConverterReader((Class) findFirst.get().getType());
-                    if (objectConverter != null) {
-                        return objectConverter.fromJson(object, type, new SuppressConversionMappingParser(this, object));
-                    }
                 }
-
             } else if (Map.class == type || HashMap.class == type || LinkedHashMap.class == type) {
                 final LinkedHashMap<String, Object> map = new LinkedHashMap<String, Object>();
                 for (final Map.Entry<String, JsonValue> value : object.entrySet()) {
@@ -313,7 +284,7 @@ public class MappingParserImpl implements MappingParser {
         if (classMapping.adapter != null) {
             return classMapping.adapter.from(t);
         }
-         */
+        */
 
         if (classMapping.factory == null) {
             throw new MapperException(classMapping.clazz + " not instantiable");
@@ -321,11 +292,9 @@ public class MappingParserImpl implements MappingParser {
 
         if (config.isFailOnUnknown()) {
             if (!classMapping.setters.keySet().containsAll(object.keySet())) {
-                throw new MapperException("(fail on unknown properties): " + new HashSet<String>(object.keySet()) {
-                    {
-                        removeAll(classMapping.setters.keySet());
-                    }
-                });
+                throw new MapperException("(fail on unknown properties): " + new HashSet<String>(object.keySet()) {{
+                    removeAll(classMapping.setters.keySet());
+                }});
             }
         }
 
@@ -457,9 +426,6 @@ public class MappingParserImpl implements MappingParser {
                 }
             }
         }
-        if (STRING.equals(valueType)) {
-            return converter.to(JsonString.class.cast(jsonValue).getString());
-        }
         return converter.to(jsonValue.toString());
 
     }
@@ -493,9 +459,10 @@ public class MappingParserImpl implements MappingParser {
         return adapterKey;
     }
 
+
     private Object toObject(final Object baseInstance, final JsonValue jsonValue,
-            final Type type, final Adapter itemConverter, final JsonPointerTracker jsonPointer,
-            final Type rootType) {
+                            final Type type, final Adapter itemConverter, final JsonPointerTracker jsonPointer,
+                            final Type rootType) {
         if (jsonValue == null || JsonValue.NULL.equals(jsonValue)) {
             return null;
         }
@@ -539,7 +506,8 @@ public class MappingParserImpl implements MappingParser {
             }
             final boolean typedAdapter = TypeAwareAdapter.class.isInstance(itemConverter);
             final Object object = buildObject(
-                    baseInstance != null ? baseInstance.getClass() : (typedAdapter ? TypeAwareAdapter.class.cast(itemConverter).getTo() : type),
+                    baseInstance != null ? baseInstance.getClass() : (
+                            typedAdapter ? TypeAwareAdapter.class.cast(itemConverter).getTo() : type),
                     JsonObject.class.cast(jsonValue), type instanceof Class,
                     jsonPointer);
             return typedAdapter ? itemConverter.to(object) : object;
@@ -610,8 +578,8 @@ public class MappingParserImpl implements MappingParser {
     }
 
     private Object buildArray(final Type type, final JsonArray jsonArray, final Adapter itemConverter,
-            final ObjectConverter.Reader objectConverter,
-            final JsonPointerTracker jsonPointer, final Type rootType) {
+                              final ObjectConverter.Reader objectConverter,
+                              final JsonPointerTracker jsonPointer, final Type rootType) {
         if (Class.class.isInstance(type)) {
             final Class clazz = Class.class.cast(type);
             if (clazz.isArray()) {
@@ -635,7 +603,7 @@ public class MappingParserImpl implements MappingParser {
     }
 
     private Object buildArrayWithComponentType(final JsonArray jsonArray, final Class<?> componentType, final Adapter itemConverter,
-            final JsonPointerTracker jsonPointer, final Type rootType) {
+                                               final JsonPointerTracker jsonPointer, final Type rootType) {
         final Object array = Array.newInstance(componentType, jsonArray.size());
         int i = 0;
         for (final JsonValue value : jsonArray) {
@@ -647,8 +615,8 @@ public class MappingParserImpl implements MappingParser {
     }
 
     private <T> Collection<T> mapCollection(final Mappings.CollectionMapping mapping, final JsonArray jsonArray,
-            final Adapter itemConverter, ObjectConverter.Reader objectConverter,
-            final JsonPointerTracker jsonPointer, final Type rootType) {
+                                            final Adapter itemConverter, ObjectConverter.Reader objectConverter,
+                                            final JsonPointerTracker jsonPointer, final Type rootType) {
         final Collection collection;
 
         if (SortedSet.class == mapping.raw || NavigableSet.class == mapping.raw || TreeSet.class == mapping.raw) {
@@ -674,7 +642,7 @@ public class MappingParserImpl implements MappingParser {
             collection.add(JsonValue.NULL.equals(value)
                     ? null
                     : toValue(null, value, null, itemConverter, mapping.arg, objectConverter,
-                            isDeduplicateObjects ? new JsonPointerTracker(jsonPointer, i) : null, rootType));
+                    isDeduplicateObjects ? new JsonPointerTracker(jsonPointer, i) : null, rootType));
             i++;
         }
 
@@ -692,6 +660,7 @@ public class MappingParserImpl implements MappingParser {
         return collection;
     }
 
+
     private Object[] createParameters(final Mappings.ClassMapping mapping, final JsonObject object, JsonPointerTracker jsonPointer) {
         final int length = mapping.factory.getParameterTypes().length;
         final Object[] objects = new Object[length];
@@ -713,8 +682,8 @@ public class MappingParserImpl implements MappingParser {
     }
 
     private Object toValue(final Object baseInstance, final JsonValue jsonValue, final Adapter converter,
-            final Adapter itemConverter, final Type type, final ObjectConverter.Reader objectConverter,
-            final JsonPointerTracker jsonPointer, final Type rootType) {
+                           final Adapter itemConverter, final Type type, final ObjectConverter.Reader objectConverter,
+                           final JsonPointerTracker jsonPointer, final Type rootType) {
 
         if (objectConverter != null) {
 
@@ -732,6 +701,7 @@ public class MappingParserImpl implements MappingParser {
                 : convertTo(converter, jsonValue, jsonPointer);
     }
 
+
     /**
      * @deprecated see MapperConfig
      */
@@ -773,8 +743,8 @@ public class MappingParserImpl implements MappingParser {
             }
         }
         if (converter == null) {
-            throw new MapperException("Missing a Converter for type " + aClass + " to convert the JSON String '"
-                    + text + "' . Please register a custom converter for it.");
+            throw new MapperException("Missing a Converter for type " + aClass + " to convert the JSON String '" +
+                    text + "' . Please register a custom converter for it.");
         }
         return converter.to(text);
     }
@@ -800,11 +770,9 @@ public class MappingParserImpl implements MappingParser {
 
     /**
      * Internal class to suppress {@link ObjectConverter} lookup if and only if
-     * the {@link JsonValue} is the same refernece than the lookup was done
-     * before.
+     * the {@link JsonValue} is the same refernece than the lookup was done before.
      */
     private static class SuppressConversionMappingParser implements MappingParser {
-
         private final MappingParserImpl delegate;
         private final JsonObject suppressConversionFor;
 


[10/12] johnzon git commit: Test fix - JsonBindingProvider added to secondary server to not influence pre existing tests

Posted by rm...@apache.org.
Test fix - JsonBindingProvider added to secondary server to not influence pre existing tests

Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/293e40c7
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/293e40c7
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/293e40c7

Branch: refs/heads/master
Commit: 293e40c78b7321abaff42d1e0db7ddd0d5475d86
Parents: 5f01fe2
Author: amoscatelli <al...@live.com>
Authored: Tue Mar 27 14:56:01 2018 +0200
Committer: amoscatelli <al...@live.com>
Committed: Tue Mar 27 14:56:01 2018 +0200

----------------------------------------------------------------------
 .../johnzon/jsonb/jaxrs/JsonbJaxRsTest.java     | 26 ++++++++++++++------
 1 file changed, 18 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/293e40c7/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
----------------------------------------------------------------------
diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
index 0013f38..83dabb9 100644
--- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
@@ -54,7 +54,9 @@ import static org.junit.Assert.assertTrue;
 
 public class JsonbJaxRsTest {
     private final static String ENDPOINT_ADDRESS = "local://johnzon";
+    private final static String ENDPOINT_ADDRESS_JSONB_CONFIG = "local://johnzonjsonbconfig";
     private static Server server;
+    private static Server serverJsonbConfig;
 
     public static class JsonBindingProvider implements ContextResolver<Jsonb> {
 
@@ -71,18 +73,26 @@ public class JsonbJaxRsTest {
     
     @BeforeClass
     public static void bindEndpoint() throws Exception {
-        final JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
+        JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
         sf.setResourceClasses(JohnzonResource.class);
-        sf.setProviders(Arrays.asList(new JsonbJaxrsProvider<>(), new JsonBindingProvider()));
+        sf.setProviders(singletonList(new JsonbJaxrsProvider<>()));
         sf.setResourceProvider(JohnzonResource.class, new SingletonResourceProvider(new JohnzonResource(), false));
         sf.setAddress(ENDPOINT_ADDRESS);
         server = sf.create();
+        sf = new JAXRSServerFactoryBean();
+        sf.setResourceClasses(JohnzonResource.class);
+        sf.setProviders(Arrays.asList(new JsonbJaxrsProvider<>(), new JsonBindingProvider()));
+        sf.setResourceProvider(JohnzonResource.class, new SingletonResourceProvider(new JohnzonResource(), false));
+        sf.setAddress(ENDPOINT_ADDRESS_JSONB_CONFIG);
+        serverJsonbConfig = sf.create();
     }
 
     @AfterClass
     public static void unbind() throws Exception {
         server.stop();
         server.destroy();
+        serverJsonbConfig.stop();
+        serverJsonbConfig.destroy();
     }
 
     @Test
@@ -93,7 +103,7 @@ public class JsonbJaxRsTest {
 
     @Test
     public void jsonbconfigProvider() {
-        client().path("johnzon").get(String.class);
+        client(ENDPOINT_ADDRESS_JSONB_CONFIG, MediaType.APPLICATION_JSON_TYPE).path("johnzon").get(String.class);
         assertEquals(JsonBindingProvider.called, Boolean.TRUE);
     }
     
@@ -113,7 +123,7 @@ public class JsonbJaxRsTest {
 
     @Test
     public void primitive() {
-        final String val = client(MediaType.TEXT_PLAIN_TYPE).path("johnzon/primitive").get(String.class);
+        final String val = client(ENDPOINT_ADDRESS, MediaType.TEXT_PLAIN_TYPE).path("johnzon/primitive").get(String.class);
         assertEquals("1986", val);
     }
 
@@ -130,7 +140,7 @@ public class JsonbJaxRsTest {
 
     @Test
     public void testBinaryDownload() {
-        byte[] content = client(MediaType.TEXT_PLAIN_TYPE)
+        byte[] content = client(ENDPOINT_ADDRESS, MediaType.TEXT_PLAIN_TYPE)
                 .path("johnzon/mybinary")
                 .get(byte[].class);
 
@@ -168,11 +178,11 @@ public class JsonbJaxRsTest {
     }
 
     private static WebClient client() {
-        return client(MediaType.APPLICATION_JSON_TYPE);
+        return client(ENDPOINT_ADDRESS, MediaType.APPLICATION_JSON_TYPE);
     }
 
-    private static WebClient client(final MediaType mediaType) {
-        final WebClient client = WebClient.create(ENDPOINT_ADDRESS, singletonList(new JsonbJaxrsProvider<>())).accept(mediaType);
+    private static WebClient client(final String endpoint, final MediaType mediaType) {
+        final WebClient client = WebClient.create(endpoint, singletonList(new JsonbJaxrsProvider<>())).accept(mediaType);
         WebClient.getConfig(client).getRequestContext().put(LocalConduit.DIRECT_DISPATCH, Boolean.TRUE);
         return client;
     }


[04/12] johnzon git commit: Update pom.xml

Posted by rm...@apache.org.
Update pom.xml

fix padding

Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/5a51ca74
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/5a51ca74
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/5a51ca74

Branch: refs/heads/master
Commit: 5a51ca748bf1cee21d34b29ef2884918c30c5f77
Parents: 4631406
Author: amoscatelli <al...@live.com>
Authored: Tue Mar 27 12:57:32 2018 +0200
Committer: GitHub <no...@github.com>
Committed: Tue Mar 27 12:57:32 2018 +0200

----------------------------------------------------------------------
 johnzon-jsonb/pom.xml | 195 ++++++++++++++++++++++-----------------------
 1 file changed, 97 insertions(+), 98 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/5a51ca74/johnzon-jsonb/pom.xml
----------------------------------------------------------------------
diff --git a/johnzon-jsonb/pom.xml b/johnzon-jsonb/pom.xml
index 0ba524d..87b88be 100644
--- a/johnzon-jsonb/pom.xml
+++ b/johnzon-jsonb/pom.xml
@@ -18,108 +18,107 @@
     under the License.
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>johnzon</artifactId>
-        <groupId>org.apache.johnzon</groupId>
-        <version>1.1.8-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>johnzon</artifactId>
+    <groupId>org.apache.johnzon</groupId>
+    <version>1.1.8-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>johnzon-jsonb</artifactId>
-    <name>Johnzon :: JSON-B Implementation</name>
-    <packaging>bundle</packaging>
+  <artifactId>johnzon-jsonb</artifactId>
+  <name>Johnzon :: JSON-B Implementation</name>
+  <packaging>bundle</packaging>
 
-    <properties>
-        <java-compile.version>1.8</java-compile.version>
-        <staging.directory>${project.parent.reporting.outputDirectory}</staging.directory>
-    </properties>
+  <properties>
+    <java-compile.version>1.8</java-compile.version>
+    <staging.directory>${project.parent.reporting.outputDirectory}</staging.directory>
+  </properties>
 
-    <dependencies>
-      
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-annotation_1.3_spec</artifactId>
-            <version>1.0</version>
-            <scope>provided</scope>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-jaxrs_2.0_spec</artifactId>
-            <version>1.0-alpha-1</version>
-            <scope>provided</scope>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-jcdi_1.1_spec</artifactId>
-            <version>1.0</version>
-            <scope>provided</scope>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-jsonb_1.0_spec</artifactId>
-            <version>1.0</version>
-            <scope>provided</scope>
-        </dependency>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-annotation_1.3_spec</artifactId>
+      <version>1.0</version>
+      <scope>provided</scope>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-jaxrs_2.0_spec</artifactId>
+      <version>1.0-alpha-1</version>
+      <scope>provided</scope>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-jcdi_1.1_spec</artifactId>
+      <version>1.0</version>
+      <scope>provided</scope>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-jsonb_1.0_spec</artifactId>
+      <version>1.0</version>
+      <scope>provided</scope>
+    </dependency>
 
-        <dependency>
-            <groupId>org.apache.johnzon</groupId>
-            <artifactId>johnzon-mapper</artifactId>
-            <version>${project.version}</version>
-        </dependency>
+    <dependency>
+      <groupId>org.apache.johnzon</groupId>
+      <artifactId>johnzon-mapper</artifactId>
+      <version>${project.version}</version>
+    </dependency>
 
-        <dependency>
-            <groupId>org.apache.cxf</groupId>
-            <artifactId>cxf-rt-rs-client</artifactId>
-            <version>${cxf.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.cxf</groupId>
-            <artifactId>cxf-rt-frontend-jaxrs</artifactId>
-            <version>${cxf.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.cxf</groupId>
-            <artifactId>cxf-rt-transports-local</artifactId>
-            <version>${cxf.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-interceptor_1.2_spec</artifactId>
-            <version>1.0</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-atinject_1.0_spec</artifactId>
-            <version>1.0</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.openwebbeans</groupId>
-            <artifactId>openwebbeans-impl</artifactId>
-            <version>1.6.2</version>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
+    <dependency>
+      <groupId>org.apache.cxf</groupId>
+      <artifactId>cxf-rt-rs-client</artifactId>
+      <version>${cxf.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.cxf</groupId>
+      <artifactId>cxf-rt-frontend-jaxrs</artifactId>
+      <version>${cxf.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.cxf</groupId>
+      <artifactId>cxf-rt-transports-local</artifactId>
+      <version>${cxf.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-interceptor_1.2_spec</artifactId>
+      <version>1.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-atinject_1.0_spec</artifactId>
+      <version>1.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.openwebbeans</groupId>
+      <artifactId>openwebbeans-impl</artifactId>
+      <version>1.6.2</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
 
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Require-Capability>osgi.extender;filter:="(osgi.extender=osgi.serviceloader.registrar)"</Require-Capability>
-                        <Provide-Capability>osgi.serviceloader;osgi.serviceloader=javax.json.bind.spi.JsonbProvider</Provide-Capability>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <configuration>
+          <instructions>
+            <Require-Capability>osgi.extender;filter:="(osgi.extender=osgi.serviceloader.registrar)"</Require-Capability>
+            <Provide-Capability>osgi.serviceloader;osgi.serviceloader=javax.json.bind.spi.JsonbProvider</Provide-Capability>
+          </instructions>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
 </project>


[06/12] johnzon git commit: Update JsonbJaxRsTest.java

Posted by rm...@apache.org.
Update JsonbJaxRsTest.java

Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/889de269
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/889de269
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/889de269

Branch: refs/heads/master
Commit: 889de269af1d1be77b364f241b32d349d3fb5b98
Parents: c81c99f
Author: amoscatelli <al...@live.com>
Authored: Tue Mar 27 13:02:46 2018 +0200
Committer: GitHub <no...@github.com>
Committed: Tue Mar 27 13:02:46 2018 +0200

----------------------------------------------------------------------
 .../test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/889de269/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
----------------------------------------------------------------------
diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
index 79d263d..adc1198 100644
--- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/jaxrs/JsonbJaxRsTest.java
@@ -210,7 +210,7 @@ public class JsonbJaxRsTest {
         @GET
         @Path("all1")
         public Johnzon[] johnzons1() {
-            return new Johnzon[]{new Johnzon("johnzon1"), new Johnzon("johnzon2")};
+            return new Johnzon[] { new Johnzon("johnzon1"), new Johnzon("johnzon2") };
         }
 
         @GET


[11/12] johnzon git commit: atomic jsonb supplier

Posted by rm...@apache.org.
atomic jsonb supplier

Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/2e4a6aeb
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/2e4a6aeb
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/2e4a6aeb

Branch: refs/heads/master
Commit: 2e4a6aeb412306f1bb328945cb51d9dca434c8ac
Parents: 293e40c
Author: amoscatelli <al...@live.com>
Authored: Tue Mar 27 15:27:49 2018 +0200
Committer: amoscatelli <al...@live.com>
Committed: Tue Mar 27 15:27:49 2018 +0200

----------------------------------------------------------------------
 .../jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java    | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/2e4a6aeb/johnzon-jsonb/src/main/java/org/apache/johnzon/jaxrs/jsonb/jaxrs/JsonbJaxrsProvider.java
----------------------------------------------------------------------
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 6b76b6f..15e1194 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
@@ -43,6 +43,7 @@ import java.lang.reflect.Type;
 import java.util.Collection;
 import java.util.Properties;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Supplier;
 import javax.annotation.Priority;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.ext.ContextResolver;
@@ -56,7 +57,7 @@ import javax.ws.rs.ext.Providers;
 public class JsonbJaxrsProvider<T> implements MessageBodyWriter<T>, MessageBodyReader<T> {
 
     protected final Collection<String> ignores;
-    protected final AtomicReference<Jsonb> delegate = new AtomicReference<>();
+    protected final AtomicReference<Supplier<Jsonb>> delegate = new AtomicReference<>();
     protected final JsonbConfig config = new JsonbConfig();
 
     @Context
@@ -69,7 +70,7 @@ public class JsonbJaxrsProvider<T> implements MessageBodyWriter<T>, MessageBodyR
     protected JsonbJaxrsProvider(final Collection<String> ignores) {
         this.ignores = ignores;
     }
-
+    
     protected Jsonb createJsonb() {
         return JsonbBuilder.create(config);
     }
@@ -164,14 +165,14 @@ public class JsonbJaxrsProvider<T> implements MessageBodyWriter<T>, MessageBodyR
     }
 
     protected Jsonb getJsonb(Class<?> type) {
-        ContextResolver<Jsonb> contextResolver = providers.getContextResolver(Jsonb.class, MediaType.APPLICATION_JSON_TYPE);
-        if (contextResolver != null) {
-            return contextResolver.getContext(type);
-        } else {
-            if (delegate.get() == null) {
-                delegate.compareAndSet(null, createJsonb());
+        if (delegate.get() == null){
+            ContextResolver<Jsonb> contextResolver = providers.getContextResolver(Jsonb.class, MediaType.APPLICATION_JSON_TYPE);
+            if (contextResolver != null) {
+                delegate.compareAndSet(null, ()-> contextResolver.getContext(type));
+            } else {
+                delegate.compareAndSet(null, ()-> createJsonb());
             }
-            return delegate.get();
         }
+        return delegate.get().get();
     }
 }