Skip to content

Commit b61a69a

Browse files
authored
Add support to serialize and deserialize Guava's Immutable{Double,Int,Long}Array (#86)
1 parent e919050 commit b61a69a

14 files changed

+458
-21
lines changed

guava/src/main/java/com/fasterxml/jackson/datatype/guava/GuavaDeserializers.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.fasterxml.jackson.datatype.guava;
22

3+
import com.fasterxml.jackson.datatype.guava.util.ImmutablePrimitiveTypes;
34
import com.fasterxml.jackson.datatype.guava.util.PrimitiveTypes;
45
import com.google.common.base.Optional;
56
import com.google.common.collect.*;
@@ -22,8 +23,6 @@
2223

2324
import java.io.Serializable;
2425

25-
import static com.fasterxml.jackson.datatype.guava.util.PrimitiveTypes.isAssignableFromPrimitive;
26-
2726
/**
2827
* Custom deserializers module offers.
2928
*/
@@ -130,7 +129,7 @@ public ValueDeserializer<?> findCollectionDeserializer(CollectionType type,
130129
null, null);
131130
}
132131

133-
return isAssignableFromPrimitive(raw)
132+
return PrimitiveTypes.isAssignableFromPrimitive(raw)
134133
.transform(PrimitiveTypes.Primitives::newDeserializer)
135134
.orNull();
136135
}
@@ -298,7 +297,9 @@ public ValueDeserializer<?> findBeanDeserializer(final JavaType type, Deserializ
298297
if (type.hasRawClass(HashCode.class)) {
299298
return HashCodeDeserializer.std;
300299
}
301-
return null;
300+
return ImmutablePrimitiveTypes.isAssignableFromImmutableArray(type.getRawClass())
301+
.transform(ImmutablePrimitiveTypes.ImmutablePrimitiveArrays::newDeserializer)
302+
.orNull();
302303
}
303304

304305
@Override
@@ -315,7 +316,8 @@ public boolean hasDeserializerFor(DeserializationConfig config, Class<?> valueTy
315316
|| ImmutableCollection.class.isAssignableFrom(valueType)
316317
|| ImmutableMap.class.isAssignableFrom(valueType)
317318
|| BiMap.class.isAssignableFrom(valueType)
318-
|| isAssignableFromPrimitive(valueType).isPresent()
319+
|| PrimitiveTypes.isAssignableFromPrimitive(valueType).isPresent()
320+
|| ImmutablePrimitiveTypes.isAssignableFromImmutableArray(valueType).isPresent()
319321
;
320322
}
321323
return false;

guava/src/main/java/com/fasterxml/jackson/datatype/guava/GuavaSerializers.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.fasterxml.jackson.datatype.guava;
22

33
import com.fasterxml.jackson.databind.type.CollectionLikeType;
4+
import com.fasterxml.jackson.datatype.guava.util.ImmutablePrimitiveTypes;
45
import com.fasterxml.jackson.datatype.guava.util.PrimitiveTypes;
56
import java.io.Serializable;
67
import java.util.Set;
@@ -95,7 +96,9 @@ public ValueSerializer<?> findSerializer(SerializationConfig config, JavaType ty
9596
JavaType iterableType = _findDeclared(type, Iterable.class);
9697
return new StdDelegatingSerializer(FluentConverter.instance, iterableType, null, null);
9798
}
98-
return null;
99+
return ImmutablePrimitiveTypes.isAssignableFromImmutableArray(raw)
100+
.transform(ImmutablePrimitiveTypes.ImmutablePrimitiveArrays::newSerializer)
101+
.orNull();
99102
}
100103

101104
@Override

guava/src/main/java/com/fasterxml/jackson/datatype/guava/deser/BasePrimitiveCollectionDeserializer.java

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,18 @@
99
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
1010
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
1111

