1 package com.fasterxml.jackson.databind.deser;
2 
3 import java.io.IOException;
4 import java.lang.annotation.Annotation;
5 
6 import com.fasterxml.jackson.core.*;
7 
8 import com.fasterxml.jackson.databind.*;
9 import com.fasterxml.jackson.databind.deser.impl.FailingDeserializer;
10 import com.fasterxml.jackson.databind.deser.impl.NullsConstantProvider;
11 import com.fasterxml.jackson.databind.introspect.*;
12 import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonObjectFormatVisitor;
13 import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
14 import com.fasterxml.jackson.databind.util.Annotations;
15 import com.fasterxml.jackson.databind.util.ClassUtil;
16 import com.fasterxml.jackson.databind.util.ViewMatcher;
17 
18 /**
19  * Base class for deserializable properties of a bean: contains
20  * both type and name definitions, and reflection-based set functionality.
21  * Concrete sub-classes implement details, so that field- and
22  * setter-backed properties, as well as a few more esoteric variations,
23  * can be handled.
24  */
25 @SuppressWarnings("serial")
26 public abstract class SettableBeanProperty
27     extends ConcreteBeanPropertyBase
28     implements java.io.Serializable
29 {
30     /**
31      * To avoid nasty NPEs, let's use a placeholder for _valueDeserializer,
32      * if real deserializer is not (yet) available.
33      *
34      * @since 2.2
35      */
36     protected static final JsonDeserializer<Object> MISSING_VALUE_DESERIALIZER = new FailingDeserializer(
37             "No _valueDeserializer assigned");
38 
39     /**
40      * Logical name of the property (often but not always derived
41      * from the setter method name)
42      */
43     protected final PropertyName _propName;
44 
45     /**
46      * Base type for property; may be a supertype of actual value.
47      */
48     protected final JavaType _type;
49 
50     /**
51      * @since 2.2
52      */
53     protected final PropertyName _wrapperName;
54 
55     /**
56      * Class that contains this property (either class that declares
57      * the property or one of its subclasses), class that is
58      * deserialized using deserializer that contains this property.
59      */
60     protected final transient Annotations _contextAnnotations;
61 
62     /**
63      * Deserializer used for handling property value.
64      *<p>
65      * NOTE: has been immutable since 2.3
66      */
67     protected final JsonDeserializer<Object> _valueDeserializer;
68 
69     /**
70      * If value will contain type information (to support
71      * polymorphic handling), this is the type deserializer
72      * used to handle type resolution.
73      */
74     protected final TypeDeserializer _valueTypeDeserializer;
75 
76     /**
77      * Entity used for possible translation from `null` into non-null
78      * value of type of this property.
79      * Often same as <code>_valueDeserializer</code>, but not always.
80      *
81      * @since 2.9
82      */
83     protected final NullValueProvider _nullProvider;
84 
85     /*
86     /**********************************************************
87     /* Configuration that is not yet immutable; generally assigned
88     /* during initialization process but cannot be passed to
89     /* constructor.
90     /**********************************************************
91      */
92 
93     /**
94      * If property represents a managed (forward) reference, we will need
95      * the name of reference for later linking.
96      *<p>
97      * TODO: should try to make immutable.
98      */
99     protected String _managedReferenceName;
100 
101     /**
102      * This is the information for object identity associated with the property.
103      * <p>
104      * TODO: should try to make immutable.
105      */
106     protected ObjectIdInfo _objectIdInfo;
107 
108     /**
109      * Helper object used for checking whether this property is to
110      * be included in the active view, if property is view-specific;
111      * null otherwise.
112      *<p>
113      * TODO: should try to make immutable.
114      */
115     protected ViewMatcher _viewMatcher;
116 
117     /**
118      * Index of property (within all property of a bean); assigned
119      * when all properties have been collected. Order of entries
120      * is arbitrary, but once indexes are assigned they are not
121      * changed.
122      *<p>
123      * TODO: should try to make immutable if at all possible
124      */
125     protected int _propertyIndex = -1;
126 
127     /*
128     /**********************************************************
129     /* Life-cycle (construct & configure)
130     /**********************************************************
131      */
132 
SettableBeanProperty(BeanPropertyDefinition propDef, JavaType type, TypeDeserializer typeDeser, Annotations contextAnnotations)133     protected SettableBeanProperty(BeanPropertyDefinition propDef,
134             JavaType type, TypeDeserializer typeDeser, Annotations contextAnnotations)
135     {
136         this(propDef.getFullName(), type, propDef.getWrapperName(), typeDeser,
137                 contextAnnotations, propDef.getMetadata());
138     }
139 
SettableBeanProperty(PropertyName propName, JavaType type, PropertyName wrapper, TypeDeserializer typeDeser, Annotations contextAnnotations, PropertyMetadata metadata)140     protected SettableBeanProperty(PropertyName propName, JavaType type, PropertyName wrapper,
141             TypeDeserializer typeDeser, Annotations contextAnnotations,
142             PropertyMetadata metadata)
143     {
144         super(metadata);
145         // 09-Jan-2009, tatu: Intern()ing makes sense since Jackson parsed
146         //  field names are (usually) interned too, hence lookups will be faster.
147         // 23-Oct-2009, tatu: should this be disabled wrt [JACKSON-180]?
148         //   Probably need not, given that namespace of field/method names
149         //   is not unbounded, unlike potential JSON names.
150         if (propName == null) {
151             _propName = PropertyName.NO_NAME;
152         } else {
153             _propName = propName.internSimpleName();
154         }
155         _type = type;
156         _wrapperName = wrapper;
157         _contextAnnotations = contextAnnotations;
158         _viewMatcher = null;
159 
160         // 30-Jan-2012, tatu: Important: contextualize TypeDeserializer now...
161         if (typeDeser != null) {
162             typeDeser = typeDeser.forProperty(this);
163         }
164         _valueTypeDeserializer = typeDeser;
165         _valueDeserializer = MISSING_VALUE_DESERIALIZER;
166         _nullProvider = MISSING_VALUE_DESERIALIZER;
167     }
168 
169     /**
170      * Constructor only used by {@link com.fasterxml.jackson.databind.deser.impl.ObjectIdValueProperty}.
171      *
172      * @since 2.3
173      */
SettableBeanProperty(PropertyName propName, JavaType type, PropertyMetadata metadata, JsonDeserializer<Object> valueDeser)174     protected SettableBeanProperty(PropertyName propName, JavaType type,
175             PropertyMetadata metadata, JsonDeserializer<Object> valueDeser)
176     {
177         super(metadata);
178         // as with above ctor, intern()ing probably fine
179         if (propName == null) {
180             _propName = PropertyName.NO_NAME;
181         } else {
182             _propName = propName.internSimpleName();
183         }
184         _type = type;
185         _wrapperName = null;
186         _contextAnnotations = null;
187         _viewMatcher = null;
188         _valueTypeDeserializer = null;
189         _valueDeserializer = valueDeser;
190         // 29-Jan-2017, tatu: Presumed to be irrelevant for ObjectId values...
191         _nullProvider = valueDeser;
192     }
193 
194     /**
195      * Basic copy-constructor for sub-classes to use.
196      */
SettableBeanProperty(SettableBeanProperty src)197     protected SettableBeanProperty(SettableBeanProperty src)
198     {
199         super(src);
200         _propName = src._propName;
201         _type = src._type;
202         _wrapperName = src._wrapperName;
203         _contextAnnotations = src._contextAnnotations;
204         _valueDeserializer = src._valueDeserializer;
205         _valueTypeDeserializer = src._valueTypeDeserializer;
206         _managedReferenceName = src._managedReferenceName;
207         _propertyIndex = src._propertyIndex;
208         _viewMatcher = src._viewMatcher;
209         _nullProvider = src._nullProvider;
210     }
211 
212     /**
213      * Copy-with-deserializer-change constructor for sub-classes to use.
214      */
215     @SuppressWarnings("unchecked")
SettableBeanProperty(SettableBeanProperty src, JsonDeserializer<?> deser, NullValueProvider nuller)216     protected SettableBeanProperty(SettableBeanProperty src,
217             JsonDeserializer<?> deser, NullValueProvider nuller)
218     {
219         super(src);
220         _propName = src._propName;
221         _type = src._type;
222         _wrapperName = src._wrapperName;
223         _contextAnnotations = src._contextAnnotations;
224         _valueTypeDeserializer = src._valueTypeDeserializer;
225         _managedReferenceName = src._managedReferenceName;
226         _propertyIndex = src._propertyIndex;
227 
228         if (deser == null) {
229             _valueDeserializer = MISSING_VALUE_DESERIALIZER;
230         } else {
231             _valueDeserializer = (JsonDeserializer<Object>) deser;
232         }
233         _viewMatcher = src._viewMatcher;
234         // 29-Jan-2017, tatu: Bit messy, but for now has to do...
235         if (nuller == MISSING_VALUE_DESERIALIZER) {
236             nuller = _valueDeserializer;
237         }
238         _nullProvider = nuller;
239     }
240 
241     /**
242      * Copy-with-deserializer-change constructor for sub-classes to use.
243      */
SettableBeanProperty(SettableBeanProperty src, PropertyName newName)244     protected SettableBeanProperty(SettableBeanProperty src, PropertyName newName)
245     {
246         super(src);
247         _propName = newName;
248         _type = src._type;
249         _wrapperName = src._wrapperName;
250         _contextAnnotations = src._contextAnnotations;
251         _valueDeserializer = src._valueDeserializer;
252         _valueTypeDeserializer = src._valueTypeDeserializer;
253         _managedReferenceName = src._managedReferenceName;
254         _propertyIndex = src._propertyIndex;
255         _viewMatcher = src._viewMatcher;
256         _nullProvider = src._nullProvider;
257     }
258 
259     /**
260      * Fluent factory method for constructing and returning a new instance
261      * with specified value deserializer.
262      * Note that this method should NOT change configuration of this instance.
263      *
264      * @param deser Deserializer to assign to the new property instance
265      *
266      * @return Newly constructed instance, if value deserializer differs from the
267      *   one used for this instance; or 'this' if not.
268      */
withValueDeserializer(JsonDeserializer<?> deser)269     public abstract SettableBeanProperty withValueDeserializer(JsonDeserializer<?> deser);
270 
271     /**
272      * Fluent factory method for constructing and returning a new instance
273      * with specified property name.
274      * Note that this method should NOT change configuration of this instance.
275      *
276      * @param newName Name to use for the new instance.
277      *
278      * @return Newly constructed instance, if property name differs from the
279      *   one used for this instance; or 'this' if not.
280      */
withName(PropertyName newName)281     public abstract SettableBeanProperty withName(PropertyName newName);
282 
283     /**
284      * @since 2.3
285      */
withSimpleName(String simpleName)286     public SettableBeanProperty withSimpleName(String simpleName) {
287         PropertyName n = (_propName == null)
288                 ? new PropertyName(simpleName) : _propName.withSimpleName(simpleName);
289         return (n == _propName) ? this : withName(n);
290     }
291 
292     /**
293      * @since 2.9
294      */
withNullProvider(NullValueProvider nva)295     public abstract SettableBeanProperty withNullProvider(NullValueProvider nva);
296 
setManagedReferenceName(String n)297     public void setManagedReferenceName(String n) {
298         _managedReferenceName = n;
299     }
300 
setObjectIdInfo(ObjectIdInfo objectIdInfo)301     public void setObjectIdInfo(ObjectIdInfo objectIdInfo) {
302         _objectIdInfo = objectIdInfo;
303     }
304 
setViews(Class<?>[] views)305     public void setViews(Class<?>[] views) {
306         if (views == null) {
307             _viewMatcher = null;
308         } else {
309             _viewMatcher = ViewMatcher.construct(views);
310         }
311     }
312 
313     /**
314      * Method used to assign index for property.
315      */
assignIndex(int index)316     public void assignIndex(int index) {
317         if (_propertyIndex != -1) {
318             throw new IllegalStateException("Property '"+getName()+"' already had index ("+_propertyIndex+"), trying to assign "+index);
319         }
320         _propertyIndex = index;
321     }
322 
323     /**
324      * Method called to ensure that the mutator has proper access rights to
325      * be called, as per configuration. Overridden by implementations that
326      * have mutators that require access, fields and setters.
327      *
328      * @since 2.8.3
329      */
fixAccess(DeserializationConfig config)330     public void fixAccess(DeserializationConfig config) {
331         ;
332     }
333 
334     /**
335      * @since 2.9.4
336      */
markAsIgnorable()337     public void markAsIgnorable() { }
338 
339     /**
340      * @since 2.9.4
341      */
isIgnorable()342     public boolean isIgnorable() { return false; }
343 
344     /*
345     /**********************************************************
346     /* BeanProperty impl
347     /**********************************************************
348      */
349 
350     @Override
getName()351     public final String getName() {
352         return _propName.getSimpleName();
353     }
354 
355     @Override
getFullName()356     public PropertyName getFullName() {
357         return _propName;
358     }
359 
360     @Override
getType()361     public JavaType getType() { return _type; }
362 
363     @Override
getWrapperName()364     public PropertyName getWrapperName() {
365         return _wrapperName;
366     }
367 
368     @Override
getMember()369     public abstract AnnotatedMember getMember();
370 
371     @Override
getAnnotation(Class<A> acls)372     public abstract <A extends Annotation> A getAnnotation(Class<A> acls);
373 
374     @Override
getContextAnnotation(Class<A> acls)375     public <A extends Annotation> A getContextAnnotation(Class<A> acls) {
376         return _contextAnnotations.get(acls);
377     }
378 
379     @Override
depositSchemaProperty(JsonObjectFormatVisitor objectVisitor, SerializerProvider provider)380     public void depositSchemaProperty(JsonObjectFormatVisitor objectVisitor,
381             SerializerProvider provider)
382         throws JsonMappingException
383     {
384         if (isRequired()) {
385             objectVisitor.property(this);
386         } else {
387             objectVisitor.optionalProperty(this);
388         }
389     }
390 
391     /*
392     /**********************************************************
393     /* Accessors
394     /**********************************************************
395      */
396 
getDeclaringClass()397     protected Class<?> getDeclaringClass() {
398         return getMember().getDeclaringClass();
399     }
400 
getManagedReferenceName()401     public String getManagedReferenceName() { return _managedReferenceName; }
402 
getObjectIdInfo()403     public ObjectIdInfo getObjectIdInfo() { return _objectIdInfo; }
404 
hasValueDeserializer()405     public boolean hasValueDeserializer() {
406         return (_valueDeserializer != null) && (_valueDeserializer != MISSING_VALUE_DESERIALIZER);
407     }
408 
hasValueTypeDeserializer()409     public boolean hasValueTypeDeserializer() { return (_valueTypeDeserializer != null); }
410 
getValueDeserializer()411     public JsonDeserializer<Object> getValueDeserializer() {
412         JsonDeserializer<Object> deser = _valueDeserializer;
413         if (deser == MISSING_VALUE_DESERIALIZER) {
414             return null;
415         }
416         return deser;
417     }
418 
getValueTypeDeserializer()419     public TypeDeserializer getValueTypeDeserializer() { return _valueTypeDeserializer; }
420 
421     /**
422      * @since 2.9
423      */
getNullValueProvider()424     public NullValueProvider getNullValueProvider() { return _nullProvider; }
425 
visibleInView(Class<?> activeView)426     public boolean visibleInView(Class<?> activeView) {
427         return (_viewMatcher == null) || _viewMatcher.isVisibleForView(activeView);
428     }
429 
hasViews()430     public boolean hasViews() { return _viewMatcher != null; }
431 
432     /**
433      * Method for accessing unique index of this property; indexes are
434      * assigned once all properties of a {@link BeanDeserializer} have
435      * been collected.
436      *
437      * @return Index of this property
438      */
getPropertyIndex()439     public int getPropertyIndex() { return _propertyIndex; }
440 
441     /**
442      * Method for accessing index of the creator property: for other
443      * types of properties will simply return -1.
444      *
445      * @since 2.1
446      */
getCreatorIndex()447     public int getCreatorIndex() {
448         // changed from 'return -1' in 2.7.9 / 2.8.7
449         throw new IllegalStateException(String.format(
450                 "Internal error: no creator index for property '%s' (of type %s)",
451                 this.getName(), getClass().getName()));
452     }
453 
454     /**
455      * Accessor for id of injectable value, if this bean property supports
456      * value injection.
457      */
getInjectableValueId()458     public Object getInjectableValueId() { return null; }
459 
460     /**
461      * Accessor for checking whether this property is injectable, and if so,
462      * ONLY injectable (will not bind from input).
463      * Currently (2.11) can only return {@code true} for Creator-backed properties.
464      *
465      * @return True if (and only if) property has injector that is also defined NOT
466      *    to bind from input.
467      *
468      * @since 2.11
469      */
isInjectionOnly()470     public boolean isInjectionOnly() { return false; } // overridden by CreatorProperty
471 
472     /*
473     /**********************************************************
474     /* Public API
475     /**********************************************************
476      */
477 
478     /**
479      * Method called to deserialize appropriate value, given parser (and
480      * context), and set it using appropriate mechanism.
481      * Pre-condition is that passed parser must point to the first token
482      * that should be consumed to produce the value (the only value for
483      * scalars, multiple for Objects and Arrays).
484      */
deserializeAndSet(JsonParser p, DeserializationContext ctxt, Object instance)485     public abstract void deserializeAndSet(JsonParser p,
486     		DeserializationContext ctxt, Object instance) throws IOException;
487 
488 	/**
489 	 * Alternative to {@link #deserializeAndSet} that returns
490 	 * either return value of setter method called (if one is),
491 	 * or null to indicate that no return value is available.
492 	 * Mostly used to support Builder style deserialization.
493 	 *
494 	 * @since 2.0
495 	 */
deserializeSetAndReturn(JsonParser p, DeserializationContext ctxt, Object instance)496     public abstract Object deserializeSetAndReturn(JsonParser p,
497     		DeserializationContext ctxt, Object instance) throws IOException;
498 
499     /**
500      * Method called to assign given value to this property, on
501      * specified Object.
502      *<p>
503      * Note: this is an optional operation, not supported by all
504      * implementations, creator-backed properties for example do not
505      * support this method.
506      */
set(Object instance, Object value)507     public abstract void set(Object instance, Object value) throws IOException;
508 
509     /**
510      * Method called to assign given value to this property, on
511      * specified Object, and return whatever delegating accessor
512      * returned (if anything)
513      *<p>
514      * Note: this is an optional operation, not supported by all
515      * implementations, creator-backed properties for example do not
516      * support this method.
517      */
setAndReturn(Object instance, Object value)518     public abstract Object setAndReturn(Object instance, Object value) throws IOException;
519 
520     /**
521      * This method is needed by some specialized bean deserializers,
522      * and also called by some {@link #deserializeAndSet} implementations.
523      *<p>
524      * Pre-condition is that passed parser must point to the first token
525      * that should be consumed to produce the value (the only value for
526      * scalars, multiple for Objects and Arrays).
527      *<p>
528      * Note that this method is final for performance reasons: to override
529      * functionality you must override other methods that call this method;
530      * this method should also not be called directly unless you really know
531      * what you are doing (and probably not even then).
532      */
deserialize(JsonParser p, DeserializationContext ctxt)533     public final Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException
534     {
535         if (p.hasToken(JsonToken.VALUE_NULL)) {
536             return _nullProvider.getNullValue(ctxt);
537         }
538         if (_valueTypeDeserializer != null) {
539             return _valueDeserializer.deserializeWithType(p, ctxt, _valueTypeDeserializer);
540         }
541         // 04-May-2018, tatu: [databind#2023] Coercion from String (mostly) can give null
542         Object value =  _valueDeserializer.deserialize(p, ctxt);
543         if (value == null) {
544             value = _nullProvider.getNullValue(ctxt);
545         }
546         return value;
547     }
548 
549     /**
550      * @since 2.9
551      */
deserializeWith(JsonParser p, DeserializationContext ctxt, Object toUpdate)552     public final Object deserializeWith(JsonParser p, DeserializationContext ctxt,
553             Object toUpdate) throws IOException
554     {
555         // 20-Oct-2016, tatu: Not 100% sure what to do; probably best to simply return
556         //   null value and let caller decide what to do.
557         if (p.hasToken(JsonToken.VALUE_NULL)) {
558             // ... except for "skip nulls" case which should just do that:
559             if (NullsConstantProvider.isSkipper(_nullProvider)) {
560                 return toUpdate;
561             }
562             return _nullProvider.getNullValue(ctxt);
563         }
564         // 20-Oct-2016, tatu: Also tricky -- for now, report an error
565         if (_valueTypeDeserializer != null) {
566             ctxt.reportBadDefinition(getType(),
567                     String.format("Cannot merge polymorphic property '%s'",
568                             getName()));
569 //            return _valueDeserializer.deserializeWithType(p, ctxt, _valueTypeDeserializer);
570         }
571         // 04-May-2018, tatu: [databind#2023] Coercion from String (mostly) can give null
572         Object value = _valueDeserializer.deserialize(p, ctxt, toUpdate);
573         if (value == null) {
574             if (NullsConstantProvider.isSkipper(_nullProvider)) {
575                 return toUpdate;
576             }
577             value = _nullProvider.getNullValue(ctxt);
578         }
579         return value;
580     }
581 
582     /*
583     /**********************************************************
584     /* Helper methods
585     /**********************************************************
586      */
587 
588     /**
589      * Method that takes in exception of any type, and casts or wraps it
590      * to an IOException or its subclass.
591      */
_throwAsIOE(JsonParser p, Exception e, Object value)592     protected void _throwAsIOE(JsonParser p, Exception e, Object value) throws IOException
593     {
594         if (e instanceof IllegalArgumentException) {
595             String actType = ClassUtil.classNameOf(value);
596             StringBuilder msg = new StringBuilder("Problem deserializing property '")
597                     .append(getName())
598                     .append("' (expected type: ")
599                     .append(getType())
600                     .append("; actual type: ")
601                     .append(actType).append(")");
602             String origMsg = ClassUtil.exceptionMessage(e);
603             if (origMsg != null) {
604                 msg.append(", problem: ")
605                     .append(origMsg);
606             } else {
607                 msg.append(" (no error message provided)");
608             }
609             throw JsonMappingException.from(p, msg.toString(), e);
610         }
611         _throwAsIOE(p, e);
612     }
613 
614     /**
615      * @since 2.7
616      */
_throwAsIOE(JsonParser p, Exception e)617     protected IOException _throwAsIOE(JsonParser p, Exception e) throws IOException
618     {
619         ClassUtil.throwIfIOE(e);
620         ClassUtil.throwIfRTE(e);
621         // let's wrap the innermost problem
622         Throwable th = ClassUtil.getRootCause(e);
623         throw JsonMappingException.from(p, ClassUtil.exceptionMessage(th), th);
624     }
625 
626     @Deprecated // since 2.7
_throwAsIOE(Exception e)627     protected IOException _throwAsIOE(Exception e) throws IOException {
628         return _throwAsIOE((JsonParser) null, e);
629     }
630 
631     // 10-Oct-2015, tatu: _Should_ be deprecated, too, but its remaining
632     //   callers cannot actually provide a JsonParser
_throwAsIOE(Exception e, Object value)633     protected void _throwAsIOE(Exception e, Object value) throws IOException {
634         _throwAsIOE((JsonParser) null, e, value);
635     }
636 
toString()637     @Override public String toString() { return "[property '"+getName()+"']"; }
638 
639     /*
640     /**********************************************************
641     /* Helper classes
642     /**********************************************************
643      */
644 
645     /**
646      * Helper class that is designed to both make it easier to sub-class
647      * delegating subtypes and to reduce likelihood of breakage when
648      * new methods are added.
649      *<p>
650      * Class was specifically added to help with {@code Afterburner}
651      * module, but its use is not limited to only support it.
652      *
653      * @since 2.9
654      */
655     public static abstract class Delegating
656         extends SettableBeanProperty
657     {
658         protected final SettableBeanProperty delegate;
659 
Delegating(SettableBeanProperty d)660         protected Delegating(SettableBeanProperty d) {
661             super(d);
662             delegate = d;
663         }
664 
665         /**
666          * Method sub-classes must implement, to construct a new instance
667          * with given delegate.
668          */
withDelegate(SettableBeanProperty d)669         protected abstract SettableBeanProperty withDelegate(SettableBeanProperty d);
670 
_with(SettableBeanProperty newDelegate)671         protected SettableBeanProperty _with(SettableBeanProperty newDelegate) {
672             if (newDelegate == delegate) {
673                 return this;
674             }
675             return withDelegate(newDelegate);
676         }
677 
678         @Override
withValueDeserializer(JsonDeserializer<?> deser)679         public SettableBeanProperty withValueDeserializer(JsonDeserializer<?> deser) {
680             return _with(delegate.withValueDeserializer(deser));
681         }
682 
683         @Override
withName(PropertyName newName)684         public SettableBeanProperty withName(PropertyName newName) {
685             return _with(delegate.withName(newName));
686         }
687 
688         @Override
withNullProvider(NullValueProvider nva)689         public SettableBeanProperty withNullProvider(NullValueProvider nva) {
690             return _with(delegate.withNullProvider(nva));
691         }
692 
693         @Override
assignIndex(int index)694         public void assignIndex(int index) {
695             delegate.assignIndex(index);
696         }
697 
698         @Override
fixAccess(DeserializationConfig config)699         public void fixAccess(DeserializationConfig config) {
700             delegate.fixAccess(config);
701         }
702 
703         /*
704         /**********************************************************
705         /* Accessors
706         /**********************************************************
707          */
708 
709         @Override
getDeclaringClass()710         protected Class<?> getDeclaringClass() { return delegate.getDeclaringClass(); }
711 
712         @Override
getManagedReferenceName()713         public String getManagedReferenceName() { return delegate.getManagedReferenceName(); }
714 
715         @Override
getObjectIdInfo()716         public ObjectIdInfo getObjectIdInfo() { return delegate.getObjectIdInfo(); }
717 
718         @Override
hasValueDeserializer()719         public boolean hasValueDeserializer() { return delegate.hasValueDeserializer(); }
720 
721         @Override
hasValueTypeDeserializer()722         public boolean hasValueTypeDeserializer() { return delegate.hasValueTypeDeserializer(); }
723 
724         @Override
getValueDeserializer()725         public JsonDeserializer<Object> getValueDeserializer() { return delegate.getValueDeserializer(); }
726 
727         @Override
getValueTypeDeserializer()728         public TypeDeserializer getValueTypeDeserializer() { return delegate.getValueTypeDeserializer(); }
729 
730         @Override
visibleInView(Class<?> activeView)731         public boolean visibleInView(Class<?> activeView) { return delegate.visibleInView(activeView); }
732 
733         @Override
hasViews()734         public boolean hasViews() { return delegate.hasViews(); }
735 
736         @Override
getPropertyIndex()737         public int getPropertyIndex() { return delegate.getPropertyIndex(); }
738 
739         @Override
getCreatorIndex()740         public int getCreatorIndex() { return delegate.getCreatorIndex(); }
741 
742         @Override
getInjectableValueId()743         public Object getInjectableValueId() { return delegate.getInjectableValueId(); }
744 
745         @Override
isInjectionOnly()746         public boolean isInjectionOnly() { return delegate.isInjectionOnly(); }
747 
748         @Override
getMember()749         public AnnotatedMember getMember() {
750             return delegate.getMember();
751         }
752 
753         @Override
getAnnotation(Class<A> acls)754         public <A extends Annotation> A getAnnotation(Class<A> acls) {
755             return delegate.getAnnotation(acls);
756         }
757 
758         /*
759         /**********************************************************
760         /* Extended API
761         /**********************************************************
762          */
763 
getDelegate()764         public SettableBeanProperty getDelegate() {
765             return delegate;
766         }
767 
768         /*
769         /**********************************************************
770         /* Actual mutators
771         /**********************************************************
772          */
773 
774         @Override
deserializeAndSet(JsonParser p, DeserializationContext ctxt, Object instance)775         public void deserializeAndSet(JsonParser p, DeserializationContext ctxt,
776                 Object instance) throws IOException {
777             delegate.deserializeAndSet(p, ctxt, instance);
778         }
779 
780         @Override
deserializeSetAndReturn(JsonParser p, DeserializationContext ctxt, Object instance)781         public Object deserializeSetAndReturn(JsonParser p,
782                 DeserializationContext ctxt, Object instance) throws IOException
783         {
784             return delegate.deserializeSetAndReturn(p, ctxt, instance);
785         }
786 
787         @Override
set(Object instance, Object value)788         public void set(Object instance, Object value) throws IOException {
789             delegate.set(instance, value);
790         }
791 
792         @Override
setAndReturn(Object instance, Object value)793         public Object setAndReturn(Object instance, Object value) throws IOException {
794             return delegate.setAndReturn(instance, value);
795         }
796     }
797 }
798