You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rs...@apache.org on 2016/04/18 10:18:09 UTC

[1/7] incubator-johnzon git commit: JOHNZON-71 moved attributeOrder to MapperConfig

Repository: incubator-johnzon
Updated Branches:
  refs/heads/master e917e77d6 -> 60dcff90d


JOHNZON-71 moved attributeOrder to MapperConfig


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

Branch: refs/heads/master
Commit: d797b9cbf1e3184e0eaf8996895244d27b26de91
Parents: e917e77
Author: Reinhard Sandtner <rs...@apache.org>
Authored: Wed Apr 13 14:48:47 2016 +0200
Committer: Reinhard Sandtner <rs...@apache.org>
Committed: Wed Apr 13 14:48:47 2016 +0200

----------------------------------------------------------------------
 .../java/org/apache/johnzon/mapper/Mapper.java  |  4 +--
 .../apache/johnzon/mapper/MapperBuilder.java    |  3 +--
 .../org/apache/johnzon/mapper/MapperConfig.java | 13 +++++++++-
 .../org/apache/johnzon/mapper/Mappings.java     | 27 ++++++++++----------
 4 files changed, 27 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/d797b9cb/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
index 7854d3b..68e0868 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java
@@ -40,7 +40,6 @@ import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Comparator;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
@@ -58,12 +57,11 @@ public class Mapper implements Closeable {
     protected final Collection<Closeable> closeables;
 
     Mapper(final JsonReaderFactory readerFactory, final JsonGeneratorFactory generatorFactory, MapperConfig config,
-                  final Comparator<String> attributeOrder,
                   final Collection<Closeable> closeables) {
         this.readerFactory = readerFactory;
         this.generatorFactory = generatorFactory;
         this.config = config;
-        this.mappings = new Mappings(attributeOrder, config.getAccessMode(), config.getVersion(), config.getAdapters());
+        this.mappings = new Mappings(config);
         this.readerHandler = ReaderHandler.create(readerFactory);
         this.closeables = closeables;
     }

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/d797b9cb/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
index d619d85..d354950 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperBuilder.java
@@ -191,8 +191,7 @@ public class MapperBuilder {
                         version, close,
                         skipNull, skipEmptyArray,
                         treatByteArrayAsBase64, treatByteArrayAsBase64URL, readAttributeBeforeWrite,
-                        accessMode, encoding),
-                attributeOrder,
+                        accessMode, encoding, attributeOrder),
                 closeables);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/d797b9cb/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
index d650769..08bd77d 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
@@ -25,6 +25,7 @@ import org.apache.johnzon.mapper.internal.ConverterAdapter;
 
 import java.lang.reflect.Type;
 import java.nio.charset.Charset;
+import java.util.Comparator;
 import java.util.Map;
 import java.util.concurrent.ConcurrentMap;
 