12-
import java.util.Collection;
13-
import java.util.List;
14-
15-
public abstract class BasePrimitiveCollectionDeserializer<ObjectType, PrimitiveList extends List<ObjectType>, IntermediateCollection extends Collection<ObjectType>>
12+
/**
13+
* Base deserializer of a primitive collection or an immutable primitive array.
14+
*
15+
* @param <ObjectType> The base object type. Eg: {@code Long}
16+
* @param <PrimitiveList> The collection type that we deserialize. Eg: type of {@code Longs.asList(..)} or
17+
* {@code ImmutableLongArray}
18+
* @param <IntermediateContainer> The intermediate container where we collect the collection elements before returning
19+
* it as the {@code PrimitiveList} type. Eg. in case of collections would be a
20+
* {@code ArrayList<Long>} or in case of an immutable array would be
21+
* {@code ImmutableLongArray.Builder}
22+
*/
23+
public abstract class BasePrimitiveCollectionDeserializer<ObjectType, PrimitiveList, IntermediateContainer>
1624
extends StdDeserializer<PrimitiveList> {
1725

1826
protected BasePrimitiveCollectionDeserializer(Class<? extends PrimitiveList> cls, Class<? super ObjectType> itemType) {
@@ -23,16 +31,16 @@ protected BasePrimitiveCollectionDeserializer(JavaType type) {
2331
super(type);
2432
}
2533

26-
protected abstract IntermediateCollection createIntermediateCollection();
34+
protected abstract IntermediateContainer createIntermediateCollection();
2735

28-
protected IntermediateCollection createIntermediateCollection(int expectedSize) {
36+
protected IntermediateContainer createIntermediateCollection(int expectedSize) {
2937
return createIntermediateCollection();
3038
}
3139

32-
protected abstract void add(IntermediateCollection intermediateCollection, JsonParser parser,
40+
protected abstract void add(IntermediateContainer intermediateContainer, JsonParser parser,
3341
DeserializationContext context) throws JacksonException;
3442

35-
protected abstract PrimitiveList finish(IntermediateCollection intermediateCollection);
43+
protected abstract PrimitiveList finish(IntermediateContainer intermediateContainer);
3644

3745
@Override
3846
public Object deserializeWithType(JsonParser parser, DeserializationContext context,
@@ -57,7 +65,7 @@ public PrimitiveList deserialize(JsonParser parser, DeserializationContext conte
5765

5866
protected PrimitiveList _deserializeContents(JsonParser parser, DeserializationContext context)
5967
throws JacksonException {
60-
IntermediateCollection collection = createIntermediateCollection();
68+
IntermediateContainer collection = createIntermediateCollection();
6169

6270
while (parser.nextToken() != JsonToken.END_ARRAY) {
6371
add(collection, parser, context);
@@ -67,9 +75,9 @@ protected PrimitiveList _deserializeContents(JsonParser parser, DeserializationC
6775

6876
protected PrimitiveList _deserializeFromSingleValue(JsonParser parser, DeserializationContext ctxt)
6977
throws JacksonException {
70-
IntermediateCollection intermediateCollection = createIntermediateCollection();
71-
add(intermediateCollection, parser, ctxt);
72-
return finish(intermediateCollection);
78+
IntermediateContainer intermediateContainer = createIntermediateCollection();
79+
add(intermediateContainer, parser, ctxt);
80+
return finish(intermediateContainer);
7381
}
7482

7583
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.fasterxml.jackson.datatype.guava.deser.primitives;
2+
3+
import com.fasterxml.jackson.core.JacksonException;
4+
import com.fasterxml.jackson.core.JsonParser;
5+
import com.fasterxml.jackson.databind.DeserializationContext;
6+
import com.fasterxml.jackson.datatype.guava.deser.BasePrimitiveCollectionDeserializer;
7+
8+
public abstract class BaseImmutableArrayDeserializer<ObjectType, ImmutablePrimitiveArray, IntermediateArrayBuilder>
9+
extends BasePrimitiveCollectionDeserializer<ObjectType, ImmutablePrimitiveArray, IntermediateArrayBuilder> {
10+
11+
protected BaseImmutableArrayDeserializer(Class<? extends ImmutablePrimitiveArray> cls, Class<? super ObjectType> itemType) {
12+
super(cls, itemType);
13+
}
14+
15+
@Override
16+
protected final void add(IntermediateArrayBuilder intermediateBuilder, JsonParser parser, DeserializationContext context) throws JacksonException {
17+
collect(intermediateBuilder, asPrimitive(parser));
18+
}
19+
20+
protected abstract void collect(IntermediateArrayBuilder intermediateBuilder, ObjectType value);
21+
22+
protected abstract ObjectType asPrimitive(JsonParser parser) throws JacksonException;
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.fasterxml.jackson.datatype.guava.deser.primitives;
2+
3+
import com.fasterxml.jackson.core.JacksonException;
4+
import com.fasterxml.jackson.core.JsonParser;
5+
import com.fasterxml.jackson.datatype.guava.util.ImmutablePrimitiveTypes;
6+
import com.google.common.primitives.ImmutableDoubleArray;
7+
8+
public class ImmutableDoubleArrayDeserializer
9+
extends BaseImmutableArrayDeserializer<Double, ImmutableDoubleArray, ImmutableDoubleArray.Builder> {
10+
public ImmutableDoubleArrayDeserializer() {
11+
super(ImmutablePrimitiveTypes.ImmutableDoubleArrayType, Double.class);
12+
}
13+
14+
@Override
15+
protected ImmutableDoubleArray.Builder createIntermediateCollection() {
16+
return ImmutableDoubleArray.builder();
17+
}
18+
19+
@Override
20+
protected void collect(ImmutableDoubleArray.Builder intermediateBuilder, Double value) {
21+
intermediateBuilder.add(value);
22+
}
23+
24+
@Override
25+
protected ImmutableDoubleArray finish(ImmutableDoubleArray.Builder builder) {
26+
return builder.build();
27+
}
28+
29+
@Override
30+
protected Double asPrimitive(JsonParser parser) throws JacksonException {
31+
return parser.getDoubleValue();
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.fasterxml.jackson.datatype.guava.deser.primitives;
2+
3+
import com.fasterxml.jackson.core.JacksonException;
4+
import com.fasterxml.jackson.core.JsonParser;
5+
import com.fasterxml.jackson.datatype.guava.util.ImmutablePrimitiveTypes;
6+
import com.google.common.primitives.ImmutableIntArray;
7+
8+
public class ImmutableIntArrayDeserializer
9+
extends BaseImmutableArrayDeserializer<Integer, ImmutableIntArray, ImmutableIntArray.Builder> {
10+
public ImmutableIntArrayDeserializer() {
11+
super(ImmutablePrimitiveTypes.ImmutableIntArrayType, Integer.class);
12+
}
13+
14+
@Override
15+
protected ImmutableIntArray.Builder createIntermediateCollection() {
16+
return ImmutableIntArray.builder();
17+
}
18+
19+
@Override
20+
protected void collect(ImmutableIntArray.Builder intermediateBuilder, Integer value) {
21+
intermediateBuilder.add(value);
22+
}
23+
24+
@Override
25+
protected ImmutableIntArray finish(ImmutableIntArray.Builder builder) {
26+
return builder.build();
27+
}
28+
29+
@Override
30+
protected Integer asPrimitive(JsonParser parser) throws JacksonException {
31+
return parser.getIntValue();
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.fasterxml.jackson.datatype.guava.deser.primitives;
2+
3+
import com.fasterxml.jackson.core.JacksonException;
4+
import com.fasterxml.jackson.core.JsonParser;
5+
import com.fasterxml.jackson.datatype.guava.util.ImmutablePrimitiveTypes;
6+
import com.google.common.primitives.ImmutableLongArray;
7+
8+
public class ImmutableLongArrayDeserializer
9+
extends BaseImmutableArrayDeserializer<Long, ImmutableLongArray, ImmutableLongArray.Builder> {
10+
public ImmutableLongArrayDeserializer() {
11+
super(ImmutablePrimitiveTypes.ImmutableLongArrayType, Long.class);
12+
}
13+
14+
@Override
15+
protected ImmutableLongArray.Builder createIntermediateCollection() {
16+
return ImmutableLongArray.builder();
17+
}
18+
19+
@Override
20+
protected void collect(ImmutableLongArray.Builder intermediateBuilder, Long value) {
21+
intermediateBuilder.add(value);
22+
}
23+
24+
@Override
25+
protected ImmutableLongArray finish(ImmutableLongArray.Builder builder) {
26+
return builder.build();
27+
}
28+
29+
@Override
30+
protected Long asPrimitive(JsonParser parser) throws JacksonException {
31+
return parser.getLongValue();
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.fasterxml.jackson.datatype.guava.ser.primitives;
2+
3+
import com.fasterxml.jackson.core.JacksonException;
4+
import com.fasterxml.jackson.core.JsonGenerator;
5+
import com.fasterxml.jackson.databind.SerializerProvider;
6+
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
7+
import com.fasterxml.jackson.datatype.guava.util.ImmutablePrimitiveTypes;
8+
9+
public abstract class BaseImmutableArraySerializer<ImmutableArray> extends StdSerializer<ImmutableArray> {
10+
protected BaseImmutableArraySerializer(ImmutablePrimitiveTypes.ImmutablePrimitiveArrays immutableArrayType) {
11+
super(immutableArrayType.type());
12+
}
13+
14+
@Override
15+
public final void serialize(ImmutableArray immutableArray, JsonGenerator gen, SerializerProvider provider) throws JacksonException {
16+
if (immutableArray == null) {
17+
provider.defaultSerializeNullValue(gen);
18+
} else {
19+
writeArray(immutableArray, gen);
20+
}
21+
}
22+
23+
protected abstract void writeArray(ImmutableArray immutableArray, JsonGenerator gen);
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.fasterxml.jackson.datatype.guava.ser.primitives;
2+
3+
import com.fasterxml.jackson.core.JsonGenerator;
4+
import com.fasterxml.jackson.datatype.guava.util.ImmutablePrimitiveTypes;
5+
import com.google.common.primitives.ImmutableDoubleArray;
6+
7+
public class ImmutableDoubleArraySerializer extends BaseImmutableArraySerializer<ImmutableDoubleArray> {
8+
9+
public ImmutableDoubleArraySerializer() {
10+
super(ImmutablePrimitiveTypes.ImmutablePrimitiveArrays.DOUBLE);
11+
}
12+
13+
@Override
14+
protected void writeArray(ImmutableDoubleArray immutableArray, JsonGenerator gen) {
15+
if (!immutableArray.isEmpty()) {
16+
gen.writeArray(immutableArray.toArray(), 0, immutableArray.length());
17+
}
18+
}
19+
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.fasterxml.jackson.datatype.guava.ser.primitives;
2+
3+
import com.fasterxml.jackson.core.JsonGenerator;
4+
import com.fasterxml.jackson.datatype.guava.util.ImmutablePrimitiveTypes;
5+
import com.google.common.primitives.ImmutableIntArray;
6+
7+
public class ImmutableIntArraySerializer extends BaseImmutableArraySerializer<ImmutableIntArray> {
8+
9+
public ImmutableIntArraySerializer() {
10+
super(ImmutablePrimitiveTypes.ImmutablePrimitiveArrays.INT);
11+
}
12+
13+
@Override
14+
protected void writeArray(ImmutableIntArray immutableArray, JsonGenerator gen) {
15+
if (!immutableArray.isEmpty()) {
16+
gen.writeArray(immutableArray.toArray(), 0, immutableArray.length());
17+
}
18+
}
19+
20+
}

0 commit comments

Comments
 (0)