Skip to content

Commit 2c86cfb

Browse files
committed
start working on #819
1 parent 19c9dc7 commit 2c86cfb

File tree

1 file changed

+169
-27
lines changed

1 file changed

+169
-27
lines changed

src/main/java/com/fasterxml/jackson/databind/DeserializationConfig.java

Lines changed: 169 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,12 @@ public final class DeserializationConfig
3232
// since 2.5
3333
private static final long serialVersionUID = 1;
3434

35-
/**
36-
* Set of {@link DeserializationFeature}s enabled.
35+
/*
36+
/**********************************************************
37+
/* Configured helper objects
38+
/**********************************************************
3739
*/
38-
protected final int _deserFeatures;
39-
40+
4041
/**
4142
* Linked list that contains all registered problem handlers.
4243
* Implementation as front-added linked list allows for sharing
@@ -49,6 +50,23 @@ public final class DeserializationConfig
4950
*/
5051
protected final JsonNodeFactory _nodeFactory;
5152

53+
/*
54+
/**********************************************************
55+
/* Deserialization features
56+
/**********************************************************
57+
*/
58+
59+
/**
60+
* Set of {@link DeserializationFeature}s enabled.
61+
*/
62+
protected final int _deserFeatures;
63+
64+
/*
65+
/**********************************************************
66+
/* Parser features: generic, format-specific
67+
/**********************************************************
68+
*/
69+
5270
/**
5371
* States of {@link com.fasterxml.jackson.core.JsonParser.Feature}s to enable/disable.
5472
*/
@@ -59,6 +77,20 @@ public final class DeserializationConfig
5977
*/
6078
protected final int _parserFeaturesToChange;
6179

