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 }