aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/fasterxml/jackson/databind
diff options
context:
space:
mode:
authorTatu Saloranta <tatu.saloranta@iki.fi>2015-04-28 23:03:31 -0700
committerTatu Saloranta <tatu.saloranta@iki.fi>2015-04-28 23:03:31 -0700
commitea1966aaf7d1dc5267bec5ecf4762543d9a71e83 (patch)
treec2bf74d55042034fb2cdf26677b589ec4bcb7aef /src/main/java/com/fasterxml/jackson/databind
parent9776f5ffd0e2afcfc0951db50b96651c2972dded (diff)
downloadjackson-databind-ea1966aaf7d1dc5267bec5ecf4762543d9a71e83.tar.gz
Minor improvements to AtomicReference handling
Diffstat (limited to 'src/main/java/com/fasterxml/jackson/databind')
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/JavaType.java7
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/JsonSerializer.java5
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/ser/BasicSerializerFactory.java6
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/ser/std/AtomicReferenceSerializer.java53
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/ser/std/StdJdkSerializers.java39
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);
- }
- }
}