Skip to content

Commit

Permalink
Fix #2475
Browse files Browse the repository at this point in the history
  • Loading branch information
cowtowncoder committed Sep 30, 2019
1 parent 54aa38d commit ca1867e
Show file tree
Hide file tree
Showing 20 changed files with 115 additions and 54 deletions.
5 changes: 5 additions & 0 deletions release-notes/CREDITS-2.x
Original file line number Diff line number Diff line change
Expand Up @@ -975,3 +975,8 @@ Martín Coll (colltoaction@github)
Andrey Kulikov (ankulikov@github)
* Reported #2457: Extended enum values are not handled as enums when used as Map keys
(2.10.1)
Ryan Bohn (bohnman@github)
* Reported `StringCollectionSerializer` calls `JsonGenerator.setCurrentValue(value)`,
which messes up current value for sibling properties
(2.10.1)
3 changes: 3 additions & 0 deletions release-notes/VERSION-2.x
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ Project: jackson-databind

#2457: Extended enum values are not handled as enums when used as Map keys
(reported by Andrey K)
#2475: `StringCollectionSerializer` calls `JsonGenerator.setCurrentValue(value)`,
which messes up current value for sibling properties
(reported by Ryan B)

2.10.0 (26-Sep-2019)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
* can be coerced into text, like Numbers and Booleans).
* Simple JSON String values are trimmed using {@link java.lang.String#trim}.
* Partial deserializer implementation will try to first access current token as
* a String, calls {@link #_deserialize(String,DeserializationContext)} and
* a String, calls {@code _deserialize(String,DeserializationContext)} and
* returns return value.
* If this does not work (current token not a simple scalar type), attempts
* are made so that:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ public void serialize(JsonGenerator f, SerializerProvider provider) throws IOExc
{
final List<JsonNode> c = _children;
final int size = c.size();
f.writeStartArray(size);
f.writeStartArray(this, size);
for (int i = 0; i < size; ++i) { // we'll typically have array list
// For now, assuming it's either BaseJsonNode, JsonSerializable
JsonNode n = c.get(i);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,9 +136,9 @@ public void serializeWithType(Object bean, JsonGenerator gen,
_serializeWithObjectId(bean, gen, provider, typeSer);
return;
}
gen.setCurrentValue(bean);
WritableTypeId typeIdDef = _typeIdDef(typeSer, bean, JsonToken.START_ARRAY);
typeSer.writeTypePrefix(gen, typeIdDef);
gen.setCurrentValue(bean);
serializeAsArray(bean, gen, provider);
typeSer.writeTypeSuffix(gen, typeIdDef);
}
Expand All @@ -161,9 +161,7 @@ && hasSingleElement(provider)) {
* any getter, filtering) have already been checked; so code here
* is trivial.
*/
gen.writeStartArray();
// [databind#631]: Assign current value, to be accessible by custom serializers
gen.setCurrentValue(bean);
gen.writeStartArray(bean);
serializeAsArray(bean, gen, provider);
gen.writeEndArray();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public final void serialize(List<?> value, JsonGenerator gen, SerializerProvider
return;
}
}
gen.writeStartArray(len);
gen.writeStartArray(value, len);
serializeContents(value, gen, provider);
gen.writeEndArray();
}
Expand Down Expand Up @@ -182,7 +182,6 @@ public void serializeTypedContents(List<?> value, JsonGenerator jgen, Serializer
}
}
} catch (Exception e) {
// [JACKSON-55] Need to add reference information
wrapAndThrow(provider, e, value, i);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public void serialize(List<String> value, JsonGenerator g,
return;
}
}
g.writeStartArray(len);
g.writeStartArray(value, len);
serializeContents(value, g, provider, len);
g.writeEndArray();
}
Expand All @@ -85,14 +85,14 @@ public void serializeWithType(List<String> value, JsonGenerator g, SerializerPro
{
WritableTypeId typeIdDef = typeSer.writeTypePrefix(g,
typeSer.typeId(value, JsonToken.START_ARRAY));
g.setCurrentValue(value);
serializeContents(value, g, provider, value.size());
typeSer.writeTypeSuffix(g, typeIdDef);
}

private final void serializeContents(List<String> value, JsonGenerator g,
SerializerProvider provider, int len) throws IOException
{
g.setCurrentValue(value);
int i = 0;
try {
for (; i < len; ++i) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public final void serialize(Iterator<?> value, JsonGenerator gen,
}
}
*/
gen.writeStartArray();
gen.writeStartArray(value);
serializeContents(value, gen, provider);
gen.writeEndArray();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ public final void serialize(String[] value, JsonGenerator gen, SerializerProvide
return;
}
}
gen.writeStartArray(len);
gen.writeStartArray(value, len);
serializeContents(value, gen, provider);
gen.writeEndArray();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@ protected void acceptContentVisitor(JsonArrayFormatVisitor visitor) throws JsonM
public void serialize(Collection<String> value, JsonGenerator g,
SerializerProvider provider) throws IOException
{
g.setCurrentValue(value);
final int len = value.size();
if (len == 1) {
if (((_unwrapSingle == null) &&
Expand All @@ -77,7 +76,7 @@ public void serialize(Collection<String> value, JsonGenerator g,
return;
}
}
g.writeStartArray(len);
g.writeStartArray(value, len);
serializeContents(value, g, provider);
g.writeEndArray();
}
Expand All @@ -87,9 +86,9 @@ public void serializeWithType(Collection<String> value, JsonGenerator g,
SerializerProvider provider, TypeSerializer typeSer)
throws IOException
{
g.setCurrentValue(value);
WritableTypeId typeIdDef = typeSer.writeTypePrefix(g,
typeSer.typeId(value, JsonToken.START_ARRAY));
g.setCurrentValue(value);
serializeContents(value, g, provider);
typeSer.writeTypeSuffix(g, typeIdDef);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public void serialize(Object value, JsonGenerator gen, SerializerProvider provid
failForEmpty(provider, value);
}
// But if it's fine, we'll just output empty JSON Object:
gen.writeStartObject();
gen.writeStartObject(value, 0);
gen.writeEndObject();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,9 +118,7 @@ public void serialize(T value, JsonGenerator gen, SerializerProvider provider) t
return;
}
}
gen.setCurrentValue(value);
gen.writeStartArray();
// [databind#631]: Assign current value, to be accessible by custom serializers
gen.writeStartArray(value);
serializeContents(value, gen, provider);
gen.writeEndArray();
}
Expand All @@ -130,10 +128,10 @@ public final void serializeWithType(T value, JsonGenerator g, SerializerProvider
TypeSerializer typeSer)
throws IOException
{
// [databind#631]: Assign current value, to be accessible by custom serializers
g.setCurrentValue(value);
WritableTypeId typeIdDef = typeSer.writeTypePrefix(g,
typeSer.typeId(value, JsonToken.START_ARRAY));
// [databind#631]: Assign current value, to be accessible by custom serializers
g.setCurrentValue(value);
serializeContents(value, g, provider);
typeSer.writeTypeSuffix(g, typeIdDef);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -244,9 +244,7 @@ && hasSingleElement(value)) {
serializeContents(value, gen, provider);
return;
}
gen.writeStartArray();
// [databind#631]: Assign current value, to be accessible by custom serializers
gen.setCurrentValue(value);
gen.writeStartArray(value);
serializeContents(value, gen, provider);
gen.writeEndArray();
}
Expand All @@ -255,10 +253,10 @@ && hasSingleElement(value)) {
public void serializeWithType(T value, JsonGenerator g, SerializerProvider provider,
TypeSerializer typeSer) throws IOException
{
// [databind#631]: Assign current value, to be accessible by custom serializers
g.setCurrentValue(value);
WritableTypeId typeIdDef = typeSer.writeTypePrefix(g,
typeSer.typeId(value, JsonToken.START_ARRAY));
// [databind#631]: Assign current value, to be accessible by custom serializers
g.setCurrentValue(value);
serializeContents(value, g, provider);
typeSer.writeTypeSuffix(g, typeIdDef);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ public final void serialize(Collection<?> value, JsonGenerator g, SerializerProv
return;
}
}
g.writeStartArray(len);
g.writeStartArray(value, len);
serializeContents(value, g, provider);
g.writeEndArray();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public final void serialize(EnumSet<? extends Enum<?>> value, JsonGenerator gen,
return;
}
}
gen.writeStartArray(len);
gen.writeStartArray(value, len);
serializeContents(value, gen, provider);
gen.writeEndArray();
}
Expand All @@ -77,9 +77,8 @@ public void serializeContents(EnumSet<? extends Enum<?>> value, JsonGenerator ge
*/
for (Enum<?> en : value) {
if (enumSer == null) {
/* 12-Jan-2010, tatu: Since enums cannot be polymorphic, let's
* not bother with typed serializer variant here
*/
// 12-Jan-2010, tatu: Since enums cannot be polymorphic, let's
// not bother with typed serializer variant here
enumSer = provider.findValueSerializer(en.getDeclaringClass(), _property);
}
enumSer.serialize(en, gen, provider);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ public final void serialize(Iterable<?> value, JsonGenerator gen,
return;
}
}
gen.writeStartArray();
gen.writeStartArray(value);
serializeContents(value, gen, provider);
gen.writeEndArray();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ public final void serialize(Object[] value, JsonGenerator gen, SerializerProvide
return;
}
}
gen.writeStartArray(len);
gen.writeStartArray(value, len);
serializeContents(value, gen, provider);
gen.writeEndArray();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,7 @@ public final void serialize(boolean[] value, JsonGenerator g, SerializerProvider
serializeContents(value, g, provider);
return;
}
g.writeStartArray(len);
g.setCurrentValue(value);
g.writeStartArray(value, len);
serializeContents(value, g, provider);
g.writeEndArray();
}
Expand Down Expand Up @@ -219,8 +218,7 @@ public final void serialize(short[] value, JsonGenerator g, SerializerProvider p
serializeContents(value, g, provider);
return;
}
g.writeStartArray(len);
g.setCurrentValue(value);
g.writeStartArray(value, len);
serializeContents(value, g, provider);
g.writeEndArray();
}
Expand Down Expand Up @@ -274,8 +272,7 @@ public void serialize(char[] value, JsonGenerator g, SerializerProvider provider
{
// [JACKSON-289] allows serializing as 'sparse' char array too:
if (provider.isEnabled(SerializationFeature.WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS)) {
g.writeStartArray(value.length);
g.setCurrentValue(value);
g.writeStartArray(value, value.length);
_writeArrayContents(g, value);
g.writeEndArray();
} else {
Expand Down Expand Up @@ -389,7 +386,6 @@ public final void serialize(int[] value, JsonGenerator g, SerializerProvider pro
return;
}
// 11-May-2016, tatu: As per [core#277] we have efficient `writeArray(...)` available
g.setCurrentValue(value);
g.writeArray(value, 0, value.length);
}

Expand Down Expand Up @@ -462,7 +458,6 @@ public final void serialize(long[] value, JsonGenerator g, SerializerProvider pr
return;
}
// 11-May-2016, tatu: As per [core#277] we have efficient `writeArray(...)` available
g.setCurrentValue(value);
g.writeArray(value, 0, value.length);
}

Expand Down Expand Up @@ -539,8 +534,7 @@ public final void serialize(float[] value, JsonGenerator g, SerializerProvider p
serializeContents(value, g, provider);
return;
}
g.writeStartArray(len);
g.setCurrentValue(value);
g.writeStartArray(value, len);
serializeContents(value, g, provider);
g.writeEndArray();
}
Expand Down Expand Up @@ -626,7 +620,6 @@ public final void serialize(double[] value, JsonGenerator g, SerializerProvider
serializeContents(value, g, provider);
return;
}
g.setCurrentValue(value);
// 11-May-2016, tatu: As per [core#277] we have efficient `writeArray(...)` available
g.writeArray(value, 0, value.length);
}
Expand Down
33 changes: 24 additions & 9 deletions src/main/java/com/fasterxml/jackson/databind/util/TokenBuffer.java
Original file line number Diff line number Diff line change
Expand Up @@ -679,8 +679,20 @@ public final void writeStartArray(int size) throws IOException
_writeContext = _writeContext.createChildArrayContext();
}

