1 package com.fasterxml.jackson.databind.deser;
2
3 import java.util.List;
4
5 import com.fasterxml.jackson.databind.*;
6 import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition;
7 import com.fasterxml.jackson.databind.type.ArrayType;
8 import com.fasterxml.jackson.databind.type.CollectionLikeType;
9 import com.fasterxml.jackson.databind.type.CollectionType;
10 import com.fasterxml.jackson.databind.type.MapLikeType;
11 import com.fasterxml.jackson.databind.type.MapType;
12 import com.fasterxml.jackson.databind.type.ReferenceType;
13
14 /**
15 * Abstract class that defines API for objects that can be registered
16 * to participate in constructing {@link JsonDeserializer} instances
17 * (via {@link DeserializerFactory}).
18 * This is typically done by modules that want alter some aspects of deserialization
19 * process; and is preferable to sub-classing of {@link BeanDeserializerFactory}.
20 *<p>
21 * Note that Jackson 2.2 adds more methods for customization; with earlier versions
22 * only {@link BeanDeserializer} instances could be modified, but with 2.2 all types
23 * of deserializers can be changed.
24 *<p>
25 * Sequence in which callback methods are called for {@link BeanDeserializer} is:
26 * <ol>
27 * <li>{@link #updateProperties} is called once all property definitions are
28 * collected, and initial filtering (by ignorable type and explicit ignoral-by-bean)
29 * has been performed.
30 * </li>
31 * <li>{@link #updateBuilder} is called once all initial pieces for building deserializer
32 * have been collected
33 * </li>
34 * <li>{@link #modifyDeserializer} is called after deserializer has been built
35 * by {@link BeanDeserializerBuilder}
36 * but before it is returned to be used
37 * </li>
38 * </ol>
39 *<p>
40 * For other types of deserializers, methods called depend on type of values for
41 * which deserializer is being constructed; and only a single method is called
42 * since the process does not involve builders (unlike that of {@link BeanDeserializer}.
43 *<p>
44 * Default method implementations are "no-op"s, meaning that methods are implemented
45 * but have no effect; this is mostly so that new methods can be added in later
46 * versions.
47 */
48 public abstract class BeanDeserializerModifier
49 {
50 /**
51 * Method called by {@link BeanDeserializerFactory} when it has collected
52 * initial list of {@link BeanPropertyDefinition}s, and done basic by-name
53 * and by-type filtering, but before constructing builder or actual
54 * property handlers; or arranging order.
55 *
56 * The most common changes to make at this point are to completely remove
57 * specified properties, or rename then: other modifications are easier
58 * to make at later points.
59 */
60 public List<BeanPropertyDefinition> updateProperties(DeserializationConfig config,
61 BeanDescription beanDesc, List<BeanPropertyDefinition> propDefs) {
62 return propDefs;
63 }
64
65 /**
66 * Method called by {@link BeanDeserializerFactory} when it has collected
67 * basic information such as tentative list of properties to deserialize.
68 *
69 * Implementations may choose to modify state of builder (to affect deserializer being
70 * built), or even completely replace it (if they want to build different kind of
71 * deserializer). Typically changes mostly concern set of properties to deserialize.
72 */
73 public BeanDeserializerBuilder updateBuilder(DeserializationConfig config,
74 BeanDescription beanDesc, BeanDeserializerBuilder builder) {
75 return builder;
76 }
77
78 /**
79 * Method called by {@link BeanDeserializerFactory} after constructing default
80 * bean deserializer instance with properties collected and ordered earlier.
81 * Implementations can modify or replace given deserializer and return deserializer
82 * to use. Note that although initial deserializer being passed is usually of type
83 * {@link BeanDeserializer}, modifiers may return deserializers of other types;
84 * and this is why implementations must check for type before casting.
85 *<p>
86 * Since 2.10 this is also called for custom deserializers for types not deemed to
87 * be of any more specific (reference, enum, array, collection(-like), map(-like),
88 * node type)
89 */
90 public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config,
91 BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
92 return deserializer;
93 }
94
95 /*
96 /**********************************************************
97 /* Callback methods for other types (since 2.2)
98 /**********************************************************
99 */
100
101 /**
102 * Method called by {@link BeanDeserializerFactory} after constructing default
103 * enum type deserializer instance.
104 *
105 * @since 2.2
106 */
107 public JsonDeserializer<?> modifyEnumDeserializer(DeserializationConfig config,
108 JavaType type, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
109 return deserializer;
110 }
111
112 /**
113 * Method called by {@link BeanDeserializerFactory} after constructing default
114 * {@link ReferenceType} deserializer instance.
115 *
116 * @since 2.7
117 */
118 public JsonDeserializer<?> modifyReferenceDeserializer(DeserializationConfig config,
119 ReferenceType type, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
120 return deserializer;
121 }
122
123 /**
124 * Method called by {@link DeserializerFactory} after it has constructed the
125 * standard deserializer for given
126 * {@link ArrayType}
127 * to make it possible to either replace or augment this deserializer with
128 * additional functionality.
129 *
130 * @param config Configuration in use
131 * @param valueType Type of the value deserializer is used for.
132 * @param beanDesc Description f
133 * @param deserializer Default deserializer that would be used.
134 *
135 * @return Deserializer to use; either <code>deserializer</code> that was passed
136 * in, or an instance method constructed.
137 *
138 * @since 2.2
139 */
140 public JsonDeserializer<?> modifyArrayDeserializer(DeserializationConfig config,
141 ArrayType valueType, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
142 return deserializer;
143 }
144
145 /**
146 * Method called by {@link BeanDeserializerFactory} after constructing default
147 * {@link CollectionType} deserializer instance.
148 *
149 * @since 2.2
150 */
151 public JsonDeserializer<?> modifyCollectionDeserializer(DeserializationConfig config,
152 CollectionType type, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
153 return deserializer;
154 }
155
156 /**
157 * Method called by {@link BeanDeserializerFactory} after constructing default
158 * {@link CollectionLikeType} deserializer instance.
159 *
160 * @since 2.2
161 */
162 public JsonDeserializer<?> modifyCollectionLikeDeserializer(DeserializationConfig config,
163 CollectionLikeType type, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
164 return deserializer;
165 }
166
167 /**
168 * Method called by {@link BeanDeserializerFactory} after constructing default
169 * {@link MapType} deserializer instance.
170 *
171 * @since 2.2
172 */
173 public JsonDeserializer<?> modifyMapDeserializer(DeserializationConfig config,
174 MapType type, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
175 return deserializer;
176 }
177
178 /**
179 * Method called by {@link BeanDeserializerFactory} after constructing default
180 * {@link MapLikeType} deserializer instance.
181 *
182 * @since 2.2
183 */
184 public JsonDeserializer<?> modifyMapLikeDeserializer(DeserializationConfig config,
185 MapLikeType type, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
186 return deserializer;
187 }
188
189 /**
190 * Method called by {@link DeserializerFactory} after it has constructed the
191 * standard key deserializer for given key type.
192 * This make it possible to replace the default key deserializer, or augment
193 * it somehow (including optional use of default deserializer with occasional
194 * override).
195 *
196 * @since 2.2
197 */
198 public KeyDeserializer modifyKeyDeserializer(DeserializationConfig config,
199 JavaType type, KeyDeserializer deserializer) {
200 return deserializer;
201 }
202 }