80+
/**
81+
* States of {@link com.fasterxml.jackson.core.FormatFeature}s to enable/disable.
82+
*
83+
* @since 2.7
84+
*/
85+
protected final int _formatReadFeatures;
86+
87+
/**
88+
* Bitflag of {@link com.fasterxml.jackson.core.FormatFeature}s to enable/disable
89+
*
90+
* @since 2.7
91+
*/
92+
protected final int _formatReadFeaturesToChange;
93+
6294
/*
6395
/**********************************************************
6496
/* Life-cycle, constructors
@@ -78,18 +110,23 @@ public DeserializationConfig(BaseSettings base,
78110
_problemHandlers = null;
79111
_parserFeatures = 0;
80112
_parserFeaturesToChange = 0;
113+
_formatReadFeatures = 0;
114+
_formatReadFeaturesToChange = 0;
81115
}
82116

83117
private DeserializationConfig(DeserializationConfig src,
84118
int mapperFeatures, int deserFeatures,
85-
int parserFeatures, int parserFeatureMask)
119+
int parserFeatures, int parserFeatureMask,
120+
int formatFeatures, int formatFeatureMask)
86121
{
87122
super(src, mapperFeatures);
88123
_deserFeatures = deserFeatures;
89124
_nodeFactory = src._nodeFactory;
90125
_problemHandlers = src._problemHandlers;
91126
_parserFeatures = parserFeatures;
92127
_parserFeaturesToChange = parserFeatureMask;
128+
_formatReadFeatures = formatFeatures;
129+
_formatReadFeaturesToChange = formatFeatureMask;
93130
}
94131

95132
/**
@@ -104,8 +141,10 @@ private DeserializationConfig(DeserializationConfig src, SubtypeResolver str)
104141
_problemHandlers = src._problemHandlers;
105142
_parserFeatures = src._parserFeatures;
106143
_parserFeaturesToChange = src._parserFeaturesToChange;
144+
_formatReadFeatures = src._formatReadFeatures;
145+
_formatReadFeaturesToChange = src._formatReadFeaturesToChange;
107146
}
108-
147+
109148
private DeserializationConfig(DeserializationConfig src, BaseSettings base)
110149
{
111150
super(src, base);
@@ -114,6 +153,8 @@ private DeserializationConfig(DeserializationConfig src, BaseSettings base)
114153
_problemHandlers = src._problemHandlers;
115154
_parserFeatures = src._parserFeatures;
116155
_parserFeaturesToChange = src._parserFeaturesToChange;
156+
_formatReadFeatures = src._formatReadFeatures;
157+
_formatReadFeaturesToChange = src._formatReadFeaturesToChange;
117158
}
118159

119160
private DeserializationConfig(DeserializationConfig src, JsonNodeFactory f)
@@ -124,6 +165,8 @@ private DeserializationConfig(DeserializationConfig src, JsonNodeFactory f)
124165
_nodeFactory = f;
125166
_parserFeatures = src._parserFeatures;
126167
_parserFeaturesToChange = src._parserFeaturesToChange;
168+
_formatReadFeatures = src._formatReadFeatures;
169+
_formatReadFeaturesToChange = src._formatReadFeaturesToChange;
127170
}
128171

129172
private DeserializationConfig(DeserializationConfig src,
@@ -135,6 +178,8 @@ private DeserializationConfig(DeserializationConfig src,
135178
_nodeFactory = src._nodeFactory;
136179
_parserFeatures = src._parserFeatures;
137180
_parserFeaturesToChange = src._parserFeaturesToChange;
181+
_formatReadFeatures = src._formatReadFeatures;
182+
_formatReadFeaturesToChange = src._formatReadFeaturesToChange;
138183
}
139184

140185
private DeserializationConfig(DeserializationConfig src, PropertyName rootName)
@@ -145,6 +190,8 @@ private DeserializationConfig(DeserializationConfig src, PropertyName rootName)
145190
_nodeFactory = src._nodeFactory;
146191
_parserFeatures = src._parserFeatures;
147192
_parserFeaturesToChange = src._parserFeaturesToChange;
193+
_formatReadFeatures = src._formatReadFeatures;
194+
_formatReadFeaturesToChange = src._formatReadFeaturesToChange;
148195
}
149196

150197
private DeserializationConfig(DeserializationConfig src, Class<?> view)
@@ -155,11 +202,10 @@ private DeserializationConfig(DeserializationConfig src, Class<?> view)
155202
_nodeFactory = src._nodeFactory;
156203
_parserFeatures = src._parserFeatures;
157204
_parserFeaturesToChange = src._parserFeaturesToChange;
205+
_formatReadFeatures = src._formatReadFeatures;
206+
_formatReadFeaturesToChange = src._formatReadFeaturesToChange;
158207
}
159208

160-
/**
161-
* @since 2.3
162-
*/
163209
protected DeserializationConfig(DeserializationConfig src, ContextAttributes attrs)
164210
{
165211
super(src, attrs);
@@ -168,11 +214,10 @@ protected DeserializationConfig(DeserializationConfig src, ContextAttributes att
168214
_nodeFactory = src._nodeFactory;
169215
_parserFeatures = src._parserFeatures;
170216
_parserFeaturesToChange = src._parserFeaturesToChange;
217+
_formatReadFeatures = src._formatReadFeatures;
218+
_formatReadFeaturesToChange = src._formatReadFeaturesToChange;
171219
}
172220

173-
/**
174-
* @since 2.1
175-
*/
176221
protected DeserializationConfig(DeserializationConfig src, SimpleMixInResolver mixins)
177222
{
178223
super(src, mixins);
@@ -181,8 +226,10 @@ protected DeserializationConfig(DeserializationConfig src, SimpleMixInResolver m
181226
_nodeFactory = src._nodeFactory;
182227
_parserFeatures = src._parserFeatures;
183228
_parserFeaturesToChange = src._parserFeaturesToChange;
229+
_formatReadFeatures = src._formatReadFeatures;
230+
_formatReadFeaturesToChange = src._formatReadFeaturesToChange;
184231
}
185-
232+
186233
/**
187234
* Copy-constructor used for making a copy to be used by new {@link ObjectMapper}
188235
* or {@link ObjectReader}.
@@ -198,11 +245,13 @@ protected DeserializationConfig(DeserializationConfig src, SimpleMixInResolver m
198245
_nodeFactory = src._nodeFactory;
199246
_parserFeatures = src._parserFeatures;
200247
_parserFeaturesToChange = src._parserFeaturesToChange;
248+
_formatReadFeatures = src._formatReadFeatures;
249+
_formatReadFeaturesToChange = src._formatReadFeaturesToChange;
201250
}
202-
251+
203252
// for unit tests only:
204253
protected BaseSettings getBaseSettings() { return _base; }
205-
254+
206255
/*
207256
/**********************************************************
208257
/* Life-cycle, factory methods from MapperConfig
@@ -218,7 +267,8 @@ public DeserializationConfig with(MapperFeature... features)
218267
}
219268
return (newMapperFlags == _mapperFeatures) ? this :
220269
new DeserializationConfig(this, newMapperFlags, _deserFeatures,
221-
_parserFeatures, _parserFeaturesToChange);
270+
_parserFeatures, _parserFeaturesToChange,
271+
_formatReadFeatures, _formatReadFeaturesToChange);
222272

223273
}
224274

@@ -231,7 +281,8 @@ public DeserializationConfig without(MapperFeature... features)
231281
}
232282
return (newMapperFlags == _mapperFeatures) ? this :
233283
new DeserializationConfig(this, newMapperFlags, _deserFeatures,
234-
_parserFeatures, _parserFeaturesToChange);
284+
_parserFeatures, _parserFeaturesToChange,
285+
_formatReadFeatures, _formatReadFeaturesToChange);
235286
}
236287

237288
@Override
@@ -245,7 +296,8 @@ public DeserializationConfig with(MapperFeature feature, boolean state)
245296
}
246297
return (newMapperFlags == _mapperFeatures) ? this :
247298
new DeserializationConfig(this, newMapperFlags, _deserFeatures,
248-
_parserFeatures, _parserFeaturesToChange);
299+
_parserFeatures, _parserFeaturesToChange,
300+
_formatReadFeatures, _formatReadFeaturesToChange);
249301
}
250302

251303
@Override
@@ -364,7 +416,8 @@ public DeserializationConfig with(DeserializationFeature feature)
364416
int newDeserFeatures = (_deserFeatures | feature.getMask());
365417
return (newDeserFeatures == _deserFeatures) ? this :
366418
new DeserializationConfig(this, _mapperFeatures, newDeserFeatures,
367-
_parserFeatures, _parserFeaturesToChange);
419+
_parserFeatures, _parserFeaturesToChange,
420+
_formatReadFeatures, _formatReadFeaturesToChange);
368421
}
369422

370423
/**
@@ -380,7 +433,8 @@ public DeserializationConfig with(DeserializationFeature first,
380433
}
381434
return (newDeserFeatures == _deserFeatures) ? this :
382435
new DeserializationConfig(this, _mapperFeatures, newDeserFeatures,
383-
_parserFeatures, _parserFeaturesToChange);
436+
_parserFeatures, _parserFeaturesToChange,
437+
_formatReadFeatures, _formatReadFeaturesToChange);
384438
}
385439

386440
/**
@@ -395,7 +449,8 @@ public DeserializationConfig withFeatures(DeserializationFeature... features)
395449
}
396450
return (newDeserFeatures == _deserFeatures) ? this :
397451
new DeserializationConfig(this, _mapperFeatures, newDeserFeatures,
398-
_parserFeatures, _parserFeaturesToChange);
452+
_parserFeatures, _parserFeaturesToChange,
453+
_formatReadFeatures, _formatReadFeaturesToChange);
399454
}
400455

401456
/**
@@ -407,7 +462,8 @@ public DeserializationConfig without(DeserializationFeature feature)
407462
int newDeserFeatures = _deserFeatures & ~feature.getMask();
408463
return (newDeserFeatures == _deserFeatures) ? this :
409464
new DeserializationConfig(this, _mapperFeatures, newDeserFeatures,
410-
_parserFeatures, _parserFeaturesToChange);
465+
_parserFeatures, _parserFeaturesToChange,
466+
_formatReadFeatures, _formatReadFeaturesToChange);
411467
}
412468

413469
/**
@@ -423,7 +479,8 @@ public DeserializationConfig without(DeserializationFeature first,
423479
}
424480
return (newDeserFeatures == _deserFeatures) ? this :
425481
new DeserializationConfig(this, _mapperFeatures, newDeserFeatures,
426-
_parserFeatures, _parserFeaturesToChange);
482+
_parserFeatures, _parserFeaturesToChange,
483+
_formatReadFeatures, _formatReadFeaturesToChange);
427484
}
428485

429486
/**
@@ -438,7 +495,8 @@ public DeserializationConfig withoutFeatures(DeserializationFeature... features)
438495
}
439496
return (newDeserFeatures == _deserFeatures) ? this :
440497
new DeserializationConfig(this, _mapperFeatures, newDeserFeatures,
441-
_parserFeatures, _parserFeaturesToChange);
498+
_parserFeatures, _parserFeaturesToChange,
499+
_formatReadFeatures, _formatReadFeaturesToChange);
442500
}
443501

444502
/*
@@ -459,7 +517,8 @@ public DeserializationConfig with(JsonParser.Feature feature)
459517
int newMask = _parserFeaturesToChange | feature.getMask();
460518
return ((_parserFeatures == newSet) && (_parserFeaturesToChange == newMask)) ? this :
461519
new DeserializationConfig(this, _mapperFeatures, _deserFeatures,
462-
newSet, newMask);
520+
_parserFeatures, _parserFeaturesToChange,
521+
_formatReadFeatures, _formatReadFeaturesToChange);
463522
}
464523

465524
/**
@@ -479,7 +538,8 @@ public DeserializationConfig withFeatures(JsonParser.Feature... features)
479538
}
480539
return ((_parserFeatures == newSet) && (_parserFeaturesToChange == newMask)) ? this :
481540
new DeserializationConfig(this, _mapperFeatures, _deserFeatures,
482-
newSet, newMask);
541+
_parserFeatures, _parserFeaturesToChange,
542+
_formatReadFeatures, _formatReadFeaturesToChange);
483543
}
484544

485545
/**
@@ -494,7 +554,8 @@ public DeserializationConfig without(JsonParser.Feature feature)
494554
int newMask = _parserFeaturesToChange | feature.getMask();
495555
return ((_parserFeatures == newSet) && (_parserFeaturesToChange == newMask)) ? this :
496556
new DeserializationConfig(this, _mapperFeatures, _deserFeatures,
497-
newSet, newMask);
557+
_parserFeatures, _parserFeaturesToChange,
558+
_formatReadFeatures, _formatReadFeaturesToChange);
498559
}
499560

500561
/**
@@ -514,6 +575,87 @@ public DeserializationConfig withoutFeatures(JsonParser.Feature... features)
514575
}
515576
return ((_parserFeatures == newSet) && (_parserFeaturesToChange == newMask)) ? this :
516577
new DeserializationConfig(this, _mapperFeatures, _deserFeatures,
578+
_parserFeatures, _parserFeaturesToChange,
579+
_formatReadFeatures, _formatReadFeaturesToChange);
580+
}
581+
582+
/*
583+
/**********************************************************
584+
/* Life-cycle, JsonParser.FormatFeature-based factory methods
585+
/**********************************************************
586+
*/
587+
588+
/**
589+
* Fluent factory method that will construct and return a new configuration
590+
* object instance with specified features enabled.
591+
*
592+
* @since 2.7
593+
*/
594+
public DeserializationConfig with(FormatFeature feature)
595+
{
596+
int newSet = _formatReadFeatures | feature.getMask();
597+
int newMask = _formatReadFeaturesToChange | feature.getMask();
598+
return ((_formatReadFeatures == newSet) && (_formatReadFeaturesToChange == newMask)) ? this :
599+
new DeserializationConfig(this, _mapperFeatures, _deserFeatures,
600+
_parserFeatures, _parserFeaturesToChange,
601+
newSet, newMask);
602+
}
603+
604+
/**
605+
* Fluent factory method that will construct and return a new configuration
606+
* object instance with specified features enabled.
607+
*
608+
* @since 2.7
609+
*/
610+
public DeserializationConfig withFeatures(FormatFeature... features)
611+
{
612+
int newSet = _formatReadFeatures;
613+
int newMask = _formatReadFeaturesToChange;
614+
for (FormatFeature f : features) {
615+
int mask = f.getMask();
616+
newSet |= mask;
617+
newMask |= mask;
618+
}
619+
return ((_formatReadFeatures == newSet) && (_formatReadFeaturesToChange == newMask)) ? this :
620+
new DeserializationConfig(this, _mapperFeatures, _deserFeatures,
621+
_parserFeatures, _parserFeaturesToChange,
622+
newSet, newMask);
623+
}
624+
625+
/**
626+
* Fluent factory method that will construct and return a new configuration
627+
* object instance with specified feature disabled.
628+
*
629+
* @since 2.7
630+
*/
631+
public DeserializationConfig without(FormatFeature feature)
632+
{
633+
int newSet = _formatReadFeatures & ~feature.getMask();
634+
int newMask = _formatReadFeaturesToChange | feature.getMask();
635+
return ((_formatReadFeatures == newSet) && (_formatReadFeaturesToChange == newMask)) ? this :
636+
new DeserializationConfig(this, _mapperFeatures, _deserFeatures,
637+
_parserFeatures, _parserFeaturesToChange,
638+
newSet, newMask);
639+
}
640+
641+
/**
642+
* Fluent factory method that will construct and return a new configuration
643+
* object instance with specified features disabled.
644+
*
645+
* @since 2.7
646+
*/
647+
public DeserializationConfig withoutFeatures(FormatFeature... features)
648+
{
649+
int newSet = _formatReadFeatures;
650+
int newMask = _formatReadFeaturesToChange;
651+
for (FormatFeature f : features) {
652+
int mask = f.getMask();
653+
newSet &= ~mask;
654+
newMask |= mask;
655+
}
656+
return ((_formatReadFeatures == newSet) && (_formatReadFeaturesToChange == newMask)) ? this :
657+
new DeserializationConfig(this, _mapperFeatures, _deserFeatures,
658+
_parserFeatures, _parserFeaturesToChange,
517659
newSet, newMask);
518660
}
519661

0 commit comments

Comments
 (0)