Skip to content

Commit b6ecd7e

Browse files
Felkcowtowncoder
authored andcommitted
add Serializer and Deserializer for RangeSet (#50)
1 parent 7caed4c commit b6ecd7e

File tree

5 files changed

+124
-0
lines changed

5 files changed

+124
-0
lines changed

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

+3
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,9 @@ public JsonDeserializer<?> findReferenceDeserializer(ReferenceType refType,
281281
public JsonDeserializer<?> findBeanDeserializer(final JavaType type, DeserializationConfig config,
282282
BeanDescription beanDesc)
283283
{
284+
if (type.hasRawClass(RangeSet.class)) {
285+
return new RangeSetDeserializer();
286+
}
284287
if (type.hasRawClass(Range.class)) {
285288
return new RangeDeserializer(type, _defaultBoundType);
286289
}

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

+5
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@
1414
import com.fasterxml.jackson.databind.type.ReferenceType;
1515
import com.fasterxml.jackson.databind.ser.std.StdDelegatingSerializer;
1616
import com.fasterxml.jackson.databind.util.StdConverter;
17+
import com.fasterxml.jackson.datatype.guava.ser.RangeSetSerializer;
1718
import com.google.common.base.Optional;
1819
import com.google.common.cache.CacheBuilder;
1920
import com.google.common.cache.CacheBuilderSpec;
2021
import com.google.common.collect.FluentIterable;
2122
import com.google.common.collect.Multimap;
2223
import com.google.common.collect.Range;
24+
import com.google.common.collect.RangeSet;
2325
import com.google.common.collect.Table;
2426
import com.google.common.hash.HashCode;
2527
import com.google.common.net.HostAndPort;
@@ -63,6 +65,9 @@ public JsonSerializer<?> findSerializer(SerializationConfig config, JavaType typ
6365
BeanDescription beanDesc, JsonFormat.Value formatOverrides)
6466
{
6567
Class<?> raw = type.getRawClass();
68+
if (RangeSet.class.isAssignableFrom(raw)) {
69+
return new RangeSetSerializer();
70+
}
6671
if (Range.class.isAssignableFrom(raw)) {
6772
return new RangeSerializer(_findDeclared(type, Range.class));
6873
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.fasterxml.jackson.datatype.guava.deser;
2+
3+
import com.fasterxml.jackson.core.JsonParseException;
4+
import com.fasterxml.jackson.core.JsonParser;
5+
import com.fasterxml.jackson.databind.BeanProperty;
6+
import com.fasterxml.jackson.databind.DeserializationContext;
7+
import com.fasterxml.jackson.databind.JavaType;
8+
import com.fasterxml.jackson.databind.JsonDeserializer;
9+
import com.google.common.collect.ImmutableRangeSet;
10+
import com.google.common.collect.Range;
11+
import com.google.common.collect.RangeSet;
12+
13+
import java.io.IOException;
14+
import java.util.List;
15+
16+
public class RangeSetDeserializer extends JsonDeserializer<RangeSet<Comparable<?>>> {
17+
private JavaType genericRangeListType;
18+
19+
@Override
20+
public RangeSet<Comparable<?>> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
21+
if (genericRangeListType == null) {
22+
throw new JsonParseException(p, "RangeSetJsonSerializer was not contextualized (no deserialize target type). " +
23+
"You need to specify the generic type down to the generic parameter of RangeSet.");
24+
} else {
25+
@SuppressWarnings("unchecked") final Iterable<Range<Comparable<?>>> ranges
26+
= (Iterable<Range<Comparable<?>>>) ctxt
27+
.findContextualValueDeserializer(genericRangeListType, null).deserialize(p, ctxt);
28+
ImmutableRangeSet.Builder<Comparable<?>> builder = ImmutableRangeSet.builder();
29+
for (Range<Comparable<?>> range : ranges) {
30+
builder.add(range);
31+
}
32+
return builder.build();
33+
}
34+
}
35+
36+
@Override
37+
public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) {
38+
final JavaType genericType = ctxt.getContextualType().containedType(0);
39+
if (genericType == null) return this;
40+
final RangeSetDeserializer deserializer = new RangeSetDeserializer();
41+
deserializer.genericRangeListType = ctxt.getTypeFactory().constructCollectionType(List.class,
42+
ctxt.getTypeFactory().constructParametricType(Range.class, genericType));
43+
return deserializer;
44+
}
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.fasterxml.jackson.datatype.guava.ser;
2+
3+
import com.fasterxml.jackson.core.JsonGenerator;
4+
import com.fasterxml.jackson.databind.BeanProperty;
5+
import com.fasterxml.jackson.databind.JavaType;
6+
import com.fasterxml.jackson.databind.JsonSerializer;
7+
import com.fasterxml.jackson.databind.SerializerProvider;
8+
import com.google.common.collect.Range;
9+
import com.google.common.collect.RangeSet;
10+
11+
import java.io.IOException;
12+
import java.util.List;
13+
14+
public class RangeSetSerializer extends JsonSerializer<RangeSet<Comparable<?>>> {
15+
private JavaType genericRangeListType;
16+
17+
@Override
18+
public void serialize(RangeSet<Comparable<?>> value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
19+
if (genericRangeListType == null) {
20+
serializers.findValueSerializer(List.class).serialize(value.asRanges(), gen, serializers);
21+
} else {
22+
serializers.findValueSerializer(genericRangeListType).serialize(value.asRanges(), gen, serializers);
23+
}
24+
}
25+
26+
@Override
27+
public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) {
28+
if (property == null) return this;
29+
final RangeSetSerializer serializer = new RangeSetSerializer();
30+
serializer.genericRangeListType = prov.getTypeFactory()
31+
.constructCollectionType(List.class,
32+
prov.getTypeFactory().constructParametricType(
33+
Range.class, property.getType().containedType(0)));
34+
return serializer;
35+
}
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.fasterxml.jackson.datatype.guava;
2+
3+
import com.fasterxml.jackson.databind.JavaType;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import com.fasterxml.jackson.databind.ObjectReader;
6+
import com.fasterxml.jackson.databind.type.TypeFactory;
7+
import com.google.common.collect.Range;
8+
import com.google.common.collect.RangeSet;
9+
import com.google.common.collect.TreeRangeSet;
10+
11+
import java.io.IOException;
12+
13+
public class TestRangeSet extends ModuleTestBase {
14+
15+
private final ObjectMapper MAPPER = mapperWithModule();
16+
17+
public void testSerializeDeserialize() throws IOException {
18+
19+
final RangeSet<Integer> rangeSet = TreeRangeSet.create();
20+
rangeSet.add(Range.closedOpen(1, 2));
21+
rangeSet.add(Range.openClosed(3, 4));
22+
23+
final String json = MAPPER.writeValueAsString(rangeSet);
24+
25+
final TypeFactory tf = MAPPER.getTypeFactory();
26+
final JavaType type = tf.constructParametricType(RangeSet.class, Integer.class);
27+
final ObjectReader reader = MAPPER.readerFor(type);
28+
29+
final RangeSet<Integer> deserialized = reader.readValue(json);
30+
31+
assertEquals(rangeSet, deserialized);
32+
33+
}
34+
35+
}

0 commit comments

Comments
 (0)