Skip to content

Commit e2d2fc2

Browse files
authored
Call the right filterFinishArray/Object from FilteringParserDelegate (#1111)
1 parent e5f0004 commit e2d2fc2

File tree

2 files changed

+89
-1
lines changed

2 files changed

+89
-1
lines changed

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

+5-1
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,11 @@ public JsonToken nextToken() throws IOException
403403
boolean returnEnd = _headContext.isStartHandled();
404404
f = _headContext.getFilter();
405405
if ((f != null) && (f != TokenFilter.INCLUDE_ALL)) {
406-
f.filterFinishArray();
406+
if (t.id() == JsonTokenId.ID_END_ARRAY) {
407+
f.filterFinishArray();
408+
} else {
409+
f.filterFinishObject();
410+
}
407411
}
408412
_headContext = _headContext.getParent();
409413
_itemFilter = _headContext.getFilter();

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

+84
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,73 @@ public TokenFilter filterStartObject() {
9595
}
9696
}
9797

98+
static class LoggingFilter extends TokenFilter
99+
{
100+
final TokenFilter _parent;
101+
final ArrayList<String> _log;
102+
103+
LoggingFilter(final TokenFilter parent) {
104+
_parent = parent;
105+
_log = new ArrayList<>();
106+
}
107+
108+
LoggingFilter(final TokenFilter parent, final ArrayList<String> log) {
109+
_parent = parent;
110+
_log = log;
111+
}
112+
113+
TokenFilter rewrap(final TokenFilter filter) {
114+
if (filter == null) {
115+
return null;
116+
} else if (filter == TokenFilter.INCLUDE_ALL) {
117+
return TokenFilter.INCLUDE_ALL;
118+
}
119+
return new LoggingFilter(filter, _log);
120+
}
121+
122+
@Override
123+
public TokenFilter includeElement(final int index) {
124+
_log.add("includeElement: " + index);
125+
return rewrap(_parent.includeElement(index));
126+
}
127+
128+
@Override
129+
public TokenFilter includeProperty(final String name) {
130+
_log.add("includeProperty: " + name);
131+
return rewrap(_parent.includeProperty(name));
132+
}
133+
134+
@Override
135+
public TokenFilter filterStartObject() {
136+
_log.add("filterStartObject");
137+
return rewrap(_parent.filterStartObject());
138+
}
139+
140+
@Override
141+
public TokenFilter filterStartArray() {
142+
_log.add("filterStartArray");
143+
return rewrap(_parent.filterStartArray());
144+
}
145+
146+
@Override
147+
public void filterFinishObject() {
148+
_log.add("filterFinishObject");
149+
_parent.filterFinishObject();
150+
}
151+
152+
@Override
153+
public void filterFinishArray() {
154+
_log.add("filterFinishArray");
155+
_parent.filterFinishArray();
156+
}
157+
158+
@Override
159+
protected boolean _includeScalar() {
160+
_log.add("_includeScalar");
161+
return _parent._includeScalar();
162+
}
163+
}
164+
98165
static final TokenFilter INCLUDE_EMPTY_IF_NOT_FILTERED = new TokenFilter() {
99166
@Override
100167
public boolean includeEmptyArray(boolean contentsFiltered) {
@@ -763,4 +830,21 @@ public void testExcludeLastArrayInsideArray() throws Exception {
763830
);
764831
assertEquals(a2q("[[]]"), readAndWrite(JSON_F, p));
765832
}
833+
834+
public void testCallbacksFromFilteringParserDelegate1() throws Exception {
835+
LoggingFilter loggingFilter = new LoggingFilter(new JsonPointerBasedFilter("/parent"));
836+
837+
JsonParser p0 = JSON_F.createParser(a2q(
838+
"{'parent':{'child':1}}"));
839+
JsonParser p = new FilteringParserDelegate(p0,
840+
loggingFilter,
841+
Inclusion.ONLY_INCLUDE_ALL,
842+
true
843+
);
844+
assertEquals(a2q("{'child':1}"), readAndWrite(JSON_F, p));
845+
846+
assertEquals(
847+
Arrays.asList("filterStartObject", "includeProperty: parent", "filterFinishObject"),
848+
loggingFilter._log);
849+
}
766850
}

0 commit comments

Comments
 (0)