// // TODO: add 2 more `writeStartArray()` methods from 2.10 (in 2.11 or later)

@Override // since 2.10.1
public void writeStartArray(Object forValue) throws IOException {
_writeContext.writeValue();
_appendStartMarker(JsonToken.START_ARRAY);
_writeContext = _writeContext.createChildArrayContext();
}

@Override // since 2.10.1
public void writeStartArray(Object forValue, int size) throws IOException {
_writeContext.writeValue();
_appendStartMarker(JsonToken.START_ARRAY);
_writeContext = _writeContext.createChildArrayContext(forValue);
}

@Override
public final void writeEndArray() throws IOException
{
Expand All @@ -705,16 +717,19 @@ public void writeStartObject(Object forValue) throws IOException
{
_writeContext.writeValue();
_appendStartMarker(JsonToken.START_OBJECT);
// 15-Aug-2019, tatu: Matching method only added in 2.10, don't yet call
JsonWriteContext ctxt = _writeContext.createChildObjectContext();
JsonWriteContext ctxt = _writeContext.createChildObjectContext(forValue);
_writeContext = ctxt;
}

@Override // since 2.10.1
public void writeStartObject(Object forValue, int size) throws IOException
{
_writeContext.writeValue();
_appendStartMarker(JsonToken.START_OBJECT);
JsonWriteContext ctxt = _writeContext.createChildObjectContext(forValue);
_writeContext = ctxt;
if (forValue != null) {
ctxt.setCurrentValue(forValue);
}
}

// // TODO: add 1 more `writeStartObject()` methods from 2.10 (in 2.11 or later)

@Override
public final void writeEndObject() throws IOException
{
Expand Down
Loading

0 comments on commit ca1867e

Please sign in to comment.