Skip to content

Commit f957529

Browse files
authored
Mark eclipse-collections immutable collections as collection-like for nested list handling [Fixes #71] (#72)
1 parent e72e63f commit f957529

File tree

4 files changed

+77
-1
lines changed

4 files changed

+77
-1
lines changed

eclipse-collections/src/main/java/com/fasterxml/jackson/datatype/eclipsecollections/EclipseCollectionsDeserializers.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
import com.fasterxml.jackson.databind.KeyDeserializer;
99
import com.fasterxml.jackson.databind.deser.Deserializers;
1010
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
11+
import com.fasterxml.jackson.databind.type.CollectionLikeType;
1112
import com.fasterxml.jackson.databind.type.CollectionType;
13+
import com.fasterxml.jackson.databind.type.MapLikeType;
1214
import com.fasterxml.jackson.databind.type.MapType;
1315
import com.fasterxml.jackson.datatype.eclipsecollections.deser.bag.ImmutableBagDeserializer;
1416
import com.fasterxml.jackson.datatype.eclipsecollections.deser.bag.ImmutableSortedBagDeserializer;
@@ -167,7 +169,20 @@ public JsonDeserializer<?> findCollectionDeserializer(
167169
TypeDeserializer elementTypeDeserializer,
168170
JsonDeserializer<?> elementDeserializer
169171
) throws JsonMappingException {
170-
//noinspection SuspiciousMethodCalls
172+
if (REFERENCE_TYPES.contains(type.getRawClass())) {
173+
return findReferenceDeserializer(type, elementTypeDeserializer, elementDeserializer);
174+
}
175+
return null;
176+
}
177+
178+
@Override
179+
public JsonDeserializer<?> findCollectionLikeDeserializer(
180+
CollectionLikeType type,
181+
DeserializationConfig config,
182+
BeanDescription beanDesc,
183+
TypeDeserializer elementTypeDeserializer,
184+
JsonDeserializer<?> elementDeserializer
185+
) throws JsonMappingException {
171186
if (REFERENCE_TYPES.contains(type.getRawClass())) {
172187
return findReferenceDeserializer(type, elementTypeDeserializer, elementDeserializer);
173188
}
@@ -183,7 +198,18 @@ public JsonDeserializer<?> findMapDeserializer(
183198
TypeDeserializer elementTypeDeserializer,
184199
JsonDeserializer<?> elementDeserializer
185200
) throws JsonMappingException {
201+
return findBeanDeserializer(type, config, beanDesc);
202+
}
186203

204+
@Override
205+
public JsonDeserializer<?> findMapLikeDeserializer(
206+
MapLikeType type,
207+
DeserializationConfig config,
208+
BeanDescription beanDesc,
209+
KeyDeserializer keyDeserializer,
210+
TypeDeserializer elementTypeDeserializer,
211+
JsonDeserializer<?> elementDeserializer
212+
) throws JsonMappingException {
187213
return findBeanDeserializer(type, config, beanDesc);
188214
}
189215

eclipse-collections/src/main/java/com/fasterxml/jackson/datatype/eclipsecollections/EclipseCollectionsModule.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ public void setupModule(SetupContext context) {
3030
context.addSerializers(new EclipseCollectionsSerializers());
3131

3232
context.addValueInstantiators(new PairInstantiators());
33+
34+
context.addTypeModifier(new EclipseCollectionsTypeModifier());
3335
}
3436

3537
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.fasterxml.jackson.datatype.eclipsecollections;
2+
3+
import com.fasterxml.jackson.databind.JavaType;
4+
import com.fasterxml.jackson.databind.type.CollectionLikeType;
5+
import com.fasterxml.jackson.databind.type.TypeBindings;
6+
import com.fasterxml.jackson.databind.type.TypeFactory;
7+
import com.fasterxml.jackson.databind.type.TypeModifier;
8+
import java.lang.reflect.Type;
9+
import org.eclipse.collections.api.collection.ImmutableCollection;
10+
11+
class EclipseCollectionsTypeModifier extends TypeModifier {
12+
@Override
13+
public JavaType modifyType(JavaType type, Type jdkType, TypeBindings context, TypeFactory typeFactory) {
14+
if (!type.isCollectionLikeType()) {
15+
JavaType collectionType = type.findSuperType(ImmutableCollection.class);
16+
if (collectionType != null) {
17+
return CollectionLikeType.upgradeFrom(type, collectionType.containedType(0));
18+
}
19+
}
20+
return type;
21+
}
22+
}

eclipse-collections/src/test/java/com/fasterxml/jackson/datatype/eclipsecollections/DeserializerTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,32 @@ public int hashCode() {
566566
}
567567
}
568568

569+
@Test
570+
public void typeInfoNestedMapList() throws IOException {
571+
// test case for jackson-datatypes-collections#71
572+
ImmutableMap<String, ImmutableList<A>> property =
573+
Maps.immutable.of("foo", Lists.immutable.of(new B()));
574+
Assert.assertEquals(
575+
mapperWithModule().readValue(
576+
"{\"foo\": [{\"@c\": \".DeserializerTest$B\"}]}",
577+
new TypeReference<ImmutableMap<String, ImmutableList<A>>>() {}),
578+
property
579+
);
580+
}
581+
582+
@Test
583+
public void typeInfoNestedMapMap() throws IOException {
584+
// auxiliary test case for jackson-datatypes-collections#71 - also worked before fix
585+
ImmutableMap<String, ImmutableMap<String, A>> property =
586+
Maps.immutable.of("foo", Maps.immutable.of("bar", new B()));
587+
Assert.assertEquals(
588+
mapperWithModule().readValue(
589+
"{\"foo\": {\"bar\": {\"@c\": \".DeserializerTest$B\"}}}",
590+
new TypeReference<ImmutableMap<String, ImmutableMap<String, A>>>() {}),
591+
property
592+
);
593+
}
594+
569595
@Test
570596
public void primitivePairs() throws Exception {
571597
List<Class<?>> types = Arrays.asList(

0 commit comments

Comments
 (0)