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/08/16 17:35:57 UTC

git commit: FLEECE-14 char handling in mapper

Repository: incubator-fleece
Updated Branches:
  refs/heads/master 9305e2148 -> ddb2885b2


FLEECE-14 char handling in mapper


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

Branch: refs/heads/master
Commit: ddb2885b21a4dc9f645f9b2d7c73d9ebdbddeb72
Parents: 9305e21
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Sat Aug 16 17:35:45 2014 +0200
Committer: Romain Manni-Bucau <rm...@apache.org>
Committed: Sat Aug 16 17:35:45 2014 +0200

----------------------------------------------------------------------
 .../java/org/apache/fleece/mapper/Mapper.java   | 85 +++++++++++++++-----
 .../org/apache/fleece/mapper/MapperBuilder.java |  4 +
 .../fleece/mapper/reflection/Mappings.java      |  2 +
 .../fleece/mapper/MapperEnhancedTest.java       | 39 ++++++++-
 .../org/apache/fleece/mapper/MapperTest.java    |  6 +-
 5 files changed, 113 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/ddb2885b/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 967d597..094eb69 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
@@ -107,7 +107,13 @@ public class Mapper {
             return generator.write(BigDecimal.class.cast(value));
         } else if (type == BigInteger.class) {
             return generator.write(BigInteger.class.cast(value));
-        }
+        } else if (type == short.class || type == Short.class) {
+            return generator.write(Short.class.cast(value).shortValue());
+        } else if (type == char.class || type == Character.class) {
+            return generator.write(Character.class.cast(value).toString());
+        } else if (type == byte.class || type == Byte.class) {
+            return generator.write(Byte.class.cast(value).byteValue());
+        }        
         return null;
     }
 
@@ -129,7 +135,9 @@ public class Mapper {
             return generator.write(key, BigDecimal.class.cast(value));
         } else if (type == BigInteger.class) {
             return generator.write(key, BigInteger.class.cast(value));
-        }
+        } else if (type == char.class || type == Character.class) {
+            return generator.write(key, Character.class.cast(value).toString());
+        } 
         return generator;
     }
 
