Skip to content

Commit a72d24c

Browse files
authored
Refactoring: determine keyComparator at construction time (#161)
* Determine keyComparator at construction time * Remove ResolvableDeserializer from MaplikeDeserializer
1 parent d6675f7 commit a72d24c

File tree

3 files changed

+21
-22
lines changed

3 files changed

+21
-22
lines changed

src/main/java/io/vavr/jackson/datatype/deserialize/MapDeserializer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ class MapDeserializer extends MaplikeDeserializer<Map<?, ?>> {
3838

3939
MapDeserializer(MapLikeType mapType, KeyDeserializer keyDeserializer, TypeDeserializer elementTypeDeserializer,
4040
JsonDeserializer<?> elementDeserializer) {
41-
super(mapType, null, keyDeserializer, elementTypeDeserializer, elementDeserializer);
41+
super(mapType, keyDeserializer, elementTypeDeserializer, elementDeserializer);
4242
}
4343

4444
MapDeserializer(MapDeserializer origin, KeyDeserializer keyDeserializer, TypeDeserializer elementTypeDeserializer, JsonDeserializer<?> valueDeserializer) {
45-
super(origin.mapType, origin.keyComparator, keyDeserializer, elementTypeDeserializer, valueDeserializer);
45+
super(origin.mapType, keyDeserializer, elementTypeDeserializer, valueDeserializer);
4646
}
4747

4848
@Override
@@ -79,4 +79,5 @@ class MapDeserializer extends MaplikeDeserializer<Map<?, ?>> {
7979
// default deserialization [...] -> Map
8080
return HashMap.ofEntries(result);
8181
}
82+
8283
}

src/main/java/io/vavr/jackson/datatype/deserialize/MaplikeDeserializer.java

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,35 +22,44 @@
2222
import com.fasterxml.jackson.databind.*;
2323
import com.fasterxml.jackson.databind.deser.ContextualDeserializer;
2424
import com.fasterxml.jackson.databind.deser.ContextualKeyDeserializer;
25-
import com.fasterxml.jackson.databind.deser.ResolvableDeserializer;
2625
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
2726
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
2827
import com.fasterxml.jackson.databind.type.MapLikeType;
2928

3029
import java.io.Serializable;
3130
import java.util.Comparator;
3231

33-
abstract class MaplikeDeserializer<T> extends StdDeserializer<T> implements ResolvableDeserializer, ContextualDeserializer {
32+
abstract class MaplikeDeserializer<T> extends StdDeserializer<T> implements ContextualDeserializer {
3433

3534
private static final long serialVersionUID = 1L;
3635

3736
final MapLikeType mapType;
3837

39-
Comparator<Object> keyComparator;
38+
final Comparator<Object> keyComparator;
4039
final KeyDeserializer keyDeserializer;
4140
final TypeDeserializer elementTypeDeserializer;
4241
final JsonDeserializer<?> elementDeserializer;
4342

44-
MaplikeDeserializer(MapLikeType mapType, Comparator<Object> keyComparator, KeyDeserializer keyDeserializer,
43+
MaplikeDeserializer(MapLikeType mapType, KeyDeserializer keyDeserializer,
4544
TypeDeserializer elementTypeDeserializer, JsonDeserializer<?> elementDeserializer) {
4645
super(mapType);
4746
this.mapType = mapType;
48-
this.keyComparator = keyComparator;
47+
this.keyComparator = createKeyComparator(mapType.getKeyType());
4948
this.keyDeserializer = keyDeserializer;
5049
this.elementTypeDeserializer = elementTypeDeserializer;
5150
this.elementDeserializer = elementDeserializer;
5251
}
5352

53+
private Comparator<Object> createKeyComparator(JavaType keyType) {
54+
if (Comparable.class.isAssignableFrom(keyType.getRawClass())) {
55+
@SuppressWarnings("unchecked")
56+
Comparator<Object> comparator = (Comparator<Object> & Serializable) (o1, o2) -> ((Comparable<Object>) o1).compareTo(o2);
57+
return comparator;
58+
} else {
59+
return (Comparator<Object> & Serializable) (o1, o2) -> o1.toString().compareTo(o2.toString());
60+
}
61+
}
62+
5463
/**
5564
* Creates a new deserializer from the original one (this).
5665
*
@@ -63,17 +72,6 @@ abstract MaplikeDeserializer<T> createDeserializer(KeyDeserializer keyDeserializ
6372
TypeDeserializer elementTypeDeserializer,
6473
JsonDeserializer<?> elementDeserializer);
6574

66-
@SuppressWarnings("unchecked")
67-
@Override
68-
public void resolve(DeserializationContext ctxt) throws JsonMappingException {
69-
JavaType keyType = mapType.getKeyType();
70-
if (Comparable.class.isAssignableFrom(keyType.getRawClass())) {
71-
keyComparator = (Comparator<Object> & Serializable) (o1, o2) -> ((Comparable<Object>) o1).compareTo(o2);
72-
} else {
73-
keyComparator = (Comparator<Object> & Serializable) (o1, o2) -> o1.toString().compareTo(o2.toString());
74-
}
75-
}
76-
7775
@Override
7876
public JsonDeserializer<?> createContextual(DeserializationContext context, BeanProperty property) throws JsonMappingException {
7977
KeyDeserializer keyDeser = keyDeserializer;

src/main/java/io/vavr/jackson/datatype/deserialize/MultimapDeserializer.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.fasterxml.jackson.core.JsonParser;
2323
import com.fasterxml.jackson.core.JsonToken;
2424
import com.fasterxml.jackson.databind.*;
25+
import com.fasterxml.jackson.databind.deser.ResolvableDeserializer;
2526
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
2627
import com.fasterxml.jackson.databind.type.MapLikeType;
2728
import io.vavr.Tuple;
@@ -34,20 +35,20 @@
3435
import java.io.IOException;
3536
import java.util.ArrayList;
3637

37-
class MultimapDeserializer extends MaplikeDeserializer<Multimap<?, ?>> {
38+
class MultimapDeserializer extends MaplikeDeserializer<Multimap<?, ?>> implements ResolvableDeserializer {
3839

3940
private static final long serialVersionUID = 1L;
4041

4142
private JsonDeserializer<?> containerDeserializer;
4243

4344
MultimapDeserializer(MapLikeType mapType, KeyDeserializer keyDeserializer, TypeDeserializer elementTypeDeserializer,
4445
JsonDeserializer<?> elementDeserializer) {
45-
super(mapType, null, keyDeserializer, elementTypeDeserializer, elementDeserializer);
46+
super(mapType, keyDeserializer, elementTypeDeserializer, elementDeserializer);
4647
}
4748

4849
MultimapDeserializer(MultimapDeserializer origin, KeyDeserializer keyDeserializer,
4950
TypeDeserializer elementTypeDeserializer, JsonDeserializer<?> elementDeserializer) {
50-
super(origin.mapType, origin.keyComparator, keyDeserializer, elementTypeDeserializer, elementDeserializer);
51+
super(origin.mapType, keyDeserializer, elementTypeDeserializer, elementDeserializer);
5152
containerDeserializer = origin.containerDeserializer;
5253
}
5354

@@ -59,7 +60,6 @@ MultimapDeserializer createDeserializer(KeyDeserializer keyDeserializer, TypeDes
5960

6061
@Override
6162
public void resolve(DeserializationContext ctxt) throws JsonMappingException {
62-
super.resolve(ctxt);
6363
JavaType containerType = ctxt.getTypeFactory().constructCollectionType(ArrayList.class, mapType.getContentType());
6464
containerDeserializer = ctxt.findContextualValueDeserializer(containerType, null);
6565
}

0 commit comments

Comments
 (0)