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 2015/02/25 08:49:59 UTC

incubator-johnzon git commit: JOHNZON-38 also use Collection getter as writer is flag is set

Repository: incubator-johnzon
Updated Branches:
  refs/heads/master c60739d13 -> 40575520f


JOHNZON-38 also use Collection getter as writer is flag is set


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

Branch: refs/heads/master
Commit: 40575520f697e370a4e94b17743dbf2cdd04bcd1
Parents: c60739d
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Wed Feb 25 08:49:47 2015 +0100
Committer: Romain Manni-Bucau <rm...@apache.org>
Committed: Wed Feb 25 08:49:47 2015 +0100

----------------------------------------------------------------------
 .../jaxrs/ConfigurableJohnzonProvider.java      |  4 ++
 .../java/org/apache/johnzon/mapper/Mapper.java  | 14 +++----
 .../apache/johnzon/mapper/MapperBuilder.java    | 15 +++++++-
 .../mapper/access/FieldAndMethodAccessMode.java |  2 +-
 .../johnzon/mapper/access/MethodAccessMode.java | 39 ++++++++++++++++++--
 .../org/apache/johnzon/mapper/MapperTest.java   | 20 ++++++++++
 6 files changed, 78 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/40575520/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java
----------------------------------------------------------------------
diff --git a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java
index a169925..3997ca3 100644
--- a/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java
+++ b/johnzon-jaxrs/src/main/java/org/apache/johnzon/jaxrs/ConfigurableJohnzonProvider.java
@@ -104,6 +104,10 @@ public class ConfigurableJohnzonProvider<T> implements MessageBodyWriter<T>, Mes
         builder.setPretty(pretty);
     }
 
