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 {