@@ -519,41 +527,80 @@ public class Mapper {
     }
 
     private Object toObject(final JsonValue jsonValue, final Type type) throws InstantiationException, IllegalAccessException {
+      
+        if(jsonValue == null || jsonValue == JsonValue.NULL) {           
+            return null;
+        }
+        
+        if (type == Boolean.class || type == boolean.class) {
+            
+            //if this would be commented out than the json string value "true" would pe parsed to a bool literal
+            //but this is according to json spec invalid
+            /*if (JsonString.class.isInstance(jsonValue)) {
+                return Boolean.valueOf(JsonString.class.cast(jsonValue).getString());
+            }*/
+            
+            if(jsonValue == JsonValue.FALSE) {
+                return Boolean.FALSE;
+            }
+            
+            if(jsonValue == JsonValue.TRUE) {
+                return Boolean.TRUE;
+            }
+            
+            throw new MapperException("Unable to parse "+jsonValue+" to boolean");
+        }
+        
+        if (type == Character.class || type == char.class) {
+            
+            return convertTo(Class.class.cast(type), (JsonString.class.cast(jsonValue).getString()));
+        }
         
-        Object convertedValue = null;
         if (JsonObject.class.isInstance(jsonValue)) {
-            convertedValue = buildObject(type, JsonObject.class.cast(jsonValue));
+            return buildObject(type, JsonObject.class.cast(jsonValue));
         } else if (JsonArray.class.isInstance(jsonValue)) {
-            convertedValue = buildArray(type, JsonArray.class.cast(jsonValue));
-        } else if (JsonString.class.isInstance(jsonValue)) {
-            convertedValue = JsonString.class.cast(jsonValue).getString();
-        } else if (jsonValue != null && JsonValue.NULL != jsonValue) {
-            if (JsonNumber.class.isInstance(jsonValue)) {
+            return buildArray(type, JsonArray.class.cast(jsonValue));
+        } else if (JsonNumber.class.isInstance(jsonValue)) {
+                
                 final JsonNumber number = JsonNumber.class.cast(jsonValue);
+                
+                if (type == Long.class || type == long.class) {
+                    return number.longValue();
+                }
+                
                 if (type == Integer.class || type == int.class) {
                     return number.intValue();
                 }
-                if (type == Long.class || type == long.class) {
-                    return number.longValue();
+                                
+                if (type == Short.class || type == short.class) {
+                    return (short) number.intValue();
+                }
+                
+                if (type == Byte.class || type == byte.class) {
+                    return (byte) number.intValue();
                 }
+                
+                if (type == Float.class || type == float.class) {
+                    return (float) number.doubleValue();
+                }
+                
                 if (type == Double.class || type == double.class) {
                     return number.doubleValue();
                 }
+                
                 if (type == BigInteger.class) {
                     return number.bigIntegerValue();
                 }
                 if (type == BigDecimal.class) {
                     return number.bigDecimalValue();
                 }
-            }
-
-            final String text = jsonValue.toString();
-            if (text != null) {
-                
-                convertedValue = convertTo(Class.class.cast(type), text);
-            }
+           
+        } else if (JsonString.class.isInstance(jsonValue)) {
+            return convertTo(Class.class.cast(type), (JsonString.class.cast(jsonValue).getString()));
         }
-        return convertedValue;
+
+        
+        throw new MapperException("Unable to parse "+jsonValue+" to "+type);
     }
 
     private Object buildArray(final Type type, final JsonArray jsonArray) throws IllegalAccessException, InstantiationException {

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/ddb2885b/fleece-mapper/src/main/java/org/apache/fleece/mapper/MapperBuilder.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/main/java/org/apache/fleece/mapper/MapperBuilder.java b/fleece-mapper/src/main/java/org/apache/fleece/mapper/MapperBuilder.java
index 02b2de2..7ec07bd 100644
--- a/fleece-mapper/src/main/java/org/apache/fleece/mapper/MapperBuilder.java
+++ b/fleece-mapper/src/main/java/org/apache/fleece/mapper/MapperBuilder.java
@@ -23,6 +23,7 @@ import org.apache.fleece.mapper.converter.BigIntegerConverter;
 import org.apache.fleece.mapper.converter.BooleanConverter;
 import org.apache.fleece.mapper.converter.ByteConverter;
 import org.apache.fleece.mapper.converter.CachedDelegateConverter;
+import org.apache.fleece.mapper.converter.CharacterConverter;
 import org.apache.fleece.mapper.converter.ClassConverter;
 import org.apache.fleece.mapper.converter.DateConverter;
 import org.apache.fleece.mapper.converter.DoubleConverter;
@@ -35,6 +36,7 @@ import org.apache.fleece.mapper.converter.StringConverter;
 import javax.json.JsonReaderFactory;
 import javax.json.spi.JsonProvider;
 import javax.json.stream.JsonGeneratorFactory;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.Collections;
@@ -54,6 +56,7 @@ public class MapperBuilder {
         DEFAULT_CONVERTERS.put(BigDecimal.class, new BigDecimalConverter());
         DEFAULT_CONVERTERS.put(BigInteger.class, new BigIntegerConverter());
         DEFAULT_CONVERTERS.put(Byte.class, new CachedDelegateConverter<Byte>(new ByteConverter()));
+        DEFAULT_CONVERTERS.put(Character.class, new CharacterConverter());
         DEFAULT_CONVERTERS.put(Double.class, new DoubleConverter());
         DEFAULT_CONVERTERS.put(Float.class, new FloatConverter());
         DEFAULT_CONVERTERS.put(Integer.class, new IntegerConverter());
@@ -61,6 +64,7 @@ public class MapperBuilder {
         DEFAULT_CONVERTERS.put(Short.class, new ShortConverter());
         DEFAULT_CONVERTERS.put(Boolean.class, new CachedDelegateConverter<Boolean>(new BooleanConverter()));
         DEFAULT_CONVERTERS.put(byte.class, DEFAULT_CONVERTERS.get(Byte.class));
+        DEFAULT_CONVERTERS.put(char.class, new CharacterConverter());
         DEFAULT_CONVERTERS.put(double.class, DEFAULT_CONVERTERS.get(Double.class));
         DEFAULT_CONVERTERS.put(float.class, DEFAULT_CONVERTERS.get(Float.class));
         DEFAULT_CONVERTERS.put(int.class, DEFAULT_CONVERTERS.get(Integer.class));

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/ddb2885b/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 51a2299..4006515 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
@@ -160,6 +160,8 @@ public class Mappings {
     public static boolean isPrimitive(final Type type) {
         if (type == String.class) {
             return true;
+        } else if (type == char.class || type == Character.class) {
+            return true;
         } else if (type == long.class || type == Long.class) {
             return true;
         } else if (type == int.class || type == Integer.class

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/ddb2885b/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperEnhancedTest.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperEnhancedTest.java b/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperEnhancedTest.java
index 403ee34..4f020e6 100644
--- a/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperEnhancedTest.java
+++ b/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperEnhancedTest.java
@@ -18,12 +18,14 @@
  */
 package org.apache.fleece.mapper;
 
+import org.junit.Assert;
 import org.junit.Test;
 
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Comparator;
 import java.util.Date;
 import java.util.HashMap;
@@ -46,7 +48,21 @@ public class MapperEnhancedTest {
         new MapperBuilder().build().writeObject(null, sw);
         assertEquals("{}", sw.toString());
     }
-   
+    
+    @Test
+    public void writeReadChar() {
+        CharClass charClass = new CharClass();
+        charClass.setCharValue('G');
+        charClass.setCharArr(new char[]{'G','O'});
+        final StringWriter sw = new StringWriter();
+        
+        new MapperBuilder().build().writeObject(charClass, sw);
+        assertEquals("{\"charArr\":[\"G\",\"O\"],\"charValue\":\"G\"}", sw.toString());
+        CharClass  read = new MapperBuilder().build().readObject(new StringReader(sw.toString()), CharClass.class);
+        Assert.assertNotNull(read);
+        Assert.assertEquals('G', read.getCharValue());
+        Assert.assertTrue(Arrays.equals(new char[]{'G','O'}, read.getCharArr()));
+    }
     
     @Test
     public void writeReadSortedMap() {
@@ -199,6 +215,27 @@ public class MapperEnhancedTest {
         }        
     }
     
+    public static class CharClass {
+        private char charValue;
+        private char charArr[];
+        
+        public char[] getCharArr() {
+            return charArr;
+        }
+
+        public void setCharArr(char[] charArr) {
+            this.charArr = charArr;
+        }
+
+        public char getCharValue() {
+            return charValue;
+        }
+
+        public void setCharValue(char charValue) {
+            this.charValue = charValue;
+        }           
+    }
+    
     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>();

http://git-wip-us.apache.org/repos/asf/incubator-fleece/blob/ddb2885b/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperTest.java
----------------------------------------------------------------------
diff --git a/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperTest.java b/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperTest.java
index bcba569..6779f0b 100644
--- a/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperTest.java
+++ b/fleece-mapper/src/test/java/org/apache/fleece/mapper/MapperTest.java
@@ -177,7 +177,7 @@ public class MapperTest {
         
     }
     
-    @Test(expected= IllegalArgumentException.class)
+    @Test(expected= MapperException.class)
     public void literalFail() {
          
         final Bool instance = new MapperBuilder().build()
@@ -187,7 +187,7 @@ public class MapperTest {
         
     }
     
-    /*@Test(expected= IllegalArgumentException.class)
+    @Test(expected= MapperException.class)
     public void literalFail2() {
          
         final Bool2 instance = new MapperBuilder().build()
@@ -195,7 +195,7 @@ public class MapperTest {
        
         
         
-    }*/
+    }
 
     @Test
     public void writeArray() {