@@ -44,14 +45,19 @@ class MapperConfig implements Cloneable {
     private final Charset encoding;
     private final ConcurrentMap<AdapterKey, Adapter<?, ?>> adapters;
     private final Map<Class<?>, ObjectConverter<?>> objectConverters;
+    private final Comparator<String> attributeOrder;
 
+    //disable checkstyle for 10+ parameters
+    //CHECKSTYLE:OFF
     public MapperConfig(final ConcurrentMap<AdapterKey, Adapter<?, ?>> adapters,
                         final Map<Class<?>, ObjectConverter<?>> objectConverters,
                         final int version, final boolean close,
                         final boolean skipNull, final boolean skipEmptyArray,
                         final boolean treatByteArrayAsBase64, final boolean treatByteArrayAsBase64URL,
                         final boolean readAttributeBeforeWrite,
-                        final AccessMode accessMode, final Charset encoding) {
+                        final AccessMode accessMode, final Charset encoding,
+                        final Comparator<String> attributeOrder) {
+    //CHECKSTYLE:ON
         this.objectConverters = objectConverters;
         this.version = version;
         this.close = close;
@@ -63,6 +69,7 @@ class MapperConfig implements Cloneable {
         this.accessMode = accessMode;
         this.encoding = encoding;
         this.adapters = adapters;
+        this.attributeOrder = attributeOrder;
     }
 
     public Adapter findAdapter(final Type aClass) {
@@ -124,4 +131,8 @@ class MapperConfig implements Cloneable {
     public Map<Class<?>, ObjectConverter<?>> getObjectConverters() {
         return objectConverters;
     }
+
+    public Comparator<String> getAttributeOrder() {
+        return attributeOrder;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/d797b9cb/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
index f95a51e..52a6eca 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
@@ -175,17 +175,12 @@ public class Mappings {
 
     protected final ConcurrentMap<Type, ClassMapping> classes = new ConcurrentHashMap<Type, ClassMapping>();
     protected final ConcurrentMap<Type, CollectionMapping> collections = new ConcurrentHashMap<Type, CollectionMapping>();
-    protected final Comparator<String> fieldOrdering;
-    protected final ConcurrentMap<AdapterKey, Adapter<?, ?>> adapters;
-    private final AccessMode accessMode;
-    private final int version;
-
-    public Mappings(final Comparator<String> attributeOrder, final AccessMode accessMode,
-                    final int version, final ConcurrentMap<AdapterKey, Adapter<?, ?>> adapters) {
-        this.fieldOrdering = attributeOrder;
-        this.accessMode = accessMode;
-        this.version = version;
-        this.adapters = adapters;
+
+    protected final MapperConfig config;
+
+
+    public Mappings(final MapperConfig config) {
+        this.config = config;
     }
 
     public <T> CollectionMapping findCollectionMapping(final ParameterizedType genericType) {
@@ -287,8 +282,10 @@ public class Mappings {
         }
         final Class<?> clazz = findModelClass(inClazz);
 
+        AccessMode accessMode = config.getAccessMode();
+
         Comparator<String> fieldComparator = accessMode.fieldComparator(inClazz);
-        fieldComparator = fieldComparator == null ? fieldOrdering : fieldComparator;
+        fieldComparator = fieldComparator == null ? config.getAttributeOrder() : fieldComparator;
 
         final Map<String, Getter> getters = fieldComparator == null ? newOrderedMap(Getter.class) : new TreeMap<String, Getter>(fieldComparator);
         final Map<String, Setter> setters = fieldComparator == null ? newOrderedMap(Setter.class) : new TreeMap<String, Setter>(fieldComparator);
@@ -344,7 +341,7 @@ public class Mappings {
     }
 
     private <T> Map<String, T> newOrderedMap(final Class<T> value) {
-        return fieldOrdering != null ? new TreeMap<String, T>(fieldOrdering) : new HashMap<String, T>();
+        return config.getAttributeOrder() != null ? new TreeMap<String, T>(config.getAttributeOrder()) : new HashMap<String, T>();
     }
 
     private void addSetterIfNeeded(final Map<String, Setter> setters,
@@ -426,7 +423,7 @@ public class Mappings {
         final String key = path[0];
 
         final Getter getter = getters.get(key);
-        final MapBuilderReader newReader = new MapBuilderReader(objectGetters, path, version);
+        final MapBuilderReader newReader = new MapBuilderReader(objectGetters, path, config.getVersion());
         getters.put(key, new Getter(getter == null ? newReader : new CompositeReader(getter.reader, newReader), false, false, false, true, null, -1));
 
         final Setter newSetter = setters.get(key);
@@ -466,6 +463,8 @@ public class Mappings {
         }
         if (converter == null && Class.class.isInstance(typeToTest)) {
             final Class type = Class.class.cast(typeToTest);
+            ConcurrentMap<AdapterKey, Adapter<?, ?>> adapters = config.getAdapters();
+
             if (Date.class.isAssignableFrom(type) && copyDate) {
                 converter = new DateWithCopyConverter(Adapter.class.cast(adapters.get(new AdapterKey(Date.class, String.class))));
             } else if (type.isEnum()) {


[2/7] incubator-johnzon git commit: JOHNZON-72 implemented ObjectConverter lookup

Posted by rs...@apache.org.
JOHNZON-72 implemented ObjectConverter lookup

of course this is not done yet but a good starting point


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

Branch: refs/heads/master
Commit: c67a73d3ae619e868e1ee4d8dc3049d5d2828f25
Parents: d797b9c
Author: Reinhard Sandtner <rs...@apache.org>
Authored: Thu Apr 14 14:35:29 2016 +0200
Committer: Reinhard Sandtner <rs...@apache.org>
Committed: Thu Apr 14 14:35:29 2016 +0200

----------------------------------------------------------------------
 .../org/apache/johnzon/mapper/MapperConfig.java | 107 +++++++++++
 .../apache/johnzon/mapper/MapperConfigTest.java | 180 +++++++++++++++++++
 2 files changed, 287 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/c67a73d3/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
index 08bd77d..8e161cc 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
@@ -23,9 +23,11 @@ import org.apache.johnzon.mapper.converter.EnumConverter;
 import org.apache.johnzon.mapper.internal.AdapterKey;
 import org.apache.johnzon.mapper.internal.ConverterAdapter;
 
+import javax.json.JsonObject;
 import java.lang.reflect.Type;
 import java.nio.charset.Charset;
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.ConcurrentMap;
 
@@ -34,6 +36,19 @@ import java.util.concurrent.ConcurrentMap;
  * It needs to be immutable and 100% runtime oriented.
  */
 class MapperConfig implements Cloneable {
+
+    private static final ObjectConverter NO_CONVERTER = new ObjectConverter() {
+        @Override
+        public void writeJson(Object instance, MappingGenerator jsonbGenerator) {
+            // just a dummy
+        }
+
+        @Override
+        public Object fromJson(JsonObject jsonObject, Type targetType, MappingParser parser) {
+            return null;
+        }
+    };
+
     private final int version;
     private final boolean close;
     private final boolean skipNull;
@@ -47,6 +62,8 @@ class MapperConfig implements Cloneable {
     private final Map<Class<?>, ObjectConverter<?>> objectConverters;
     private final Comparator<String> attributeOrder;
 
+    private final Map<Class<?>, ObjectConverter<?>> objectConverterCache;
+
     //disable checkstyle for 10+ parameters
     //CHECKSTYLE:OFF
     public MapperConfig(final ConcurrentMap<AdapterKey, Adapter<?, ?>> adapters,
@@ -70,6 +87,8 @@ class MapperConfig implements Cloneable {
         this.encoding = encoding;
         this.adapters = adapters;
         this.attributeOrder = attributeOrder;
+
+        this.objectConverterCache = new HashMap<Class<?>, ObjectConverter<?>>(objectConverters.size());
     }
 
     public Adapter findAdapter(final Type aClass) {
@@ -88,6 +107,94 @@ class MapperConfig implements Cloneable {
         return null;
     }
 
+    /**
+     * Search for an {@link ObjectConverter} for the given class.
+     *
+     * If no {@link ObjectConverter} was found for the specific class,
+     * the whole type hierarchy will be scanned for a matching {@link ObjectConverter}.
+     *
+     * In case the given class implements more than on interfaces and for at least two
+     * we have configured an {@link ObjectConverter} the {@link ObjectConverter} for the
+     * first interface we get will be taken.
+     *
+     * @param clazz the {@link Class}
+     *
+     * @return the found {@link ObjectConverter} or {@code null} if no {@link ObjectConverter} has been found
+     *
+     * @throws IllegalArgumentException if {@code clazz} is {@code null}
+     */
+    public ObjectConverter findObjectConverter(Class clazz) {
+        if (clazz == null) {
+            throw new IllegalArgumentException("clazz must not be null");
+        }
+
+        // first lets look in our cache
+        ObjectConverter<?> converter = objectConverterCache.get(clazz);
+        if (converter != null && converter != NO_CONVERTER) {
+            return converter;
+        }
+
+        // if we have found a dummy, we return null
+        if (converter == NO_CONVERTER) {
+            return null;
+        }
+
+        // we get called the first time for this class
+        // lets search...
+
+        Map<Class<?>, ObjectConverter<?>> matchingConverters = new HashMap<Class<?>, ObjectConverter<?>>();
+
+        for (Map.Entry<Class<?>, ObjectConverter<?>> entry : objectConverters.entrySet()) {
+
+            if (clazz == entry.getKey()) {
+                converter = entry.getValue();
+                break;
+            }
+
+            if (entry.getKey().isAssignableFrom(clazz)) {
+                matchingConverters.put(entry.getKey(), entry.getValue());
+            }
+        }
+
+        if (converter != null) {
+            objectConverterCache.put(clazz, converter);
+            return converter;
+        }
+
+        if (matchingConverters.isEmpty()) {
+            objectConverterCache.put(clazz, NO_CONVERTER);
+            return null;
+        }
+
+        // search the most significant
+        Class toProcess = clazz;
+        while (toProcess != Object.class && converter == null) {
+
+            converter = matchingConverters.get(toProcess);
+            if (converter != null) {
+                break;
+            }
+
+            for (Class interfaceToSearch : toProcess.getInterfaces()) {
+
+                converter = matchingConverters.get(interfaceToSearch);
+                if (converter != null) {
+                    break;
+                }
+            }
+
+            toProcess = toProcess.getSuperclass();
+        }
+
+        if (converter == null) {
+            objectConverterCache.put(clazz, NO_CONVERTER);
+        } else {
+            objectConverterCache.put(clazz, converter);
+        }
+
+        return converter;
+    }
+
     public int getVersion() {
         return version;
     }

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/c67a73d3/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
new file mode 100644
index 0000000..321bf0b
--- /dev/null
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
@@ -0,0 +1,180 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.johnzon.mapper;
+
+import org.apache.johnzon.mapper.access.FieldAccessMode;
+import org.apache.johnzon.mapper.internal.AdapterKey;
+import org.junit.Assert;
+import org.junit.Test;
+
+import javax.json.JsonObject;
+import java.lang.reflect.Type;
+import java.nio.charset.Charset;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class MapperConfigTest {
+
+    @Test
+    public void testFindObjectConverterConverterForSpecificClass() {
+
+        ObjectConverter<ClassWithoutSupertypes> theConverter = new TheConverter<ClassWithoutSupertypes>();
+
+        Map<Class<?>, ObjectConverter<?>> converterMap = new HashMap<Class<?>, ObjectConverter<?>>(1);
+        converterMap.put(ClassWithoutSupertypes.class, theConverter);
+
+        MapperConfig config = createConfig(converterMap);
+
+        ObjectConverter converter = config.findObjectConverter(ClassWithoutSupertypes.class);
+        Assert.assertNotNull(converter);
+        Assert.assertEquals(theConverter, converter);
+    }
+
+    @Test
+    public void testFindObjectConverterConverterForInterface() {
+
+        ObjectConverter<TheInterface> theConverter = new TheConverter<TheInterface>();
+
+        MapperConfig config = createConfig(Collections.<Class<?>, ObjectConverter<?>>singletonMap(TheInterface.class, theConverter));
+
+        ObjectConverter converter = config.findObjectConverter(ClassForTheInterface.class);
+        Assert.assertNotNull(converter);
+        Assert.assertEquals(theConverter, converter);
+    }
+
+    @Test
+    public void testFindObjectConverterConverterOnlyForSuperclass() {
+
+        ObjectConverter<ClassForTheInterface> theConverter = new TheConverter<ClassForTheInterface>();
+
+        MapperConfig config = createConfig(Collections.<Class<?>, ObjectConverter<?>>singletonMap(ClassForTheInterface.class, theConverter));
+
+        ObjectConverter converter = config.findObjectConverter(ExtendingClassForTheInterface.class);
+        Assert.assertNotNull(converter);
+        Assert.assertEquals(theConverter, converter);
+    }
+
+    @Test
+    public void testFindObjectConverterConverterForInterfaceAndClass() {
+
+        ObjectConverter<TheInterface> interfaceConverter = new TheConverter<TheInterface>();
+        ObjectConverter<ClassForTheInterface> theConverter = new TheConverter<ClassForTheInterface>();
+
+        Map<Class<?>, ObjectConverter<?>> converterMap = new HashMap<Class<?>, ObjectConverter<?>>(2);
+        converterMap.put(TheInterface.class, interfaceConverter);
+        converterMap.put(ClassForTheInterface.class, theConverter);
+
+        MapperConfig config = createConfig(converterMap);
+
+        ObjectConverter converter = config.findObjectConverter(ClassForTheInterface.class);
+        Assert.assertNotNull(converter);
+        Assert.assertEquals(theConverter, converter);
+
+        converter = config.findObjectConverter(ExtendingClassForTheInterface.class);
+        Assert.assertNotNull(converter);
+        Assert.assertEquals(theConverter, converter);
+    }
+
+    @Test
+    public void testFindObjectConverterConverterForMoreInterfaces() {
+
+        ObjectConverter<TheInterface> firstConverter = new TheConverter<TheInterface>();
+        ObjectConverter<TheSecondInterface> secondConverter = new TheConverter<TheSecondInterface>();
+
+        Map<Class<?>, ObjectConverter<?>> converterMap = new HashMap<Class<?>, ObjectConverter<?>>(2);
+        converterMap.put(TheInterface.class, firstConverter);
+        converterMap.put(TheSecondInterface.class, secondConverter);
+        MapperConfig config = createConfig(converterMap);
+
+        ObjectConverter converter = config.findObjectConverter(ClassWithTwoInterfaces.class);
+        Assert.assertNotNull(converter);
+        Assert.assertEquals(converterMap.get(ClassWithTwoInterfaces.class.getInterfaces()[0]), converter);
+    }
+
+    @Test
+    public void testFindObjectConverterConverterForInterfaceAndClassConverterSubclasses() {
+
+        TheAbstractConverter<ClassForTheInterface> theConverter = new TheAbstractConverter<ClassForTheInterface>() {};
+
+        MapperConfig config = createConfig(Collections.<Class<?>, ObjectConverter<?>>singletonMap(ClassForTheInterface.class, theConverter));
+
+        ObjectConverter converter = config.findObjectConverter(ClassForTheInterface.class);
+        Assert.assertNotNull(converter);
+        Assert.assertEquals(theConverter, converter);
+
+        converter = config.findObjectConverter(ExtendingClassForTheInterface.class);
+        Assert.assertNotNull(converter);
+        Assert.assertEquals(theConverter, converter);
+    }
+
+
+    private MapperConfig createConfig(Map<Class<?>, ObjectConverter<?>> converter) {
+        return new MapperConfig(new ConcurrentHashMap<AdapterKey, Adapter<?, ?>>(0),
+                                converter,
+                                -1,
+                                true,
+                                true,
+                                true,
+                                false,
+                                false,
+                                false,
+                                new FieldAccessMode(true, true),
+                                Charset.forName("UTF-8"),
+                                null);
+    }
+
+
+    private static final class ClassWithoutSupertypes {}
+
+    private interface TheInterface {}
+    private static class ClassForTheInterface implements TheInterface {}
+    private static class ExtendingClassForTheInterface extends ClassForTheInterface {}
+
+    private interface TheSecondInterface {}
+    private static class ClassWithTwoInterfaces implements TheInterface, TheSecondInterface {}
+
+
+    private static class TheConverter<T> implements ObjectConverter<T>{
+        @Override
+        public void writeJson(T instance, MappingGenerator jsonbGenerator) {
+            // dummy
+        }
+
+        @Override
+        public T fromJson(JsonObject jsonObject, Type targetType, MappingParser parser) {
+            // dummy
+            return null;
+        }
+    }
+
+    private static abstract class TheAbstractConverter<T extends TheInterface> implements ObjectConverter<T> {
+        @Override
+        public void writeJson(T instance, MappingGenerator jsonbGenerator) {
+            // dummy
+        }
+
+        @Override
+        public T fromJson(JsonObject jsonObject, Type targetType, MappingParser parser) {
+            // dummy
+            return null;
+        }
+    }
+}


[4/7] incubator-johnzon git commit: JOHNZON-72 added ObjectConverter support for reading json

Posted by rs...@apache.org.
JOHNZON-72 added ObjectConverter support for reading json


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

Branch: refs/heads/master
Commit: e1b93f8b6940f2ed2e83f672e661b7801f95f965
Parents: cff8388
Author: Reinhard Sandtner <rs...@apache.org>
Authored: Fri Apr 15 12:06:26 2016 +0200
Committer: Reinhard Sandtner <rs...@apache.org>
Committed: Fri Apr 15 12:06:26 2016 +0200

----------------------------------------------------------------------
 .../apache/johnzon/mapper/MappingParser.java    |  2 +
 .../johnzon/mapper/MappingParserImpl.java       | 25 +++++-
 .../apache/johnzon/mapper/ObjectTypeTest.java   | 88 +++++++++++++++-----
 3 files changed, 92 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/e1b93f8b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParser.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParser.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParser.java
index cee68d8..98836d5 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParser.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParser.java
@@ -31,4 +31,6 @@ public interface MappingParser {
     <T> T readObject(Type targetType);
 
     <T> T readObject(JsonValue jsonValue, Type targetType);
+
+    <T> T readObject(JsonValue jsonValue, Type targetType, boolean applyObjectConverter);
 }

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/e1b93f8b/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 e13778d..80afdec 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
@@ -112,11 +112,15 @@ public class MappingParserImpl implements MappingParser {
 
     @Override
     public <T> T readObject(JsonValue jsonValue, Type targetType) {
+        return readObject(jsonValue, targetType, targetType instanceof Class);
+    }
+
+    public <T> T readObject(JsonValue jsonValue, Type targetType, boolean applyObjectConverter) {
         if (JsonStructure.class == targetType || JsonObject.class == targetType || JsonValue.class == targetType) {
             return (T) jsonValue;
         }
         if (JsonObject.class.isInstance(jsonValue)) {
-            return (T) buildObject(targetType, JsonObject.class.cast(jsonValue));
+            return (T) buildObject(targetType, JsonObject.class.cast(jsonValue), applyObjectConverter);
         }
         if (JsonString.class.isInstance(jsonValue) && targetType == String.class) {
             return (T) JsonString.class.cast(jsonValue).getString();
@@ -170,12 +174,24 @@ public class MappingParserImpl implements MappingParser {
     }
 
 
-    private Object buildObject(final Type inType, final JsonObject object) {
+    private Object buildObject(final Type inType, final JsonObject object, final boolean applyObjectConverter) {
         Type type = inType;
         if (inType == Object.class) {
             type = new JohnzonParameterizedType(Map.class, String.class, Object.class);
         }
 
+        if (applyObjectConverter && !(type instanceof JohnzonParameterizedType)) {
+
+            if (!(type instanceof Class)) {
+                throw new MapperException("ObjectConverters are only supported for Classes not Types");
+            }
+
+            ObjectConverter objectConverter = config.findObjectConverter((Class) type);
+            if (objectConverter != null) {
+                return objectConverter.fromJson(object, type, this);
+            }
+        }
+
         final Mappings.ClassMapping classMapping = mappings.findOrCreateClassMapping(type);
 
         if (classMapping == null) {
@@ -307,7 +323,8 @@ public class MappingParserImpl implements MappingParser {
 
             final Object param;
             try {
-                param = buildObject(adapterKey.getTo(), JsonObject.class.cast(jsonValue));
+                Type to = adapterKey.getTo();
+                param = buildObject(to, JsonObject.class.cast(jsonValue), to instanceof Class);
             } catch (final Exception e) {
                 throw new MapperException(e);
             }
@@ -366,7 +383,7 @@ public class MappingParserImpl implements MappingParser {
             final Object object = buildObject(
                     baseInstance != null ? baseInstance.getClass() : (
                             typedAdapter ? TypeAwareAdapter.class.cast(itemConverter).getTo() : type),
-                    JsonObject.class.cast(jsonValue));
+                    JsonObject.class.cast(jsonValue), type instanceof Class);
             return typedAdapter ? itemConverter.to(object) : object;
         } else if (JsonArray.class.isInstance(jsonValue)) {
             if (JsonArray.class == type || JsonStructure.class == type) {

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/e1b93f8b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
index e6c12d0..9f4c314 100644
--- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
@@ -52,22 +52,28 @@ public class ObjectTypeTest {
                 .setAttributeOrder(String.CASE_INSENSITIVE_ORDER)
                 .build();
 
-        String expectedJsonString = "{" +
-                                      "\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Mutt\"," +
-                                      "\"father\":{" +
-                                        "\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Beagle\"," +
-                                          "\"father\":{" +
-                                            "\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Beagle\"," +
-                                            "\"name\":\"Wuffi\"" +
-                                          "}," +
-                                          "\"name\":\"Gnarl\"}," +
-                                      "\"mother\":{" +
-                                        "\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Poodle\"," +
-                                        "\"hairCut\":true," +
-                                        "\"name\":\"Rosa\"}," +
-                                      "\"name\":\"Snoopie\"" +
-                                    "}";
+        String expectedJsonString = getJson();
+        Mutt snoopie = getJavaObject();
+
+        String json = mapper.writeObjectAsString(snoopie);
+        Assert.assertNotNull(json);
+        Assert.assertEquals(expectedJsonString, json);
+    }
+
+    @Test
+    public void testReadWithObjectConverter() {
+
+        Mapper mapper = new MapperBuilder().setAccessModeName(accessMode)
+                                           .addObjectConverter(Dog.class, new TestWithTypeConverter())
+                                           .build();
+
+        Dog dog = mapper.readObject(getJson(), Dog.class);
+        Assert.assertNotNull(dog);
+        Assert.assertEquals(getJavaObject(), dog);
+    }
 
+
+    private Mutt getJavaObject() {
         Poodle mum = new Poodle();
         mum.setName("Rosa");
         mum.setHairCut(true);
@@ -83,10 +89,25 @@ public class ObjectTypeTest {
         snoopie.setName("Snoopie");
         snoopie.setFather(dad);
         snoopie.setMother(mum);
+        return snoopie;
+    }
 
-        String json = mapper.writeObjectAsString(snoopie);
-        Assert.assertNotNull(json);
-        Assert.assertEquals(expectedJsonString, json);
+    private String getJson() {
+        return "{" +
+                                          "\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Mutt\"," +
+                                          "\"father\":{" +
+                                            "\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Beagle\"," +
+                                              "\"father\":{" +
+                                                "\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Beagle\"," +
+                                                "\"name\":\"Wuffi\"" +
+                                              "}," +
+                                              "\"name\":\"Gnarl\"}," +
+                                          "\"mother\":{" +
+                                            "\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Poodle\"," +
+                                            "\"hairCut\":true," +
+                                            "\"name\":\"Rosa\"}," +
+                                          "\"name\":\"Snoopie\"" +
+                                        "}";
     }
 
 
@@ -102,7 +123,7 @@ public class ObjectTypeTest {
             String javaType = jsonObject.getString("//javaType");
             Class targetClass = javaType != null ? getSubClass(targetType, javaType) : (Class) targetType;
 
-            return parser.readObject(jsonObject, targetClass);
+            return parser.readObject(jsonObject, targetClass, false);
         }
 
 
@@ -167,6 +188,35 @@ public class ObjectTypeTest {
         public void setMother(Dog mother) {
             this.mother = mother;
         }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) {
+                return true;
+            }
+            if (o == null || getClass() != o.getClass()) {
+                return false;
+            }
+
+            Dog dog = (Dog) o;
+
+            if (name != null ? !name.equals(dog.name) : dog.name != null) {
+                return false;
+            }
+            if (father != null ? !father.equals(dog.father) : dog.father != null) {
+                return false;
+            }
+            return mother != null ? mother.equals(dog.mother) : dog.mother == null;
+
+        }
+
+        @Override
+        public int hashCode() {
+            int result = name != null ? name.hashCode() : 0;
+            result = 31 * result + (father != null ? father.hashCode() : 0);
+            result = 31 * result + (mother != null ? mother.hashCode() : 0);
+            return result;
+        }
     }
 
     public static class Beagle extends Dog {


[7/7] incubator-johnzon git commit: JOHNZON-72 direct lookup for Object.class if we have an interface

Posted by rs...@apache.org.
JOHNZON-72 direct lookup for Object.class if we have an interface


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

Branch: refs/heads/master
Commit: 60dcff90d200b1a744b3b3da47f21cf5bdc1eec3
Parents: e059b72
Author: Reinhard Sandtner <rs...@apache.org>
Authored: Mon Apr 18 10:07:57 2016 +0200
Committer: Reinhard Sandtner <rs...@apache.org>
Committed: Mon Apr 18 10:07:57 2016 +0200

----------------------------------------------------------------------
 .../src/main/java/org/apache/johnzon/mapper/MapperConfig.java    | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/60dcff90/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
index 942d463..afd40b2 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
@@ -187,8 +187,8 @@ class MapperConfig implements Cloneable {
             }
 
             if (converter == null && toProcess.isInterface()) {
-                toProcess = Object.class;
-                continue;
+                converter = matchingConverters.get(Object.class);
+                break;
             }
 
             toProcess = toProcess.getSuperclass();


[6/7] incubator-johnzon git commit: JOHNZON-72 added test for ObjectConverter

Posted by rs...@apache.org.
JOHNZON-72 added test for ObjectConverter


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

Branch: refs/heads/master
Commit: e059b727a193aa49b5a79f98b0b093c1f9f0ccfc
Parents: ef274a4
Author: Reinhard Sandtner <rs...@apache.org>
Authored: Fri Apr 15 14:35:20 2016 +0200
Committer: Reinhard Sandtner <rs...@apache.org>
Committed: Fri Apr 15 14:41:26 2016 +0200

----------------------------------------------------------------------
 .../apache/johnzon/mapper/ObjectTypeTest.java   | 80 ++++++++++++++++++++
 1 file changed, 80 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/e059b727/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
index 9f4c314..52ea112 100644
--- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
@@ -21,7 +21,11 @@ package org.apache.johnzon.mapper;
 
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
 
 
 import javax.json.JsonObject;
@@ -72,6 +76,51 @@ public class ObjectTypeTest {
         Assert.assertEquals(getJavaObject(), dog);
     }
 
+    @Test
+    public void testWriteWithAdvancedObjectConverter() {
+
+        String expectedJson = "[{\"poodleName\":\"Poodle1\"},{\"poodleName\":\"Poodle2\"}]";
+
+        Mapper mapper = new MapperBuilder().setAccessModeName(accessMode)
+                                           .addObjectConverter(Poodle.class, new DBAccessPoodleConverter())
+                                           .build();
+
+        String json = mapper.writeObjectAsString(new ArrayList<Poodle>(DBAccessPoodleConverter.POODLES.values()));
+        Assert.assertNotNull(json);
+        Assert.assertEquals(expectedJson, json);
+    }
+
+    @Test
+    public void testReadWithAdvancedObjectConverter() {
+
+        Mapper mapper = new MapperBuilder().setAccessModeName(accessMode)
+                                           .addObjectConverter(Poodle.class, new DBAccessPoodleConverter())
+                                           .build();
+
+        List<Poodle> poodles = mapper.readObject("[{\"poodleName\":\"Poodle1\"},{\"poodleName\":\"Poodle2\"}]", new ParameterizedType() {
+            @Override
+            public Type[] getActualTypeArguments() {
+                return new Type[]{Poodle.class};
+            }
+
+            @Override
+            public Type getRawType() {
+                return List.class;
+            }
+
+            @Override
+            public Type getOwnerType() {
+                return null;
+            }
+        });
+
+        Assert.assertNotNull(poodles);
+        Assert.assertEquals(2, poodles.size());
+        for (Poodle poodle : poodles) {
+            Assert.assertEquals(DBAccessPoodleConverter.POODLES.get(poodle.getName()), poodle);
+        }
+    }
+
 
     private Mutt getJavaObject() {
         Poodle mum = new Poodle();
@@ -236,4 +285,35 @@ public class ObjectTypeTest {
 
     public static class Mutt extends Dog {
     }
+
+
+    public static class DBAccessPoodleConverter implements ObjectConverter<Poodle> {
+
+        public static final String POODLE_1_NAME = "Poodle1";
+        public static final String POODLE_2_NAME = "Poodle2";
+
+        public static final Map<String, Poodle> POODLES = new LinkedHashMap<String, Poodle>(2);
+        static {
+            Poodle poodle1 = new Poodle();
+            poodle1.setHairCut(true);
+            poodle1.setName(POODLE_1_NAME);
+
+            Poodle poodle2 = new Poodle();
+            poodle2.setHairCut(false);
+            poodle2.setName(POODLE_2_NAME);
+
+            POODLES.put(poodle1.getName(), poodle1);
+            POODLES.put(poodle2.getName(), poodle2);
+        }
+
+        @Override
+        public void writeJson(Poodle instance, MappingGenerator jsonbGenerator) {
+            jsonbGenerator.getJsonGenerator().write("poodleName", instance.getName());
+        }
+
+        @Override
+        public Poodle fromJson(JsonObject jsonObject, Type targetType, MappingParser parser) {
+            return POODLES.get(jsonObject.getString("poodleName"));
+        }
+    }
 }
\ No newline at end of file


[3/7] incubator-johnzon git commit: JOHNZON-72 implemented writing with ObjectConverter

Posted by rs...@apache.org.
JOHNZON-72 implemented writing with ObjectConverter


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

Branch: refs/heads/master
Commit: cff838844b75cc982bf4532c0bf3ed084ee0f1af
Parents: c67a73d
Author: Reinhard Sandtner <rs...@apache.org>
Authored: Thu Apr 14 16:07:58 2016 +0200
Committer: Reinhard Sandtner <rs...@apache.org>
Committed: Thu Apr 14 16:07:58 2016 +0200

----------------------------------------------------------------------
 .../johnzon/mapper/MappingGeneratorImpl.java    | 17 ++++++++++++++-
 .../apache/johnzon/mapper/ObjectTypeTest.java   | 22 +++++++++++++++-----
 2 files changed, 33 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/cff83884/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
index 3e82ebd..bc0f531 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java
@@ -93,7 +93,14 @@ public class MappingGeneratorImpl implements MappingGenerator {
             if (writeBody) {
                 generator.writeStartObject();
             }
-            doWriteObjectBody(object);
+
+            ObjectConverter objectConverter = config.findObjectConverter(objectClass);
+            if (writeBody && objectConverter != null) {
+                objectConverter.writeJson(object, this);
+            } else {
+                doWriteObjectBody(object);
+            }
+
             if (writeBody) {
                 generator.writeEnd();
             }
@@ -310,6 +317,14 @@ public class MappingGeneratorImpl implements MappingGenerator {
                 }
                 writeValue(String.class, true, false, false, false, null, key, adapted);
                 return;
+            } else {
+                ObjectConverter objectConverter = config.findObjectConverter(type);
+                if (objectConverter != null) {
+                    generator.writeStartObject(key);
+                    objectConverter.writeJson(value, this);
+                    generator.writeEnd();
+                    return;
+                }
             }
             generator.writeStartObject(key);
             doWriteObjectBody(value);

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/cff83884/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
index 2abb617..e6c12d0 100644
--- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/ObjectTypeTest.java
@@ -49,12 +49,24 @@ public class ObjectTypeTest {
         Mapper mapper = new MapperBuilder()
                 .setAccessModeName(accessMode)
                 .addObjectConverter(Dog.class, new TestWithTypeConverter())
+                .setAttributeOrder(String.CASE_INSENSITIVE_ORDER)
                 .build();
 
-        String expectedJsonString = "{\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Mutt\"," +
-                "\"mother\":{\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Poodle\",\"name\":\"Rosa\",\"hairCut\":true}," +
-                "\"father\":{\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Beagle\"," +
-                "\"father\":{\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Beagle\",\"name\":\"Wuffi\"},\"name\":\"Gnarl\"},\"name\":\"Snoopie\"}";
+        String expectedJsonString = "{" +
+                                      "\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Mutt\"," +
+                                      "\"father\":{" +
+                                        "\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Beagle\"," +
+                                          "\"father\":{" +
+                                            "\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Beagle\"," +
+                                            "\"name\":\"Wuffi\"" +
+                                          "}," +
+                                          "\"name\":\"Gnarl\"}," +
+                                      "\"mother\":{" +
+                                        "\"//javaType\":\"org.apache.johnzon.mapper.ObjectTypeTest$Poodle\"," +
+                                        "\"hairCut\":true," +
+                                        "\"name\":\"Rosa\"}," +
+                                      "\"name\":\"Snoopie\"" +
+                                    "}";
 
         Poodle mum = new Poodle();
         mum.setName("Rosa");
@@ -74,7 +86,7 @@ public class ObjectTypeTest {
 
         String json = mapper.writeObjectAsString(snoopie);
         Assert.assertNotNull(json);
-        //X TODO Assert.assertEquals(expectedJsonString, json);
+        Assert.assertEquals(expectedJsonString, json);
     }
 
 


[5/7] incubator-johnzon git commit: JOHNZON-72 enabled lookup for Object.class and improved interface handling

Posted by rs...@apache.org.
JOHNZON-72 enabled lookup for Object.class and improved interface handling


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

Branch: refs/heads/master
Commit: ef274a4c4b274ddd5b7a0b573cffe3a758c01350
Parents: e1b93f8
Author: Reinhard Sandtner <rs...@apache.org>
Authored: Fri Apr 15 13:51:51 2016 +0200
Committer: Reinhard Sandtner <rs...@apache.org>
Committed: Fri Apr 15 13:51:51 2016 +0200

----------------------------------------------------------------------
 .../org/apache/johnzon/mapper/MapperConfig.java | 18 ++++++++++++-----
 .../apache/johnzon/mapper/MapperConfigTest.java | 21 ++++++++++++++++++++
 2 files changed, 34 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/ef274a4c/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
index 8e161cc..942d463 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
@@ -168,21 +168,29 @@ class MapperConfig implements Cloneable {
 
         // search the most significant
         Class toProcess = clazz;
-        while (toProcess != Object.class && converter == null) {
+        while (toProcess != null && converter == null) {
 
             converter = matchingConverters.get(toProcess);
             if (converter != null) {
                 break;
             }
 
-            for (Class interfaceToSearch : toProcess.getInterfaces()) {
+            Class[] interfaces = toProcess.getInterfaces();
+            if (interfaces.length > 0) {
+                for (Class interfaceToSearch : interfaces) {
 
-                converter = matchingConverters.get(interfaceToSearch);
-                if (converter != null) {
-                    break;
+                    converter = matchingConverters.get(interfaceToSearch);
+                    if (converter != null) {
+                        break;
+                    }
                 }
             }
 
+            if (converter == null && toProcess.isInterface()) {
+                toProcess = Object.class;
+                continue;
+            }
+
             toProcess = toProcess.getSuperclass();
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/ef274a4c/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
index 321bf0b..7f5bac2 100644
--- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperConfigTest.java
@@ -125,6 +125,25 @@ public class MapperConfigTest {
         Assert.assertEquals(theConverter, converter);
     }
 
+    @Test
+    public void testfindObjectConverterConverterForObject() {
+        TheConverter<Object> theConverter = new TheConverter<Object>();
+
+        MapperConfig config = createConfig(Collections.<Class<?>, ObjectConverter<?>>singletonMap(Object.class, theConverter));
+
+        ObjectConverter converter = config.findObjectConverter(ClassForTheInterface.class);
+        Assert.assertNotNull(converter);
+        Assert.assertEquals(theConverter, converter);
+
+        converter = config.findObjectConverter(TheInterface.class);
+        Assert.assertNotNull(converter);
+        Assert.assertEquals(theConverter, converter);
+
+        converter = config.findObjectConverter(InterfaceExtendingTwoInterfaces.class);
+        Assert.assertNotNull(converter);
+        Assert.assertEquals(theConverter, converter);
+    }
+
 
     private MapperConfig createConfig(Map<Class<?>, ObjectConverter<?>> converter) {
         return new MapperConfig(new ConcurrentHashMap<AdapterKey, Adapter<?, ?>>(0),
@@ -151,6 +170,8 @@ public class MapperConfigTest {
     private interface TheSecondInterface {}
     private static class ClassWithTwoInterfaces implements TheInterface, TheSecondInterface {}
 
+    private interface InterfaceExtendingTwoInterfaces extends TheInterface, TheSecondInterface {}
+
 
     private static class TheConverter<T> implements ObjectConverter<T>{
         @Override