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