Skip to content

Commit ecc374d

Browse files
committed
Backport fix for #359 in 2.8
1 parent 7f455ef commit ecc374d

File tree

4 files changed

+64
-0
lines changed

4 files changed

+64
-0
lines changed

release-notes/CREDITS

+4
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,7 @@ Kevin Gallardo (newkek@github)
111111
Alessio Soldano (asoldano@github)
112112
* Contributed #322: Trim tokens in error messages to 256 byte to prevent attacks
113113
(2.8.6)
114+
115+
Arnaud Roger (arnaudroger@github)
116+
* Contributed #359: FilteringGeneratorDelegate does not override writeStartObject(Object forValue)
117+
(2.8.8)

release-notes/VERSION

+5
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ JSON library.
1818

1919
#304: Optimize `NumberOutput.outputLong()` method
2020

21+
2.8.8 (not yet released)
22+
23+
#359: FilteringGeneratorDelegate does not override writeStartObject(Object forValue)
24+
(contributed by Arnaud R)
25+
2126
2.8.7 (21-Feb-2017)
2227

2328
#349: CharsToNameCanonicalizer performance bottleneck

src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java

+30
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,36 @@ public void writeStartObject() throws IOException
243243
}
244244
}
245245

246+
@Override
247+
public void writeStartObject(Object forValue) throws IOException
248+
{
249+
if (_itemFilter == null) {
250+
_filterContext = _filterContext.createChildObjectContext(_itemFilter, false);
251+
return;
252+
}
253+
if (_itemFilter == TokenFilter.INCLUDE_ALL) {
254+
_filterContext = _filterContext.createChildObjectContext(_itemFilter, true);
255+
delegate.writeStartObject(forValue);
256+
return;
257+
}
258+
259+
TokenFilter f = _filterContext.checkValue(_itemFilter);
260+
if (f == null) {
261+
return;
262+
}
263+
264+
if (f != TokenFilter.INCLUDE_ALL) {
265+
f = f.filterStartObject();
266+
}
267+
if (f == TokenFilter.INCLUDE_ALL) {
268+
_checkParentPath();
269+
_filterContext = _filterContext.createChildObjectContext(f, true);
270+
delegate.writeStartObject(forValue);
271+
} else { // filter out
272+
_filterContext = _filterContext.createChildObjectContext(f, false);
273+
}
274+
}
275+
246276
@Override
247277
public void writeEndObject() throws IOException
248278
{

src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java

+25
Original file line numberDiff line numberDiff line change
@@ -305,4 +305,29 @@ public void testIndexMatchWithPath2() throws Exception
305305
writeJsonDoc(JSON_F, JSON, gen);
306306
assertEquals(aposToQuotes("{'array':[1,2]}"), w.toString());
307307
}
308+
309+
public void testWriteStartObjectWithObject() throws Exception
310+
{
311+
StringWriter w = new StringWriter();
312+
313+
JsonGenerator gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w),
314+
TokenFilter.INCLUDE_ALL,
315+
true, true);
316+
317+
String value = "val";
318+
319+
gen.writeStartObject(new Object());
320+
gen.writeFieldName("field1");
321+
{
322+
gen.writeStartObject(value);
323+
gen.writeEndObject();
324+
}
325+
326+
gen.writeFieldName("field2");
327+
gen.writeString("val2");
328+
329+
gen.writeEndObject();
330+
gen.close();
331+
assertEquals(aposToQuotes("{'field1':{},'field2':'val2'}"), w.toString());
332+
}
308333
}

0 commit comments

Comments
 (0)