Repository: johnzon Updated Branches: refs/heads/master 2ca9baf80 -> 2ffe0f697
JOHNZON-143 make isDeduplicateObjects config a ternary flag. The rule is now: * _explicit_ decuplicateObjects set via config? -> use this * otherwise -> check @JohnzonDeduplicateObjects annotation * otherwise -> false Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/2ffe0f69 Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/2ffe0f69 Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/2ffe0f69 Branch: refs/heads/master Commit: 2ffe0f69735021508cd0b064d88044492ccc234c Parents: 2ca9baf Author: Mark Struberg <[email protected]> Authored: Thu Nov 2 14:45:33 2017 +0100 Committer: Mark Struberg <[email protected]> Committed: Thu Nov 2 14:45:33 2017 +0100 ---------------------------------------------------------------------- .../java/org/apache/johnzon/mapper/Mapper.java | 25 ++++++++++++-------- .../apache/johnzon/mapper/MapperBuilder.java | 11 +++++++-- .../org/apache/johnzon/mapper/MapperConfig.java | 6 ++--- .../johnzon/mapper/MappingParserImpl.java | 12 ++-------- 4 files changed, 29 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/johnzon/blob/2ffe0f69/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 29bf3fd..52b57da 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 @@ -86,7 +86,8 @@ public class Mapper implements Closeable { public <T> void writeArray(final Collection<T> object, final Writer stream) { JsonGenerator generator = generatorFactory.createGenerator(stream(stream)); - writeObject(object, generator, null, config.isDeduplicateObjects() ? new JsonPointerTracker(null, "/") : null); + boolean dedup = Boolean.TRUE.equals(config.isDeduplicateObjects()); + writeObject(object, generator, null, dedup ? new JsonPointerTracker(null, "/") : null); } public <T> void writeIterable(final Iterable<T> object, final OutputStream stream) { @@ -95,7 +96,8 @@ public class Mapper implements Closeable { public <T> void writeIterable(final Iterable<T> object, final Writer stream) { JsonGenerator generator = generatorFactory.createGenerator(stream(stream)); - writeObject(object, generator, null, new JsonPointerTracker(null, "/")); + boolean dedup = Boolean.TRUE.equals(config.isDeduplicateObjects()); + writeObject(object, generator, null, dedup ? new JsonPointerTracker(null, "/") : null); } public void writeObject(final Object object, final Writer stream) { @@ -131,16 +133,15 @@ public class Mapper implements Closeable { } private boolean isDeduplicateObjects(Class<?> rootType) { - Boolean dedup = null; - Mappings.ClassMapping classMapping = mappings.findOrCreateClassMapping(rootType); - if (classMapping != null) { - dedup = classMapping.isDeduplicateObjects(); - } + Boolean dedup = config.isDeduplicateObjects(); if (dedup == null) { - dedup = config.isDeduplicateObjects(); + Mappings.ClassMapping classMapping = mappings.findOrCreateClassMapping(rootType); + if (classMapping != null) { + dedup = classMapping.isDeduplicateObjects(); + } } - return dedup; + return dedup != null ? dedup : false; } public void writeObject(final Object object, final OutputStream stream) { @@ -248,7 +249,11 @@ public class Mapper implements Closeable { private <T> T mapObject(final Type clazz, final JsonReader reader) { - return new MappingParserImpl(config, mappings, reader, clazz).readObject(clazz); + boolean dedup = false; + if (clazz instanceof Class) { + dedup = isDeduplicateObjects((Class) clazz); + } + return new MappingParserImpl(config, mappings, reader, dedup).readObject(clazz); } http://git-wip-us.apache.org/repos/asf/johnzon/blob/2ffe0f69/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 3c90309..387f3e6 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 @@ -133,7 +133,7 @@ public class MapperBuilder { private boolean failOnUnknownProperties; private SerializeValueFilter serializeValueFilter; private boolean useBigDecimalForFloats; - private boolean deduplicateObjects; + private Boolean deduplicateObjects = null; public Mapper build() { if (readerFactory == null || generatorFactory == null) { @@ -443,8 +443,15 @@ public class MapperBuilder { * * When deserialised back Johnzon will automatically de-reference the JsonPointer * back to the correct instance. + * + * Possible values: + * <ul> + * <li>{@code true}: deduplicate objects</li> + * <li>{@code false}: do <b>not</b> deduplicate objects</li> + * <li>{@code null}: dedupliate based on the {@link JohnzonDeduplicateObjects} annotation. This is the default</li> + * </ul> */ - public MapperBuilder setDeduplicateObjects(boolean deduplicateObjects) { + public MapperBuilder setDeduplicateObjects(Boolean deduplicateObjects) { this.deduplicateObjects = deduplicateObjects; return this; } http://git-wip-us.apache.org/repos/asf/johnzon/blob/2ffe0f69/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java index 71cb51a..44cea05 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java @@ -66,7 +66,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig implements Cloneable { private final boolean failOnUnknown; private final SerializeValueFilter serializeValueFilter; private final boolean useBigDecimalForFloats; - private final boolean deduplicateObjects; + private final Boolean deduplicateObjects; private final Map<Class<?>, ObjectConverter.Writer<?>> objectConverterWriterCache; private final Map<Class<?>, ObjectConverter.Reader<?>> objectConverterReaderCache; @@ -85,7 +85,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig implements Cloneable { final boolean enforceQuoteString, final boolean failOnUnknown, final SerializeValueFilter serializeValueFilter, final boolean useBigDecimalForFloats, - final boolean deduplicateObjects) { + final Boolean deduplicateObjects) { //CHECKSTYLE:ON this.objectConverterWriters = objectConverterWriters; this.objectConverterReaders = objectConverterReaders; @@ -306,7 +306,7 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig implements Cloneable { return useBigDecimalForFloats; } - public boolean isDeduplicateObjects() { + public Boolean isDeduplicateObjects() { return deduplicateObjects; } } http://git-wip-us.apache.org/repos/asf/johnzon/blob/2ffe0f69/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java ---------------------------------------------------------------------- diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java index ce604bd..ab05b52 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java @@ -101,7 +101,7 @@ public class MappingParserImpl implements MappingParser { private Map<String, Object> jsonPointers; - public MappingParserImpl(MapperConfig config, Mappings mappings, JsonReader jsonReader, Type rootType) { + public MappingParserImpl(MapperConfig config, Mappings mappings, JsonReader jsonReader, boolean isDeduplicateObjects) { this.config = config; this.mappings = mappings; @@ -110,15 +110,7 @@ public class MappingParserImpl implements MappingParser { reverseAdaptersRegistry = new ConcurrentHashMap<>(config.getAdapters().size()); - Boolean dedup = null; - Mappings.ClassMapping classMapping = mappings.findOrCreateClassMapping(rootType); - if (classMapping != null) { - dedup = classMapping.isDeduplicateObjects(); - } - if (dedup == null) { - dedup = config.isDeduplicateObjects(); - } - this.isDeduplicateObjects = dedup; + this.isDeduplicateObjects = isDeduplicateObjects; if (isDeduplicateObjects) { jsonPointers = new HashMap<>();
