You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rm...@apache.org on 2014/07/13 10:18:53 UTC
git commit: using toString to write unknown types by default
Repository: incubator-fleece
Updated Branches:
refs/heads/master d6c1bb8b2 -> 351374bbe
using toString to write unknown types by default
Project: http://git-wip-us.apache.org/repos/asf/incubator-fleece/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-fleece/commit/351374bb
Tree: http://git-wip-us.apache.org/repos/asf/incubator-fleece/tree/351374bb
Diff: http://git-wip-us.apache.org/repos/asf/incubator-fleece/diff/351374bb
Branch: refs/heads/master
Commit: 351374bbefbf107a4b12b210980c945e220eef60
Parents: d6c1bb8
Author: Romain Manni-Bucau <rm...@gmail.com>
Authored: Sun Jul 13 10:18:41 2014 +0200
Committer: Romain Manni-Bucau <rm...@gmail.com>
Committed: Sun Jul 13 10:18:41 2014 +0200
----------------------------------------------------------------------
.../java/org/apache/fleece/mapper/Mapper.java | 42 ++++++++++----
.../fleece/mapper/reflection/Mappings.java | 2 +-
.../fleece/mapper/MapperEnhancedTests.java | 59 ++++++++++++++------
3 files changed, 73 insertions(+), 30 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/351374bb/fleece-mapper/src/main/java/org/apache/fleece/mapper/Mapper.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/Mapper.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/Mapper.java
index 815426f..70bde53 100644
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/Mapper.java
+++ b/fleece-mapper/src/main/java/org/apache/fleece/mapper/Mapper.java
@@ -63,12 +63,13 @@ import static java.util.Arrays.asList;
public class Mapper {
protected static final JsonObjectImpl EMPTY_OBJECT = new JsonObjectImpl();
+ private static final Converter<Object> FALLBACK_CONVERTER = new FallbackConverter();
protected final Mappings mappings = new Mappings();
protected final JsonReaderFactory readerFactory;
protected final JsonGeneratorFactory generatorFactory;
protected final boolean close;
- protected final ConcurrentMap<Class<?>, Converter<?>> converters;
+ protected final ConcurrentMap<Type, Converter<?>> converters;
protected final int version;
public Mapper(final JsonReaderFactory readerFactory, final JsonGeneratorFactory generatorFactory,
@@ -77,7 +78,7 @@ public class Mapper {
this.readerFactory = readerFactory;
this.generatorFactory = generatorFactory;
this.close = doClose;
- this.converters = new ConcurrentHashMap<Class<?>, Converter<?>>(converters);
+ this.converters = new ConcurrentHashMap<Type, Converter<?>>(converters);
this.version = version;
}
@@ -138,23 +139,27 @@ public class Mapper {
return converter.toString(value);
}
- private <T> Converter<T> findConverter(final Class<T> aClass) {
+ private <T> Converter<T> findConverter(final Type aClass) {
final Converter<T> converter = (Converter<T>) converters.get(aClass);
if (converter != null) {
return converter;
}
- if (aClass.isEnum()) {
- final Converter<T> enumConverter = new EnumConverter(aClass);
- converters.putIfAbsent(aClass, enumConverter);
- return enumConverter;
+ if (Class.class.isInstance(aClass)) {
+ final Class<?> clazz = Class.class.cast(aClass);
+ if (clazz.isEnum()) {
+ final Converter<T> enumConverter = new EnumConverter(clazz);
+ converters.putIfAbsent(clazz, enumConverter);
+ return enumConverter;
+ }
}
return null;
}
- private Object convertTo(final Class<?> aClass, final String text) {
+ private Object convertTo(final Type aClass, final String text) {
final Converter<?> converter = findConverter(aClass);
if (converter == null) {
- throw new MapperException("can't convert String to " + aClass.getName());
+ converters.putIfAbsent(aClass, FALLBACK_CONVERTER);
+ return FALLBACK_CONVERTER;
}
return converter.fromString(text);
}
@@ -465,13 +470,13 @@ public class Mapper {
if (map != null) {
- Class<?> keyType = null;
+ Type keyType = null;
if (ParameterizedType.class.isInstance(fieldArgTypes[0])) {
//class cast exception when fieldArgTypes[0] is parameterized
//FIXME
- keyType = Class.class.cast(fieldArgTypes[0]);
+ keyType = fieldArgTypes[0];
} else {
- keyType = Class.class.cast(fieldArgTypes[0]);
+ keyType = fieldArgTypes[0];
}
for (final Map.Entry<String, JsonValue> value : object.entrySet()) {
@@ -594,4 +599,17 @@ public class Mapper {
}
return array;
}
+
+ private static class FallbackConverter implements Converter<Object> {
+ @Override
+ public String toString(final Object instance) {
+ return instance.toString();
+ }
+
+ @Override
+ public Object fromString(final String text) {
+ throw new UnsupportedOperationException("Using fallback converter, " +
+ "this only works in write mode but not in read. Please register a custom converter to do so.");
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/351374bb/fleece-mapper/src/main/java/org/apache/fleece/mapper/reflection/Mappings.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/reflection/Mappings.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/reflection/Mappings.java
index f5e6e6d..5c9af1a 100644
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/reflection/Mappings.java
+++ b/fleece-mapper/src/main/java/org/apache/fleece/mapper/reflection/Mappings.java
@@ -84,7 +84,7 @@ public class Mappings {
this.converter = converter;
this.version = version;
this.array = array;
- this.map = map;
+ this.map = map && converter == null;
this.collection = collection;
this.primitive = primitive;
}
http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/351374bb/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperEnhancedTests.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperEnhancedTests.java b/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperEnhancedTests.java
index 8169655..8e69657 100644
--- a/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperEnhancedTests.java
+++ b/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperEnhancedTests.java
@@ -18,7 +18,7 @@
*/
package org.apache.fleece.mapper;
-import static org.junit.Assert.assertEquals;
+import org.junit.Test;
import java.io.StringReader;
import java.io.StringWriter;
@@ -35,7 +35,7 @@ import java.util.TreeMap;
import java.util.TreeSet;
import java.util.concurrent.ArrayBlockingQueue;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
public class MapperEnhancedTests {
@@ -88,9 +88,46 @@ public class MapperEnhancedTests {
}
- /*@Test
+ @Test
public void writeTestclass() {
final StringWriter sw = new StringWriter();
+ final TestClass tc2 = buildTestClassInstance();
+
+ new MapperBuilder().build().writeObject(tc2, sw);
+ assertEquals("{" +
+ "\"bd\":-456.4567890987654321,\"string\":\"some \\t \\u0001 unicode: ÖÄÜ pppন\"," +
+ "\"dates\":[]," +
+ "\"sose\":[]," +
+ "\"inner\":{" +
+ "\"bd\":-456.4567890987654321," +
+ "\"string\":\"some \\t \\u0001 unicode: ÖÄÜ pppন\"," +
+ "\"dates\":[]," +
+ "\"sose\":[\"string1\",\"string2\"]," +
+ "\"map\":{\"[{key1=-100, key11=-1002, key2=100, key22=1002}, {}]\":100}" +
+ "}," +
+ "\"map\":{\"[{key1=-100, key11=-1002, key2=100, key22=1002}, {}]\":200}}",
+ sw.toString());
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void needConvertersForComplexTypes() {
+ final String str = "{" +
+ "\"bd\":-456.4567890987654321,\"string\":\"some \\t \\u0001 unicode: ÖÄÜ pppন\"," +
+ "\"dates\":[]," +
+ "\"sose\":[]," +
+ "\"inner\":{" +
+ "\"bd\":-456.4567890987654321," +
+ "\"string\":\"some \\t \\u0001 unicode: ÖÄÜ pppন\"," +
+ "\"dates\":[]," +
+ "\"sose\":[\"string1\",\"string2\"]," +
+ "\"map\":{\"[{key1=-100, key11=-1002, key2=100, key22=1002}, {}]\":100}" +
+ "}," +
+ "\"map\":{\"[{key1=-100, key11=-1002, key2=100, key22=1002}, {}]\":200}}";
+
+ new MapperBuilder().build().readObject(new StringReader(str), TestClass.class);
+ }
+
+ private TestClass buildTestClassInstance() {
final TestClass tc1 = new TestClass(null);
final Map<String, Integer> m = new TreeMap<String, Integer>();
m.put("key1", -100);
@@ -116,14 +153,9 @@ public class MapperEnhancedTests {
l1.add(m);
l1.add(m2);
tc2.map.put(l1, 200L);
+ return tc2;
+ }
- new MapperBuilder().build().writeObject(tc2, sw);
-
-
- new MapperBuilder().build().readObject(new StringReader(sw.toString()), TestClass.class);
- }*/
-
-
public static class QueueClass {
private Queue<String> queue = new ArrayBlockingQueue<String>(5);
@@ -134,9 +166,6 @@ public class MapperEnhancedTests {
public void setQueue(Queue<String> queue) {
this.queue = queue;
}
-
-
-
}
public static class SoseClass {
@@ -149,7 +178,6 @@ public class MapperEnhancedTests {
public void setSose(SortedSet<String> sose) {
this.sose = sose;
}
-
}
public static class SomaClass {
@@ -165,7 +193,6 @@ public class MapperEnhancedTests {
}
public static class TestClass {
-
private List<Map<String, Date>> dates = new ArrayList<Map<String, Date>>();
private Map<List<Map<String, Integer>>, Long> map = new HashMap<List<Map<String, Integer>>, Long>();
private TestClass inner;
@@ -188,7 +215,6 @@ public class MapperEnhancedTests {
public TestClass() {
super();
-
}
public List<Map<String, Date>> getDates() {
@@ -230,6 +256,5 @@ public class MapperEnhancedTests {
public void setBd(final BigDecimal bd) {
this.bd = bd;
}
-
}
}