Skip to content

Commit 9039a9b

Browse files
committed
Refactoring to prepare for fixing #312
1 parent 9a233d9 commit 9039a9b

File tree

7 files changed

+110
-24
lines changed

7 files changed

+110
-24
lines changed

src/main/java/com/fasterxml/jackson/databind/DeserializationConfig.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -750,7 +750,7 @@ public TypeDeserializer findTypeDeserializer(JavaType baseType)
750750
return null;
751751
}
752752
} else {
753-
subtypes = getSubtypeResolver().collectAndResolveSubtypes(ac, this, getAnnotationIntrospector());
753+
subtypes = getSubtypeResolver().collectAndResolveSubtypesByName(this, ac);
754754
}
755755
/* 04-May-2014, tatu: When called from DeserializerFactory, additional code like
756756
* this is invoked. But here we do not actually have access to mappings, so not

src/main/java/com/fasterxml/jackson/databind/deser/BasicDeserializerFactory.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -1247,7 +1247,7 @@ public TypeDeserializer findTypeDeserializer(DeserializationConfig config,
12471247
return null;
12481248
}
12491249
} else {
1250-
subtypes = config.getSubtypeResolver().collectAndResolveSubtypes(ac, config, ai);
1250+
subtypes = config.getSubtypeResolver().collectAndResolveSubtypesByName(config, ac);
12511251
}
12521252
// [JACKSON-505]: May need to figure out default implementation, if none found yet
12531253
// (note: check for abstract type is not 100% mandatory, more of an optimization)
@@ -1356,7 +1356,7 @@ private KeyDeserializer _createEnumKeyDeserializer(DeserializationContext ctxt,
13561356
// [JACKSON-749] Also, need to consider @JsonValue, if one found
13571357
return StdKeyDeserializers.constructEnumKeyDeserializer(enumRes);
13581358
}
1359-
1359+
13601360
/*
13611361
/**********************************************************
13621362
/* Extended API
@@ -1387,8 +1387,8 @@ public TypeDeserializer findPropertyTypeDeserializer(DeserializationConfig confi
13871387
return findTypeDeserializer(config, baseType);
13881388
}
13891389
// but if annotations found, may need to resolve subtypes:
1390-
Collection<NamedType> subtypes = config.getSubtypeResolver().collectAndResolveSubtypes(
1391-
annotated, config, ai, baseType);
1390+
Collection<NamedType> subtypes = config.getSubtypeResolver().collectAndResolveSubtypesByName(
1391+
config, annotated, baseType);
13921392
return b.buildTypeDeserializer(config, baseType, subtypes);
13931393
}
13941394

@@ -1415,8 +1415,8 @@ public TypeDeserializer findPropertyContentTypeDeserializer(DeserializationConfi
14151415
return findTypeDeserializer(config, contentType);
14161416
}
14171417
// but if annotations found, may need to resolve subtypes:
1418-
Collection<NamedType> subtypes = config.getSubtypeResolver().collectAndResolveSubtypes(
1419-
propertyEntity, config, ai, contentType);
1418+
Collection<NamedType> subtypes = config.getSubtypeResolver().collectAndResolveSubtypesByName(
1419+
config, propertyEntity, contentType);
14201420
return b.buildTypeDeserializer(config, contentType, subtypes);
14211421
}
14221422

src/main/java/com/fasterxml/jackson/databind/jsontype/SubtypeResolver.java

+95-4
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@
1414
*/
1515
public abstract class SubtypeResolver
1616
{
17+
/*
18+
/**********************************************************
19+
/* Methods for registering external subtype definitions
20+
/**********************************************************
21+
*/
22+
1723
/**
1824
* Method for registering specified subtypes (possibly including type
1925
* names); for type entries without name, non-qualified class name
@@ -23,22 +29,107 @@ public abstract class SubtypeResolver
2329

2430
public abstract void registerSubtypes(Class<?>... classes);
2531

32+
/*
33+
/**********************************************************
34+
/* Subtype resolution
35+
/**********************************************************
36+
*/
37+
38+
/**
39+
* Method for finding out all reachable subtypes for a property specified
40+
* by given element (method or field),
41+
* such that access is by type,
42+
* typically needed for serialization (converting from type to type name).
43+
*
44+
* @param baseType Effective property base type to use; may differ from
45+
* actual type of property; for structured types it is content (value) type and NOT
46+
* structured type.
47+
*
48+
* @since 2.6
49+
*/
50+
public Collection<NamedType> collectAndResolveSubtypesByClass(MapperConfig<?> config,
51+
AnnotatedMember property, JavaType baseType) {
52+
// for backwards compatibility...
53+
return collectAndResolveSubtypes(property, config,
54+
config.getAnnotationIntrospector(), baseType);
55+
}
56+
57+
/**
58+
* Method for finding out all reachable subtypes for given type,
59+
* such that access is by type,
60+
* typically needed for serialization (converting from type to type name).
61+
*
62+
* @param baseType Effective property base type to use; may differ from
63+
* actual type of property; for structured types it is content (value) type and NOT
64+
* structured type.
65+
*
66+
* @since 2.6
67+
*/
68+
public Collection<NamedType> collectAndResolveSubtypesByClass(MapperConfig<?> config,
69+
AnnotatedClass baseType) {
70+
// for backwards compatibility...
71+
return collectAndResolveSubtypes(baseType, config, config.getAnnotationIntrospector());
72+
}
73+
2674
/**
2775
* Method for finding out all reachable subtypes for a property specified
28-
* by given element (method or field)
76+
* by given element (method or field),
77+
* such that access is by type id,
78+
* typically needed for deserialization (converting from type id to type).
2979
*
3080
* @param baseType Effective property base type to use; may differ from
3181
* actual type of property; for structured types it is content (value) type and NOT
3282
* structured type.
3383
*
34-
* @since 2.1
84+
* @since 2.6
85+
*/
86+
public Collection<NamedType> collectAndResolveSubtypesByName(MapperConfig<?> config,
87+
AnnotatedMember property, JavaType baseType) {
88+
// for backwards compatibility...
89+
return collectAndResolveSubtypes(property, config,
90+
config.getAnnotationIntrospector(), baseType);
91+
}
92+
93+
/**
94+
* Method for finding out all reachable subtypes for given type,
95+
* such that access is by type id,
96+
* typically needed for deserialization (converting from type id to type).
97+
*
98+
* @param baseType Effective property base type to use; may differ from
99+
* actual type of property; for structured types it is content (value) type and NOT
100+
* structured type.
101+
*
102+
* @since 2.6
103+
*/
104+
public Collection<NamedType> collectAndResolveSubtypesByName(MapperConfig<?> config,
105+
AnnotatedClass baseType) {
106+
// for backwards compatibility...
107+
return collectAndResolveSubtypes(baseType, config, config.getAnnotationIntrospector());
108+
}
109+
110+
/*
111+
/**********************************************************
112+
/* Deprecated methods
113+
/**********************************************************
114+
*/
115+
116+
/**
117+
* @deprecated Since 2.6 Use either
118+
* {@link #collectAndResolveSubtypesByClass(MapperConfig, AnnotatedMember, JavaType)}
119+
* or {@link #collectAndResolveSubtypesByName(MapperConfig, AnnotatedMember, JavaType)}
120+
* instead.
35121
*/
122+
@Deprecated
36123
public abstract Collection<NamedType> collectAndResolveSubtypes(AnnotatedMember property,
37124
MapperConfig<?> config, AnnotationIntrospector ai, JavaType baseType);
38125

39126
/**
40-
* Method for finding out all reachable subtypes for given type.
127+
* @deprecated Since 2.6 Use either
128+
* {@link #collectAndResolveSubtypesByClass(MapperConfig, AnnotatedClass)}
129+
* or {@link #collectAndResolveSubtypesByName(MapperConfig, AnnotatedClass)}
130+
* instead.
41131
*/
42-
public abstract Collection<NamedType> collectAndResolveSubtypes(AnnotatedClass basetype,
132+
@Deprecated
133+
public abstract Collection<NamedType> collectAndResolveSubtypes(AnnotatedClass baseType,
43134
MapperConfig<?> config, AnnotationIntrospector ai);
44135
}

src/main/java/com/fasterxml/jackson/databind/jsontype/impl/StdSubtypeResolver.java

+2-5
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,7 @@ public void registerSubtypes(Class<?>... classes) {
4848
}
4949

5050
/**
51-
*
52-
* @param property Base member to use for type resolution: either annotated type (class),
53-
* or property (field, getter/setter)
54-
*
55-
* @since 2.1
51+
* @deprecated Since 2.6
5652
*/
5753
@Override
5854
public Collection<NamedType> collectAndResolveSubtypes(AnnotatedMember property,
@@ -87,6 +83,7 @@ public Collection<NamedType> collectAndResolveSubtypes(AnnotatedMember property,
8783

8884
// and finally subtypes via annotations from base type (recursively)
8985
_collectAndResolve(ac, rootType, config, ai, collected);
86+
9087
return new ArrayList<NamedType>(collected.values());
9188
}
9289

src/main/java/com/fasterxml/jackson/databind/ser/BasicSerializerFactory.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ public TypeSerializer createTypeSerializer(SerializationConfig config,
271271
if (b == null) {
272272
b = config.getDefaultTyper(baseType);
273273
} else {
274-
subtypes = config.getSubtypeResolver().collectAndResolveSubtypes(ac, config, ai);
274+
subtypes = config.getSubtypeResolver().collectAndResolveSubtypesByClass(config, ac);
275275
}
276276
if (b == null) {
277277
return null;

src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializerFactory.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -289,8 +289,8 @@ public TypeSerializer findPropertyTypeSerializer(JavaType baseType,
289289
if (b == null) {
290290
return createTypeSerializer(config, baseType);
291291
}
292-
Collection<NamedType> subtypes = config.getSubtypeResolver().collectAndResolveSubtypes(
293-
accessor, config, ai, baseType);
292+
Collection<NamedType> subtypes = config.getSubtypeResolver().collectAndResolveSubtypesByClass(
293+
config, accessor, baseType);
294294
return b.buildTypeSerializer(config, baseType, subtypes);
295295
}
296296

@@ -315,8 +315,8 @@ public TypeSerializer findPropertyContentTypeSerializer(JavaType containerType,
315315
if (b == null) {
316316
return createTypeSerializer(config, contentType);
317317
}
318-
Collection<NamedType> subtypes = config.getSubtypeResolver().collectAndResolveSubtypes(accessor,
319-
config, ai, contentType);
318+
Collection<NamedType> subtypes = config.getSubtypeResolver().collectAndResolveSubtypesByClass(config,
319+
accessor, contentType);
320320
return b.buildTypeSerializer(config, contentType, subtypes);
321321
}
322322

src/test/java/com/fasterxml/jackson/failing/TestOverlappingTypeIdNames312.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.fasterxml.jackson.failing;
22

3-
import com.fasterxml.jackson.annotation.JsonSubTypes;
4-
import com.fasterxml.jackson.annotation.JsonTypeInfo;
5-
import com.fasterxml.jackson.annotation.JsonTypeName;
3+
import com.fasterxml.jackson.annotation.*;
64
import com.fasterxml.jackson.databind.*;
75

86
public class TestOverlappingTypeIdNames312 extends BaseMapTest

0 commit comments

Comments
 (0)