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;
         }
-
     }
 }