diff options
author | Tatu Saloranta <tatu.saloranta@iki.fi> | 2015-04-28 23:03:31 -0700 |
---|---|---|
committer | Tatu Saloranta <tatu.saloranta@iki.fi> | 2015-04-28 23:03:31 -0700 |
commit | ea1966aaf7d1dc5267bec5ecf4762543d9a71e83 (patch) | |
tree | c2bf74d55042034fb2cdf26677b589ec4bcb7aef /src/main/java/com/fasterxml/jackson/databind | |
parent | 9776f5ffd0e2afcfc0951db50b96651c2972dded (diff) | |
download | jackson-databind-ea1966aaf7d1dc5267bec5ecf4762543d9a71e83.tar.gz |
Minor improvements to AtomicReference handling
Diffstat (limited to 'src/main/java/com/fasterxml/jackson/databind')
5 files changed, 75 insertions, 35 deletions
diff --git a/src/main/java/com/fasterxml/jackson/databind/JavaType.java b/src/main/java/com/fasterxml/jackson/databind/JavaType.java index 88767e00e..586048cfa 100644 --- a/src/main/java/com/fasterxml/jackson/databind/JavaType.java +++ b/src/main/java/com/fasterxml/jackson/databind/JavaType.java @@ -227,6 +227,13 @@ public abstract class JavaType @Override public final boolean hasRawClass(Class<?> clz) { return _class == clz; } + /** + * @since 2.6 + */ + public final boolean isTypeOrSubTypeOf(Class<?> clz) { + return (_class == clz) || (clz.isAssignableFrom(_class)); + } + @Override public boolean isAbstract() { return Modifier.isAbstract(_class.getModifiers()); diff --git a/src/main/java/com/fasterxml/jackson/databind/JsonSerializer.java b/src/main/java/com/fasterxml/jackson/databind/JsonSerializer.java index 324643b2c..4da9cc92a 100644 --- a/src/main/java/com/fasterxml/jackson/databind/JsonSerializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/JsonSerializer.java @@ -175,7 +175,7 @@ public abstract class JsonSerializer<T> */ @Deprecated public boolean isEmpty(T value) { - return (value == null); + return isEmpty(null, value); } /** @@ -190,8 +190,7 @@ public abstract class JsonSerializer<T> * @since 2.5 */ public boolean isEmpty(SerializerProvider provider, T value) { - // replace with implementation in 2.6 or later - return isEmpty(value); + return (value == null); } /** diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/BasicSerializerFactory.java b/src/main/java/com/fasterxml/jackson/databind/ser/BasicSerializerFactory.java index 7535b0dee..7938d6aab 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/BasicSerializerFactory.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/BasicSerializerFactory.java @@ -7,6 +7,7 @@ import java.net.InetAddress; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.util.*; +import java.util.concurrent.atomic.AtomicReference; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonInclude; @@ -303,6 +304,11 @@ public abstract class BasicSerializerFactory { Class<?> raw = type.getRawClass(); String clsName = raw.getName(); + if (type.isReferenceType()) { + if (type.isTypeOrSubTypeOf(AtomicReference.class)) { + return new AtomicReferenceSerializer((ReferenceType) type); + } + } JsonSerializer<?> ser = _concrete.get(clsName); if (ser == null) { Class<? extends JsonSerializer<?>> serClass = _concreteLazy.get(clsName); diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/AtomicReferenceSerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/AtomicReferenceSerializer.java new file mode 100644 index 000000000..08b6e4b3e --- /dev/null +++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/AtomicReferenceSerializer.java @@ -0,0 +1,53 @@ +package com.fasterxml.jackson.databind.ser.std; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.concurrent.atomic.AtomicReference; + +import com.fasterxml.jackson.core.JsonGenerationException; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper; +import com.fasterxml.jackson.databind.type.ReferenceType; + +// Since 2.6 in its own class +public class AtomicReferenceSerializer + extends StdSerializer<AtomicReference<?>> +{ + private static final long serialVersionUID = 1L; + + /** + * @deprecated Since 2.6 + */ + @Deprecated + public AtomicReferenceSerializer() { super(AtomicReference.class, false); } + + public AtomicReferenceSerializer(ReferenceType type) { + super(type); + } + + @Override + public boolean isEmpty(SerializerProvider provider, AtomicReference<?> value) { + return (value == null) || (value.get() == null); + } + + @Override + public void serialize(AtomicReference<?> value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException { + provider.defaultSerializeValue(value.get(), jgen); + } + + @Override + public JsonNode getSchema(SerializerProvider provider, Type typeHint) { + return createSchemaNode("any", true); + } + + @Override + public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint) + throws JsonMappingException + { + visitor.expectAnyFormat(typeHint); + } +}
\ No newline at end of file diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/StdJdkSerializers.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/StdJdkSerializers.java index f8f446844..bd0df891e 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/std/StdJdkSerializers.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/StdJdkSerializers.java @@ -38,11 +38,9 @@ public class StdJdkSerializers sers.put(java.util.regex.Pattern.class, sls); sers.put(Locale.class, sls); - // starting with 1.7, use compact String for Locale sers.put(Locale.class, sls); - // then atomic types - sers.put(AtomicReference.class, AtomicReferenceSerializer.class); + // then atomic types (note: AtomicReference needs better handling) sers.put(AtomicBoolean.class, AtomicBooleanSerializer.class); sers.put(AtomicInteger.class, AtomicIntegerSerializer.class); sers.put(AtomicLong.class, AtomicLongSerializer.class); @@ -70,8 +68,8 @@ public class StdJdkSerializers public AtomicBooleanSerializer() { super(AtomicBoolean.class, false); } @Override - public void serialize(AtomicBoolean value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException { - jgen.writeBoolean(value.get()); + public void serialize(AtomicBoolean value, JsonGenerator gen, SerializerProvider provider) throws IOException, JsonGenerationException { + gen.writeBoolean(value.get()); } @Override @@ -91,8 +89,8 @@ public class StdJdkSerializers public AtomicIntegerSerializer() { super(AtomicInteger.class, false); } @Override - public void serialize(AtomicInteger value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException { - jgen.writeNumber(value.get()); + public void serialize(AtomicInteger value, JsonGenerator gen, SerializerProvider provider) throws IOException, JsonGenerationException { + gen.writeNumber(value.get()); } @Override @@ -116,8 +114,8 @@ public class StdJdkSerializers public AtomicLongSerializer() { super(AtomicLong.class, false); } @Override - public void serialize(AtomicLong value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException { - jgen.writeNumber(value.get()); + public void serialize(AtomicLong value, JsonGenerator gen, SerializerProvider provider) throws IOException, JsonGenerationException { + gen.writeNumber(value.get()); } @Override @@ -135,27 +133,4 @@ public class StdJdkSerializers } } } - - public static class AtomicReferenceSerializer - extends StdSerializer<AtomicReference<?>> - { - public AtomicReferenceSerializer() { super(AtomicReference.class, false); } - - @Override - public void serialize(AtomicReference<?> value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException { - provider.defaultSerializeValue(value.get(), jgen); - } - - @Override - public JsonNode getSchema(SerializerProvider provider, Type typeHint) { - return createSchemaNode("any", true); - } - - @Override - public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint) - throws JsonMappingException - { - visitor.expectAnyFormat(typeHint); - } - } } |