1 package com.fasterxml.jackson.databind.deser;
2 
3 import java.io.IOException;
4 
5 import com.fasterxml.jackson.databind.*;
6 import com.fasterxml.jackson.databind.cfg.CoercionAction;
7 import com.fasterxml.jackson.databind.cfg.CoercionInputShape;
8 import com.fasterxml.jackson.databind.deser.impl.PropertyValueBuffer;
9 import com.fasterxml.jackson.databind.introspect.AnnotatedWithParams;
10 import com.fasterxml.jackson.databind.type.LogicalType;
11 import java.math.BigDecimal;
12 import java.math.BigInteger;
13 
14 /**
15  * Class that defines simple API implemented by objects that create value
16  * instances.  Some or all of properties of value instances may
17  * be initialized by instantiator, rest being populated by deserializer,
18  * to which value instance is passed.
19  * Since different kinds of JSON values (structured and scalar)
20  * may be bound to Java values, in some cases instantiator
21  * fully defines resulting value; this is the case when JSON value
22  * is a scalar value (String, number, boolean).
23  *<p>
24  * Note that this type is not parameterized (even though it would seemingly
25  * make sense), because such type information cannot be use effectively
26  * during runtime: access is always using either wildcard type, or just
27  * basic {@link java.lang.Object}; and so adding type parameter seems
28  * like unnecessary extra work.
29  *<p>
30  * Actual implementations are strongly recommended to be based on
31  * {@link com.fasterxml.jackson.databind.deser.std.StdValueInstantiator}
32  * which implements all methods, and as such will be compatible
33  * across versions even if new methods were added to this interface.
34  */
35 public abstract class ValueInstantiator
36 {
37     /*
38     /**********************************************************
39     /* Introspection
40     /**********************************************************
41      */
42 
43     /**
44      * @since 2.9
45      */
46     public interface Gettable {
getValueInstantiator()47         public ValueInstantiator getValueInstantiator();
48     }
49 
50     /*
51     /**********************************************************
52     /* Life-cycle
53     /**********************************************************
54      */
55 
56     /**
57      * "Contextualization" method that is called after construction but before first
58      * use, to allow instantiator access to context needed to possible resolve its
59      * dependencies.
60      *
61      * @param ctxt Currently active deserialization context: needed to (for example)
62      *    resolving {@link com.fasterxml.jackson.databind.jsontype.TypeDeserializer}s.
63      *
64      * @return This instance, if no change, or newly constructed instance
65      *
66      * @throws JsonMappingException If there are issues with contextualization
67      *
68      * @since 2.12
69      */
createContextual(DeserializationContext ctxt, BeanDescription beanDesc)70     public ValueInstantiator createContextual(DeserializationContext ctxt, BeanDescription beanDesc)
71             throws JsonMappingException
72     {
73         return this;
74     }
75 
76     /*
77     /**********************************************************
78     /* Metadata accessors
79     /**********************************************************
80      */
81 
82     /**
83      * Accessor for raw (type-erased) type of instances to create.
84      *<p>
85      * NOTE: since this method has not existed since beginning of
86      * Jackson 2.0 series, default implementation will just return
87      * <code>Object.class</code>; implementations are expected
88      * to override it with real value.
89      *
90      * @since 2.8
91      */
getValueClass()92     public Class<?> getValueClass() {
93         return Object.class;
94     }
95 
96     /**
97      * Method that returns description of the value type this instantiator
98      * handles. Used for error messages, diagnostics.
99      */
getValueTypeDesc()100     public String getValueTypeDesc() {
101         Class<?> cls = getValueClass();
102         if (cls == null) {
103             return "UNKNOWN";
104         }
105         return cls.getName();
106     }
107 
108     /**
109      * Method that will return true if any of {@code canCreateXxx} method
110      * returns true: that is, if there is any way that an instance could
111      * be created.
112      */
canInstantiate()113     public boolean canInstantiate() {
114         return canCreateUsingDefault()
115                 || canCreateUsingDelegate() || canCreateUsingArrayDelegate()
116                 || canCreateFromObjectWith() || canCreateFromString()
117                 || canCreateFromInt() || canCreateFromLong()
118                 || canCreateFromDouble() || canCreateFromBoolean();
119     }
120 
121     /**
122      * Method that can be called to check whether a String-based creator
123      * is available for this instantiator.
124      *<p>
125      * NOTE: does NOT include possible case of fallbacks, or coercion; only
126      * considers explicit creator.
127      */
canCreateFromString()128     public boolean canCreateFromString() { return false; }
129 
130     /**
131      * Method that can be called to check whether an integer (int, Integer) based
132      * creator is available to use (to call {@link #createFromInt}).
133      */
canCreateFromInt()134     public boolean canCreateFromInt() { return false; }
135 
136     /**
137      * Method that can be called to check whether a long (long, Long) based
138      * creator is available to use (to call {@link #createFromLong}).
139      */
canCreateFromLong()140     public boolean canCreateFromLong() { return false; }
141 
142     /**
143      * Method that can be called to check whether a BigInteger based creator is available
144      * to use (to call {@link #createFromBigInteger}). +
145      */
canCreateFromBigInteger()146     public boolean canCreateFromBigInteger() { return false; }
147 
148     /**
149      * Method that can be called to check whether a double (double / Double) based
150      * creator is available to use (to call {@link #createFromDouble}).
151      */
canCreateFromDouble()152     public boolean canCreateFromDouble() { return false; }
153 
154     /**
155      * Method that can be called to check whether a BigDecimal based creator is available
156      * to use (to call {@link #createFromBigDecimal}).
157      */
canCreateFromBigDecimal()158     public boolean canCreateFromBigDecimal() { return false; }
159 
160     /**
161      * Method that can be called to check whether a double (boolean / Boolean) based
162      * creator is available to use (to call {@link #createFromDouble}).
163      */
canCreateFromBoolean()164     public boolean canCreateFromBoolean() { return false; }
165 
166 
167     /**
168      * Method that can be called to check whether a default creator (constructor,
169      * or no-arg static factory method)
170      * is available for this instantiator
171      */
canCreateUsingDefault()172     public boolean canCreateUsingDefault() {  return getDefaultCreator() != null; }
173 
174     /**
175      * Method that can be called to check whether a delegate-based creator (single-arg
176      * constructor or factory method)
177      * is available for this instantiator
178      */
canCreateUsingDelegate()179     public boolean canCreateUsingDelegate() { return false; }
180 
181     /**
182      * Method that can be called to check whether a array-delegate-based creator
183      * (single-arg constructor or factory method)
184      * is available for this instantiator
185      *
186      * @since 2.7
187      */
canCreateUsingArrayDelegate()188     public boolean canCreateUsingArrayDelegate() { return false; }
189 
190     /**
191      * Method that can be called to check whether a property-based creator
192      * (argument-taking constructor or factory method)
193      * is available to instantiate values from JSON Object
194      */
canCreateFromObjectWith()195     public boolean canCreateFromObjectWith() { return false; }
196 
197     /**
198      * Method called to determine types of instantiation arguments
199      * to use when creating instances with creator arguments
200      * (when {@link #canCreateFromObjectWith()} returns  true).
201      * These arguments are bound from JSON, using specified
202      * property types to locate deserializers.
203      *<p>
204      * NOTE: all properties will be of type
205      * {@link com.fasterxml.jackson.databind.deser.CreatorProperty}.
206      */
getFromObjectArguments(DeserializationConfig config)207     public SettableBeanProperty[] getFromObjectArguments(DeserializationConfig config) {
208         return null;
209     }
210 
211     /**
212      * Method that can be used to determine what is the type of delegate
213      * type to use, if any; if no delegates are used, will return null.
214      * If non-null type is returned, deserializer will bind JSON into
215      * specified type (using standard deserializer for that type), and
216      * pass that to instantiator.
217      */
getDelegateType(DeserializationConfig config)218     public JavaType getDelegateType(DeserializationConfig config) { return null; }
219 
220     /**
221      * Method that can be used to determine what is the type of array delegate
222      * type to use, if any; if no delegates are used, will return null. If
223      * non-null type is returned, deserializer will bind JSON into specified
224      * type (using standard deserializer for that type), and pass that to
225      * instantiator.
226      *
227      * @since 2.7
228      */
getArrayDelegateType(DeserializationConfig config)229     public JavaType getArrayDelegateType(DeserializationConfig config) { return null; }
230 
231     /*
232     /**********************************************************
233     /* Instantiation methods for JSON Object
234     /**********************************************************
235      */
236 
237     /**
238      * Method called to create value instance from a JSON value when
239      * no data needs to passed to creator (constructor, factory method);
240      * typically this will call the default constructor of the value object.
241      * It will only be used if more specific creator methods are not
242      * applicable; hence "default".
243      *<p>
244      * This method is called if {@link #getFromObjectArguments} returns
245      * null or empty List.
246      */
createUsingDefault(DeserializationContext ctxt)247     public Object createUsingDefault(DeserializationContext ctxt) throws IOException {
248         return ctxt.handleMissingInstantiator(getValueClass(), this, null,
249                 "no default no-arguments constructor found");
250     }
251 
252     /**
253      * Method called to create value instance from JSON Object when
254      * instantiation arguments are passed; this is done, for example when passing information
255      * specified with "Creator" annotations.
256      *<p>
257      * This method is called if {@link #getFromObjectArguments} returns
258      * a non-empty List of arguments.
259      */
createFromObjectWith(DeserializationContext ctxt, Object[] args)260     public Object createFromObjectWith(DeserializationContext ctxt, Object[] args) throws IOException {
261         // sanity check; shouldn't really get called if no Creator specified
262         return ctxt.handleMissingInstantiator(getValueClass(), this, null,
263                 "no creator with arguments specified");
264     }
265 
266     /**
267      * Method that delegates to
268      * {@link #createFromObjectWith(DeserializationContext, Object[])} by
269      * default, but can be overridden if the application should have customized
270      * behavior with respect to missing properties.
271      *<p>
272      * The default implementation of this method uses
273      * {@link PropertyValueBuffer#getParameters(SettableBeanProperty[])} to read
274      * and validate all properties in bulk, possibly substituting defaults for
275      * missing properties or throwing exceptions for missing properties.  An
276      * overridden implementation of this method could, for example, use
277      * {@link PropertyValueBuffer#hasParameter(SettableBeanProperty)} and
278      * {@link PropertyValueBuffer#getParameter(SettableBeanProperty)} to safely
279      * read the present properties only, and to have some other behavior for the
280      * missing properties.
281      *
282      * @since 2.8
283      */
createFromObjectWith(DeserializationContext ctxt, SettableBeanProperty[] props, PropertyValueBuffer buffer)284     public Object createFromObjectWith(DeserializationContext ctxt,
285             SettableBeanProperty[] props, PropertyValueBuffer buffer)
286         throws IOException
287     {
288         return createFromObjectWith(ctxt, buffer.getParameters(props));
289     }
290 
291     /**
292      * Method to called to create value instance from JSON Object using
293      * an intermediate "delegate" value to pass to createor method
294      */
createUsingDelegate(DeserializationContext ctxt, Object delegate)295     public Object createUsingDelegate(DeserializationContext ctxt, Object delegate) throws IOException {
296         return ctxt.handleMissingInstantiator(getValueClass(), this, null,
297                 "no delegate creator specified");
298     }
299 
300     /**
301      * Method to called to create value instance from JSON Array using
302      * an intermediate "delegate" value to pass to createor method
303      */
createUsingArrayDelegate(DeserializationContext ctxt, Object delegate)304     public Object createUsingArrayDelegate(DeserializationContext ctxt, Object delegate) throws IOException {
305         return ctxt.handleMissingInstantiator(getValueClass(), this, null,
306                 "no array delegate creator specified");
307     }
308 
309     /*
310     /**********************************************************
311     /* Instantiation methods for JSON scalar types (String, Number, Boolean)
312     /**********************************************************
313      */
314 
createFromString(DeserializationContext ctxt, String value)315     public Object createFromString(DeserializationContext ctxt, String value) throws IOException {
316         return ctxt.handleMissingInstantiator(getValueClass(), this, ctxt.getParser(),
317                 "no String-argument constructor/factory method to deserialize from String value ('%s')",
318                 value);
319 
320     }
321 
createFromInt(DeserializationContext ctxt, int value)322     public Object createFromInt(DeserializationContext ctxt, int value) throws IOException {
323         return ctxt.handleMissingInstantiator(getValueClass(), this, null,
324                 "no int/Int-argument constructor/factory method to deserialize from Number value (%s)",
325                 value);
326     }
327 
createFromLong(DeserializationContext ctxt, long value)328     public Object createFromLong(DeserializationContext ctxt, long value) throws IOException {
329         return ctxt.handleMissingInstantiator(getValueClass(), this, null,
330                 "no long/Long-argument constructor/factory method to deserialize from Number value (%s)",
331                 value);
332     }
333 
createFromBigInteger(DeserializationContext ctxt, BigInteger value)334     public Object createFromBigInteger(DeserializationContext ctxt, BigInteger value) throws IOException
335     {
336         return ctxt.handleMissingInstantiator(getValueClass(),this,null,
337                                               "no BigInteger-argument constructor/factory method to deserialize from Number value (%s)",
338                                               value
339         );
340     }
341 
createFromDouble(DeserializationContext ctxt, double value)342     public Object createFromDouble(DeserializationContext ctxt, double value) throws IOException {
343         return ctxt.handleMissingInstantiator(getValueClass(), this, null,
344                 "no double/Double-argument constructor/factory method to deserialize from Number value (%s)",
345                 value);
346     }
347 
createFromBigDecimal(DeserializationContext ctxt, BigDecimal value)348     public Object createFromBigDecimal(DeserializationContext ctxt, BigDecimal value) throws IOException
349     {
350         return ctxt.handleMissingInstantiator(getValueClass(),this,null,
351                                               "no BigDecimal/double/Double-argument constructor/factory method to deserialize from Number value (%s)",
352                                               value
353         );
354     }
355 
createFromBoolean(DeserializationContext ctxt, boolean value)356     public Object createFromBoolean(DeserializationContext ctxt, boolean value) throws IOException {
357         return ctxt.handleMissingInstantiator(getValueClass(), this, null,
358                 "no boolean/Boolean-argument constructor/factory method to deserialize from boolean value (%s)",
359                 value);
360     }
361 
362     /*
363     /**********************************************************
364     /* Accessors for underlying creator objects (optional)
365     /**********************************************************
366      */
367 
368     /**
369      * Method that can be called to try to access member (constructor,
370      * static factory method) that is used as the "default creator"
371      * (creator that is called without arguments; typically default
372      * [zero-argument] constructor of the type).
373      * Note that implementations not required to return actual object
374      * they use (or, they may use some other instantiation) method.
375      * That is, even if {@link #canCreateUsingDefault()} returns true,
376      * this method may return null .
377      */
getDefaultCreator()378     public AnnotatedWithParams getDefaultCreator() { return null; }
379 
380     /**
381      * Method that can be called to try to access member (constructor,
382      * static factory method) that is used as the "delegate creator".
383      * Note that implementations not required to return actual object
384      * they use (or, they may use some other instantiation) method.
385      * That is, even if {@link #canCreateUsingDelegate()} returns true,
386      * this method may return null .
387      */
getDelegateCreator()388     public AnnotatedWithParams getDelegateCreator() { return null; }
389 
390     /**
391      * Method that can be called to try to access member (constructor,
392      * static factory method) that is used as the "array delegate creator".
393      * Note that implementations not required to return actual object
394      * they use (or, they may use some other instantiation) method.
395      * That is, even if {@link #canCreateUsingArrayDelegate()} returns true,
396      * this method may return null .
397      */
getArrayDelegateCreator()398     public AnnotatedWithParams getArrayDelegateCreator() { return null; }
399 
400     /**
401      * Method that can be called to try to access member (constructor,
402      * static factory method) that is used as the "non-default creator"
403      * (constructor or factory method that takes one or more arguments).
404      * Note that implementations not required to return actual object
405      * they use (or, they may use some other instantiation) method.
406      * That is, even if {@link #canCreateFromObjectWith()} returns true,
407      * this method may return null .
408      */
getWithArgsCreator()409     public AnnotatedWithParams getWithArgsCreator() { return null; }
410 
411     /*
412     /**********************************************************
413     /* Helper methods
414     /**********************************************************
415      */
416 
417     /**
418      * @since 2.4 (demoted from <code>StdValueInstantiator</code>)
419      * @deprecated Since 2.12 should not handle coercions here
420      */
421     @Deprecated // since 2.12
_createFromStringFallbacks(DeserializationContext ctxt, String value)422     protected Object _createFromStringFallbacks(DeserializationContext ctxt, String value)
423             throws IOException
424     {
425         // also, empty Strings might be accepted as null Object...
426         if (value.length() == 0) {
427             if (ctxt.isEnabled(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT)) {
428                 return null;
429             }
430         }
431 
432         /* 28-Sep-2011, tatu: Ok this is not clean at all; but since there are legacy
433          *   systems that expect conversions in some cases, let's just add a minimal
434          *   patch (note: same could conceivably be used for numbers too).
435          */
436         if (canCreateFromBoolean()) {
437             // 29-May-2020, tatu: With 2.12 can and should use CoercionConfig so:
438             if (ctxt.findCoercionAction(LogicalType.Boolean, Boolean.class,
439                     CoercionInputShape.String) == CoercionAction.TryConvert) {
440                 String str = value.trim();
441                 if ("true".equals(str)) {
442                     return createFromBoolean(ctxt, true);
443                 }
444                 if ("false".equals(str)) {
445                     return createFromBoolean(ctxt, false);
446                 }
447             }
448         }
449         return ctxt.handleMissingInstantiator(getValueClass(), this, ctxt.getParser(),
450                 "no String-argument constructor/factory method to deserialize from String value ('%s')",
451                 value);
452     }
453 
454     /*
455     /**********************************************************
456     /* Standard Base implementation (since 2.8)
457     /**********************************************************
458      */
459 
460     /**
461      * Partial {@link ValueInstantiator} implementation that is strongly recommended
462      * to be used instead of directly extending {@link ValueInstantiator} itself.
463      */
464     public static class Base extends ValueInstantiator
465         implements java.io.Serializable // just because used as base for "standard" variants
466     {
467         private static final long serialVersionUID = 1L;
468 
469         protected final Class<?> _valueType;
470 
Base(Class<?> type)471         public Base(Class<?> type) {
472             _valueType = type;
473         }
474 
Base(JavaType type)475         public Base(JavaType type) {
476             _valueType = type.getRawClass();
477         }
478 
479         @Override
getValueTypeDesc()480         public String getValueTypeDesc() {
481             return _valueType.getName();
482         }
483 
484         @Override
getValueClass()485         public Class<?> getValueClass() {
486             return _valueType;
487         }
488     }
489 
490     /**
491      * Delegating {@link ValueInstantiator} implementation meant as a base type
492      * that by default delegates methods to specified fallback instantiator.
493      *
494      * @since 2.12
495      */
496     public static class Delegating extends ValueInstantiator
497         implements java.io.Serializable
498     {
499         private static final long serialVersionUID = 1L;
500 
501         protected final ValueInstantiator _delegate;
502 
Delegating(ValueInstantiator delegate)503         protected Delegating(ValueInstantiator delegate) {
504             _delegate = delegate;
505         }
506 
507         @Override
createContextual(DeserializationContext ctxt, BeanDescription beanDesc)508         public ValueInstantiator createContextual(DeserializationContext ctxt,  BeanDescription beanDesc)
509                 throws JsonMappingException
510         {
511             ValueInstantiator d = _delegate.createContextual(ctxt, beanDesc);
512             return (d == _delegate) ? this : new Delegating(d);
513         }
514 
delegate()515         protected ValueInstantiator delegate() { return _delegate; }
516 
517         @Override
getValueClass()518         public Class<?> getValueClass() { return delegate().getValueClass(); }
519 
520         @Override
getValueTypeDesc()521         public String getValueTypeDesc() { return delegate().getValueTypeDesc(); }
522 
523         @Override
canInstantiate()524         public boolean canInstantiate() { return delegate().canInstantiate(); }
525 
526         @Override
canCreateFromString()527         public boolean canCreateFromString() { return delegate().canCreateFromString(); }
528         @Override
canCreateFromInt()529         public boolean canCreateFromInt() { return delegate().canCreateFromInt(); }
530         @Override
canCreateFromLong()531         public boolean canCreateFromLong() { return delegate().canCreateFromLong(); }
532         @Override
canCreateFromDouble()533         public boolean canCreateFromDouble() { return delegate().canCreateFromDouble(); }
534         @Override
canCreateFromBoolean()535         public boolean canCreateFromBoolean() { return delegate().canCreateFromBoolean(); }
536         @Override
canCreateUsingDefault()537         public boolean canCreateUsingDefault() { return delegate().canCreateUsingDefault(); }
538         @Override
canCreateUsingDelegate()539         public boolean canCreateUsingDelegate() { return delegate().canCreateUsingDelegate(); }
540         @Override
canCreateUsingArrayDelegate()541         public boolean canCreateUsingArrayDelegate() { return delegate().canCreateUsingArrayDelegate(); }
542         @Override
canCreateFromObjectWith()543         public boolean canCreateFromObjectWith() { return delegate().canCreateFromObjectWith(); }
544 
545         @Override
getFromObjectArguments(DeserializationConfig config)546         public SettableBeanProperty[] getFromObjectArguments(DeserializationConfig config) {
547             return delegate().getFromObjectArguments(config);
548         }
549 
550         @Override
getDelegateType(DeserializationConfig config)551         public JavaType getDelegateType(DeserializationConfig config) {
552             return delegate().getDelegateType(config);
553         }
554 
555         @Override
getArrayDelegateType(DeserializationConfig config)556         public JavaType getArrayDelegateType(DeserializationConfig config) {
557             return delegate().getArrayDelegateType(config);
558         }
559 
560         /*
561         /**********************************************************
562         /* Creation methods
563         /**********************************************************
564          */
565 
566         @Override
createUsingDefault(DeserializationContext ctxt)567         public Object createUsingDefault(DeserializationContext ctxt) throws IOException {
568             return delegate().createUsingDefault(ctxt);
569         }
570 
571         @Override
createFromObjectWith(DeserializationContext ctxt, Object[] args)572         public Object createFromObjectWith(DeserializationContext ctxt, Object[] args) throws IOException {
573             return delegate().createFromObjectWith(ctxt, args);
574         }
575 
576         @Override
createFromObjectWith(DeserializationContext ctxt, SettableBeanProperty[] props, PropertyValueBuffer buffer)577         public Object createFromObjectWith(DeserializationContext ctxt,
578                 SettableBeanProperty[] props, PropertyValueBuffer buffer)
579             throws IOException {
580             return delegate().createFromObjectWith(ctxt, props, buffer);
581         }
582 
583         @Override
createUsingDelegate(DeserializationContext ctxt, Object delegate)584         public Object createUsingDelegate(DeserializationContext ctxt, Object delegate) throws IOException {
585             return delegate().createUsingDelegate(ctxt, delegate);
586         }
587 
588         @Override
createUsingArrayDelegate(DeserializationContext ctxt, Object delegate)589         public Object createUsingArrayDelegate(DeserializationContext ctxt, Object delegate) throws IOException {
590             return delegate().createUsingArrayDelegate(ctxt, delegate);
591         }
592 
593         @Override
createFromString(DeserializationContext ctxt, String value)594         public Object createFromString(DeserializationContext ctxt, String value) throws IOException {
595             return delegate().createFromString(ctxt, value);
596         }
597 
598         @Override
createFromInt(DeserializationContext ctxt, int value)599         public Object createFromInt(DeserializationContext ctxt, int value) throws IOException {
600             return delegate().createFromInt(ctxt, value);
601         }
602 
603         @Override
createFromLong(DeserializationContext ctxt, long value)604         public Object createFromLong(DeserializationContext ctxt, long value) throws IOException {
605             return delegate().createFromLong(ctxt, value);
606         }
607 
608         @Override
createFromBigInteger(DeserializationContext ctxt, BigInteger value)609         public Object createFromBigInteger(DeserializationContext ctxt, BigInteger value) throws IOException {
610             return delegate().createFromBigInteger(ctxt, value);
611         }
612 
613         @Override
createFromDouble(DeserializationContext ctxt, double value)614         public Object createFromDouble(DeserializationContext ctxt, double value) throws IOException {
615             return delegate().createFromDouble(ctxt, value);
616         }
617 
618         @Override
createFromBigDecimal(DeserializationContext ctxt, BigDecimal value)619         public Object createFromBigDecimal(DeserializationContext ctxt, BigDecimal value) throws IOException {
620             return delegate().createFromBigDecimal(ctxt, value);
621         }
622 
623         @Override
createFromBoolean(DeserializationContext ctxt, boolean value)624         public Object createFromBoolean(DeserializationContext ctxt, boolean value) throws IOException {
625             return delegate().createFromBoolean(ctxt, value);
626         }
627 
628         /*
629         /**********************************************************
630         /* Accessors for underlying creator objects (optional)
631         /**********************************************************
632          */
633 
634         @Override
getDefaultCreator()635         public AnnotatedWithParams getDefaultCreator() { return delegate().getDefaultCreator(); }
636 
637         @Override
getDelegateCreator()638         public AnnotatedWithParams getDelegateCreator() { return delegate().getDelegateCreator(); }
639 
640         @Override
getArrayDelegateCreator()641         public AnnotatedWithParams getArrayDelegateCreator() { return delegate().getArrayDelegateCreator(); }
642 
643         @Override
getWithArgsCreator()644         public AnnotatedWithParams getWithArgsCreator() { return delegate().getWithArgsCreator(); }
645     }
646 }
647