Skip to content

Commit bbf650f

Browse files
committed
Fix #2989 (redirect TokenBuffer construction to allow overrides)
1 parent 7b3671c commit bbf650f

File tree

10 files changed

+25
-23
lines changed

10 files changed

+25
-23
lines changed

release-notes/VERSION-2.x

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ Project: jackson-databind
1212
#2828: Add `DatabindException` as intermediate subtype of `JsonMappingException`
1313
#2900: Jackson does not support deserializing new Java 9 unmodifiable collections
1414
(reported by Daniel H)
15+
#2989: Allocate TokenBuffer instance via context objects (to allow format-specific
16+
buffer types)
1517
#3001: Add mechanism for setting default `ContextAttributes` for `ObjectMapper`
1618
#3002: Add `DeserializationContext.readTreeAsValue()` methods for more convenient
1719
conversions for deserializers to use

src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -733,7 +733,7 @@ protected Object deserializeWithUnwrapped(JsonParser p, DeserializationContext c
733733
continue;
734734
}
735735
// Need to copy to a separate buffer first
736-
TokenBuffer b2 = TokenBuffer.asCopyOfValue(p);
736+
TokenBuffer b2 = ctxt.bufferAsCopyOfValue(p);
737737
tokens.writeFieldName(propName);
738738
tokens.append(b2);
739739
try {
@@ -789,7 +789,7 @@ protected Object deserializeWithUnwrapped(JsonParser p, DeserializationContext c
789789
tokens.copyCurrentStructure(p);
790790
} else {
791791
// Need to copy to a separate buffer first
792-
TokenBuffer b2 = TokenBuffer.asCopyOfValue(p);
792+
TokenBuffer b2 = ctxt.bufferAsCopyOfValue(p);
793793
tokens.writeFieldName(propName);
794794
tokens.append(b2);
795795
try {
@@ -888,7 +888,7 @@ protected Object deserializeUsingPropertyBasedWithUnwrapped(JsonParser p, Deseri
888888
tokens.copyCurrentStructure(p);
889889
} else {
890890
// Need to copy to a separate buffer first
891-
TokenBuffer b2 = TokenBuffer.asCopyOfValue(p);
891+
TokenBuffer b2 = ctxt.bufferAsCopyOfValue(p);
892892
tokens.writeFieldName(propName);
893893
tokens.append(b2);
894894
try {

src/main/java/com/fasterxml/jackson/databind/deser/std/TokenBufferDeserializer.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,6 @@ public LogicalType logicalType() {
3535
@Override
3636
@SuppressWarnings("resource")
3737
public TokenBuffer deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
38-
return createBufferInstance(p).deserialize(p, ctxt);
38+
return ctxt.bufferForInputBuffering(p).deserialize(p, ctxt);
3939
}
40-
41-
protected TokenBuffer createBufferInstance(JsonParser p) {
42-
return new TokenBuffer(p);
43-
}
44-
}
40+
}

src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsArrayTypeDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ protected Object _deserialize(JsonParser p, DeserializationContext ctxt) throws
103103
&& !_usesExternalId()
104104
&& p.hasToken(JsonToken.START_OBJECT)) {
105105
// but what if there's nowhere to add it in? Error? Or skip? For now, skip.
106-
TokenBuffer tb = new TokenBuffer(null, false);
106+
TokenBuffer tb = ctxt.bufferForInputBuffering(p);
107107
tb.writeStartObject(); // recreate START_OBJECT
108108
tb.writeFieldName(_typePropertyName);
109109
tb.writeString(typeId);

src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsDeductionTypeDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ public Object deserializeTypedFromObject(JsonParser p, DeserializationContext ct
123123
// Keep track of processed tokens as we must rewind once after deducing
124124
// the deserializer to use
125125
@SuppressWarnings("resource")
126-
TokenBuffer tb = new TokenBuffer(p, ctxt);
126+
final TokenBuffer tb = ctxt.bufferForInputBuffering(p);
127127
boolean ignoreCase = ctxt.isEnabled(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
128128

129129
for (; t == JsonToken.FIELD_NAME; t = p.nextToken()) {

src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsPropertyTypeDeserializer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ public Object deserializeTypedFromObject(JsonParser p, DeserializationContext ct
107107
return _deserializeTypedForId(p, ctxt, tb, p.getText());
108108
}
109109
if (tb == null) {
110-
tb = new TokenBuffer(p, ctxt);
110+
tb = ctxt.bufferForInputBuffering(p);
111111
}
112112
tb.writeFieldName(name);
113113
tb.copyCurrentStructure(p);
@@ -120,7 +120,7 @@ protected Object _deserializeTypedForId(JsonParser p, DeserializationContext ctx
120120
JsonDeserializer<Object> deser = _findDeserializer(ctxt, typeId);
121121
if (_typeIdVisible) { // need to merge id back in JSON input?
122122
if (tb == null) {
123-
tb = new TokenBuffer(p, ctxt);
123+
tb = ctxt.bufferForInputBuffering(p);
124124
}
125125
tb.writeFieldName(p.currentName());
126126
tb.writeString(typeId);

src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsWrapperTypeDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ protected Object _deserialize(JsonParser p, DeserializationContext ctxt) throws
107107
// Minor complication: we may need to merge type id in?
108108
if (_typeIdVisible && p.hasToken(JsonToken.START_OBJECT)) {
109109
// but what if there's nowhere to add it in? Error? Or skip? For now, skip.
110-
TokenBuffer tb = new TokenBuffer(null, false);
110+
TokenBuffer tb = ctxt.bufferForInputBuffering(p);
111111
tb.writeStartObject(); // recreate START_OBJECT
112112
tb.writeFieldName(_typePropertyName);
113113
tb.writeString(typeId);

src/main/java/com/fasterxml/jackson/databind/util/TokenBuffer.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,10 @@ public TokenBuffer(JsonParser p, DeserializationContext ctxt)
191191
*</pre>
192192
*
193193
* @since 2.9
194+
*
195+
* @deprecated Since 2.13: use {@link DeserializationContext#bufferAsCopyOfValue} instead.
194196
*/
197+
@Deprecated // since 2.13
195198
public static TokenBuffer asCopyOfValue(JsonParser p) throws IOException {
196199
TokenBuffer b = new TokenBuffer(p);
197200
b.copyCurrentStructure(p);
@@ -488,10 +491,9 @@ public TokenBuffer deserialize(JsonParser p, DeserializationContext ctxt) throws
488491
copyCurrentStructure(p);
489492
return this;
490493
}
491-
/* 28-Oct-2014, tatu: As per [databind#592], need to support a special case of starting from
492-
* FIELD_NAME, which is taken to mean that we are missing START_OBJECT, but need
493-
* to assume one did exist.
494-
*/
494+
// 28-Oct-2014, tatu: As per [databind#592], need to support a special case of starting from
495+
// FIELD_NAME, which is taken to mean that we are missing START_OBJECT, but need
496+
// to assume one did exist.
495497
JsonToken t;
496498
writeStartObject();
497499
do {

src/test/java/com/fasterxml/jackson/databind/introspect/IntrospectorPairTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -657,9 +657,9 @@ public ReadableInjectedBean(@JacksonInject(useInput = OptBoolean.FALSE) Unreadab
657657
this.injectBean = injectBean;
658658
}
659659
@JsonProperty
660-
private String foo;
660+
String foo;
661661
@JsonIgnore
662-
private UnreadableBean injectBean;
662+
UnreadableBean injectBean;
663663
}
664664

665665
static class UnreadableInjectedBean {
@@ -688,7 +688,7 @@ public void testMergingIntrospectorsForInjection() throws Exception {
688688

689689
boolean successReadingUnreadableInjectedBean;
690690
try {
691-
UnreadableInjectedBean noBean = mapper.readValue("{\"foo\": \"bob\"}", UnreadableInjectedBean.class);
691+
/*UnreadableInjectedBean noBean =*/ mapper.readValue("{\"foo\": \"bob\"}", UnreadableInjectedBean.class);
692692
successReadingUnreadableInjectedBean = true;
693693
} catch (JsonMappingException e) {
694694
successReadingUnreadableInjectedBean = false;

src/test/java/com/fasterxml/jackson/databind/misc/ParsingContext2525Test.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,10 @@ private TokenBuffer _readAsTokenBuffer(String doc) throws IOException
7070
{
7171
try (JsonParser p = MAPPER.createParser(doc)) {
7272
p.nextToken();
73-
return TokenBuffer.asCopyOfValue(p)
74-
.overrideParentContext(null);
73+
try (TokenBuffer tb = new TokenBuffer(p, null)) {
74+
tb.copyCurrentStructure(p);
75+
return tb.overrideParentContext(null);
76+
}
7577
}
7678
}
7779

0 commit comments

Comments
 (0)