1 package com.fasterxml.jackson.databind;
2
3 import java.util.*;
4
5 import com.fasterxml.jackson.core.*;
6 import com.fasterxml.jackson.core.json.JsonReadFeature;
7 import com.fasterxml.jackson.databind.cfg.*;
8 import com.fasterxml.jackson.databind.deser.DeserializationProblemHandler;
9 import com.fasterxml.jackson.databind.introspect.*;
10 import com.fasterxml.jackson.databind.jsontype.*;
11 import com.fasterxml.jackson.databind.node.JsonNodeFactory;
12 import com.fasterxml.jackson.databind.util.LinkedNode;
13 import com.fasterxml.jackson.databind.util.RootNameLookup;
14
15
24 public final class DeserializationConfig
25 extends MapperConfigBase<DeserializationFeature, DeserializationConfig>
26 implements java.io.Serializable
27 {
28
29 private static final long serialVersionUID = 2;
30
31
32 private final static int DESER_FEATURE_DEFAULTS = collectFeatureDefaults(DeserializationFeature.class);
33
34
39
40
45 protected final LinkedNode<DeserializationProblemHandler> _problemHandlers;
46
47
50 protected final JsonNodeFactory _nodeFactory;
51
52
57
58
61 protected final int _deserFeatures;
62
63
68
69
72 protected final int _parserFeatures;
73
74
77 protected final int _parserFeaturesToChange;
78
79
84 protected final int _formatReadFeatures;
85
86
91 protected final int _formatReadFeaturesToChange;
92
93
98
99
102 public DeserializationConfig(BaseSettings base,
103 SubtypeResolver str, SimpleMixInResolver mixins, RootNameLookup rootNames,
104 ConfigOverrides configOverrides)
105 {
106 super(base, str, mixins, rootNames, configOverrides);
107 _deserFeatures = DESER_FEATURE_DEFAULTS;
108 _nodeFactory = JsonNodeFactory.instance;
109 _problemHandlers = null;
110 _parserFeatures = 0;
111 _parserFeaturesToChange = 0;
112 _formatReadFeatures = 0;
113 _formatReadFeaturesToChange = 0;
114 }
115
116
121 protected DeserializationConfig(DeserializationConfig src,
122 SubtypeResolver str, SimpleMixInResolver mixins, RootNameLookup rootNames,
123 ConfigOverrides configOverrides)
124 {
125 super(src, str, mixins, rootNames, configOverrides);
126 _deserFeatures = src._deserFeatures;
127 _problemHandlers = src._problemHandlers;
128 _nodeFactory = src._nodeFactory;
129 _parserFeatures = src._parserFeatures;
130 _parserFeaturesToChange = src._parserFeaturesToChange;
131 _formatReadFeatures = src._formatReadFeatures;
132 _formatReadFeaturesToChange = src._formatReadFeaturesToChange;
133 }
134
135
139 @Deprecated
140 protected DeserializationConfig(DeserializationConfig src,
141 SimpleMixInResolver mixins, RootNameLookup rootNames,
142 ConfigOverrides configOverrides)
143 {
144 this(src, src._subtypeResolver, mixins, rootNames, configOverrides);
145 }
146
147
153
154 private DeserializationConfig(DeserializationConfig src,
155 int mapperFeatures, int deserFeatures,
156 int parserFeatures, int parserFeatureMask,
157 int formatFeatures, int formatFeatureMask)
158 {
159 super(src, mapperFeatures);
160 _deserFeatures = deserFeatures;
161 _nodeFactory = src._nodeFactory;
162 _problemHandlers = src._problemHandlers;
163 _parserFeatures = parserFeatures;
164 _parserFeaturesToChange = parserFeatureMask;
165 _formatReadFeatures = formatFeatures;
166 _formatReadFeaturesToChange = formatFeatureMask;
167 }
168
169
173 private DeserializationConfig(DeserializationConfig src, SubtypeResolver str)
174 {
175 super(src, str);
176 _deserFeatures = src._deserFeatures;
177 _nodeFactory = src._nodeFactory;
178 _problemHandlers = src._problemHandlers;
179 _parserFeatures = src._parserFeatures;
180 _parserFeaturesToChange = src._parserFeaturesToChange;
181 _formatReadFeatures = src._formatReadFeatures;
182 _formatReadFeaturesToChange = src._formatReadFeaturesToChange;
183 }
184
185 private DeserializationConfig(DeserializationConfig src, BaseSettings base)
186 {
187 super(src, base);
188 _deserFeatures = src._deserFeatures;
189 _nodeFactory = src._nodeFactory;
190 _problemHandlers = src._problemHandlers;
191 _parserFeatures = src._parserFeatures;
192 _parserFeaturesToChange = src._parserFeaturesToChange;
193 _formatReadFeatures = src._formatReadFeatures;
194 _formatReadFeaturesToChange = src._formatReadFeaturesToChange;
195 }
196
197 private DeserializationConfig(DeserializationConfig src, JsonNodeFactory f)
198 {
199 super(src);
200 _deserFeatures = src._deserFeatures;
201 _problemHandlers = src._problemHandlers;
202 _nodeFactory = f;
203 _parserFeatures = src._parserFeatures;
204 _parserFeaturesToChange = src._parserFeaturesToChange;
205 _formatReadFeatures = src._formatReadFeatures;
206 _formatReadFeaturesToChange = src._formatReadFeaturesToChange;
207 }
208
209 private DeserializationConfig(DeserializationConfig src,
210 LinkedNode<DeserializationProblemHandler> problemHandlers)
211 {
212 super(src);
213 _deserFeatures = src._deserFeatures;
214 _problemHandlers = problemHandlers;
215 _nodeFactory = src._nodeFactory;
216 _parserFeatures = src._parserFeatures;
217 _parserFeaturesToChange = src._parserFeaturesToChange;
218 _formatReadFeatures = src._formatReadFeatures;
219 _formatReadFeaturesToChange = src._formatReadFeaturesToChange;
220 }
221
222 private DeserializationConfig(DeserializationConfig src, PropertyName rootName)
223 {
224 super(src, rootName);
225 _deserFeatures = src._deserFeatures;
226 _problemHandlers = src._problemHandlers;
227 _nodeFactory = src._nodeFactory;
228 _parserFeatures = src._parserFeatures;
229 _parserFeaturesToChange = src._parserFeaturesToChange;
230 _formatReadFeatures = src._formatReadFeatures;
231 _formatReadFeaturesToChange = src._formatReadFeaturesToChange;
232 }
233
234 private DeserializationConfig(DeserializationConfig src, Class<?> view)
235 {
236 super(src, view);
237 _deserFeatures = src._deserFeatures;
238 _problemHandlers = src._problemHandlers;
239 _nodeFactory = src._nodeFactory;
240 _parserFeatures = src._parserFeatures;
241 _parserFeaturesToChange = src._parserFeaturesToChange;
242 _formatReadFeatures = src._formatReadFeatures;
243 _formatReadFeaturesToChange = src._formatReadFeaturesToChange;
244 }
245
246 protected DeserializationConfig(DeserializationConfig src, ContextAttributes attrs)
247 {
248 super(src, attrs);
249 _deserFeatures = src._deserFeatures;
250 _problemHandlers = src._problemHandlers;
251 _nodeFactory = src._nodeFactory;
252 _parserFeatures = src._parserFeatures;
253 _parserFeaturesToChange = src._parserFeaturesToChange;
254 _formatReadFeatures = src._formatReadFeatures;
255 _formatReadFeaturesToChange = src._formatReadFeaturesToChange;
256 }
257
258 protected DeserializationConfig(DeserializationConfig src, SimpleMixInResolver mixins)
259 {
260 super(src, mixins);
261 _deserFeatures = src._deserFeatures;
262 _problemHandlers = src._problemHandlers;
263 _nodeFactory = src._nodeFactory;
264 _parserFeatures = src._parserFeatures;
265 _parserFeaturesToChange = src._parserFeaturesToChange;
266 _formatReadFeatures = src._formatReadFeatures;
267 _formatReadFeaturesToChange = src._formatReadFeaturesToChange;
268 }
269
270
271 protected BaseSettings getBaseSettings() { return _base; }
272
273
278
279 @Override
280 protected final DeserializationConfig _withBase(BaseSettings newBase) {
281 return (_base == newBase) ? this : new DeserializationConfig(this, newBase);
282 }
283
284 @Override
285 protected final DeserializationConfig _withMapperFeatures(int mapperFeatures) {
286 return new DeserializationConfig(this, mapperFeatures, _deserFeatures,
287 _parserFeatures, _parserFeaturesToChange,
288 _formatReadFeatures, _formatReadFeaturesToChange);
289 }
290
291
296
297 @Override
298 public DeserializationConfig with(SubtypeResolver str) {
299 return (_subtypeResolver == str) ? this : new DeserializationConfig(this, str);
300 }
301
302 @Override
303 public DeserializationConfig withRootName(PropertyName rootName) {
304 if (rootName == null) {
305 if (_rootName == null) {
306 return this;
307 }
308 } else if (rootName.equals(_rootName)) {
309 return this;
310 }
311 return new DeserializationConfig(this, rootName);
312 }
313
314 @Override
315 public DeserializationConfig withView(Class<?> view) {
316 return (_view == view) ? this : new DeserializationConfig(this, view);
317 }
318
319 @Override
320 public DeserializationConfig with(ContextAttributes attrs) {
321 return (attrs == _attributes) ? this : new DeserializationConfig(this, attrs);
322 }
323
324
329
330
334 public DeserializationConfig with(DeserializationFeature feature)
335 {
336 int newDeserFeatures = (_deserFeatures | feature.getMask());
337 return (newDeserFeatures == _deserFeatures) ? this :
338 new DeserializationConfig(this, _mapperFeatures, newDeserFeatures,
339 _parserFeatures, _parserFeaturesToChange,
340 _formatReadFeatures, _formatReadFeaturesToChange);
341 }
342
343
347 public DeserializationConfig with(DeserializationFeature first,
348 DeserializationFeature... features)
349 {
350 int newDeserFeatures = _deserFeatures | first.getMask();
351 for (DeserializationFeature f : features) {
352 newDeserFeatures |= f.getMask();
353 }
354 return (newDeserFeatures == _deserFeatures) ? this :
355 new DeserializationConfig(this, _mapperFeatures, newDeserFeatures,
356 _parserFeatures, _parserFeaturesToChange,
357 _formatReadFeatures, _formatReadFeaturesToChange);
358 }
359
360
364 public DeserializationConfig withFeatures(DeserializationFeature... features)
365 {
366 int newDeserFeatures = _deserFeatures;
367 for (DeserializationFeature f : features) {
368 newDeserFeatures |= f.getMask();
369 }
370 return (newDeserFeatures == _deserFeatures) ? this :
371 new DeserializationConfig(this, _mapperFeatures, newDeserFeatures,
372 _parserFeatures, _parserFeaturesToChange,
373 _formatReadFeatures, _formatReadFeaturesToChange);
374 }
375
376
380 public DeserializationConfig without(DeserializationFeature feature)
381 {
382 int newDeserFeatures = _deserFeatures & ~feature.getMask();
383 return (newDeserFeatures == _deserFeatures) ? this :
384 new DeserializationConfig(this, _mapperFeatures, newDeserFeatures,
385 _parserFeatures, _parserFeaturesToChange,
386 _formatReadFeatures, _formatReadFeaturesToChange);
387 }
388
389
393 public DeserializationConfig without(DeserializationFeature first,
394 DeserializationFeature... features)
395 {
396 int newDeserFeatures = _deserFeatures & ~first.getMask();
397 for (DeserializationFeature f : features) {
398 newDeserFeatures &= ~f.getMask();
399 }
400 return (newDeserFeatures == _deserFeatures) ? this :
401 new DeserializationConfig(this, _mapperFeatures, newDeserFeatures,
402 _parserFeatures, _parserFeaturesToChange,
403 _formatReadFeatures, _formatReadFeaturesToChange);
404 }
405
406
410 public DeserializationConfig withoutFeatures(DeserializationFeature... features)
411 {
412 int newDeserFeatures = _deserFeatures;
413 for (DeserializationFeature f : features) {
414 newDeserFeatures &= ~f.getMask();
415 }
416 return (newDeserFeatures == _deserFeatures) ? this :
417 new DeserializationConfig(this, _mapperFeatures, newDeserFeatures,
418 _parserFeatures, _parserFeaturesToChange,
419 _formatReadFeatures, _formatReadFeaturesToChange);
420 }
421
422
427
428
434 public DeserializationConfig with(JsonParser.Feature feature)
435 {
436 int newSet = _parserFeatures | feature.getMask();
437 int newMask = _parserFeaturesToChange | feature.getMask();
438 return ((_parserFeatures == newSet) && (_parserFeaturesToChange == newMask)) ? this :
439 new DeserializationConfig(this, _mapperFeatures, _deserFeatures,
440 newSet, newMask,
441 _formatReadFeatures, _formatReadFeaturesToChange);
442 }
443
444
450 public DeserializationConfig withFeatures(JsonParser.Feature... features)
451 {
452 int newSet = _parserFeatures;
453 int newMask = _parserFeaturesToChange;
454 for (JsonParser.Feature f : features) {
455 int mask = f.getMask();
456 newSet |= mask;
457 newMask |= mask;
458 }
459 return ((_parserFeatures == newSet) && (_parserFeaturesToChange == newMask)) ? this :
460 new DeserializationConfig(this, _mapperFeatures, _deserFeatures,
461 newSet, newMask,
462 _formatReadFeatures, _formatReadFeaturesToChange);
463 }
464
465
471 public DeserializationConfig without(JsonParser.Feature feature)
472 {
473 int newSet = _parserFeatures & ~feature.getMask();
474 int newMask = _parserFeaturesToChange | feature.getMask();
475 return ((_parserFeatures == newSet) && (_parserFeaturesToChange == newMask)) ? this :
476 new DeserializationConfig(this, _mapperFeatures, _deserFeatures,
477 newSet, newMask,
478 _formatReadFeatures, _formatReadFeaturesToChange);
479 }
480
481
487 public DeserializationConfig withoutFeatures(JsonParser.Feature... features)
488 {
489 int newSet = _parserFeatures;
490 int newMask = _parserFeaturesToChange;
491 for (JsonParser.Feature f : features) {
492 int mask = f.getMask();
493 newSet &= ~mask;
494 newMask |= mask;
495 }
496 return ((_parserFeatures == newSet) && (_parserFeaturesToChange == newMask)) ? this :
497 new DeserializationConfig(this, _mapperFeatures, _deserFeatures,
498 newSet, newMask,
499 _formatReadFeatures, _formatReadFeaturesToChange);
500 }
501
502
507
508
514 public DeserializationConfig with(FormatFeature feature)
515 {
516
517 if (feature instanceof JsonReadFeature) {
518 return _withJsonReadFeatures(feature);
519 }
520 int newSet = _formatReadFeatures | feature.getMask();
521 int newMask = _formatReadFeaturesToChange | feature.getMask();
522 return ((_formatReadFeatures == newSet) && (_formatReadFeaturesToChange == newMask)) ? this :
523 new DeserializationConfig(this, _mapperFeatures, _deserFeatures,
524 _parserFeatures, _parserFeaturesToChange,
525 newSet, newMask);
526 }
527
528
534 public DeserializationConfig withFeatures(FormatFeature... features)
535 {
536
537 if (features.length > 0 && (features[0] instanceof JsonReadFeature)) {
538 return _withJsonReadFeatures(features);
539 }
540 int newSet = _formatReadFeatures;
541 int newMask = _formatReadFeaturesToChange;
542 for (FormatFeature f : features) {
543 int mask = f.getMask();
544 newSet |= mask;
545 newMask |= mask;
546 }
547 return ((_formatReadFeatures == newSet) && (_formatReadFeaturesToChange == newMask)) ? this :
548 new DeserializationConfig(this, _mapperFeatures, _deserFeatures,
549 _parserFeatures, _parserFeaturesToChange,
550 newSet, newMask);
551 }
552
553
559 public DeserializationConfig without(FormatFeature feature)
560 {
561
562 if (feature instanceof JsonReadFeature) {
563 return _withoutJsonReadFeatures(feature);
564 }
565 int newSet = _formatReadFeatures & ~feature.getMask();
566 int newMask = _formatReadFeaturesToChange | feature.getMask();
567 return ((_formatReadFeatures == newSet) && (_formatReadFeaturesToChange == newMask)) ? this :
568 new DeserializationConfig(this, _mapperFeatures, _deserFeatures,
569 _parserFeatures, _parserFeaturesToChange,
570 newSet, newMask);
571 }
572
573
579 public DeserializationConfig withoutFeatures(FormatFeature... features)
580 {
581
582 if (features.length > 0 && (features[0] instanceof JsonReadFeature)) {
583 return _withoutJsonReadFeatures(features);
584 }
585 int newSet = _formatReadFeatures;
586 int newMask = _formatReadFeaturesToChange;
587 for (FormatFeature f : features) {
588 int mask = f.getMask();
589 newSet &= ~mask;
590 newMask |= mask;
591 }
592 return ((_formatReadFeatures == newSet) && (_formatReadFeaturesToChange == newMask)) ? this :
593 new DeserializationConfig(this, _mapperFeatures, _deserFeatures,
594 _parserFeatures, _parserFeaturesToChange,
595 newSet, newMask);
596 }
597
598
599 private DeserializationConfig _withJsonReadFeatures(FormatFeature... features) {
600 int parserSet = _parserFeatures;
601 int parserMask = _parserFeaturesToChange;
602 int newSet = _formatReadFeatures;
603 int newMask = _formatReadFeaturesToChange;
604 for (FormatFeature f : features) {
605 final int mask = f.getMask();
606 newSet |= mask;
607 newMask |= mask;
608
609 if (f instanceof JsonReadFeature) {
610 JsonParser.Feature oldF = ((JsonReadFeature) f).mappedFeature();
611 if (oldF != null) {
612 final int pmask = oldF.getMask();
613 parserSet |= pmask;
614 parserMask |= pmask;
615 }
616 }
617 }
618 return ((_formatReadFeatures == newSet) && (_formatReadFeaturesToChange == newMask)
619 && (_parserFeatures == parserSet) && (_parserFeaturesToChange == parserMask)
620 ) ? this :
621 new DeserializationConfig(this, _mapperFeatures, _deserFeatures,
622 parserSet, parserMask, newSet, newMask);
623 }
624
625
626 private DeserializationConfig _withoutJsonReadFeatures(FormatFeature... features) {
627 int parserSet = _parserFeatures;
628 int parserMask = _parserFeaturesToChange;
629 int newSet = _formatReadFeatures;
630 int newMask = _formatReadFeaturesToChange;
631 for (FormatFeature f : features) {
632 final int mask = f.getMask();
633 newSet &= ~mask;
634 newMask |= mask;
635
636 if (f instanceof JsonReadFeature) {
637 JsonParser.Feature oldF = ((JsonReadFeature) f).mappedFeature();
638 if (oldF != null) {
639 final int pmask = oldF.getMask();
640 parserSet &= ~pmask;
641 parserMask |= pmask;
642 }
643 }
644 }
645 return ((_formatReadFeatures == newSet) && (_formatReadFeaturesToChange == newMask)
646 && (_parserFeatures == parserSet) && (_parserFeaturesToChange == parserMask)
647 ) ? this :
648 new DeserializationConfig(this, _mapperFeatures, _deserFeatures,
649 parserSet, parserMask, newSet, newMask);
650 }
651
652
657
658
662 public DeserializationConfig with(JsonNodeFactory f) {
663 if (_nodeFactory == f) {
664 return this;
665 }
666 return new DeserializationConfig(this, f);
667 }
668
669
673 public DeserializationConfig withHandler(DeserializationProblemHandler h)
674 {
675
676 if (LinkedNode.contains(_problemHandlers, h)) {
677 return this;
678 }
679 return new DeserializationConfig(this,
680 new LinkedNode<DeserializationProblemHandler>(h, _problemHandlers));
681 }
682
683
687 public DeserializationConfig withNoProblemHandlers() {
688 if (_problemHandlers == null) {
689 return this;
690 }
691 return new DeserializationConfig(this,
692 (LinkedNode<DeserializationProblemHandler>) null);
693 }
694
695
700
701
708 public void initialize(JsonParser p) {
709 if (_parserFeaturesToChange != 0) {
710 p.overrideStdFeatures(_parserFeatures, _parserFeaturesToChange);
711 }
712 if (_formatReadFeaturesToChange != 0) {
713 p.overrideFormatFeatures(_formatReadFeatures, _formatReadFeaturesToChange);
714 }
715 }
716
717
722
723 @Override
724 public boolean useRootWrapping()
725 {
726 if (_rootName != null) {
727 return !_rootName.isEmpty();
728 }
729 return isEnabled(DeserializationFeature.UNWRAP_ROOT_VALUE);
730 }
731
732 public final boolean isEnabled(DeserializationFeature f) {
733 return (_deserFeatures & f.getMask()) != 0;
734 }
735
736 public final boolean isEnabled(JsonParser.Feature f, JsonFactory factory) {
737 int mask = f.getMask();
738 if ((_parserFeaturesToChange & mask) != 0) {
739 return (_parserFeatures & f.getMask()) != 0;
740 }
741 return factory.isEnabled(f);
742 }
743
744
750 public final boolean hasDeserializationFeatures(int featureMask) {
751 return (_deserFeatures & featureMask) == featureMask;
752 }
753
754
760 public final boolean hasSomeOfFeatures(int featureMask) {
761 return (_deserFeatures & featureMask) != 0;
762 }
763
764
768 public final int getDeserializationFeatures() {
769 return _deserFeatures;
770 }
771
772
780 public final boolean requiresFullValue() {
781 return DeserializationFeature.FAIL_ON_TRAILING_TOKENS.enabledIn(_deserFeatures);
782 }
783
784
789
790
794 public LinkedNode<DeserializationProblemHandler> getProblemHandlers() {
795 return _problemHandlers;
796 }
797
798 public final JsonNodeFactory getNodeFactory() {
799 return _nodeFactory;
800 }
801
802
807
808
814 @SuppressWarnings("unchecked")
815 public <T extends BeanDescription> T introspect(JavaType type) {
816 return (T) getClassIntrospector().forDeserialization(this, type, this);
817 }
818
819
823 @SuppressWarnings("unchecked")
824 public <T extends BeanDescription> T introspectForCreation(JavaType type) {
825 return (T) getClassIntrospector().forCreation(this, type, this);
826 }
827
828
831 @SuppressWarnings("unchecked")
832 public <T extends BeanDescription> T introspectForBuilder(JavaType type) {
833 return (T) getClassIntrospector().forDeserializationWithBuilder(this, type, this);
834 }
835
836
841
842
849 public TypeDeserializer findTypeDeserializer(JavaType baseType)
850 throws JsonMappingException
851 {
852 BeanDescription bean = introspectClassAnnotations(baseType.getRawClass());
853 AnnotatedClass ac = bean.getClassInfo();
854 TypeResolverBuilder<?> b = getAnnotationIntrospector().findTypeResolver(this, ac, baseType);
855
856
859 Collection<NamedType> subtypes = null;
860 if (b == null) {
861 b = getDefaultTyper(baseType);
862 if (b == null) {
863 return null;
864 }
865 } else {
866 subtypes = getSubtypeResolver().collectAndResolveSubtypesByTypeId(this, ac);
867 }
868 return b.buildTypeDeserializer(this, baseType, subtypes);
869 }
870 }
871