+    public void setSupportGetterForCollections(final boolean supportGetterForCollections) {
+        builder.setSupportGetterForCollections(supportGetterForCollections);
+    }
+
     public void setSupportsComments(final boolean supportsComments) {
         builder.setSupportsComments(supportsComments);
     }

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/40575520/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 1a16a8e..7a70575 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
@@ -77,16 +77,14 @@ public class Mapper {
     protected final boolean close;
     protected final ConcurrentMap<Type, Converter<?>> converters;
     protected final int version;
-    //private final boolean hiddenConstructorSupported;
-    //private final AccessMode accessMode;
-    protected boolean skipNull;
-    protected boolean skipEmptyArray;
-    protected boolean treatByteArrayAsBase64;
+    protected final boolean skipNull;
+    protected final boolean skipEmptyArray;
+    protected final boolean treatByteArrayAsBase64;
 
     public Mapper(final JsonReaderFactory readerFactory, final JsonGeneratorFactory generatorFactory,
                   final boolean doClose, final Map<Class<?>, Converter<?>> converters,
-                  final int version, final Comparator<String> attributeOrder, boolean skipNull, boolean skipEmptyArray,
-                  final AccessMode accessMode, final boolean hiddenConstructorSupported, boolean treatByteArrayAsBase64) {
+                  final int version, final Comparator<String> attributeOrder, final boolean skipNull, final boolean skipEmptyArray,
+                  final AccessMode accessMode, final boolean hiddenConstructorSupported, final boolean treatByteArrayAsBase64) {
         this.readerFactory = readerFactory;
         this.generatorFactory = generatorFactory;
         this.close = doClose;
@@ -95,8 +93,6 @@ public class Mapper {
         this.mappings = new Mappings(attributeOrder, accessMode, hiddenConstructorSupported);
         this.skipNull = skipNull;
         this.skipEmptyArray = skipEmptyArray;
-        //this.accessMode = accessMode;
-        //this.hiddenConstructorSupported = hiddenConstructorSupported;
         this.treatByteArrayAsBase64 = treatByteArrayAsBase64;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/40575520/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 b447464..d46217a 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
@@ -81,6 +81,7 @@ public class MapperBuilder {
     private JsonGeneratorFactory generatorFactory;
     private boolean doCloseOnStreams = false;
     private boolean supportHiddenAccess = true;
+    private boolean supportGetterForCollections = false;
     private int version = -1;
     private int maxSize = -1;
     private int bufferSize = -1;
@@ -90,7 +91,7 @@ public class MapperBuilder {
     private boolean skipEmptyArray = false;
     private boolean supportsComments = false;
     protected boolean pretty;
-    private AccessMode accessMode = new MethodAccessMode();
+    private AccessMode accessMode = new MethodAccessMode(false);
     private boolean treatByteArrayAsBase64;
     private final Map<Class<?>, Converter<?>> converters = new HashMap<Class<?>, Converter<?>>(DEFAULT_CONVERTERS);
 
@@ -136,6 +137,14 @@ public class MapperBuilder {
                 treatByteArrayAsBase64);
     }
 
+    public MapperBuilder setSupportGetterForCollections(final boolean useGetterForCollections) {
+        this.supportGetterForCollections = useGetterForCollections;
+        if (supportGetterForCollections) {
+            accessMode = new MethodAccessMode(supportGetterForCollections);
+        }
+        return this;
+    }
+
     public MapperBuilder setSupportsComments(final boolean supportsComments) {
         this.supportsComments = supportsComments;
         return this;
@@ -170,7 +179,9 @@ public class MapperBuilder {
         if ("field".equalsIgnoreCase(mode)) {
             this.accessMode = new FieldAccessMode();
         } else if ("method".equalsIgnoreCase(mode)) {
-            this.accessMode = new MethodAccessMode();
+            this.accessMode = new MethodAccessMode(true);
+        } else if ("strict-method".equalsIgnoreCase(mode)) {
+            this.accessMode = new MethodAccessMode(false);
         } else if ("both".equalsIgnoreCase(mode)) {
             this.accessMode = new FieldAndMethodAccessMode();
         } else {

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/40575520/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAndMethodAccessMode.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAndMethodAccessMode.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAndMethodAccessMode.java
index 94acbe0..f108616 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAndMethodAccessMode.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/FieldAndMethodAccessMode.java
@@ -24,7 +24,7 @@ import java.util.Map;
 // methods override fields
 public class FieldAndMethodAccessMode implements AccessMode {
     private final FieldAccessMode fields = new FieldAccessMode();
-    private final MethodAccessMode methods = new MethodAccessMode();
+    private final MethodAccessMode methods = new MethodAccessMode(false);
 
     @Override
     public Map<String, Reader> findReaders(final Class<?> clazz) {

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/40575520/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java
index 62fee0f..9167b98 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/access/MethodAccessMode.java
@@ -27,10 +27,17 @@ import java.beans.PropertyDescriptor;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 import java.lang.reflect.Type;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 
 public class MethodAccessMode implements AccessMode {
+    private final boolean supportGetterAsWritter;
+
+    public MethodAccessMode(final boolean supportGetterAsWritter) {
+        this.supportGetterAsWritter = supportGetterAsWritter;
+    }
+
     @Override
     public Map<String, Reader> findReaders(final Class<?> clazz) {
         final Map<String, Reader> readers = new HashMap<String, Reader>();
@@ -52,12 +59,16 @@ public class MethodAccessMode implements AccessMode {
         final Map<String, Writer> writers = new HashMap<String, Writer>();
         final PropertyDescriptor[] propertyDescriptors = getPropertyDescriptors(clazz);
         for (final PropertyDescriptor descriptor : propertyDescriptors) {
+            if (descriptor.getPropertyType() == Class.class || isIgnored(descriptor.getName())) {
+                continue;
+            }
             final Method writeMethod = descriptor.getWriteMethod();
-            if (writeMethod != null && writeMethod.getDeclaringClass() != Object.class) {
-                if (isIgnored(descriptor.getName())) {
-                    continue;
-                }
+            if (writeMethod != null) {
                 writers.put(extractKey(descriptor), new MethodWriter(writeMethod));
+            } else if (supportGetterAsWritter
+                    && Collection.class.isAssignableFrom(descriptor.getPropertyType())
+                    && descriptor.getReadMethod() != null) {
+                writers.put(extractKey(descriptor), new MethodGetterAsWriter(descriptor.getReadMethod()));
             }
         }
         return writers;
@@ -137,4 +148,24 @@ public class MethodAccessMode implements AccessMode {
             }
         }
     }
+
+    private class MethodGetterAsWriter extends MethodReader implements Writer {
+        public MethodGetterAsWriter(final Method readMethod) {
+            super(readMethod);
+        }
+
+        @Override
+        public void write(final Object instance, final Object value) {
+            if (value != null) {
+                try {
+                    final Collection<?> collection = Collection.class.cast(method.invoke(instance));
+                    if (collection != null) {
+                        collection.addAll(Collection.class.cast(value));
+                    }
+                } catch (final Exception e) {
+                    throw new MapperException(e);
+                }
+            }
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-johnzon/blob/40575520/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java
----------------------------------------------------------------------
diff --git a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java
index cf86ec8..49b9954 100644
--- a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java
+++ b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperTest.java
@@ -31,6 +31,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Comparator;
 import java.util.LinkedHashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
@@ -429,6 +430,14 @@ public class MapperTest {
         assertEquals("{}", value);
     }
 
+
+    @Test
+    public void noSetterCollection() {
+        final NoSetterCollection value = new MapperBuilder().setSupportGetterForCollections(true).build()
+                .readObject(new ByteArrayInputStream("{\"theCollection\":[\"a\",\"b\"]}".getBytes()), NoSetterCollection.class);
+        assertEquals(asList("a", "b"), value.getTheCollection());
+    }
+
     @Test
     public void aliases() {
         {
@@ -801,6 +810,17 @@ public class MapperTest {
             this.superLongProperty = superLongProperty;
         }
     }
+
+    public static class NoSetterCollection {
+        private Collection<String> theCollection;
+
+        public Collection<String> getTheCollection() {
+            if (theCollection == null) {
+                theCollection = new LinkedList<String>();
+            }
+            return theCollection;
+        }
+    }
     
     /*public static class ByteArray {