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:03 UTC

[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

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;