From 97919e01a0962086761b0b421669c02158d36b79 Mon Sep 17 00:00:00 2001 From: jhaber Date: Wed, 23 Oct 2019 16:47:41 -0400 Subject: [PATCH 01/15] Add support for writing empty objects and arrays --- .../filter/FilteringGeneratorDelegate.java | 51 ++++++++++++++ .../filter/BasicGeneratorFilteringTest.java | 70 +++++++++++++++---- .../JsonPointerGeneratorFilteringTest.java | 2 +- .../jackson/core/json/TestUtf8Generator.java | 3 +- 4 files changed, 112 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java b/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java index ef3995cf92..35e30857da 100644 --- a/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java +++ b/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java @@ -46,6 +46,12 @@ public class FilteringGeneratorDelegate extends JsonGeneratorDelegate */ protected boolean _includePath; + /** + * Flag that determines whether empty objects and arrays will be written + * or omitted + */ + protected boolean _writeEmptyObjectsAndArrays; + /* NOTE: this feature is included in the first version (2.6), but * there is no public API to enable it, yet, since there isn't an * actual use case. But it seemed possible need could arise, which @@ -89,8 +95,15 @@ public class FilteringGeneratorDelegate extends JsonGeneratorDelegate /********************************************************** */ + @Deprecated public FilteringGeneratorDelegate(JsonGenerator d, TokenFilter f, boolean includePath, boolean allowMultipleMatches) + { + this(d, f, includePath, allowMultipleMatches, false); + } + + public FilteringGeneratorDelegate(JsonGenerator d, TokenFilter f, + boolean includePath, boolean allowMultipleMatches, boolean writeEmptyObjectsAndArrays) { // By default, do NOT delegate copy methods super(d, false); @@ -100,6 +113,7 @@ public FilteringGeneratorDelegate(JsonGenerator d, TokenFilter f, _filterContext = TokenFilterContext.createRootContext(f); _includePath = includePath; _allowMultipleMatches = allowMultipleMatches; + _writeEmptyObjectsAndArrays = writeEmptyObjectsAndArrays; } /* @@ -169,6 +183,10 @@ public void writeStartArray() throws IOException _checkParentPath(); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(); + } else if (_itemFilter != null && _writeEmptyObjectsAndArrays) { + _checkParentPath(); + _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); + delegate.writeStartArray(); } else { _filterContext = _filterContext.createChildArrayContext(_itemFilter, false); } @@ -198,6 +216,10 @@ public void writeStartArray(int size) throws IOException _checkParentPath(); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(size); + } else if (_itemFilter != null && _writeEmptyObjectsAndArrays) { + _checkParentPath(); + _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); + delegate.writeStartArray(size); } else { _filterContext = _filterContext.createChildArrayContext(_itemFilter, false); } @@ -238,6 +260,10 @@ public void writeStartObject() throws IOException _checkParentPath(); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(); + } else if (f != null && _writeEmptyObjectsAndArrays) { + _checkParentPath(); + _filterContext = _filterContext.createChildObjectContext(f, true); + delegate.writeStartObject(); } else { // filter out _filterContext = _filterContext.createChildObjectContext(f, false); } @@ -268,6 +294,10 @@ public void writeStartObject(Object forValue) throws IOException _checkParentPath(); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(forValue); + } else if (f != null && _writeEmptyObjectsAndArrays) { + _checkParentPath(); + _filterContext = _filterContext.createChildObjectContext(f, true); + delegate.writeStartObject(forValue); } else { // filter out _filterContext = _filterContext.createChildObjectContext(f, false); } @@ -322,6 +352,27 @@ public void writeFieldName(SerializableString name) throws IOException } } + @Override + public void writeFieldId(long id) throws IOException + { + String idString = Long.toString(id); + TokenFilter state = _filterContext.setFieldName(idString); + if (state == null) { + _itemFilter = null; + return; + } + if (state == TokenFilter.INCLUDE_ALL) { + _itemFilter = state; + delegate.writeFieldId(id); + return; + } + state = state.includeProperty(idString); + _itemFilter = state; + if (state == TokenFilter.INCLUDE_ALL) { + _checkPropertyParentPath(); + } + } + /* /********************************************************** /* Public API, write methods, text/String values diff --git a/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java b/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java index a99e814f2d..4d3fcd8440 100644 --- a/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java +++ b/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java @@ -94,7 +94,8 @@ public void testSingleMatchFilteringWithoutPath() throws Exception JsonGenerator gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("value"), false, // includePath - false // multipleMatches + false, // multipleMatches + false // writeEmptyObjectsAndArrays ); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); @@ -115,7 +116,8 @@ public void testSingleMatchFilteringWithPath() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(origGen, filter, true, // includePath - false // multipleMatches + false, // multipleMatches + false // writeEmptyObjectsAndArrays ); // Hmmh. Should we get access to eventual target? @@ -138,7 +140,8 @@ public void testSingleMatchFilteringWithPathSkippedArray() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(origGen, filter, true, // includePath - false // multipleMatches + false, // multipleMatches + false // writeEmptyObjectsAndArrays ); // Hmmh. Should we get access to eventual target? @@ -159,7 +162,8 @@ public void testSingleMatchFilteringWithPathAlternate1() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("value"), true, // includePath - false // multipleMatches + false, // multipleMatches + false // writeEmptyObjectsAndArrays ); //final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':[3],'value2':'foo'},'b':true}"; @@ -199,7 +203,8 @@ public void testSingleMatchFilteringWithPathRawBinary() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("array"), true, // includePath - false // multipleMatches + false, // multipleMatches + false // writeEmptyObjectsAndArrays ); //final String JSON = "{'header':['ENCODED',raw],'array':['base64stuff',1,2,3,4,5,6.25,7.5],'extra':[1,2,3,4,5,6.25,7.5]}"; @@ -249,7 +254,7 @@ public void testMultipleMatchFilteringWithPath1() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("value0", "value2"), - true, /* includePath */ true /* multipleMatches */ ); + true, /* includePath */ true, /* multipleMatches */ false /* writeEmptyObjectsAndArrays */ ); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'ob':{'value0':2,'value2':4}}"), w.toString()); @@ -262,7 +267,7 @@ public void testMultipleMatchFilteringWithPath2() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("array", "b", "value"), - true, true); + true, true, false); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'array':[1,2],'ob':{'value':3},'b':true}"), w.toString()); @@ -275,19 +280,60 @@ public void testMultipleMatchFilteringWithPath3() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("value"), - true, true); + true, true, false); final String JSON = "{'root':{'a0':true,'a':{'value':3},'b':{'value':4}},'b0':false}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'root':{'a':{'value':3},'b':{'value':4}}}"), w.toString()); assertEquals(2, gen.getMatchCount()); } + public void testNoMatchFilteringWithPath1() throws Exception + { + StringWriter w = new StringWriter(); + + FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), + new NameMatchFilter("invalid"), + true, true, true); + final String JSON = "{'root':{'a0':true,'a':{'value':3},'b':{'value':4}},'b0':false}"; + writeJsonDoc(JSON_F, JSON, gen); + assertEquals(aposToQuotes("{}"), w.toString()); + assertEquals(0, gen.getMatchCount()); + } + + public void testNoMatchFilteringWithPath2() throws Exception + { + StringWriter w = new StringWriter(); + + FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), + new NameMatchFilter("invalid"), + true, true, true); + final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; + final String JSON = String.format("[%s,%s,%s]", object, object, object); + writeJsonDoc(JSON_F, JSON, gen); + assertEquals(aposToQuotes("[{},{},{}]"), w.toString()); + assertEquals(0, gen.getMatchCount()); + } + + public void testNoMatchFilteringWithPath3() throws Exception + { + StringWriter w = new StringWriter(); + + FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), + new NameMatchFilter("invalid"), + true, true, true); + final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; + final String JSON = String.format("[[%s],[%s],[%s]]", object, object, object); + writeJsonDoc(JSON_F, JSON, gen); + assertEquals(aposToQuotes("[[{}],[{}],[{}]]"), w.toString()); + assertEquals(0, gen.getMatchCount()); + } + public void testIndexMatchWithPath1() throws Exception { StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new IndexMatchFilter(1), - true, true); + true, true, false); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'array':[2]}"), w.toString()); @@ -295,7 +341,7 @@ public void testIndexMatchWithPath1() throws Exception w = new StringWriter(); gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new IndexMatchFilter(0), - true, true); + true, true, false); writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'array':[1]}"), w.toString()); assertEquals(1, gen.getMatchCount()); @@ -306,7 +352,7 @@ public void testIndexMatchWithPath2() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new IndexMatchFilter(0,1), - true, true); + true, true, false); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'array':[1,2]}"), w.toString()); @@ -319,7 +365,7 @@ public void testWriteStartObjectWithObject() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), TokenFilter.INCLUDE_ALL, - true, true); + true, true, false); String value = "val"; diff --git a/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java b/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java index 0113a307e3..83d6247a94 100644 --- a/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java +++ b/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java @@ -96,7 +96,7 @@ private void _assert(String input, String pathExpr, boolean includeParent, Strin JsonGenerator g0 = JSON_F.createGenerator(w); FilteringGeneratorDelegate g = new FilteringGeneratorDelegate(g0, new JsonPointerBasedFilter(pathExpr), - includeParent, false); + includeParent, false, false); try { writeJsonDoc(JSON_F, input, g); diff --git a/src/test/java/com/fasterxml/jackson/core/json/TestUtf8Generator.java b/src/test/java/com/fasterxml/jackson/core/json/TestUtf8Generator.java index 828121c76d..56473cbbdd 100644 --- a/src/test/java/com/fasterxml/jackson/core/json/TestUtf8Generator.java +++ b/src/test/java/com/fasterxml/jackson/core/json/TestUtf8Generator.java @@ -74,7 +74,8 @@ public void testFilteringWithEscapedChars() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(g, new JsonPointerBasedFilter("/escapes"), true, // includePath - false // multipleMatches + false, // multipleMatches + false // writeEmptyObjectsAndArrays ); //final String JSON = "{'a':123,'array':[1,2],'escapes':'\b\t\f\n\r\"foo\"\u0000'}"; From e220e42adec462672fb12deabea2de36d566fbce Mon Sep 17 00:00:00 2001 From: jhaber Date: Wed, 23 Oct 2019 18:49:42 -0400 Subject: [PATCH 02/15] Get it working --- .../filter/FilteringGeneratorDelegate.java | 37 ++++++----- .../core/filter/TokenFilterContext.java | 11 ++++ .../filter/BasicGeneratorFilteringTest.java | 64 ++++++++++++++++++- 3 files changed, 93 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java b/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java index 35e30857da..ce85f51e09 100644 --- a/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java +++ b/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java @@ -184,7 +184,7 @@ public void writeStartArray() throws IOException _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(); } else if (_itemFilter != null && _writeEmptyObjectsAndArrays) { - _checkParentPath(); + _ensureFieldNameWritten(); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(); } else { @@ -217,7 +217,7 @@ public void writeStartArray(int size) throws IOException _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(size); } else if (_itemFilter != null && _writeEmptyObjectsAndArrays) { - _checkParentPath(); + _ensureFieldNameWritten(); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(size); } else { @@ -261,7 +261,7 @@ public void writeStartObject() throws IOException _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(); } else if (f != null && _writeEmptyObjectsAndArrays) { - _checkParentPath(); + _ensureFieldNameWritten(); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(); } else { // filter out @@ -295,7 +295,7 @@ public void writeStartObject(Object forValue) throws IOException _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(forValue); } else if (f != null && _writeEmptyObjectsAndArrays) { - _checkParentPath(); + _ensureFieldNameWritten(); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(forValue); } else { // filter out @@ -396,7 +396,7 @@ public void writeString(String value) throws IOException } } _checkParentPath(); - } + } delegate.writeString(value); } @@ -418,7 +418,7 @@ public void writeString(char[] text, int offset, int len) throws IOException } } _checkParentPath(); - } + } delegate.writeString(text, offset, len); } @@ -439,7 +439,7 @@ public void writeString(SerializableString value) throws IOException } } _checkParentPath(); - } + } delegate.writeString(value); } @@ -570,7 +570,7 @@ public void writeNumber(short v) throws IOException } } _checkParentPath(); - } + } delegate.writeNumber(v); } @@ -591,7 +591,7 @@ public void writeNumber(int v) throws IOException } } _checkParentPath(); - } + } delegate.writeNumber(v); } @@ -612,7 +612,7 @@ public void writeNumber(long v) throws IOException } } _checkParentPath(); - } + } delegate.writeNumber(v); } @@ -633,7 +633,7 @@ public void writeNumber(BigInteger v) throws IOException } } _checkParentPath(); - } + } delegate.writeNumber(v); } @@ -654,7 +654,7 @@ public void writeNumber(double v) throws IOException } } _checkParentPath(); - } + } delegate.writeNumber(v); } @@ -675,7 +675,7 @@ public void writeNumber(float v) throws IOException } } _checkParentPath(); - } + } delegate.writeNumber(v); } @@ -696,7 +696,7 @@ public void writeNumber(BigDecimal v) throws IOException } } _checkParentPath(); - } + } delegate.writeNumber(v); } @@ -738,7 +738,7 @@ public void writeBoolean(boolean v) throws IOException } } _checkParentPath(); - } + } delegate.writeBoolean(v); } @@ -759,7 +759,7 @@ public void writeNull() throws IOException } } _checkParentPath(); - } + } delegate.writeNull(); } @@ -880,6 +880,11 @@ public void copyCurrentStructure(JsonParser jp) throws IOException { /********************************************************** */ + protected void _ensureFieldNameWritten() throws IOException + { + _filterContext.ensureFieldNameWritten(delegate); + } + protected void _checkParentPath() throws IOException { ++_matchCount; diff --git a/src/main/java/com/fasterxml/jackson/core/filter/TokenFilterContext.java b/src/main/java/com/fasterxml/jackson/core/filter/TokenFilterContext.java index c414633ee6..b7125afbd6 100644 --- a/src/main/java/com/fasterxml/jackson/core/filter/TokenFilterContext.java +++ b/src/main/java/com/fasterxml/jackson/core/filter/TokenFilterContext.java @@ -147,6 +147,17 @@ public TokenFilter checkValue(TokenFilter filter) { return filter.includeRootValue(ix); } + /** + * Method called to ensure that field name, if present, has been written + */ + public void ensureFieldNameWritten(JsonGenerator gen) throws IOException + { + if (_needToHandleName) { + _needToHandleName = false; + gen.writeFieldName(_currentName); + } + } + /** * Method called to ensure that parent path from root is written up to * and including this node. diff --git a/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java b/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java index 4d3fcd8440..212990c5ff 100644 --- a/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java +++ b/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java @@ -40,6 +40,23 @@ public TokenFilter includeProperty(String name) { protected boolean _includeScalar() { return false; } } + static class StrictNameMatchFilter extends TokenFilter + { + private final Set _names; + + public StrictNameMatchFilter(String... names) { + _names = new HashSet(Arrays.asList(names)); + } + + @Override + public TokenFilter includeProperty(String name) { + if (_names.contains(name)) { + return TokenFilter.INCLUDE_ALL; + } + return null; + } + } + static class IndexMatchFilter extends TokenFilter { private final BitSet _indices; @@ -294,9 +311,9 @@ public void testNoMatchFilteringWithPath1() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("invalid"), true, true, true); - final String JSON = "{'root':{'a0':true,'a':{'value':3},'b':{'value':4}},'b0':false}"; + final String JSON = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; writeJsonDoc(JSON_F, JSON, gen); - assertEquals(aposToQuotes("{}"), w.toString()); + assertEquals(aposToQuotes("{'root':{'b':{}}}"), w.toString()); assertEquals(0, gen.getMatchCount()); } @@ -310,7 +327,7 @@ public void testNoMatchFilteringWithPath2() throws Exception final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[%s,%s,%s]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); - assertEquals(aposToQuotes("[{},{},{}]"), w.toString()); + assertEquals(aposToQuotes("[{'root':{'b':{}}},{'root':{'b':{}}},{'root':{'b':{}}}]"), w.toString()); assertEquals(0, gen.getMatchCount()); } @@ -324,6 +341,47 @@ public void testNoMatchFilteringWithPath3() throws Exception final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[[%s],[%s],[%s]]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); + assertEquals(aposToQuotes("[[{'root':{'b':{}}}],[{'root':{'b':{}}}],[{'root':{'b':{}}}]]"), w.toString()); + assertEquals(0, gen.getMatchCount()); + } + + public void testNoMatchFilteringWithPath4() throws Exception + { + StringWriter w = new StringWriter(); + + FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), + new StrictNameMatchFilter("invalid"), + true, true, true); + final String JSON = "{'root':{'a0':true,'a':{'value':3},'b':{'value':4}},'b0':false}"; + writeJsonDoc(JSON_F, JSON, gen); + assertEquals(aposToQuotes("{}"), w.toString()); + assertEquals(0, gen.getMatchCount()); + } + + public void testNoMatchFilteringWithPath5() throws Exception + { + StringWriter w = new StringWriter(); + + FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), + new StrictNameMatchFilter("invalid"), + true, true, true); + final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; + final String JSON = String.format("[%s,%s,%s]", object, object, object); + writeJsonDoc(JSON_F, JSON, gen); + assertEquals(aposToQuotes("[{},{},{}]"), w.toString()); + assertEquals(0, gen.getMatchCount()); + } + + public void testNoMatchFilteringWithPath6() throws Exception + { + StringWriter w = new StringWriter(); + + FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), + new StrictNameMatchFilter("invalid"), + true, true, true); + final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; + final String JSON = String.format("[[%s],[%s],[%s]]", object, object, object); + writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("[[{}],[{}],[{}]]"), w.toString()); assertEquals(0, gen.getMatchCount()); } From 81706204f27dd9fa1811b747af55891dd6f16eca Mon Sep 17 00:00:00 2001 From: jhaber Date: Wed, 23 Oct 2019 18:57:15 -0400 Subject: [PATCH 03/15] Add some more tests --- .../filter/BasicGeneratorFilteringTest.java | 54 ++++++++++++++++--- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java b/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java index 212990c5ff..351ee700df 100644 --- a/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java +++ b/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java @@ -85,6 +85,22 @@ public TokenFilter includeElement(int index) { protected boolean _includeScalar() { return false; } } + static class NoArraysFilter extends TokenFilter + { + @Override + public TokenFilter filterStartArray() { + return null; + } + } + + static class NoObjectsFilter extends TokenFilter + { + @Override + public TokenFilter filterStartObject() { + return null; + } + } + /* /********************************************************** /* Test methods @@ -304,7 +320,7 @@ public void testMultipleMatchFilteringWithPath3() throws Exception assertEquals(2, gen.getMatchCount()); } - public void testNoMatchFilteringWithPath1() throws Exception + public void testNoMatchFiltering1() throws Exception { StringWriter w = new StringWriter(); @@ -317,7 +333,7 @@ public void testNoMatchFilteringWithPath1() throws Exception assertEquals(0, gen.getMatchCount()); } - public void testNoMatchFilteringWithPath2() throws Exception + public void testNoMatchFiltering2() throws Exception { StringWriter w = new StringWriter(); @@ -331,7 +347,7 @@ public void testNoMatchFilteringWithPath2() throws Exception assertEquals(0, gen.getMatchCount()); } - public void testNoMatchFilteringWithPath3() throws Exception + public void testNoMatchFiltering3() throws Exception { StringWriter w = new StringWriter(); @@ -345,7 +361,7 @@ public void testNoMatchFilteringWithPath3() throws Exception assertEquals(0, gen.getMatchCount()); } - public void testNoMatchFilteringWithPath4() throws Exception + public void testNoMatchFiltering4() throws Exception { StringWriter w = new StringWriter(); @@ -358,7 +374,7 @@ public void testNoMatchFilteringWithPath4() throws Exception assertEquals(0, gen.getMatchCount()); } - public void testNoMatchFilteringWithPath5() throws Exception + public void testNoMatchFiltering5() throws Exception { StringWriter w = new StringWriter(); @@ -372,7 +388,7 @@ public void testNoMatchFilteringWithPath5() throws Exception assertEquals(0, gen.getMatchCount()); } - public void testNoMatchFilteringWithPath6() throws Exception + public void testNoMatchFiltering6() throws Exception { StringWriter w = new StringWriter(); @@ -386,6 +402,32 @@ public void testNoMatchFilteringWithPath6() throws Exception assertEquals(0, gen.getMatchCount()); } + public void testValueOmitsFieldName1() throws Exception + { + StringWriter w = new StringWriter(); + + FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), + new NoArraysFilter(), + true, true, true); + final String JSON = "{'root':['a'],'b0':false}"; + writeJsonDoc(JSON_F, JSON, gen); + assertEquals(aposToQuotes("{'b0':false}"), w.toString()); + assertEquals(1, gen.getMatchCount()); + } + + public void testValueOmitsFieldName2() throws Exception + { + StringWriter w = new StringWriter(); + + FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), + new NoObjectsFilter(), + true, true, true); + final String JSON = "['a',{'root':{'b':{'value':4}},'b0':false}]"; + writeJsonDoc(JSON_F, JSON, gen); + assertEquals(aposToQuotes("['a']"), w.toString()); + assertEquals(1, gen.getMatchCount()); + } + public void testIndexMatchWithPath1() throws Exception { StringWriter w = new StringWriter(); From 28c2b621934143490863c0e6d8ccc8a4ba94523a Mon Sep 17 00:00:00 2001 From: jhaber Date: Wed, 23 Oct 2019 19:37:32 -0400 Subject: [PATCH 04/15] Switch to enum --- .../filter/FilteringGeneratorDelegate.java | 70 +++++++--------- .../core/filter/TokenFilterContext.java | 29 ------- .../filter/BasicGeneratorFilteringTest.java | 56 ++++++------- .../JsonPointerGeneratorFilteringTest.java | 84 ++++++++++--------- .../jackson/core/json/TestUtf8Generator.java | 16 ++-- 5 files changed, 108 insertions(+), 147 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java b/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java index ce85f51e09..19c7187f9e 100644 --- a/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java +++ b/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java @@ -17,6 +17,10 @@ */ public class FilteringGeneratorDelegate extends JsonGeneratorDelegate { + public enum PathWriteMode { + NONE, LAZY, EAGER + } + /* /********************************************************** /* Configuration @@ -44,24 +48,7 @@ public class FilteringGeneratorDelegate extends JsonGeneratorDelegate * done and only explicitly included entries are output; if `true` then * path from main level down to match is also included as necessary. */ - protected boolean _includePath; - - /** - * Flag that determines whether empty objects and arrays will be written - * or omitted - */ - protected boolean _writeEmptyObjectsAndArrays; - - /* NOTE: this feature is included in the first version (2.6), but - * there is no public API to enable it, yet, since there isn't an - * actual use case. But it seemed possible need could arise, which - * is feature has not yet been removed. If no use is found within - * first version or two, just remove. - * - * Marked as deprecated since its status is uncertain. - */ - @Deprecated - protected boolean _includeImmediateParent; + protected PathWriteMode _pathWriteMode; /* /********************************************************** @@ -99,11 +86,11 @@ public class FilteringGeneratorDelegate extends JsonGeneratorDelegate public FilteringGeneratorDelegate(JsonGenerator d, TokenFilter f, boolean includePath, boolean allowMultipleMatches) { - this(d, f, includePath, allowMultipleMatches, false); + this(d, f, includePath ? PathWriteMode.LAZY : PathWriteMode.NONE, allowMultipleMatches); } public FilteringGeneratorDelegate(JsonGenerator d, TokenFilter f, - boolean includePath, boolean allowMultipleMatches, boolean writeEmptyObjectsAndArrays) + PathWriteMode pathWriteMode, boolean allowMultipleMatches) { // By default, do NOT delegate copy methods super(d, false); @@ -111,9 +98,8 @@ public FilteringGeneratorDelegate(JsonGenerator d, TokenFilter f, // and this is the currently active filter for root values _itemFilter = f; _filterContext = TokenFilterContext.createRootContext(f); - _includePath = includePath; + _pathWriteMode = pathWriteMode; _allowMultipleMatches = allowMultipleMatches; - _writeEmptyObjectsAndArrays = writeEmptyObjectsAndArrays; } /* @@ -183,8 +169,8 @@ public void writeStartArray() throws IOException _checkParentPath(); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(); - } else if (_itemFilter != null && _writeEmptyObjectsAndArrays) { - _ensureFieldNameWritten(); + } else if (_itemFilter != null && _pathWriteMode == PathWriteMode.EAGER) { + _checkParentPath(false /* match */); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(); } else { @@ -216,8 +202,8 @@ public void writeStartArray(int size) throws IOException _checkParentPath(); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(size); - } else if (_itemFilter != null && _writeEmptyObjectsAndArrays) { - _ensureFieldNameWritten(); + } else if (_itemFilter != null && _pathWriteMode == PathWriteMode.EAGER) { + _checkParentPath(false /* match */); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(size); } else { @@ -260,8 +246,8 @@ public void writeStartObject() throws IOException _checkParentPath(); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(); - } else if (f != null && _writeEmptyObjectsAndArrays) { - _ensureFieldNameWritten(); + } else if (f != null && _pathWriteMode == PathWriteMode.EAGER) { + _checkParentPath(false /* match */); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(); } else { // filter out @@ -294,8 +280,8 @@ public void writeStartObject(Object forValue) throws IOException _checkParentPath(); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(forValue); - } else if (f != null && _writeEmptyObjectsAndArrays) { - _ensureFieldNameWritten(); + } else if (f != null && _pathWriteMode == PathWriteMode.EAGER) { + _checkParentPath(false /* match */); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(forValue); } else { // filter out @@ -880,20 +866,24 @@ public void copyCurrentStructure(JsonParser jp) throws IOException { /********************************************************** */ - protected void _ensureFieldNameWritten() throws IOException + protected void _checkParentPath() throws IOException { - _filterContext.ensureFieldNameWritten(delegate); + _checkParentPath(true); } - protected void _checkParentPath() throws IOException + protected void _checkParentPath(boolean match) throws IOException { - ++_matchCount; + if (match) { + ++_matchCount; + } // only need to construct path if parent wasn't written - if (_includePath) { + if (_pathWriteMode == PathWriteMode.LAZY) { _filterContext.writePath(delegate); + } else if (_pathWriteMode == PathWriteMode.EAGER) { + _filterContext.ensureFieldNameWritten(delegate); } // also: if no multiple matches desired, short-cut checks - if (!_allowMultipleMatches) { + if (match && !_allowMultipleMatches) { // Mark parents as "skip" so that further check calls are not made _filterContext.skipParentChecks(); } @@ -907,12 +897,10 @@ protected void _checkParentPath() throws IOException protected void _checkPropertyParentPath() throws IOException { ++_matchCount; - if (_includePath) { + if (_pathWriteMode == PathWriteMode.LAZY) { _filterContext.writePath(delegate); - } else if (_includeImmediateParent) { - // 21-Apr-2015, tatu: Note that there is no API to enable this currently... - // retained for speculative future use - _filterContext.writeImmediatePath(delegate); + } else if (_pathWriteMode == PathWriteMode.EAGER) { + _filterContext.ensureFieldNameWritten(delegate); } // also: if no multiple matches desired, short-cut checks diff --git a/src/main/java/com/fasterxml/jackson/core/filter/TokenFilterContext.java b/src/main/java/com/fasterxml/jackson/core/filter/TokenFilterContext.java index b7125afbd6..70c8a61b5c 100644 --- a/src/main/java/com/fasterxml/jackson/core/filter/TokenFilterContext.java +++ b/src/main/java/com/fasterxml/jackson/core/filter/TokenFilterContext.java @@ -186,35 +186,6 @@ public void writePath(JsonGenerator gen) throws IOException } } - /** - * Variant of {@link #writePath(JsonGenerator)} called when all we - * need is immediately surrounding Object. Method typically called - * when including a single property but not including full path - * to root. - */ - public void writeImmediatePath(JsonGenerator gen) throws IOException - { - if ((_filter == null) || (_filter == TokenFilter.INCLUDE_ALL)) { - return; - } - if (_startHandled) { - // even if Object started, need to start leaf-level name - if (_needToHandleName) { - gen.writeFieldName(_currentName); - } - } else { - _startHandled = true; - if (_type == TYPE_OBJECT) { - gen.writeStartObject(); - if (_needToHandleName) { - gen.writeFieldName(_currentName); - } - } else if (_type == TYPE_ARRAY) { - gen.writeStartArray(); - } - } - } - private void _writePath(JsonGenerator gen) throws IOException { if ((_filter == null) || (_filter == TokenFilter.INCLUDE_ALL)) { diff --git a/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java b/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java index 351ee700df..502eb06d0c 100644 --- a/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java +++ b/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java @@ -6,6 +6,7 @@ import java.util.*; import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate.PathWriteMode; import com.fasterxml.jackson.core.io.SerializedString; /** @@ -126,9 +127,8 @@ public void testSingleMatchFilteringWithoutPath() throws Exception StringWriter w = new StringWriter(); JsonGenerator gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("value"), - false, // includePath - false, // multipleMatches - false // writeEmptyObjectsAndArrays + PathWriteMode.NONE, + false // multipleMatches ); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); @@ -148,9 +148,8 @@ public void testSingleMatchFilteringWithPath() throws Exception NameMatchFilter filter = new NameMatchFilter("value"); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(origGen, filter, - true, // includePath - false, // multipleMatches - false // writeEmptyObjectsAndArrays + PathWriteMode.LAZY, // includePath + false // multipleMatches ); // Hmmh. Should we get access to eventual target? @@ -172,9 +171,8 @@ public void testSingleMatchFilteringWithPathSkippedArray() throws Exception NameMatchFilter filter = new NameMatchFilter("value"); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(origGen, filter, - true, // includePath - false, // multipleMatches - false // writeEmptyObjectsAndArrays + PathWriteMode.LAZY, // includePath + false // multipleMatches ); // Hmmh. Should we get access to eventual target? @@ -194,9 +192,8 @@ public void testSingleMatchFilteringWithPathAlternate1() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("value"), - true, // includePath - false, // multipleMatches - false // writeEmptyObjectsAndArrays + PathWriteMode.LAZY, // includePath + false // multipleMatches ); //final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':[3],'value2':'foo'},'b':true}"; @@ -235,9 +232,8 @@ public void testSingleMatchFilteringWithPathRawBinary() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("array"), - true, // includePath - false, // multipleMatches - false // writeEmptyObjectsAndArrays + PathWriteMode.LAZY, // includePath + false // multipleMatches ); //final String JSON = "{'header':['ENCODED',raw],'array':['base64stuff',1,2,3,4,5,6.25,7.5],'extra':[1,2,3,4,5,6.25,7.5]}"; @@ -287,7 +283,7 @@ public void testMultipleMatchFilteringWithPath1() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("value0", "value2"), - true, /* includePath */ true, /* multipleMatches */ false /* writeEmptyObjectsAndArrays */ ); + PathWriteMode.LAZY, true /* multipleMatches */ ); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'ob':{'value0':2,'value2':4}}"), w.toString()); @@ -300,7 +296,7 @@ public void testMultipleMatchFilteringWithPath2() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("array", "b", "value"), - true, true, false); + PathWriteMode.LAZY, true); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'array':[1,2],'ob':{'value':3},'b':true}"), w.toString()); @@ -313,7 +309,7 @@ public void testMultipleMatchFilteringWithPath3() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("value"), - true, true, false); + PathWriteMode.LAZY, true); final String JSON = "{'root':{'a0':true,'a':{'value':3},'b':{'value':4}},'b0':false}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'root':{'a':{'value':3},'b':{'value':4}}}"), w.toString()); @@ -326,7 +322,7 @@ public void testNoMatchFiltering1() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("invalid"), - true, true, true); + PathWriteMode.EAGER, true); final String JSON = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'root':{'b':{}}}"), w.toString()); @@ -339,7 +335,7 @@ public void testNoMatchFiltering2() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("invalid"), - true, true, true); + PathWriteMode.EAGER, true); final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[%s,%s,%s]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); @@ -353,7 +349,7 @@ public void testNoMatchFiltering3() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("invalid"), - true, true, true); + PathWriteMode.EAGER, true); final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[[%s],[%s],[%s]]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); @@ -367,7 +363,7 @@ public void testNoMatchFiltering4() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new StrictNameMatchFilter("invalid"), - true, true, true); + PathWriteMode.EAGER, true); final String JSON = "{'root':{'a0':true,'a':{'value':3},'b':{'value':4}},'b0':false}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{}"), w.toString()); @@ -380,7 +376,7 @@ public void testNoMatchFiltering5() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new StrictNameMatchFilter("invalid"), - true, true, true); + PathWriteMode.EAGER, true); final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[%s,%s,%s]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); @@ -394,7 +390,7 @@ public void testNoMatchFiltering6() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new StrictNameMatchFilter("invalid"), - true, true, true); + PathWriteMode.EAGER, true); final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[[%s],[%s],[%s]]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); @@ -408,7 +404,7 @@ public void testValueOmitsFieldName1() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NoArraysFilter(), - true, true, true); + PathWriteMode.EAGER, true); final String JSON = "{'root':['a'],'b0':false}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'b0':false}"), w.toString()); @@ -421,7 +417,7 @@ public void testValueOmitsFieldName2() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NoObjectsFilter(), - true, true, true); + PathWriteMode.EAGER, true); final String JSON = "['a',{'root':{'b':{'value':4}},'b0':false}]"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("['a']"), w.toString()); @@ -433,7 +429,7 @@ public void testIndexMatchWithPath1() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new IndexMatchFilter(1), - true, true, false); + PathWriteMode.LAZY, true); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'array':[2]}"), w.toString()); @@ -441,7 +437,7 @@ public void testIndexMatchWithPath1() throws Exception w = new StringWriter(); gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new IndexMatchFilter(0), - true, true, false); + PathWriteMode.LAZY, true); writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'array':[1]}"), w.toString()); assertEquals(1, gen.getMatchCount()); @@ -452,7 +448,7 @@ public void testIndexMatchWithPath2() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new IndexMatchFilter(0,1), - true, true, false); + PathWriteMode.LAZY, true); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'array':[1,2]}"), w.toString()); @@ -465,7 +461,7 @@ public void testWriteStartObjectWithObject() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), TokenFilter.INCLUDE_ALL, - true, true, false); + PathWriteMode.LAZY, true); String value = "val"; diff --git a/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java b/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java index 83d6247a94..6594384b3f 100644 --- a/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java +++ b/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java @@ -1,8 +1,10 @@ package com.fasterxml.jackson.core.filter; -import java.io.*; +import java.io.StringWriter; -import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate.PathWriteMode; @SuppressWarnings("resource") public class JsonPointerGeneratorFilteringTest extends com.fasterxml.jackson.core.BaseTest @@ -13,82 +15,82 @@ public class JsonPointerGeneratorFilteringTest extends com.fasterxml.jackson.cor public void testSimplePropertyWithPath() throws Exception { - _assert(SIMPLE_INPUT, "/c", true, "{'c':{'d':{'a':true}}}"); - _assert(SIMPLE_INPUT, "/c/d", true, "{'c':{'d':{'a':true}}}"); - _assert(SIMPLE_INPUT, "/c/d/a", true, "{'c':{'d':{'a':true}}}"); + _assert(SIMPLE_INPUT, "/c", PathWriteMode.LAZY, "{'c':{'d':{'a':true}}}"); + _assert(SIMPLE_INPUT, "/c/d", PathWriteMode.LAZY, "{'c':{'d':{'a':true}}}"); + _assert(SIMPLE_INPUT, "/c/d/a", PathWriteMode.LAZY, "{'c':{'d':{'a':true}}}"); - _assert(SIMPLE_INPUT, "/c/d/a", true, "{'c':{'d':{'a':true}}}"); + _assert(SIMPLE_INPUT, "/c/d/a", PathWriteMode.LAZY, "{'c':{'d':{'a':true}}}"); - _assert(SIMPLE_INPUT, "/a", true, "{'a':1}"); - _assert(SIMPLE_INPUT, "/d", true, "{'d':null}"); + _assert(SIMPLE_INPUT, "/a", PathWriteMode.LAZY, "{'a':1}"); + _assert(SIMPLE_INPUT, "/d", PathWriteMode.LAZY, "{'d':null}"); // and then non-match - _assert(SIMPLE_INPUT, "/x", true, ""); + _assert(SIMPLE_INPUT, "/x", PathWriteMode.LAZY, ""); } public void testSimplePropertyWithoutPath() throws Exception { - _assert(SIMPLE_INPUT, "/c", false, "{'d':{'a':true}}"); - _assert(SIMPLE_INPUT, "/c/d", false, "{'a':true}"); - _assert(SIMPLE_INPUT, "/c/d/a", false, "true"); + _assert(SIMPLE_INPUT, "/c", PathWriteMode.NONE, "{'d':{'a':true}}"); + _assert(SIMPLE_INPUT, "/c/d", PathWriteMode.NONE, "{'a':true}"); + _assert(SIMPLE_INPUT, "/c/d/a", PathWriteMode.NONE, "true"); - _assert(SIMPLE_INPUT, "/a", false, "1"); - _assert(SIMPLE_INPUT, "/d", false, "null"); + _assert(SIMPLE_INPUT, "/a", PathWriteMode.NONE, "1"); + _assert(SIMPLE_INPUT, "/d", PathWriteMode.NONE, "null"); // and then non-match - _assert(SIMPLE_INPUT, "/x", false, ""); + _assert(SIMPLE_INPUT, "/x", PathWriteMode.NONE, ""); } public void testArrayElementWithPath() throws Exception { - _assert(SIMPLE_INPUT, "/b", true, "{'b':[1,2,3]}"); - _assert(SIMPLE_INPUT, "/b/1", true, "{'b':[2]}"); - _assert(SIMPLE_INPUT, "/b/2", true, "{'b':[3]}"); + _assert(SIMPLE_INPUT, "/b", PathWriteMode.LAZY, "{'b':[1,2,3]}"); + _assert(SIMPLE_INPUT, "/b/1", PathWriteMode.LAZY, "{'b':[2]}"); + _assert(SIMPLE_INPUT, "/b/2", PathWriteMode.LAZY, "{'b':[3]}"); // and then non-match - _assert(SIMPLE_INPUT, "/b/8", true, ""); + _assert(SIMPLE_INPUT, "/b/8", PathWriteMode.LAZY, ""); } public void testArrayNestedWithPath() throws Exception { - _assert("{'a':[true,{'b':3,'d':2},false]}", "/a/1/b", true, "{'a':[{'b':3}]}"); - _assert("[true,[1]]", "/0", true, "[true]"); - _assert("[true,[1]]", "/1", true, "[[1]]"); - _assert("[true,[1,2,[true],3],0]", "/0", true, "[true]"); - _assert("[true,[1,2,[true],3],0]", "/1", true, "[[1,2,[true],3]]"); - - _assert("[true,[1,2,[true],3],0]", "/1/2", true, "[[[true]]]"); - _assert("[true,[1,2,[true],3],0]", "/1/2/0", true, "[[[true]]]"); - _assert("[true,[1,2,[true],3],0]", "/1/3/0", true, ""); + _assert("{'a':[true,{'b':3,'d':2},false]}", "/a/1/b", PathWriteMode.LAZY, "{'a':[{'b':3}]}"); + _assert("[true,[1]]", "/0", PathWriteMode.LAZY, "[true]"); + _assert("[true,[1]]", "/1", PathWriteMode.LAZY, "[[1]]"); + _assert("[true,[1,2,[true],3],0]", "/0", PathWriteMode.LAZY, "[true]"); + _assert("[true,[1,2,[true],3],0]", "/1", PathWriteMode.LAZY, "[[1,2,[true],3]]"); + + _assert("[true,[1,2,[true],3],0]", "/1/2", PathWriteMode.LAZY, "[[[true]]]"); + _assert("[true,[1,2,[true],3],0]", "/1/2/0", PathWriteMode.LAZY, "[[[true]]]"); + _assert("[true,[1,2,[true],3],0]", "/1/3/0", PathWriteMode.LAZY, ""); } public void testArrayNestedWithoutPath() throws Exception { - _assert("{'a':[true,{'b':3,'d':2},false]}", "/a/1/b", false, "3"); - _assert("[true,[1,2,[true],3],0]", "/0", false, "true"); - _assert("[true,[1,2,[true],3],0]", "/1", false, + _assert("{'a':[true,{'b':3,'d':2},false]}", "/a/1/b", PathWriteMode.NONE, "3"); + _assert("[true,[1,2,[true],3],0]", "/0", PathWriteMode.NONE, "true"); + _assert("[true,[1,2,[true],3],0]", "/1", PathWriteMode.NONE, "[1,2,[true],3]"); - _assert("[true,[1,2,[true],3],0]", "/1/2", false, "[true]"); - _assert("[true,[1,2,[true],3],0]", "/1/2/0", false, "true"); - _assert("[true,[1,2,[true],3],0]", "/1/3/0", false, ""); + _assert("[true,[1,2,[true],3],0]", "/1/2", PathWriteMode.NONE, "[true]"); + _assert("[true,[1,2,[true],3],0]", "/1/2/0", PathWriteMode.NONE, "true"); + _assert("[true,[1,2,[true],3],0]", "/1/3/0", PathWriteMode.NONE, ""); } // final String SIMPLE_INPUT = aposToQuotes("{'a':1,'b':[1,2,3],'c':{'d':{'a':true}},'d':null}"); public void testArrayElementWithoutPath() throws Exception { - _assert(SIMPLE_INPUT, "/b", false, "[1,2,3]"); - _assert(SIMPLE_INPUT, "/b/1", false, "2"); - _assert(SIMPLE_INPUT, "/b/2", false, "3"); + _assert(SIMPLE_INPUT, "/b", PathWriteMode.NONE, "[1,2,3]"); + _assert(SIMPLE_INPUT, "/b/1", PathWriteMode.NONE, "2"); + _assert(SIMPLE_INPUT, "/b/2", PathWriteMode.NONE, "3"); - _assert(SIMPLE_INPUT, "/b/8", false, ""); + _assert(SIMPLE_INPUT, "/b/8", PathWriteMode.NONE, ""); // and then non-match - _assert(SIMPLE_INPUT, "/x", false, ""); + _assert(SIMPLE_INPUT, "/x", PathWriteMode.NONE, ""); } - private void _assert(String input, String pathExpr, boolean includeParent, String exp) + private void _assert(String input, String pathExpr, PathWriteMode pathWriteMode, String exp) throws Exception { StringWriter w = new StringWriter(); @@ -96,7 +98,7 @@ private void _assert(String input, String pathExpr, boolean includeParent, Strin JsonGenerator g0 = JSON_F.createGenerator(w); FilteringGeneratorDelegate g = new FilteringGeneratorDelegate(g0, new JsonPointerBasedFilter(pathExpr), - includeParent, false, false); + pathWriteMode, false); try { writeJsonDoc(JSON_F, input, g); diff --git a/src/test/java/com/fasterxml/jackson/core/json/TestUtf8Generator.java b/src/test/java/com/fasterxml/jackson/core/json/TestUtf8Generator.java index 56473cbbdd..c6e56f56d7 100644 --- a/src/test/java/com/fasterxml/jackson/core/json/TestUtf8Generator.java +++ b/src/test/java/com/fasterxml/jackson/core/json/TestUtf8Generator.java @@ -1,13 +1,18 @@ package com.fasterxml.jackson.core.json; -import com.fasterxml.jackson.core.*; +import java.io.ByteArrayOutputStream; + +import com.fasterxml.jackson.core.BaseTest; +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate; +import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate.PathWriteMode; import com.fasterxml.jackson.core.filter.JsonPointerBasedFilter; import com.fasterxml.jackson.core.io.IOContext; import com.fasterxml.jackson.core.util.BufferRecycler; -import java.io.ByteArrayOutputStream; - public class TestUtf8Generator extends BaseTest { private final JsonFactory JSON_F = new JsonFactory(); @@ -73,9 +78,8 @@ public void testFilteringWithEscapedChars() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(g, new JsonPointerBasedFilter("/escapes"), - true, // includePath - false, // multipleMatches - false // writeEmptyObjectsAndArrays + PathWriteMode.LAZY, + false // multipleMatches ); //final String JSON = "{'a':123,'array':[1,2],'escapes':'\b\t\f\n\r\"foo\"\u0000'}"; From f4fecbc4d6e2138a51d3f3ad4e4be14eceee5846 Mon Sep 17 00:00:00 2001 From: jhaber Date: Wed, 23 Oct 2019 22:47:37 -0400 Subject: [PATCH 05/15] Rename enum --- .../filter/FilteringGeneratorDelegate.java | 50 ++++++++---- .../filter/BasicGeneratorFilteringTest.java | 42 +++++----- .../JsonPointerGeneratorFilteringTest.java | 80 +++++++++---------- .../jackson/core/json/TestUtf8Generator.java | 4 +- 4 files changed, 99 insertions(+), 77 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java b/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java index 19c7187f9e..f8fe9dc6ab 100644 --- a/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java +++ b/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java @@ -17,8 +17,28 @@ */ public class FilteringGeneratorDelegate extends JsonGeneratorDelegate { - public enum PathWriteMode { - NONE, LAZY, EAGER + /** + * Enumeration that controls how TokenFilter return values are interpreted + * + * @since 2.11 + */ + public enum TokenInclusion { + /** + * Tokens will only be included if the filter returns TokenFilter.INCLUDE_ALL + */ + ONLY_INCLUDE_ALL, + /** + * When TokenFilter.INCLUDE_ALL is returned, the corresponding token will + * be included as well as enclosing tokens up to the root + */ + INCLUDE_ALL_AND_PATH, + /** + * Tokens will be included if any non-null filter is returned. + * The exception is if a field name returns a non-null filter, + * but the field value returns a null filter. In this case the + * field name will also be omitted. + */ + NON_NULL } /* @@ -48,7 +68,7 @@ public enum PathWriteMode { * done and only explicitly included entries are output; if `true` then * path from main level down to match is also included as necessary. */ - protected PathWriteMode _pathWriteMode; + protected TokenInclusion _tokenInclusion; /* /********************************************************** @@ -86,11 +106,11 @@ public enum PathWriteMode { public FilteringGeneratorDelegate(JsonGenerator d, TokenFilter f, boolean includePath, boolean allowMultipleMatches) { - this(d, f, includePath ? PathWriteMode.LAZY : PathWriteMode.NONE, allowMultipleMatches); + this(d, f, includePath ? TokenInclusion.INCLUDE_ALL_AND_PATH : TokenInclusion.ONLY_INCLUDE_ALL, allowMultipleMatches); } public FilteringGeneratorDelegate(JsonGenerator d, TokenFilter f, - PathWriteMode pathWriteMode, boolean allowMultipleMatches) + TokenInclusion tokenInclusion, boolean allowMultipleMatches) { // By default, do NOT delegate copy methods super(d, false); @@ -98,7 +118,7 @@ public FilteringGeneratorDelegate(JsonGenerator d, TokenFilter f, // and this is the currently active filter for root values _itemFilter = f; _filterContext = TokenFilterContext.createRootContext(f); - _pathWriteMode = pathWriteMode; + _tokenInclusion = tokenInclusion; _allowMultipleMatches = allowMultipleMatches; } @@ -169,7 +189,7 @@ public void writeStartArray() throws IOException _checkParentPath(); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(); - } else if (_itemFilter != null && _pathWriteMode == PathWriteMode.EAGER) { + } else if (_itemFilter != null && _tokenInclusion == TokenInclusion.NON_NULL) { _checkParentPath(false /* match */); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(); @@ -202,7 +222,7 @@ public void writeStartArray(int size) throws IOException _checkParentPath(); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(size); - } else if (_itemFilter != null && _pathWriteMode == PathWriteMode.EAGER) { + } else if (_itemFilter != null && _tokenInclusion == TokenInclusion.NON_NULL) { _checkParentPath(false /* match */); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(size); @@ -246,7 +266,7 @@ public void writeStartObject() throws IOException _checkParentPath(); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(); - } else if (f != null && _pathWriteMode == PathWriteMode.EAGER) { + } else if (f != null && _tokenInclusion == TokenInclusion.NON_NULL) { _checkParentPath(false /* match */); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(); @@ -280,7 +300,7 @@ public void writeStartObject(Object forValue) throws IOException _checkParentPath(); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(forValue); - } else if (f != null && _pathWriteMode == PathWriteMode.EAGER) { + } else if (f != null && _tokenInclusion == TokenInclusion.NON_NULL) { _checkParentPath(false /* match */); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(forValue); @@ -877,9 +897,10 @@ protected void _checkParentPath(boolean match) throws IOException ++_matchCount; } // only need to construct path if parent wasn't written - if (_pathWriteMode == PathWriteMode.LAZY) { + if (_tokenInclusion == TokenInclusion.INCLUDE_ALL_AND_PATH) { _filterContext.writePath(delegate); - } else if (_pathWriteMode == PathWriteMode.EAGER) { + } else if (_tokenInclusion == TokenInclusion.NON_NULL) { + // path has already been written, except for maybe field name _filterContext.ensureFieldNameWritten(delegate); } // also: if no multiple matches desired, short-cut checks @@ -897,9 +918,10 @@ protected void _checkParentPath(boolean match) throws IOException protected void _checkPropertyParentPath() throws IOException { ++_matchCount; - if (_pathWriteMode == PathWriteMode.LAZY) { + if (_tokenInclusion == TokenInclusion.INCLUDE_ALL_AND_PATH) { _filterContext.writePath(delegate); - } else if (_pathWriteMode == PathWriteMode.EAGER) { + } else if (_tokenInclusion == TokenInclusion.NON_NULL) { + // path has already been written, except for maybe field name _filterContext.ensureFieldNameWritten(delegate); } diff --git a/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java b/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java index 502eb06d0c..c451ba6d02 100644 --- a/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java +++ b/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java @@ -6,7 +6,7 @@ import java.util.*; import com.fasterxml.jackson.core.*; -import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate.PathWriteMode; +import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate.TokenInclusion; import com.fasterxml.jackson.core.io.SerializedString; /** @@ -127,7 +127,7 @@ public void testSingleMatchFilteringWithoutPath() throws Exception StringWriter w = new StringWriter(); JsonGenerator gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("value"), - PathWriteMode.NONE, + TokenInclusion.ONLY_INCLUDE_ALL, false // multipleMatches ); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; @@ -148,7 +148,7 @@ public void testSingleMatchFilteringWithPath() throws Exception NameMatchFilter filter = new NameMatchFilter("value"); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(origGen, filter, - PathWriteMode.LAZY, // includePath + TokenInclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches ); @@ -171,7 +171,7 @@ public void testSingleMatchFilteringWithPathSkippedArray() throws Exception NameMatchFilter filter = new NameMatchFilter("value"); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(origGen, filter, - PathWriteMode.LAZY, // includePath + TokenInclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches ); @@ -192,7 +192,7 @@ public void testSingleMatchFilteringWithPathAlternate1() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("value"), - PathWriteMode.LAZY, // includePath + TokenInclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches ); //final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':[3],'value2':'foo'},'b':true}"; @@ -232,7 +232,7 @@ public void testSingleMatchFilteringWithPathRawBinary() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("array"), - PathWriteMode.LAZY, // includePath + TokenInclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches ); //final String JSON = "{'header':['ENCODED',raw],'array':['base64stuff',1,2,3,4,5,6.25,7.5],'extra':[1,2,3,4,5,6.25,7.5]}"; @@ -283,7 +283,7 @@ public void testMultipleMatchFilteringWithPath1() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("value0", "value2"), - PathWriteMode.LAZY, true /* multipleMatches */ ); + TokenInclusion.INCLUDE_ALL_AND_PATH, true /* multipleMatches */ ); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'ob':{'value0':2,'value2':4}}"), w.toString()); @@ -296,7 +296,7 @@ public void testMultipleMatchFilteringWithPath2() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("array", "b", "value"), - PathWriteMode.LAZY, true); + TokenInclusion.INCLUDE_ALL_AND_PATH, true); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'array':[1,2],'ob':{'value':3},'b':true}"), w.toString()); @@ -309,7 +309,7 @@ public void testMultipleMatchFilteringWithPath3() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("value"), - PathWriteMode.LAZY, true); + TokenInclusion.INCLUDE_ALL_AND_PATH, true); final String JSON = "{'root':{'a0':true,'a':{'value':3},'b':{'value':4}},'b0':false}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'root':{'a':{'value':3},'b':{'value':4}}}"), w.toString()); @@ -322,7 +322,7 @@ public void testNoMatchFiltering1() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("invalid"), - PathWriteMode.EAGER, true); + TokenInclusion.NON_NULL, true); final String JSON = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'root':{'b':{}}}"), w.toString()); @@ -335,7 +335,7 @@ public void testNoMatchFiltering2() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("invalid"), - PathWriteMode.EAGER, true); + TokenInclusion.NON_NULL, true); final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[%s,%s,%s]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); @@ -349,7 +349,7 @@ public void testNoMatchFiltering3() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("invalid"), - PathWriteMode.EAGER, true); + TokenInclusion.NON_NULL, true); final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[[%s],[%s],[%s]]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); @@ -363,7 +363,7 @@ public void testNoMatchFiltering4() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new StrictNameMatchFilter("invalid"), - PathWriteMode.EAGER, true); + TokenInclusion.NON_NULL, true); final String JSON = "{'root':{'a0':true,'a':{'value':3},'b':{'value':4}},'b0':false}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{}"), w.toString()); @@ -376,7 +376,7 @@ public void testNoMatchFiltering5() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new StrictNameMatchFilter("invalid"), - PathWriteMode.EAGER, true); + TokenInclusion.NON_NULL, true); final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[%s,%s,%s]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); @@ -390,7 +390,7 @@ public void testNoMatchFiltering6() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new StrictNameMatchFilter("invalid"), - PathWriteMode.EAGER, true); + TokenInclusion.NON_NULL, true); final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[[%s],[%s],[%s]]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); @@ -404,7 +404,7 @@ public void testValueOmitsFieldName1() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NoArraysFilter(), - PathWriteMode.EAGER, true); + TokenInclusion.NON_NULL, true); final String JSON = "{'root':['a'],'b0':false}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'b0':false}"), w.toString()); @@ -417,7 +417,7 @@ public void testValueOmitsFieldName2() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NoObjectsFilter(), - PathWriteMode.EAGER, true); + TokenInclusion.NON_NULL, true); final String JSON = "['a',{'root':{'b':{'value':4}},'b0':false}]"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("['a']"), w.toString()); @@ -429,7 +429,7 @@ public void testIndexMatchWithPath1() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new IndexMatchFilter(1), - PathWriteMode.LAZY, true); + TokenInclusion.INCLUDE_ALL_AND_PATH, true); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'array':[2]}"), w.toString()); @@ -437,7 +437,7 @@ public void testIndexMatchWithPath1() throws Exception w = new StringWriter(); gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new IndexMatchFilter(0), - PathWriteMode.LAZY, true); + TokenInclusion.INCLUDE_ALL_AND_PATH, true); writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'array':[1]}"), w.toString()); assertEquals(1, gen.getMatchCount()); @@ -448,7 +448,7 @@ public void testIndexMatchWithPath2() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new IndexMatchFilter(0,1), - PathWriteMode.LAZY, true); + TokenInclusion.INCLUDE_ALL_AND_PATH, true); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'array':[1,2]}"), w.toString()); @@ -461,7 +461,7 @@ public void testWriteStartObjectWithObject() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), TokenFilter.INCLUDE_ALL, - PathWriteMode.LAZY, true); + TokenInclusion.INCLUDE_ALL_AND_PATH, true); String value = "val"; diff --git a/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java b/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java index 6594384b3f..4e11c871ff 100644 --- a/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java +++ b/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate.PathWriteMode; +import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate.TokenInclusion; @SuppressWarnings("resource") public class JsonPointerGeneratorFilteringTest extends com.fasterxml.jackson.core.BaseTest @@ -15,82 +15,82 @@ public class JsonPointerGeneratorFilteringTest extends com.fasterxml.jackson.cor public void testSimplePropertyWithPath() throws Exception { - _assert(SIMPLE_INPUT, "/c", PathWriteMode.LAZY, "{'c':{'d':{'a':true}}}"); - _assert(SIMPLE_INPUT, "/c/d", PathWriteMode.LAZY, "{'c':{'d':{'a':true}}}"); - _assert(SIMPLE_INPUT, "/c/d/a", PathWriteMode.LAZY, "{'c':{'d':{'a':true}}}"); + _assert(SIMPLE_INPUT, "/c", TokenInclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); + _assert(SIMPLE_INPUT, "/c/d", TokenInclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); + _assert(SIMPLE_INPUT, "/c/d/a", TokenInclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); - _assert(SIMPLE_INPUT, "/c/d/a", PathWriteMode.LAZY, "{'c':{'d':{'a':true}}}"); + _assert(SIMPLE_INPUT, "/c/d/a", TokenInclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); - _assert(SIMPLE_INPUT, "/a", PathWriteMode.LAZY, "{'a':1}"); - _assert(SIMPLE_INPUT, "/d", PathWriteMode.LAZY, "{'d':null}"); + _assert(SIMPLE_INPUT, "/a", TokenInclusion.INCLUDE_ALL_AND_PATH, "{'a':1}"); + _assert(SIMPLE_INPUT, "/d", TokenInclusion.INCLUDE_ALL_AND_PATH, "{'d':null}"); // and then non-match - _assert(SIMPLE_INPUT, "/x", PathWriteMode.LAZY, ""); + _assert(SIMPLE_INPUT, "/x", TokenInclusion.INCLUDE_ALL_AND_PATH, ""); } public void testSimplePropertyWithoutPath() throws Exception { - _assert(SIMPLE_INPUT, "/c", PathWriteMode.NONE, "{'d':{'a':true}}"); - _assert(SIMPLE_INPUT, "/c/d", PathWriteMode.NONE, "{'a':true}"); - _assert(SIMPLE_INPUT, "/c/d/a", PathWriteMode.NONE, "true"); + _assert(SIMPLE_INPUT, "/c", TokenInclusion.ONLY_INCLUDE_ALL, "{'d':{'a':true}}"); + _assert(SIMPLE_INPUT, "/c/d", TokenInclusion.ONLY_INCLUDE_ALL, "{'a':true}"); + _assert(SIMPLE_INPUT, "/c/d/a", TokenInclusion.ONLY_INCLUDE_ALL, "true"); - _assert(SIMPLE_INPUT, "/a", PathWriteMode.NONE, "1"); - _assert(SIMPLE_INPUT, "/d", PathWriteMode.NONE, "null"); + _assert(SIMPLE_INPUT, "/a", TokenInclusion.ONLY_INCLUDE_ALL, "1"); + _assert(SIMPLE_INPUT, "/d", TokenInclusion.ONLY_INCLUDE_ALL, "null"); // and then non-match - _assert(SIMPLE_INPUT, "/x", PathWriteMode.NONE, ""); + _assert(SIMPLE_INPUT, "/x", TokenInclusion.ONLY_INCLUDE_ALL, ""); } public void testArrayElementWithPath() throws Exception { - _assert(SIMPLE_INPUT, "/b", PathWriteMode.LAZY, "{'b':[1,2,3]}"); - _assert(SIMPLE_INPUT, "/b/1", PathWriteMode.LAZY, "{'b':[2]}"); - _assert(SIMPLE_INPUT, "/b/2", PathWriteMode.LAZY, "{'b':[3]}"); + _assert(SIMPLE_INPUT, "/b", TokenInclusion.INCLUDE_ALL_AND_PATH, "{'b':[1,2,3]}"); + _assert(SIMPLE_INPUT, "/b/1", TokenInclusion.INCLUDE_ALL_AND_PATH, "{'b':[2]}"); + _assert(SIMPLE_INPUT, "/b/2", TokenInclusion.INCLUDE_ALL_AND_PATH, "{'b':[3]}"); // and then non-match - _assert(SIMPLE_INPUT, "/b/8", PathWriteMode.LAZY, ""); + _assert(SIMPLE_INPUT, "/b/8", TokenInclusion.INCLUDE_ALL_AND_PATH, ""); } public void testArrayNestedWithPath() throws Exception { - _assert("{'a':[true,{'b':3,'d':2},false]}", "/a/1/b", PathWriteMode.LAZY, "{'a':[{'b':3}]}"); - _assert("[true,[1]]", "/0", PathWriteMode.LAZY, "[true]"); - _assert("[true,[1]]", "/1", PathWriteMode.LAZY, "[[1]]"); - _assert("[true,[1,2,[true],3],0]", "/0", PathWriteMode.LAZY, "[true]"); - _assert("[true,[1,2,[true],3],0]", "/1", PathWriteMode.LAZY, "[[1,2,[true],3]]"); - - _assert("[true,[1,2,[true],3],0]", "/1/2", PathWriteMode.LAZY, "[[[true]]]"); - _assert("[true,[1,2,[true],3],0]", "/1/2/0", PathWriteMode.LAZY, "[[[true]]]"); - _assert("[true,[1,2,[true],3],0]", "/1/3/0", PathWriteMode.LAZY, ""); + _assert("{'a':[true,{'b':3,'d':2},false]}", "/a/1/b", TokenInclusion.INCLUDE_ALL_AND_PATH, "{'a':[{'b':3}]}"); + _assert("[true,[1]]", "/0", TokenInclusion.INCLUDE_ALL_AND_PATH, "[true]"); + _assert("[true,[1]]", "/1", TokenInclusion.INCLUDE_ALL_AND_PATH, "[[1]]"); + _assert("[true,[1,2,[true],3],0]", "/0", TokenInclusion.INCLUDE_ALL_AND_PATH, "[true]"); + _assert("[true,[1,2,[true],3],0]", "/1", TokenInclusion.INCLUDE_ALL_AND_PATH, "[[1,2,[true],3]]"); + + _assert("[true,[1,2,[true],3],0]", "/1/2", TokenInclusion.INCLUDE_ALL_AND_PATH, "[[[true]]]"); + _assert("[true,[1,2,[true],3],0]", "/1/2/0", TokenInclusion.INCLUDE_ALL_AND_PATH, "[[[true]]]"); + _assert("[true,[1,2,[true],3],0]", "/1/3/0", TokenInclusion.INCLUDE_ALL_AND_PATH, ""); } public void testArrayNestedWithoutPath() throws Exception { - _assert("{'a':[true,{'b':3,'d':2},false]}", "/a/1/b", PathWriteMode.NONE, "3"); - _assert("[true,[1,2,[true],3],0]", "/0", PathWriteMode.NONE, "true"); - _assert("[true,[1,2,[true],3],0]", "/1", PathWriteMode.NONE, + _assert("{'a':[true,{'b':3,'d':2},false]}", "/a/1/b", TokenInclusion.ONLY_INCLUDE_ALL, "3"); + _assert("[true,[1,2,[true],3],0]", "/0", TokenInclusion.ONLY_INCLUDE_ALL, "true"); + _assert("[true,[1,2,[true],3],0]", "/1", TokenInclusion.ONLY_INCLUDE_ALL, "[1,2,[true],3]"); - _assert("[true,[1,2,[true],3],0]", "/1/2", PathWriteMode.NONE, "[true]"); - _assert("[true,[1,2,[true],3],0]", "/1/2/0", PathWriteMode.NONE, "true"); - _assert("[true,[1,2,[true],3],0]", "/1/3/0", PathWriteMode.NONE, ""); + _assert("[true,[1,2,[true],3],0]", "/1/2", TokenInclusion.ONLY_INCLUDE_ALL, "[true]"); + _assert("[true,[1,2,[true],3],0]", "/1/2/0", TokenInclusion.ONLY_INCLUDE_ALL, "true"); + _assert("[true,[1,2,[true],3],0]", "/1/3/0", TokenInclusion.ONLY_INCLUDE_ALL, ""); } // final String SIMPLE_INPUT = aposToQuotes("{'a':1,'b':[1,2,3],'c':{'d':{'a':true}},'d':null}"); public void testArrayElementWithoutPath() throws Exception { - _assert(SIMPLE_INPUT, "/b", PathWriteMode.NONE, "[1,2,3]"); - _assert(SIMPLE_INPUT, "/b/1", PathWriteMode.NONE, "2"); - _assert(SIMPLE_INPUT, "/b/2", PathWriteMode.NONE, "3"); + _assert(SIMPLE_INPUT, "/b", TokenInclusion.ONLY_INCLUDE_ALL, "[1,2,3]"); + _assert(SIMPLE_INPUT, "/b/1", TokenInclusion.ONLY_INCLUDE_ALL, "2"); + _assert(SIMPLE_INPUT, "/b/2", TokenInclusion.ONLY_INCLUDE_ALL, "3"); - _assert(SIMPLE_INPUT, "/b/8", PathWriteMode.NONE, ""); + _assert(SIMPLE_INPUT, "/b/8", TokenInclusion.ONLY_INCLUDE_ALL, ""); // and then non-match - _assert(SIMPLE_INPUT, "/x", PathWriteMode.NONE, ""); + _assert(SIMPLE_INPUT, "/x", TokenInclusion.ONLY_INCLUDE_ALL, ""); } - private void _assert(String input, String pathExpr, PathWriteMode pathWriteMode, String exp) + private void _assert(String input, String pathExpr, TokenInclusion tokenInclusion, String exp) throws Exception { StringWriter w = new StringWriter(); @@ -98,7 +98,7 @@ private void _assert(String input, String pathExpr, PathWriteMode pathWriteMode, JsonGenerator g0 = JSON_F.createGenerator(w); FilteringGeneratorDelegate g = new FilteringGeneratorDelegate(g0, new JsonPointerBasedFilter(pathExpr), - pathWriteMode, false); + tokenInclusion, false); try { writeJsonDoc(JSON_F, input, g); diff --git a/src/test/java/com/fasterxml/jackson/core/json/TestUtf8Generator.java b/src/test/java/com/fasterxml/jackson/core/json/TestUtf8Generator.java index c6e56f56d7..d78a5fd68a 100644 --- a/src/test/java/com/fasterxml/jackson/core/json/TestUtf8Generator.java +++ b/src/test/java/com/fasterxml/jackson/core/json/TestUtf8Generator.java @@ -8,7 +8,7 @@ import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate; -import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate.PathWriteMode; +import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate.TokenInclusion; import com.fasterxml.jackson.core.filter.JsonPointerBasedFilter; import com.fasterxml.jackson.core.io.IOContext; import com.fasterxml.jackson.core.util.BufferRecycler; @@ -78,7 +78,7 @@ public void testFilteringWithEscapedChars() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(g, new JsonPointerBasedFilter("/escapes"), - PathWriteMode.LAZY, + TokenInclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches ); From 3110c29cb316b37b614d0c822f1556a066598406 Mon Sep 17 00:00:00 2001 From: jhaber Date: Wed, 23 Oct 2019 22:49:39 -0400 Subject: [PATCH 06/15] Rename arg --- .../core/filter/FilteringGeneratorDelegate.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java b/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java index f8fe9dc6ab..b3c5394699 100644 --- a/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java +++ b/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java @@ -190,7 +190,7 @@ public void writeStartArray() throws IOException _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(); } else if (_itemFilter != null && _tokenInclusion == TokenInclusion.NON_NULL) { - _checkParentPath(false /* match */); + _checkParentPath(false /* isMatch */); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(); } else { @@ -223,7 +223,7 @@ public void writeStartArray(int size) throws IOException _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(size); } else if (_itemFilter != null && _tokenInclusion == TokenInclusion.NON_NULL) { - _checkParentPath(false /* match */); + _checkParentPath(false /* isMatch */); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(size); } else { @@ -267,7 +267,7 @@ public void writeStartObject() throws IOException _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(); } else if (f != null && _tokenInclusion == TokenInclusion.NON_NULL) { - _checkParentPath(false /* match */); + _checkParentPath(false /* isMatch */); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(); } else { // filter out @@ -301,7 +301,7 @@ public void writeStartObject(Object forValue) throws IOException _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(forValue); } else if (f != null && _tokenInclusion == TokenInclusion.NON_NULL) { - _checkParentPath(false /* match */); + _checkParentPath(false /* isMatch */); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(forValue); } else { // filter out @@ -891,9 +891,9 @@ protected void _checkParentPath() throws IOException _checkParentPath(true); } - protected void _checkParentPath(boolean match) throws IOException + protected void _checkParentPath(boolean isMatch) throws IOException { - if (match) { + if (isMatch) { ++_matchCount; } // only need to construct path if parent wasn't written @@ -904,7 +904,7 @@ protected void _checkParentPath(boolean match) throws IOException _filterContext.ensureFieldNameWritten(delegate); } // also: if no multiple matches desired, short-cut checks - if (match && !_allowMultipleMatches) { + if (isMatch && !_allowMultipleMatches) { // Mark parents as "skip" so that further check calls are not made _filterContext.skipParentChecks(); } From 9aa71323198b9b07da1e99626347e61c88e100f0 Mon Sep 17 00:00:00 2001 From: jhaber Date: Wed, 23 Oct 2019 23:12:09 -0400 Subject: [PATCH 07/15] Improve comment --- .../jackson/core/filter/FilteringGeneratorDelegate.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java b/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java index b3c5394699..ad2be40ea5 100644 --- a/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java +++ b/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java @@ -36,7 +36,7 @@ public enum TokenInclusion { * Tokens will be included if any non-null filter is returned. * The exception is if a field name returns a non-null filter, * but the field value returns a null filter. In this case the - * field name will also be omitted. + * field name and value will both be omitted. */ NON_NULL } From 0916608e88365722777f4f1767f02c8505dfd464 Mon Sep 17 00:00:00 2001 From: jhaber Date: Wed, 23 Oct 2019 23:14:31 -0400 Subject: [PATCH 08/15] Fix indentation --- .../jackson/core/filter/JsonPointerGeneratorFilteringTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java b/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java index 4e11c871ff..1b56a1003c 100644 --- a/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java +++ b/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java @@ -98,7 +98,7 @@ private void _assert(String input, String pathExpr, TokenInclusion tokenInclusio JsonGenerator g0 = JSON_F.createGenerator(w); FilteringGeneratorDelegate g = new FilteringGeneratorDelegate(g0, new JsonPointerBasedFilter(pathExpr), - tokenInclusion, false); + tokenInclusion, false); try { writeJsonDoc(JSON_F, input, g); From ba8148663f7fd189d0ab6e31f4eb1ffb9c153c00 Mon Sep 17 00:00:00 2001 From: jhaber Date: Wed, 23 Oct 2019 23:21:35 -0400 Subject: [PATCH 09/15] Rename constant --- .../core/filter/FilteringGeneratorDelegate.java | 14 +++++++------- .../core/filter/BasicGeneratorFilteringTest.java | 16 ++++++++-------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java b/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java index ad2be40ea5..a26b7ac3cf 100644 --- a/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java +++ b/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java @@ -38,7 +38,7 @@ public enum TokenInclusion { * but the field value returns a null filter. In this case the * field name and value will both be omitted. */ - NON_NULL + INCLUDE_NON_NULL } /* @@ -189,7 +189,7 @@ public void writeStartArray() throws IOException _checkParentPath(); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(); - } else if (_itemFilter != null && _tokenInclusion == TokenInclusion.NON_NULL) { + } else if (_itemFilter != null && _tokenInclusion == TokenInclusion.INCLUDE_NON_NULL) { _checkParentPath(false /* isMatch */); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(); @@ -222,7 +222,7 @@ public void writeStartArray(int size) throws IOException _checkParentPath(); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(size); - } else if (_itemFilter != null && _tokenInclusion == TokenInclusion.NON_NULL) { + } else if (_itemFilter != null && _tokenInclusion == TokenInclusion.INCLUDE_NON_NULL) { _checkParentPath(false /* isMatch */); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(size); @@ -266,7 +266,7 @@ public void writeStartObject() throws IOException _checkParentPath(); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(); - } else if (f != null && _tokenInclusion == TokenInclusion.NON_NULL) { + } else if (f != null && _tokenInclusion == TokenInclusion.INCLUDE_NON_NULL) { _checkParentPath(false /* isMatch */); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(); @@ -300,7 +300,7 @@ public void writeStartObject(Object forValue) throws IOException _checkParentPath(); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(forValue); - } else if (f != null && _tokenInclusion == TokenInclusion.NON_NULL) { + } else if (f != null && _tokenInclusion == TokenInclusion.INCLUDE_NON_NULL) { _checkParentPath(false /* isMatch */); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(forValue); @@ -899,7 +899,7 @@ protected void _checkParentPath(boolean isMatch) throws IOException // only need to construct path if parent wasn't written if (_tokenInclusion == TokenInclusion.INCLUDE_ALL_AND_PATH) { _filterContext.writePath(delegate); - } else if (_tokenInclusion == TokenInclusion.NON_NULL) { + } else if (_tokenInclusion == TokenInclusion.INCLUDE_NON_NULL) { // path has already been written, except for maybe field name _filterContext.ensureFieldNameWritten(delegate); } @@ -920,7 +920,7 @@ protected void _checkPropertyParentPath() throws IOException ++_matchCount; if (_tokenInclusion == TokenInclusion.INCLUDE_ALL_AND_PATH) { _filterContext.writePath(delegate); - } else if (_tokenInclusion == TokenInclusion.NON_NULL) { + } else if (_tokenInclusion == TokenInclusion.INCLUDE_NON_NULL) { // path has already been written, except for maybe field name _filterContext.ensureFieldNameWritten(delegate); } diff --git a/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java b/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java index c451ba6d02..f5343d373d 100644 --- a/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java +++ b/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java @@ -322,7 +322,7 @@ public void testNoMatchFiltering1() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("invalid"), - TokenInclusion.NON_NULL, true); + TokenInclusion.INCLUDE_NON_NULL, true); final String JSON = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'root':{'b':{}}}"), w.toString()); @@ -335,7 +335,7 @@ public void testNoMatchFiltering2() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("invalid"), - TokenInclusion.NON_NULL, true); + TokenInclusion.INCLUDE_NON_NULL, true); final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[%s,%s,%s]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); @@ -349,7 +349,7 @@ public void testNoMatchFiltering3() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("invalid"), - TokenInclusion.NON_NULL, true); + TokenInclusion.INCLUDE_NON_NULL, true); final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[[%s],[%s],[%s]]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); @@ -363,7 +363,7 @@ public void testNoMatchFiltering4() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new StrictNameMatchFilter("invalid"), - TokenInclusion.NON_NULL, true); + TokenInclusion.INCLUDE_NON_NULL, true); final String JSON = "{'root':{'a0':true,'a':{'value':3},'b':{'value':4}},'b0':false}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{}"), w.toString()); @@ -376,7 +376,7 @@ public void testNoMatchFiltering5() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new StrictNameMatchFilter("invalid"), - TokenInclusion.NON_NULL, true); + TokenInclusion.INCLUDE_NON_NULL, true); final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[%s,%s,%s]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); @@ -390,7 +390,7 @@ public void testNoMatchFiltering6() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new StrictNameMatchFilter("invalid"), - TokenInclusion.NON_NULL, true); + TokenInclusion.INCLUDE_NON_NULL, true); final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[[%s],[%s],[%s]]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); @@ -404,7 +404,7 @@ public void testValueOmitsFieldName1() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NoArraysFilter(), - TokenInclusion.NON_NULL, true); + TokenInclusion.INCLUDE_NON_NULL, true); final String JSON = "{'root':['a'],'b0':false}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'b0':false}"), w.toString()); @@ -417,7 +417,7 @@ public void testValueOmitsFieldName2() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NoObjectsFilter(), - TokenInclusion.NON_NULL, true); + TokenInclusion.INCLUDE_NON_NULL, true); final String JSON = "['a',{'root':{'b':{'value':4}},'b0':false}]"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("['a']"), w.toString()); From a90a1e87bbdcbcf8cce8cfd4cc645a351f415a4e Mon Sep 17 00:00:00 2001 From: jhaber Date: Sat, 26 Oct 2019 07:47:29 -0400 Subject: [PATCH 10/15] Rename to TokenFilterInclusion --- .../filter/FilteringGeneratorDelegate.java | 26 +++--- .../filter/BasicGeneratorFilteringTest.java | 42 +++++----- .../JsonPointerGeneratorFilteringTest.java | 80 +++++++++---------- .../jackson/core/json/TestUtf8Generator.java | 4 +- 4 files changed, 76 insertions(+), 76 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java b/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java index a26b7ac3cf..fb66291f6c 100644 --- a/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java +++ b/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java @@ -22,7 +22,7 @@ public class FilteringGeneratorDelegate extends JsonGeneratorDelegate * * @since 2.11 */ - public enum TokenInclusion { + public enum TokenFilterInclusion { /** * Tokens will only be included if the filter returns TokenFilter.INCLUDE_ALL */ @@ -68,7 +68,7 @@ public enum TokenInclusion { * done and only explicitly included entries are output; if `true` then * path from main level down to match is also included as necessary. */ - protected TokenInclusion _tokenInclusion; + protected TokenFilterInclusion _tokenFilterInclusion; /* /********************************************************** @@ -106,11 +106,11 @@ public enum TokenInclusion { public FilteringGeneratorDelegate(JsonGenerator d, TokenFilter f, boolean includePath, boolean allowMultipleMatches) { - this(d, f, includePath ? TokenInclusion.INCLUDE_ALL_AND_PATH : TokenInclusion.ONLY_INCLUDE_ALL, allowMultipleMatches); + this(d, f, includePath ? TokenFilterInclusion.INCLUDE_ALL_AND_PATH : TokenFilterInclusion.ONLY_INCLUDE_ALL, allowMultipleMatches); } public FilteringGeneratorDelegate(JsonGenerator d, TokenFilter f, - TokenInclusion tokenInclusion, boolean allowMultipleMatches) + TokenFilterInclusion tokenFilterInclusion, boolean allowMultipleMatches) { // By default, do NOT delegate copy methods super(d, false); @@ -118,7 +118,7 @@ public FilteringGeneratorDelegate(JsonGenerator d, TokenFilter f, // and this is the currently active filter for root values _itemFilter = f; _filterContext = TokenFilterContext.createRootContext(f); - _tokenInclusion = tokenInclusion; + _tokenFilterInclusion = tokenFilterInclusion; _allowMultipleMatches = allowMultipleMatches; } @@ -189,7 +189,7 @@ public void writeStartArray() throws IOException _checkParentPath(); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(); - } else if (_itemFilter != null && _tokenInclusion == TokenInclusion.INCLUDE_NON_NULL) { + } else if (_itemFilter != null && _tokenFilterInclusion == TokenFilterInclusion.INCLUDE_NON_NULL) { _checkParentPath(false /* isMatch */); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(); @@ -222,7 +222,7 @@ public void writeStartArray(int size) throws IOException _checkParentPath(); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(size); - } else if (_itemFilter != null && _tokenInclusion == TokenInclusion.INCLUDE_NON_NULL) { + } else if (_itemFilter != null && _tokenFilterInclusion == TokenFilterInclusion.INCLUDE_NON_NULL) { _checkParentPath(false /* isMatch */); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(size); @@ -266,7 +266,7 @@ public void writeStartObject() throws IOException _checkParentPath(); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(); - } else if (f != null && _tokenInclusion == TokenInclusion.INCLUDE_NON_NULL) { + } else if (f != null && _tokenFilterInclusion == TokenFilterInclusion.INCLUDE_NON_NULL) { _checkParentPath(false /* isMatch */); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(); @@ -300,7 +300,7 @@ public void writeStartObject(Object forValue) throws IOException _checkParentPath(); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(forValue); - } else if (f != null && _tokenInclusion == TokenInclusion.INCLUDE_NON_NULL) { + } else if (f != null && _tokenFilterInclusion == TokenFilterInclusion.INCLUDE_NON_NULL) { _checkParentPath(false /* isMatch */); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(forValue); @@ -897,9 +897,9 @@ protected void _checkParentPath(boolean isMatch) throws IOException ++_matchCount; } // only need to construct path if parent wasn't written - if (_tokenInclusion == TokenInclusion.INCLUDE_ALL_AND_PATH) { + if (_tokenFilterInclusion == TokenFilterInclusion.INCLUDE_ALL_AND_PATH) { _filterContext.writePath(delegate); - } else if (_tokenInclusion == TokenInclusion.INCLUDE_NON_NULL) { + } else if (_tokenFilterInclusion == TokenFilterInclusion.INCLUDE_NON_NULL) { // path has already been written, except for maybe field name _filterContext.ensureFieldNameWritten(delegate); } @@ -918,9 +918,9 @@ protected void _checkParentPath(boolean isMatch) throws IOException protected void _checkPropertyParentPath() throws IOException { ++_matchCount; - if (_tokenInclusion == TokenInclusion.INCLUDE_ALL_AND_PATH) { + if (_tokenFilterInclusion == TokenFilterInclusion.INCLUDE_ALL_AND_PATH) { _filterContext.writePath(delegate); - } else if (_tokenInclusion == TokenInclusion.INCLUDE_NON_NULL) { + } else if (_tokenFilterInclusion == TokenFilterInclusion.INCLUDE_NON_NULL) { // path has already been written, except for maybe field name _filterContext.ensureFieldNameWritten(delegate); } diff --git a/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java b/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java index f5343d373d..07167522a8 100644 --- a/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java +++ b/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java @@ -6,7 +6,7 @@ import java.util.*; import com.fasterxml.jackson.core.*; -import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate.TokenInclusion; +import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate.TokenFilterInclusion; import com.fasterxml.jackson.core.io.SerializedString; /** @@ -127,7 +127,7 @@ public void testSingleMatchFilteringWithoutPath() throws Exception StringWriter w = new StringWriter(); JsonGenerator gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("value"), - TokenInclusion.ONLY_INCLUDE_ALL, + TokenFilterInclusion.ONLY_INCLUDE_ALL, false // multipleMatches ); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; @@ -148,7 +148,7 @@ public void testSingleMatchFilteringWithPath() throws Exception NameMatchFilter filter = new NameMatchFilter("value"); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(origGen, filter, - TokenInclusion.INCLUDE_ALL_AND_PATH, + TokenFilterInclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches ); @@ -171,7 +171,7 @@ public void testSingleMatchFilteringWithPathSkippedArray() throws Exception NameMatchFilter filter = new NameMatchFilter("value"); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(origGen, filter, - TokenInclusion.INCLUDE_ALL_AND_PATH, + TokenFilterInclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches ); @@ -192,7 +192,7 @@ public void testSingleMatchFilteringWithPathAlternate1() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("value"), - TokenInclusion.INCLUDE_ALL_AND_PATH, + TokenFilterInclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches ); //final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':[3],'value2':'foo'},'b':true}"; @@ -232,7 +232,7 @@ public void testSingleMatchFilteringWithPathRawBinary() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("array"), - TokenInclusion.INCLUDE_ALL_AND_PATH, + TokenFilterInclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches ); //final String JSON = "{'header':['ENCODED',raw],'array':['base64stuff',1,2,3,4,5,6.25,7.5],'extra':[1,2,3,4,5,6.25,7.5]}"; @@ -283,7 +283,7 @@ public void testMultipleMatchFilteringWithPath1() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("value0", "value2"), - TokenInclusion.INCLUDE_ALL_AND_PATH, true /* multipleMatches */ ); + TokenFilterInclusion.INCLUDE_ALL_AND_PATH, true /* multipleMatches */ ); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'ob':{'value0':2,'value2':4}}"), w.toString()); @@ -296,7 +296,7 @@ public void testMultipleMatchFilteringWithPath2() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("array", "b", "value"), - TokenInclusion.INCLUDE_ALL_AND_PATH, true); + TokenFilterInclusion.INCLUDE_ALL_AND_PATH, true); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'array':[1,2],'ob':{'value':3},'b':true}"), w.toString()); @@ -309,7 +309,7 @@ public void testMultipleMatchFilteringWithPath3() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("value"), - TokenInclusion.INCLUDE_ALL_AND_PATH, true); + TokenFilterInclusion.INCLUDE_ALL_AND_PATH, true); final String JSON = "{'root':{'a0':true,'a':{'value':3},'b':{'value':4}},'b0':false}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'root':{'a':{'value':3},'b':{'value':4}}}"), w.toString()); @@ -322,7 +322,7 @@ public void testNoMatchFiltering1() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("invalid"), - TokenInclusion.INCLUDE_NON_NULL, true); + TokenFilterInclusion.INCLUDE_NON_NULL, true); final String JSON = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'root':{'b':{}}}"), w.toString()); @@ -335,7 +335,7 @@ public void testNoMatchFiltering2() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("invalid"), - TokenInclusion.INCLUDE_NON_NULL, true); + TokenFilterInclusion.INCLUDE_NON_NULL, true); final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[%s,%s,%s]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); @@ -349,7 +349,7 @@ public void testNoMatchFiltering3() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("invalid"), - TokenInclusion.INCLUDE_NON_NULL, true); + TokenFilterInclusion.INCLUDE_NON_NULL, true); final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[[%s],[%s],[%s]]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); @@ -363,7 +363,7 @@ public void testNoMatchFiltering4() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new StrictNameMatchFilter("invalid"), - TokenInclusion.INCLUDE_NON_NULL, true); + TokenFilterInclusion.INCLUDE_NON_NULL, true); final String JSON = "{'root':{'a0':true,'a':{'value':3},'b':{'value':4}},'b0':false}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{}"), w.toString()); @@ -376,7 +376,7 @@ public void testNoMatchFiltering5() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new StrictNameMatchFilter("invalid"), - TokenInclusion.INCLUDE_NON_NULL, true); + TokenFilterInclusion.INCLUDE_NON_NULL, true); final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[%s,%s,%s]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); @@ -390,7 +390,7 @@ public void testNoMatchFiltering6() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new StrictNameMatchFilter("invalid"), - TokenInclusion.INCLUDE_NON_NULL, true); + TokenFilterInclusion.INCLUDE_NON_NULL, true); final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[[%s],[%s],[%s]]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); @@ -404,7 +404,7 @@ public void testValueOmitsFieldName1() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NoArraysFilter(), - TokenInclusion.INCLUDE_NON_NULL, true); + TokenFilterInclusion.INCLUDE_NON_NULL, true); final String JSON = "{'root':['a'],'b0':false}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'b0':false}"), w.toString()); @@ -417,7 +417,7 @@ public void testValueOmitsFieldName2() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NoObjectsFilter(), - TokenInclusion.INCLUDE_NON_NULL, true); + TokenFilterInclusion.INCLUDE_NON_NULL, true); final String JSON = "['a',{'root':{'b':{'value':4}},'b0':false}]"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("['a']"), w.toString()); @@ -429,7 +429,7 @@ public void testIndexMatchWithPath1() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new IndexMatchFilter(1), - TokenInclusion.INCLUDE_ALL_AND_PATH, true); + TokenFilterInclusion.INCLUDE_ALL_AND_PATH, true); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'array':[2]}"), w.toString()); @@ -437,7 +437,7 @@ public void testIndexMatchWithPath1() throws Exception w = new StringWriter(); gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new IndexMatchFilter(0), - TokenInclusion.INCLUDE_ALL_AND_PATH, true); + TokenFilterInclusion.INCLUDE_ALL_AND_PATH, true); writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'array':[1]}"), w.toString()); assertEquals(1, gen.getMatchCount()); @@ -448,7 +448,7 @@ public void testIndexMatchWithPath2() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new IndexMatchFilter(0,1), - TokenInclusion.INCLUDE_ALL_AND_PATH, true); + TokenFilterInclusion.INCLUDE_ALL_AND_PATH, true); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'array':[1,2]}"), w.toString()); @@ -461,7 +461,7 @@ public void testWriteStartObjectWithObject() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), TokenFilter.INCLUDE_ALL, - TokenInclusion.INCLUDE_ALL_AND_PATH, true); + TokenFilterInclusion.INCLUDE_ALL_AND_PATH, true); String value = "val"; diff --git a/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java b/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java index 1b56a1003c..4b00132faa 100644 --- a/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java +++ b/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate.TokenInclusion; +import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate.TokenFilterInclusion; @SuppressWarnings("resource") public class JsonPointerGeneratorFilteringTest extends com.fasterxml.jackson.core.BaseTest @@ -15,82 +15,82 @@ public class JsonPointerGeneratorFilteringTest extends com.fasterxml.jackson.cor public void testSimplePropertyWithPath() throws Exception { - _assert(SIMPLE_INPUT, "/c", TokenInclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); - _assert(SIMPLE_INPUT, "/c/d", TokenInclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); - _assert(SIMPLE_INPUT, "/c/d/a", TokenInclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); + _assert(SIMPLE_INPUT, "/c", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); + _assert(SIMPLE_INPUT, "/c/d", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); + _assert(SIMPLE_INPUT, "/c/d/a", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); - _assert(SIMPLE_INPUT, "/c/d/a", TokenInclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); + _assert(SIMPLE_INPUT, "/c/d/a", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); - _assert(SIMPLE_INPUT, "/a", TokenInclusion.INCLUDE_ALL_AND_PATH, "{'a':1}"); - _assert(SIMPLE_INPUT, "/d", TokenInclusion.INCLUDE_ALL_AND_PATH, "{'d':null}"); + _assert(SIMPLE_INPUT, "/a", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "{'a':1}"); + _assert(SIMPLE_INPUT, "/d", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "{'d':null}"); // and then non-match - _assert(SIMPLE_INPUT, "/x", TokenInclusion.INCLUDE_ALL_AND_PATH, ""); + _assert(SIMPLE_INPUT, "/x", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, ""); } public void testSimplePropertyWithoutPath() throws Exception { - _assert(SIMPLE_INPUT, "/c", TokenInclusion.ONLY_INCLUDE_ALL, "{'d':{'a':true}}"); - _assert(SIMPLE_INPUT, "/c/d", TokenInclusion.ONLY_INCLUDE_ALL, "{'a':true}"); - _assert(SIMPLE_INPUT, "/c/d/a", TokenInclusion.ONLY_INCLUDE_ALL, "true"); + _assert(SIMPLE_INPUT, "/c", TokenFilterInclusion.ONLY_INCLUDE_ALL, "{'d':{'a':true}}"); + _assert(SIMPLE_INPUT, "/c/d", TokenFilterInclusion.ONLY_INCLUDE_ALL, "{'a':true}"); + _assert(SIMPLE_INPUT, "/c/d/a", TokenFilterInclusion.ONLY_INCLUDE_ALL, "true"); - _assert(SIMPLE_INPUT, "/a", TokenInclusion.ONLY_INCLUDE_ALL, "1"); - _assert(SIMPLE_INPUT, "/d", TokenInclusion.ONLY_INCLUDE_ALL, "null"); + _assert(SIMPLE_INPUT, "/a", TokenFilterInclusion.ONLY_INCLUDE_ALL, "1"); + _assert(SIMPLE_INPUT, "/d", TokenFilterInclusion.ONLY_INCLUDE_ALL, "null"); // and then non-match - _assert(SIMPLE_INPUT, "/x", TokenInclusion.ONLY_INCLUDE_ALL, ""); + _assert(SIMPLE_INPUT, "/x", TokenFilterInclusion.ONLY_INCLUDE_ALL, ""); } public void testArrayElementWithPath() throws Exception { - _assert(SIMPLE_INPUT, "/b", TokenInclusion.INCLUDE_ALL_AND_PATH, "{'b':[1,2,3]}"); - _assert(SIMPLE_INPUT, "/b/1", TokenInclusion.INCLUDE_ALL_AND_PATH, "{'b':[2]}"); - _assert(SIMPLE_INPUT, "/b/2", TokenInclusion.INCLUDE_ALL_AND_PATH, "{'b':[3]}"); + _assert(SIMPLE_INPUT, "/b", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "{'b':[1,2,3]}"); + _assert(SIMPLE_INPUT, "/b/1", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "{'b':[2]}"); + _assert(SIMPLE_INPUT, "/b/2", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "{'b':[3]}"); // and then non-match - _assert(SIMPLE_INPUT, "/b/8", TokenInclusion.INCLUDE_ALL_AND_PATH, ""); + _assert(SIMPLE_INPUT, "/b/8", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, ""); } public void testArrayNestedWithPath() throws Exception { - _assert("{'a':[true,{'b':3,'d':2},false]}", "/a/1/b", TokenInclusion.INCLUDE_ALL_AND_PATH, "{'a':[{'b':3}]}"); - _assert("[true,[1]]", "/0", TokenInclusion.INCLUDE_ALL_AND_PATH, "[true]"); - _assert("[true,[1]]", "/1", TokenInclusion.INCLUDE_ALL_AND_PATH, "[[1]]"); - _assert("[true,[1,2,[true],3],0]", "/0", TokenInclusion.INCLUDE_ALL_AND_PATH, "[true]"); - _assert("[true,[1,2,[true],3],0]", "/1", TokenInclusion.INCLUDE_ALL_AND_PATH, "[[1,2,[true],3]]"); - - _assert("[true,[1,2,[true],3],0]", "/1/2", TokenInclusion.INCLUDE_ALL_AND_PATH, "[[[true]]]"); - _assert("[true,[1,2,[true],3],0]", "/1/2/0", TokenInclusion.INCLUDE_ALL_AND_PATH, "[[[true]]]"); - _assert("[true,[1,2,[true],3],0]", "/1/3/0", TokenInclusion.INCLUDE_ALL_AND_PATH, ""); + _assert("{'a':[true,{'b':3,'d':2},false]}", "/a/1/b", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "{'a':[{'b':3}]}"); + _assert("[true,[1]]", "/0", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "[true]"); + _assert("[true,[1]]", "/1", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "[[1]]"); + _assert("[true,[1,2,[true],3],0]", "/0", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "[true]"); + _assert("[true,[1,2,[true],3],0]", "/1", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "[[1,2,[true],3]]"); + + _assert("[true,[1,2,[true],3],0]", "/1/2", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "[[[true]]]"); + _assert("[true,[1,2,[true],3],0]", "/1/2/0", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "[[[true]]]"); + _assert("[true,[1,2,[true],3],0]", "/1/3/0", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, ""); } public void testArrayNestedWithoutPath() throws Exception { - _assert("{'a':[true,{'b':3,'d':2},false]}", "/a/1/b", TokenInclusion.ONLY_INCLUDE_ALL, "3"); - _assert("[true,[1,2,[true],3],0]", "/0", TokenInclusion.ONLY_INCLUDE_ALL, "true"); - _assert("[true,[1,2,[true],3],0]", "/1", TokenInclusion.ONLY_INCLUDE_ALL, + _assert("{'a':[true,{'b':3,'d':2},false]}", "/a/1/b", TokenFilterInclusion.ONLY_INCLUDE_ALL, "3"); + _assert("[true,[1,2,[true],3],0]", "/0", TokenFilterInclusion.ONLY_INCLUDE_ALL, "true"); + _assert("[true,[1,2,[true],3],0]", "/1", TokenFilterInclusion.ONLY_INCLUDE_ALL, "[1,2,[true],3]"); - _assert("[true,[1,2,[true],3],0]", "/1/2", TokenInclusion.ONLY_INCLUDE_ALL, "[true]"); - _assert("[true,[1,2,[true],3],0]", "/1/2/0", TokenInclusion.ONLY_INCLUDE_ALL, "true"); - _assert("[true,[1,2,[true],3],0]", "/1/3/0", TokenInclusion.ONLY_INCLUDE_ALL, ""); + _assert("[true,[1,2,[true],3],0]", "/1/2", TokenFilterInclusion.ONLY_INCLUDE_ALL, "[true]"); + _assert("[true,[1,2,[true],3],0]", "/1/2/0", TokenFilterInclusion.ONLY_INCLUDE_ALL, "true"); + _assert("[true,[1,2,[true],3],0]", "/1/3/0", TokenFilterInclusion.ONLY_INCLUDE_ALL, ""); } // final String SIMPLE_INPUT = aposToQuotes("{'a':1,'b':[1,2,3],'c':{'d':{'a':true}},'d':null}"); public void testArrayElementWithoutPath() throws Exception { - _assert(SIMPLE_INPUT, "/b", TokenInclusion.ONLY_INCLUDE_ALL, "[1,2,3]"); - _assert(SIMPLE_INPUT, "/b/1", TokenInclusion.ONLY_INCLUDE_ALL, "2"); - _assert(SIMPLE_INPUT, "/b/2", TokenInclusion.ONLY_INCLUDE_ALL, "3"); + _assert(SIMPLE_INPUT, "/b", TokenFilterInclusion.ONLY_INCLUDE_ALL, "[1,2,3]"); + _assert(SIMPLE_INPUT, "/b/1", TokenFilterInclusion.ONLY_INCLUDE_ALL, "2"); + _assert(SIMPLE_INPUT, "/b/2", TokenFilterInclusion.ONLY_INCLUDE_ALL, "3"); - _assert(SIMPLE_INPUT, "/b/8", TokenInclusion.ONLY_INCLUDE_ALL, ""); + _assert(SIMPLE_INPUT, "/b/8", TokenFilterInclusion.ONLY_INCLUDE_ALL, ""); // and then non-match - _assert(SIMPLE_INPUT, "/x", TokenInclusion.ONLY_INCLUDE_ALL, ""); + _assert(SIMPLE_INPUT, "/x", TokenFilterInclusion.ONLY_INCLUDE_ALL, ""); } - private void _assert(String input, String pathExpr, TokenInclusion tokenInclusion, String exp) + private void _assert(String input, String pathExpr, TokenFilterInclusion tokenFilterInclusion, String exp) throws Exception { StringWriter w = new StringWriter(); @@ -98,7 +98,7 @@ private void _assert(String input, String pathExpr, TokenInclusion tokenInclusio JsonGenerator g0 = JSON_F.createGenerator(w); FilteringGeneratorDelegate g = new FilteringGeneratorDelegate(g0, new JsonPointerBasedFilter(pathExpr), - tokenInclusion, false); + tokenFilterInclusion, false); try { writeJsonDoc(JSON_F, input, g); diff --git a/src/test/java/com/fasterxml/jackson/core/json/TestUtf8Generator.java b/src/test/java/com/fasterxml/jackson/core/json/TestUtf8Generator.java index d78a5fd68a..641f5d71f5 100644 --- a/src/test/java/com/fasterxml/jackson/core/json/TestUtf8Generator.java +++ b/src/test/java/com/fasterxml/jackson/core/json/TestUtf8Generator.java @@ -8,7 +8,7 @@ import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate; -import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate.TokenInclusion; +import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate.TokenFilterInclusion; import com.fasterxml.jackson.core.filter.JsonPointerBasedFilter; import com.fasterxml.jackson.core.io.IOContext; import com.fasterxml.jackson.core.util.BufferRecycler; @@ -78,7 +78,7 @@ public void testFilteringWithEscapedChars() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(g, new JsonPointerBasedFilter("/escapes"), - TokenInclusion.INCLUDE_ALL_AND_PATH, + TokenFilterInclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches ); From b0290916fa1a97547d5ea3cbdda79992c0e3b6a9 Mon Sep 17 00:00:00 2001 From: jhaber Date: Sat, 26 Oct 2019 07:59:43 -0400 Subject: [PATCH 11/15] Move enum to TokenFilter --- .../filter/FilteringGeneratorDelegate.java | 48 ++++-------- .../jackson/core/filter/TokenFilter.java | 24 ++++++ .../filter/BasicGeneratorFilteringTest.java | 42 +++++----- .../JsonPointerGeneratorFilteringTest.java | 78 +++++++++---------- .../jackson/core/json/TestUtf8Generator.java | 4 +- 5 files changed, 99 insertions(+), 97 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java b/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java index fb66291f6c..17acb39ebf 100644 --- a/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java +++ b/src/main/java/com/fasterxml/jackson/core/filter/FilteringGeneratorDelegate.java @@ -6,6 +6,7 @@ import java.math.BigInteger; import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.filter.TokenFilter.Inclusion; import com.fasterxml.jackson.core.util.JsonGeneratorDelegate; /** @@ -17,29 +18,6 @@ */ public class FilteringGeneratorDelegate extends JsonGeneratorDelegate { - /** - * Enumeration that controls how TokenFilter return values are interpreted - * - * @since 2.11 - */ - public enum TokenFilterInclusion { - /** - * Tokens will only be included if the filter returns TokenFilter.INCLUDE_ALL - */ - ONLY_INCLUDE_ALL, - /** - * When TokenFilter.INCLUDE_ALL is returned, the corresponding token will - * be included as well as enclosing tokens up to the root - */ - INCLUDE_ALL_AND_PATH, - /** - * Tokens will be included if any non-null filter is returned. - * The exception is if a field name returns a non-null filter, - * but the field value returns a null filter. In this case the - * field name and value will both be omitted. - */ - INCLUDE_NON_NULL - } /* /********************************************************** @@ -68,7 +46,7 @@ public enum TokenFilterInclusion { * done and only explicitly included entries are output; if `true` then * path from main level down to match is also included as necessary. */ - protected TokenFilterInclusion _tokenFilterInclusion; + protected TokenFilter.Inclusion _inclusion; /* /********************************************************** @@ -106,11 +84,11 @@ public enum TokenFilterInclusion { public FilteringGeneratorDelegate(JsonGenerator d, TokenFilter f, boolean includePath, boolean allowMultipleMatches) { - this(d, f, includePath ? TokenFilterInclusion.INCLUDE_ALL_AND_PATH : TokenFilterInclusion.ONLY_INCLUDE_ALL, allowMultipleMatches); + this(d, f, includePath ? Inclusion.INCLUDE_ALL_AND_PATH : Inclusion.ONLY_INCLUDE_ALL, allowMultipleMatches); } public FilteringGeneratorDelegate(JsonGenerator d, TokenFilter f, - TokenFilterInclusion tokenFilterInclusion, boolean allowMultipleMatches) + TokenFilter.Inclusion inclusion, boolean allowMultipleMatches) { // By default, do NOT delegate copy methods super(d, false); @@ -118,7 +96,7 @@ public FilteringGeneratorDelegate(JsonGenerator d, TokenFilter f, // and this is the currently active filter for root values _itemFilter = f; _filterContext = TokenFilterContext.createRootContext(f); - _tokenFilterInclusion = tokenFilterInclusion; + _inclusion = inclusion; _allowMultipleMatches = allowMultipleMatches; } @@ -189,7 +167,7 @@ public void writeStartArray() throws IOException _checkParentPath(); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(); - } else if (_itemFilter != null && _tokenFilterInclusion == TokenFilterInclusion.INCLUDE_NON_NULL) { + } else if (_itemFilter != null && _inclusion == Inclusion.INCLUDE_NON_NULL) { _checkParentPath(false /* isMatch */); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(); @@ -222,7 +200,7 @@ public void writeStartArray(int size) throws IOException _checkParentPath(); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(size); - } else if (_itemFilter != null && _tokenFilterInclusion == TokenFilterInclusion.INCLUDE_NON_NULL) { + } else if (_itemFilter != null && _inclusion == Inclusion.INCLUDE_NON_NULL) { _checkParentPath(false /* isMatch */); _filterContext = _filterContext.createChildArrayContext(_itemFilter, true); delegate.writeStartArray(size); @@ -266,7 +244,7 @@ public void writeStartObject() throws IOException _checkParentPath(); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(); - } else if (f != null && _tokenFilterInclusion == TokenFilterInclusion.INCLUDE_NON_NULL) { + } else if (f != null && _inclusion == Inclusion.INCLUDE_NON_NULL) { _checkParentPath(false /* isMatch */); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(); @@ -300,7 +278,7 @@ public void writeStartObject(Object forValue) throws IOException _checkParentPath(); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(forValue); - } else if (f != null && _tokenFilterInclusion == TokenFilterInclusion.INCLUDE_NON_NULL) { + } else if (f != null && _inclusion == Inclusion.INCLUDE_NON_NULL) { _checkParentPath(false /* isMatch */); _filterContext = _filterContext.createChildObjectContext(f, true); delegate.writeStartObject(forValue); @@ -897,9 +875,9 @@ protected void _checkParentPath(boolean isMatch) throws IOException ++_matchCount; } // only need to construct path if parent wasn't written - if (_tokenFilterInclusion == TokenFilterInclusion.INCLUDE_ALL_AND_PATH) { + if (_inclusion == Inclusion.INCLUDE_ALL_AND_PATH) { _filterContext.writePath(delegate); - } else if (_tokenFilterInclusion == TokenFilterInclusion.INCLUDE_NON_NULL) { + } else if (_inclusion == Inclusion.INCLUDE_NON_NULL) { // path has already been written, except for maybe field name _filterContext.ensureFieldNameWritten(delegate); } @@ -918,9 +896,9 @@ protected void _checkParentPath(boolean isMatch) throws IOException protected void _checkPropertyParentPath() throws IOException { ++_matchCount; - if (_tokenFilterInclusion == TokenFilterInclusion.INCLUDE_ALL_AND_PATH) { + if (_inclusion == Inclusion.INCLUDE_ALL_AND_PATH) { _filterContext.writePath(delegate); - } else if (_tokenFilterInclusion == TokenFilterInclusion.INCLUDE_NON_NULL) { + } else if (_inclusion == Inclusion.INCLUDE_NON_NULL) { // path has already been written, except for maybe field name _filterContext.ensureFieldNameWritten(delegate); } diff --git a/src/main/java/com/fasterxml/jackson/core/filter/TokenFilter.java b/src/main/java/com/fasterxml/jackson/core/filter/TokenFilter.java index 4546fbfd32..0595ede879 100644 --- a/src/main/java/com/fasterxml/jackson/core/filter/TokenFilter.java +++ b/src/main/java/com/fasterxml/jackson/core/filter/TokenFilter.java @@ -16,6 +16,30 @@ public class TokenFilter { + /** + * Enumeration that controls how TokenFilter return values are interpreted + * + * @since 2.11 + */ + public enum Inclusion { + /** + * Tokens will only be included if the filter returns TokenFilter.INCLUDE_ALL + */ + ONLY_INCLUDE_ALL, + /** + * When TokenFilter.INCLUDE_ALL is returned, the corresponding token will + * be included as well as enclosing tokens up to the root + */ + INCLUDE_ALL_AND_PATH, + /** + * Tokens will be included if any non-null filter is returned. + * The exception is if a field name returns a non-null filter, + * but the field value returns a null filter. In this case the + * field name and value will both be omitted. + */ + INCLUDE_NON_NULL + } + // // Marker values /** diff --git a/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java b/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java index 07167522a8..c07143637b 100644 --- a/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java +++ b/src/test/java/com/fasterxml/jackson/core/filter/BasicGeneratorFilteringTest.java @@ -6,7 +6,7 @@ import java.util.*; import com.fasterxml.jackson.core.*; -import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate.TokenFilterInclusion; +import com.fasterxml.jackson.core.filter.TokenFilter.Inclusion; import com.fasterxml.jackson.core.io.SerializedString; /** @@ -127,7 +127,7 @@ public void testSingleMatchFilteringWithoutPath() throws Exception StringWriter w = new StringWriter(); JsonGenerator gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("value"), - TokenFilterInclusion.ONLY_INCLUDE_ALL, + Inclusion.ONLY_INCLUDE_ALL, false // multipleMatches ); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; @@ -148,7 +148,7 @@ public void testSingleMatchFilteringWithPath() throws Exception NameMatchFilter filter = new NameMatchFilter("value"); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(origGen, filter, - TokenFilterInclusion.INCLUDE_ALL_AND_PATH, + Inclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches ); @@ -171,7 +171,7 @@ public void testSingleMatchFilteringWithPathSkippedArray() throws Exception NameMatchFilter filter = new NameMatchFilter("value"); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(origGen, filter, - TokenFilterInclusion.INCLUDE_ALL_AND_PATH, + Inclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches ); @@ -192,7 +192,7 @@ public void testSingleMatchFilteringWithPathAlternate1() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("value"), - TokenFilterInclusion.INCLUDE_ALL_AND_PATH, + Inclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches ); //final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':[3],'value2':'foo'},'b':true}"; @@ -232,7 +232,7 @@ public void testSingleMatchFilteringWithPathRawBinary() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("array"), - TokenFilterInclusion.INCLUDE_ALL_AND_PATH, + Inclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches ); //final String JSON = "{'header':['ENCODED',raw],'array':['base64stuff',1,2,3,4,5,6.25,7.5],'extra':[1,2,3,4,5,6.25,7.5]}"; @@ -283,7 +283,7 @@ public void testMultipleMatchFilteringWithPath1() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("value0", "value2"), - TokenFilterInclusion.INCLUDE_ALL_AND_PATH, true /* multipleMatches */ ); + Inclusion.INCLUDE_ALL_AND_PATH, true /* multipleMatches */ ); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'ob':{'value0':2,'value2':4}}"), w.toString()); @@ -296,7 +296,7 @@ public void testMultipleMatchFilteringWithPath2() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("array", "b", "value"), - TokenFilterInclusion.INCLUDE_ALL_AND_PATH, true); + Inclusion.INCLUDE_ALL_AND_PATH, true); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'array':[1,2],'ob':{'value':3},'b':true}"), w.toString()); @@ -309,7 +309,7 @@ public void testMultipleMatchFilteringWithPath3() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("value"), - TokenFilterInclusion.INCLUDE_ALL_AND_PATH, true); + Inclusion.INCLUDE_ALL_AND_PATH, true); final String JSON = "{'root':{'a0':true,'a':{'value':3},'b':{'value':4}},'b0':false}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'root':{'a':{'value':3},'b':{'value':4}}}"), w.toString()); @@ -322,7 +322,7 @@ public void testNoMatchFiltering1() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("invalid"), - TokenFilterInclusion.INCLUDE_NON_NULL, true); + Inclusion.INCLUDE_NON_NULL, true); final String JSON = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'root':{'b':{}}}"), w.toString()); @@ -335,7 +335,7 @@ public void testNoMatchFiltering2() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("invalid"), - TokenFilterInclusion.INCLUDE_NON_NULL, true); + Inclusion.INCLUDE_NON_NULL, true); final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[%s,%s,%s]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); @@ -349,7 +349,7 @@ public void testNoMatchFiltering3() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NameMatchFilter("invalid"), - TokenFilterInclusion.INCLUDE_NON_NULL, true); + Inclusion.INCLUDE_NON_NULL, true); final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[[%s],[%s],[%s]]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); @@ -363,7 +363,7 @@ public void testNoMatchFiltering4() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new StrictNameMatchFilter("invalid"), - TokenFilterInclusion.INCLUDE_NON_NULL, true); + Inclusion.INCLUDE_NON_NULL, true); final String JSON = "{'root':{'a0':true,'a':{'value':3},'b':{'value':4}},'b0':false}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{}"), w.toString()); @@ -376,7 +376,7 @@ public void testNoMatchFiltering5() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new StrictNameMatchFilter("invalid"), - TokenFilterInclusion.INCLUDE_NON_NULL, true); + Inclusion.INCLUDE_NON_NULL, true); final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[%s,%s,%s]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); @@ -390,7 +390,7 @@ public void testNoMatchFiltering6() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new StrictNameMatchFilter("invalid"), - TokenFilterInclusion.INCLUDE_NON_NULL, true); + Inclusion.INCLUDE_NON_NULL, true); final String object = "{'root':{'a0':true,'b':{'value':4}},'b0':false}"; final String JSON = String.format("[[%s],[%s],[%s]]", object, object, object); writeJsonDoc(JSON_F, JSON, gen); @@ -404,7 +404,7 @@ public void testValueOmitsFieldName1() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NoArraysFilter(), - TokenFilterInclusion.INCLUDE_NON_NULL, true); + Inclusion.INCLUDE_NON_NULL, true); final String JSON = "{'root':['a'],'b0':false}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'b0':false}"), w.toString()); @@ -417,7 +417,7 @@ public void testValueOmitsFieldName2() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new NoObjectsFilter(), - TokenFilterInclusion.INCLUDE_NON_NULL, true); + Inclusion.INCLUDE_NON_NULL, true); final String JSON = "['a',{'root':{'b':{'value':4}},'b0':false}]"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("['a']"), w.toString()); @@ -429,7 +429,7 @@ public void testIndexMatchWithPath1() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new IndexMatchFilter(1), - TokenFilterInclusion.INCLUDE_ALL_AND_PATH, true); + Inclusion.INCLUDE_ALL_AND_PATH, true); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'array':[2]}"), w.toString()); @@ -437,7 +437,7 @@ public void testIndexMatchWithPath1() throws Exception w = new StringWriter(); gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new IndexMatchFilter(0), - TokenFilterInclusion.INCLUDE_ALL_AND_PATH, true); + Inclusion.INCLUDE_ALL_AND_PATH, true); writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'array':[1]}"), w.toString()); assertEquals(1, gen.getMatchCount()); @@ -448,7 +448,7 @@ public void testIndexMatchWithPath2() throws Exception StringWriter w = new StringWriter(); FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), new IndexMatchFilter(0,1), - TokenFilterInclusion.INCLUDE_ALL_AND_PATH, true); + Inclusion.INCLUDE_ALL_AND_PATH, true); final String JSON = "{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"; writeJsonDoc(JSON_F, JSON, gen); assertEquals(aposToQuotes("{'array':[1,2]}"), w.toString()); @@ -461,7 +461,7 @@ public void testWriteStartObjectWithObject() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(JSON_F.createGenerator(w), TokenFilter.INCLUDE_ALL, - TokenFilterInclusion.INCLUDE_ALL_AND_PATH, true); + Inclusion.INCLUDE_ALL_AND_PATH, true); String value = "val"; diff --git a/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java b/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java index 4b00132faa..3938b89ad7 100644 --- a/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java +++ b/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate.TokenFilterInclusion; +import com.fasterxml.jackson.core.filter.TokenFilter.Inclusion; @SuppressWarnings("resource") public class JsonPointerGeneratorFilteringTest extends com.fasterxml.jackson.core.BaseTest @@ -15,82 +15,82 @@ public class JsonPointerGeneratorFilteringTest extends com.fasterxml.jackson.cor public void testSimplePropertyWithPath() throws Exception { - _assert(SIMPLE_INPUT, "/c", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); - _assert(SIMPLE_INPUT, "/c/d", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); - _assert(SIMPLE_INPUT, "/c/d/a", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); + _assert(SIMPLE_INPUT, "/c", Inclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); + _assert(SIMPLE_INPUT, "/c/d", Inclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); + _assert(SIMPLE_INPUT, "/c/d/a", Inclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); - _assert(SIMPLE_INPUT, "/c/d/a", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); + _assert(SIMPLE_INPUT, "/c/d/a", Inclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); - _assert(SIMPLE_INPUT, "/a", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "{'a':1}"); - _assert(SIMPLE_INPUT, "/d", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "{'d':null}"); + _assert(SIMPLE_INPUT, "/a", Inclusion.INCLUDE_ALL_AND_PATH, "{'a':1}"); + _assert(SIMPLE_INPUT, "/d", Inclusion.INCLUDE_ALL_AND_PATH, "{'d':null}"); // and then non-match - _assert(SIMPLE_INPUT, "/x", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, ""); + _assert(SIMPLE_INPUT, "/x", Inclusion.INCLUDE_ALL_AND_PATH, ""); } public void testSimplePropertyWithoutPath() throws Exception { - _assert(SIMPLE_INPUT, "/c", TokenFilterInclusion.ONLY_INCLUDE_ALL, "{'d':{'a':true}}"); - _assert(SIMPLE_INPUT, "/c/d", TokenFilterInclusion.ONLY_INCLUDE_ALL, "{'a':true}"); - _assert(SIMPLE_INPUT, "/c/d/a", TokenFilterInclusion.ONLY_INCLUDE_ALL, "true"); + _assert(SIMPLE_INPUT, "/c", Inclusion.ONLY_INCLUDE_ALL, "{'d':{'a':true}}"); + _assert(SIMPLE_INPUT, "/c/d", Inclusion.ONLY_INCLUDE_ALL, "{'a':true}"); + _assert(SIMPLE_INPUT, "/c/d/a", Inclusion.ONLY_INCLUDE_ALL, "true"); - _assert(SIMPLE_INPUT, "/a", TokenFilterInclusion.ONLY_INCLUDE_ALL, "1"); - _assert(SIMPLE_INPUT, "/d", TokenFilterInclusion.ONLY_INCLUDE_ALL, "null"); + _assert(SIMPLE_INPUT, "/a", Inclusion.ONLY_INCLUDE_ALL, "1"); + _assert(SIMPLE_INPUT, "/d", Inclusion.ONLY_INCLUDE_ALL, "null"); // and then non-match - _assert(SIMPLE_INPUT, "/x", TokenFilterInclusion.ONLY_INCLUDE_ALL, ""); + _assert(SIMPLE_INPUT, "/x", Inclusion.ONLY_INCLUDE_ALL, ""); } public void testArrayElementWithPath() throws Exception { - _assert(SIMPLE_INPUT, "/b", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "{'b':[1,2,3]}"); - _assert(SIMPLE_INPUT, "/b/1", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "{'b':[2]}"); - _assert(SIMPLE_INPUT, "/b/2", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "{'b':[3]}"); + _assert(SIMPLE_INPUT, "/b", Inclusion.INCLUDE_ALL_AND_PATH, "{'b':[1,2,3]}"); + _assert(SIMPLE_INPUT, "/b/1", Inclusion.INCLUDE_ALL_AND_PATH, "{'b':[2]}"); + _assert(SIMPLE_INPUT, "/b/2", Inclusion.INCLUDE_ALL_AND_PATH, "{'b':[3]}"); // and then non-match - _assert(SIMPLE_INPUT, "/b/8", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, ""); + _assert(SIMPLE_INPUT, "/b/8", Inclusion.INCLUDE_ALL_AND_PATH, ""); } public void testArrayNestedWithPath() throws Exception { - _assert("{'a':[true,{'b':3,'d':2},false]}", "/a/1/b", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "{'a':[{'b':3}]}"); - _assert("[true,[1]]", "/0", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "[true]"); - _assert("[true,[1]]", "/1", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "[[1]]"); - _assert("[true,[1,2,[true],3],0]", "/0", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "[true]"); - _assert("[true,[1,2,[true],3],0]", "/1", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "[[1,2,[true],3]]"); - - _assert("[true,[1,2,[true],3],0]", "/1/2", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "[[[true]]]"); - _assert("[true,[1,2,[true],3],0]", "/1/2/0", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, "[[[true]]]"); - _assert("[true,[1,2,[true],3],0]", "/1/3/0", TokenFilterInclusion.INCLUDE_ALL_AND_PATH, ""); + _assert("{'a':[true,{'b':3,'d':2},false]}", "/a/1/b", Inclusion.INCLUDE_ALL_AND_PATH, "{'a':[{'b':3}]}"); + _assert("[true,[1]]", "/0", Inclusion.INCLUDE_ALL_AND_PATH, "[true]"); + _assert("[true,[1]]", "/1", Inclusion.INCLUDE_ALL_AND_PATH, "[[1]]"); + _assert("[true,[1,2,[true],3],0]", "/0", Inclusion.INCLUDE_ALL_AND_PATH, "[true]"); + _assert("[true,[1,2,[true],3],0]", "/1", Inclusion.INCLUDE_ALL_AND_PATH, "[[1,2,[true],3]]"); + + _assert("[true,[1,2,[true],3],0]", "/1/2", Inclusion.INCLUDE_ALL_AND_PATH, "[[[true]]]"); + _assert("[true,[1,2,[true],3],0]", "/1/2/0", Inclusion.INCLUDE_ALL_AND_PATH, "[[[true]]]"); + _assert("[true,[1,2,[true],3],0]", "/1/3/0", Inclusion.INCLUDE_ALL_AND_PATH, ""); } public void testArrayNestedWithoutPath() throws Exception { - _assert("{'a':[true,{'b':3,'d':2},false]}", "/a/1/b", TokenFilterInclusion.ONLY_INCLUDE_ALL, "3"); - _assert("[true,[1,2,[true],3],0]", "/0", TokenFilterInclusion.ONLY_INCLUDE_ALL, "true"); - _assert("[true,[1,2,[true],3],0]", "/1", TokenFilterInclusion.ONLY_INCLUDE_ALL, + _assert("{'a':[true,{'b':3,'d':2},false]}", "/a/1/b", Inclusion.ONLY_INCLUDE_ALL, "3"); + _assert("[true,[1,2,[true],3],0]", "/0", Inclusion.ONLY_INCLUDE_ALL, "true"); + _assert("[true,[1,2,[true],3],0]", "/1", Inclusion.ONLY_INCLUDE_ALL, "[1,2,[true],3]"); - _assert("[true,[1,2,[true],3],0]", "/1/2", TokenFilterInclusion.ONLY_INCLUDE_ALL, "[true]"); - _assert("[true,[1,2,[true],3],0]", "/1/2/0", TokenFilterInclusion.ONLY_INCLUDE_ALL, "true"); - _assert("[true,[1,2,[true],3],0]", "/1/3/0", TokenFilterInclusion.ONLY_INCLUDE_ALL, ""); + _assert("[true,[1,2,[true],3],0]", "/1/2", Inclusion.ONLY_INCLUDE_ALL, "[true]"); + _assert("[true,[1,2,[true],3],0]", "/1/2/0", Inclusion.ONLY_INCLUDE_ALL, "true"); + _assert("[true,[1,2,[true],3],0]", "/1/3/0", Inclusion.ONLY_INCLUDE_ALL, ""); } // final String SIMPLE_INPUT = aposToQuotes("{'a':1,'b':[1,2,3],'c':{'d':{'a':true}},'d':null}"); public void testArrayElementWithoutPath() throws Exception { - _assert(SIMPLE_INPUT, "/b", TokenFilterInclusion.ONLY_INCLUDE_ALL, "[1,2,3]"); - _assert(SIMPLE_INPUT, "/b/1", TokenFilterInclusion.ONLY_INCLUDE_ALL, "2"); - _assert(SIMPLE_INPUT, "/b/2", TokenFilterInclusion.ONLY_INCLUDE_ALL, "3"); + _assert(SIMPLE_INPUT, "/b", Inclusion.ONLY_INCLUDE_ALL, "[1,2,3]"); + _assert(SIMPLE_INPUT, "/b/1", Inclusion.ONLY_INCLUDE_ALL, "2"); + _assert(SIMPLE_INPUT, "/b/2", Inclusion.ONLY_INCLUDE_ALL, "3"); - _assert(SIMPLE_INPUT, "/b/8", TokenFilterInclusion.ONLY_INCLUDE_ALL, ""); + _assert(SIMPLE_INPUT, "/b/8", Inclusion.ONLY_INCLUDE_ALL, ""); // and then non-match - _assert(SIMPLE_INPUT, "/x", TokenFilterInclusion.ONLY_INCLUDE_ALL, ""); + _assert(SIMPLE_INPUT, "/x", Inclusion.ONLY_INCLUDE_ALL, ""); } - private void _assert(String input, String pathExpr, TokenFilterInclusion tokenFilterInclusion, String exp) + private void _assert(String input, String pathExpr, Inclusion tokenFilterInclusion, String exp) throws Exception { StringWriter w = new StringWriter(); diff --git a/src/test/java/com/fasterxml/jackson/core/json/TestUtf8Generator.java b/src/test/java/com/fasterxml/jackson/core/json/TestUtf8Generator.java index 641f5d71f5..56107c68db 100644 --- a/src/test/java/com/fasterxml/jackson/core/json/TestUtf8Generator.java +++ b/src/test/java/com/fasterxml/jackson/core/json/TestUtf8Generator.java @@ -8,8 +8,8 @@ import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate; -import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate.TokenFilterInclusion; import com.fasterxml.jackson.core.filter.JsonPointerBasedFilter; +import com.fasterxml.jackson.core.filter.TokenFilter.Inclusion; import com.fasterxml.jackson.core.io.IOContext; import com.fasterxml.jackson.core.util.BufferRecycler; @@ -78,7 +78,7 @@ public void testFilteringWithEscapedChars() throws Exception FilteringGeneratorDelegate gen = new FilteringGeneratorDelegate(g, new JsonPointerBasedFilter("/escapes"), - TokenFilterInclusion.INCLUDE_ALL_AND_PATH, + Inclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches ); From e04b81711cec3718510023acb25c43c7f66b315a Mon Sep 17 00:00:00 2001 From: jhaber Date: Sat, 26 Oct 2019 08:38:55 -0400 Subject: [PATCH 12/15] Apply to parser as well --- .../core/filter/FilteringParserDelegate.java | 81 +++++++++++-------- .../core/filter/BasicParserFilteringTest.java | 47 +++++------ .../JsonPointerParserFilteringTest.java | 57 ++++++------- .../core/json/async/AsyncTokenFilterTest.java | 5 +- 4 files changed, 102 insertions(+), 88 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/core/filter/FilteringParserDelegate.java b/src/main/java/com/fasterxml/jackson/core/filter/FilteringParserDelegate.java index 80c17e022c..8c8ebb7680 100644 --- a/src/main/java/com/fasterxml/jackson/core/filter/FilteringParserDelegate.java +++ b/src/main/java/com/fasterxml/jackson/core/filter/FilteringParserDelegate.java @@ -6,6 +6,7 @@ import java.math.BigInteger; import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.filter.TokenFilter.Inclusion; import com.fasterxml.jackson.core.util.JsonParserDelegate; import static com.fasterxml.jackson.core.JsonTokenId.*; @@ -46,19 +47,8 @@ public class FilteringParserDelegate extends JsonParserDelegate * done and only explicitly included entries are output; if `true` then * path from main level down to match is also included as necessary. */ - protected boolean _includePath; - - /* NOTE: this feature is included in the first version (2.6), but - * there is no public API to enable it, yet, since there isn't an - * actual use case. But it seemed possible need could arise, which - * is feature has not yet been removed. If no use is found within - * first version or two, just remove. - * - * Marked as deprecated since its status is uncertain. - */ - @Deprecated - protected boolean _includeImmediateParent; - + protected TokenFilter.Inclusion _inclusion; + /* /********************************************************** /* State @@ -111,15 +101,22 @@ public class FilteringParserDelegate extends JsonParserDelegate /********************************************************** */ + @Deprecated public FilteringParserDelegate(JsonParser p, TokenFilter f, boolean includePath, boolean allowMultipleMatches) + { + this(p, f, includePath ? Inclusion.INCLUDE_ALL_AND_PATH : Inclusion.ONLY_INCLUDE_ALL, allowMultipleMatches); + } + + public FilteringParserDelegate(JsonParser p, TokenFilter f, + TokenFilter.Inclusion inclusion, boolean allowMultipleMatches) { super(p); rootFilter = f; // and this is the currently active filter for root values _itemFilter = f; _headContext = TokenFilterContext.createRootContext(f); - _includePath = includePath; + _inclusion = inclusion; _allowMultipleMatches = allowMultipleMatches; } @@ -235,9 +232,10 @@ public JsonToken nextToken() throws IOException // If all the conditions matches then check for scalar / non-scalar property if (!_allowMultipleMatches && (_currToken != null) && (_exposedContext == null)) { - // if scalar, and scalar not present in obj/array and !includePath and INCLUDE_ALL - // matched once, return null - if (_currToken.isScalarValue() && !_headContext.isStartHandled() && !_includePath + // if scalar, and scalar not present in obj/array and _inclusion == ONLY_INCLUDE_ALL + // and INCLUDE_ALL matched once, return null + if (_currToken.isScalarValue() && !_headContext.isStartHandled() + && _inclusion == Inclusion.ONLY_INCLUDE_ALL && (_itemFilter == TokenFilter.INCLUDE_ALL)) { return (_currToken = null); } @@ -318,11 +316,15 @@ public JsonToken nextToken() throws IOException if (f == TokenFilter.INCLUDE_ALL) { _headContext = _headContext.createChildArrayContext(f, true); return (_currToken = t); + } else if (f != null && _inclusion == Inclusion.INCLUDE_NON_NULL) { + // TODO don't count as match? + _headContext = _headContext.createChildArrayContext(f, true); + return (_currToken = t); } _headContext = _headContext.createChildArrayContext(f, false); - + // Also: only need buffering if parent path to be included - if (_includePath) { + if (_inclusion == Inclusion.INCLUDE_ALL_AND_PATH) { t = _nextTokenWithBuffering(_headContext); if (t != null) { _currToken = t; @@ -354,10 +356,14 @@ public JsonToken nextToken() throws IOException if (f == TokenFilter.INCLUDE_ALL) { _headContext = _headContext.createChildObjectContext(f, true); return (_currToken = t); + } else if (f != null && _inclusion == Inclusion.INCLUDE_NON_NULL) { + // TODO don't count as match? + _headContext = _headContext.createChildObjectContext(f, true); + return (_currToken = t); } _headContext = _headContext.createChildObjectContext(f, false); // Also: only need buffering if parent path to be included - if (_includePath) { + if (_inclusion == Inclusion.INCLUDE_ALL_AND_PATH) { t = _nextTokenWithBuffering(_headContext); if (t != null) { _currToken = t; @@ -391,14 +397,6 @@ public JsonToken nextToken() throws IOException f = _headContext.setFieldName(name); if (f == TokenFilter.INCLUDE_ALL) { _itemFilter = f; - if (!_includePath) { - // Minor twist here: if parent NOT included, may need to induce output of - // surrounding START_OBJECT/END_OBJECT - if (_includeImmediateParent && !_headContext.isStartHandled()) { - t = _headContext.nextTokenToRead(); // returns START_OBJECT but also marks it handled - _exposedContext = _headContext; - } - } return (_currToken = t); } if (f == null) { @@ -415,7 +413,7 @@ public JsonToken nextToken() throws IOException _itemFilter = f; if (f == TokenFilter.INCLUDE_ALL) { if (_verifyAllowedMatches()) { - if (_includePath) { + if (_inclusion == Inclusion.INCLUDE_ALL_AND_PATH) { return (_currToken = t); } } else { @@ -423,7 +421,7 @@ public JsonToken nextToken() throws IOException delegate.skipChildren(); } } - if (_includePath) { + if (_inclusion != Inclusion.ONLY_INCLUDE_ALL) { t = _nextTokenWithBuffering(_headContext); if (t != null) { _currToken = t; @@ -496,10 +494,13 @@ protected final JsonToken _nextToken2() throws IOException if (f == TokenFilter.INCLUDE_ALL) { _headContext = _headContext.createChildArrayContext(f, true); return (_currToken = t); + } else if (f != null && _inclusion == Inclusion.INCLUDE_NON_NULL) { + _headContext = _headContext.createChildArrayContext(f, true); + return (_currToken = t); } _headContext = _headContext.createChildArrayContext(f, false); // but if we didn't figure it out yet, need to buffer possible events - if (_includePath) { + if (_inclusion == Inclusion.INCLUDE_ALL_AND_PATH) { t = _nextTokenWithBuffering(_headContext); if (t != null) { _currToken = t; @@ -531,9 +532,12 @@ protected final JsonToken _nextToken2() throws IOException if (f == TokenFilter.INCLUDE_ALL) { _headContext = _headContext.createChildObjectContext(f, true); return (_currToken = t); + } else if (f != null && _inclusion == Inclusion.INCLUDE_NON_NULL) { + _headContext = _headContext.createChildObjectContext(f, true); + return (_currToken = t); } _headContext = _headContext.createChildObjectContext(f, false); - if (_includePath) { + if (_inclusion == Inclusion.INCLUDE_ALL_AND_PATH) { t = _nextTokenWithBuffering(_headContext); if (t != null) { _currToken = t; @@ -579,13 +583,12 @@ protected final JsonToken _nextToken2() throws IOException } _itemFilter = f; if (f == TokenFilter.INCLUDE_ALL) { - if (_verifyAllowedMatches() && _includePath) { + if (_verifyAllowedMatches() && _inclusion == Inclusion.INCLUDE_ALL_AND_PATH) { return (_currToken = t); } -// if (_includeImmediateParent) { ... continue main_loop; } - if (_includePath) { + if (_inclusion != Inclusion.ONLY_INCLUDE_ALL) { t = _nextTokenWithBuffering(_headContext); if (t != null) { _currToken = t; @@ -647,6 +650,10 @@ protected final JsonToken _nextTokenWithBuffering(final TokenFilterContext buffR if (f == TokenFilter.INCLUDE_ALL) { _headContext = _headContext.createChildArrayContext(f, true); return _nextBuffered(buffRoot); + } else if (f != null && _inclusion == Inclusion.INCLUDE_NON_NULL) { + // TODO don't count as match? + _headContext = _headContext.createChildArrayContext(f, true); + return _nextBuffered(buffRoot); } _headContext = _headContext.createChildArrayContext(f, false); continue main_loop; @@ -674,6 +681,10 @@ protected final JsonToken _nextTokenWithBuffering(final TokenFilterContext buffR if (f == TokenFilter.INCLUDE_ALL) { _headContext = _headContext.createChildObjectContext(f, true); return _nextBuffered(buffRoot); + } else if (f != null && _inclusion == Inclusion.INCLUDE_NON_NULL) { + // TODO don't count as match? + _headContext = _headContext.createChildArrayContext(f, true); + return _nextBuffered(buffRoot); } _headContext = _headContext.createChildObjectContext(f, false); continue main_loop; diff --git a/src/test/java/com/fasterxml/jackson/core/filter/BasicParserFilteringTest.java b/src/test/java/com/fasterxml/jackson/core/filter/BasicParserFilteringTest.java index bcd9754ceb..ec7615074c 100644 --- a/src/test/java/com/fasterxml/jackson/core/filter/BasicParserFilteringTest.java +++ b/src/test/java/com/fasterxml/jackson/core/filter/BasicParserFilteringTest.java @@ -3,6 +3,7 @@ import java.util.*; import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.filter.TokenFilter.Inclusion; @SuppressWarnings("resource") public class BasicParserFilteringTest extends BaseTest @@ -82,7 +83,7 @@ public void testSingleMatchFilteringWithoutPath() throws Exception JsonParser p0 = JSON_F.createParser(SIMPLE); FilteringParserDelegate p = new FilteringParserDelegate(p0, new NameMatchFilter("value"), - false, // includePath + Inclusion.ONLY_INCLUDE_ALL, false // multipleMatches ); String result = readAndWrite(JSON_F, p); @@ -96,7 +97,7 @@ public void testSingleMatchFilteringWithPath1() throws Exception JsonParser p0 = JSON_F.createParser(jsonString); FilteringParserDelegate p = new FilteringParserDelegate(p0, new NameMatchFilter("a"), - true, // includePath + Inclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches ); String result = readAndWrite(JSON_F, p); @@ -110,7 +111,7 @@ public void testSingleMatchFilteringWithPath2() throws Exception JsonParser p0 = JSON_F.createParser(jsonString); FilteringParserDelegate p = new FilteringParserDelegate(p0, new NameMatchFilter("value"), - true, // includePath + Inclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches ); String result = readAndWrite(JSON_F, p); @@ -124,7 +125,7 @@ public void testSingleMatchFilteringWithPath3() throws Exception JsonParser p0 = JSON_F.createParser(jsonString); FilteringParserDelegate p = new FilteringParserDelegate(p0, new NameMatchFilter("ob"), - true, // includePath + Inclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches ); String result = readAndWrite(JSON_F, p); @@ -138,7 +139,7 @@ public void testNotAllowMultipleMatchesWithoutPath1() throws Exception JsonParser p0 = JSON_F.createParser(jsonString); FilteringParserDelegate p = new FilteringParserDelegate(p0, new NameMatchFilter("value"), - false, // includePath + Inclusion.ONLY_INCLUDE_ALL, false // multipleMatches -false ); String result = readAndWrite(JSON_F, p); @@ -152,7 +153,7 @@ public void testNotAllowMultipleMatchesWithoutPath2() throws Exception JsonParser p0 = JSON_F.createParser(jsonString); FilteringParserDelegate p = new FilteringParserDelegate(p0, new IndexMatchFilter(1), - false, // includePath + Inclusion.ONLY_INCLUDE_ALL, false // multipleMatches -false ); String result = readAndWrite(JSON_F, p); @@ -166,7 +167,7 @@ public void testNotAllowMultipleMatchesWithPath1() throws Exception JsonParser p0 = JSON_F.createParser(jsonString); FilteringParserDelegate p = new FilteringParserDelegate(p0, new IndexMatchFilter(1), - true, // includePath + Inclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches -false ); String result = readAndWrite(JSON_F, p); @@ -181,7 +182,7 @@ public void testNotAllowMultipleMatchesWithPath2() throws Exception JsonParser p0 = JSON_F.createParser(jsonString); FilteringParserDelegate p = new FilteringParserDelegate(p0, new IndexMatchFilter(1), - true, // includePath + Inclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches -false ); String result = readAndWrite(JSON_F, p); @@ -195,7 +196,7 @@ public void testNotAllowMultipleMatchesWithPath3() throws Exception JsonParser p0 = JSON_F.createParser(jsonString); FilteringParserDelegate p = new FilteringParserDelegate(p0, new NameMatchFilter("value"), - true, // includePath + Inclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches -false ); String result = readAndWrite(JSON_F, p); @@ -209,7 +210,7 @@ public void testNotAllowMultipleMatchesWithPath4() throws Exception JsonParser p0 = JSON_F.createParser(jsonString); FilteringParserDelegate p = new FilteringParserDelegate(p0, new NameMatchFilter("ob"), - true, // includePath + Inclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches -false ); String result = readAndWrite(JSON_F, p); @@ -223,7 +224,7 @@ public void testAllowMultipleMatchesWithoutPath() throws Exception JsonParser p0 = JSON_F.createParser(jsonString); FilteringParserDelegate p = new FilteringParserDelegate(p0, new NameMatchFilter("value"), - false, // includePath + Inclusion.ONLY_INCLUDE_ALL, true // multipleMatches - true ); String result = readAndWrite(JSON_F, p); @@ -237,7 +238,7 @@ public void testAllowMultipleMatchesWithPath1() throws Exception JsonParser p0 = JSON_F.createParser(jsonString); FilteringParserDelegate p = new FilteringParserDelegate(p0, new NameMatchFilter("value"), - true, // includePath + Inclusion.INCLUDE_ALL_AND_PATH, true // multipleMatches - true ); String result = readAndWrite(JSON_F, p); @@ -251,7 +252,7 @@ public void testAllowMultipleMatchesWithPath2() throws Exception JsonParser p0 = JSON_F.createParser(jsonString); FilteringParserDelegate p = new FilteringParserDelegate(p0, new IndexMatchFilter(1), - true, // includePath + Inclusion.INCLUDE_ALL_AND_PATH, true // multipleMatches - true ); String result = readAndWrite(JSON_F, p); @@ -264,7 +265,7 @@ public void testMultipleMatchFilteringWithPath1() throws Exception JsonParser p0 = JSON_F.createParser(SIMPLE); FilteringParserDelegate p = new FilteringParserDelegate(p0, new NameMatchFilter("value0", "value2"), - true, /* includePath */ true /* multipleMatches */ ); + Inclusion.INCLUDE_ALL_AND_PATH, true /* multipleMatches */ ); String result = readAndWrite(JSON_F, p); assertEquals(aposToQuotes("{'ob':{'value0':2,'value2':4}}"), result); assertEquals(2, p.getMatchCount()); @@ -277,7 +278,7 @@ public void testMultipleMatchFilteringWithPath2() throws Exception JsonParser p0 = JSON_F.createParser(INPUT); FilteringParserDelegate p = new FilteringParserDelegate(p0, new NameMatchFilter("b", "value"), - true, true); + Inclusion.INCLUDE_ALL_AND_PATH, true); String result = readAndWrite(JSON_F, p); assertEquals(aposToQuotes("{'ob':{'value':3},'b':true}"), result); @@ -290,7 +291,7 @@ public void testMultipleMatchFilteringWithPath3() throws Exception JsonParser p0 = JSON_F.createParser(JSON); FilteringParserDelegate p = new FilteringParserDelegate(p0, new NameMatchFilter("value"), - true, true); + Inclusion.INCLUDE_ALL_AND_PATH, true); String result = readAndWrite(JSON_F, p); assertEquals(aposToQuotes("{'root':{'a':{'value':3},'b':{'value':\"foo\"}}}"), result); assertEquals(2, p.getMatchCount()); @@ -299,13 +300,13 @@ public void testMultipleMatchFilteringWithPath3() throws Exception public void testIndexMatchWithPath1() throws Exception { FilteringParserDelegate p = new FilteringParserDelegate(JSON_F.createParser(SIMPLE), - new IndexMatchFilter(1), true, true); + new IndexMatchFilter(1), Inclusion.INCLUDE_ALL_AND_PATH, true); String result = readAndWrite(JSON_F, p); assertEquals(aposToQuotes("{'array':[2]}"), result); assertEquals(1, p.getMatchCount()); p = new FilteringParserDelegate(JSON_F.createParser(SIMPLE), - new IndexMatchFilter(0), true, true); + new IndexMatchFilter(0), Inclusion.INCLUDE_ALL_AND_PATH, true); result = readAndWrite(JSON_F, p); assertEquals(aposToQuotes("{'array':[1]}"), result); assertEquals(1, p.getMatchCount()); @@ -314,13 +315,13 @@ public void testIndexMatchWithPath1() throws Exception public void testIndexMatchWithPath2() throws Exception { FilteringParserDelegate p = new FilteringParserDelegate(JSON_F.createParser(SIMPLE), - new IndexMatchFilter(0, 1), true, true); + new IndexMatchFilter(0, 1), Inclusion.INCLUDE_ALL_AND_PATH, true); assertEquals(aposToQuotes("{'array':[1,2]}"), readAndWrite(JSON_F, p)); assertEquals(2, p.getMatchCount()); String JSON = aposToQuotes("{'a':123,'array':[1,2,3,4,5],'b':[1,2,3]}"); p = new FilteringParserDelegate(JSON_F.createParser(JSON), - new IndexMatchFilter(1, 3), true, true); + new IndexMatchFilter(1, 3), Inclusion.INCLUDE_ALL_AND_PATH, true); assertEquals(aposToQuotes("{'array':[2,4],'b':[2]}"), readAndWrite(JSON_F, p)); assertEquals(3, p.getMatchCount()); } @@ -330,7 +331,7 @@ public void testBasicSingleMatchFilteringWithPath() throws Exception JsonParser p0 = JSON_F.createParser(SIMPLE); JsonParser p = new FilteringParserDelegate(p0, new NameMatchFilter("value"), - true, // includePath + Inclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches ); @@ -344,7 +345,7 @@ public void testTokensSingleMatchWithPath() throws Exception JsonParser p0 = JSON_F.createParser(SIMPLE); JsonParser p = new FilteringParserDelegate(p0, new NameMatchFilter("value"), - true, // includePath + Inclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches ); @@ -398,7 +399,7 @@ public void testSkippingForSingleWithPath() throws Exception JsonParser p0 = JSON_F.createParser(SIMPLE); JsonParser p = new FilteringParserDelegate(p0, new NameMatchFilter("value"), - true, // includePath + Inclusion.INCLUDE_ALL_AND_PATH, false // multipleMatches ); diff --git a/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerParserFilteringTest.java b/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerParserFilteringTest.java index 58ecca795d..86fa975902 100644 --- a/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerParserFilteringTest.java +++ b/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerParserFilteringTest.java @@ -3,6 +3,7 @@ import java.io.StringWriter; import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.filter.TokenFilter.Inclusion; public class JsonPointerParserFilteringTest extends com.fasterxml.jackson.core.BaseTest { @@ -14,55 +15,55 @@ public class JsonPointerParserFilteringTest extends com.fasterxml.jackson.core.B public void testSimplestWithPath() throws Exception { - _assert(SIMPLEST_INPUT, "/a", true, "{'a':1}"); - _assert(SIMPLEST_INPUT, "/b", true, "{'b':2}"); - _assert(SIMPLEST_INPUT, "/c", true, "{'c':3}"); - _assert(SIMPLEST_INPUT, "/c/0", true, ""); - _assert(SIMPLEST_INPUT, "/d", true, ""); + _assert(SIMPLEST_INPUT, "/a", Inclusion.INCLUDE_ALL_AND_PATH, "{'a':1}"); + _assert(SIMPLEST_INPUT, "/b", Inclusion.INCLUDE_ALL_AND_PATH, "{'b':2}"); + _assert(SIMPLEST_INPUT, "/c", Inclusion.INCLUDE_ALL_AND_PATH, "{'c':3}"); + _assert(SIMPLEST_INPUT, "/c/0", Inclusion.INCLUDE_ALL_AND_PATH, ""); + _assert(SIMPLEST_INPUT, "/d", Inclusion.INCLUDE_ALL_AND_PATH, ""); } public void testSimplestNoPath() throws Exception { - _assert(SIMPLEST_INPUT, "/a", false, "1"); - _assert(SIMPLEST_INPUT, "/b", false, "2"); - _assert(SIMPLEST_INPUT, "/b/2", false, ""); - _assert(SIMPLEST_INPUT, "/c", false, "3"); - _assert(SIMPLEST_INPUT, "/d", false, ""); + _assert(SIMPLEST_INPUT, "/a", Inclusion.ONLY_INCLUDE_ALL, "1"); + _assert(SIMPLEST_INPUT, "/b", Inclusion.ONLY_INCLUDE_ALL, "2"); + _assert(SIMPLEST_INPUT, "/b/2", Inclusion.ONLY_INCLUDE_ALL, ""); + _assert(SIMPLEST_INPUT, "/c", Inclusion.ONLY_INCLUDE_ALL, "3"); + _assert(SIMPLEST_INPUT, "/d", Inclusion.ONLY_INCLUDE_ALL, ""); } public void testSimpleWithPath() throws Exception { - _assert(SIMPLE_INPUT, "/c", true, "{'c':{'d':{'a':true}}}"); - _assert(SIMPLE_INPUT, "/c/d", true, "{'c':{'d':{'a':true}}}"); - _assert(SIMPLE_INPUT, "/a", true, "{'a':1}"); - _assert(SIMPLE_INPUT, "/b", true, "{'b':[1,2,3]}"); - _assert(SIMPLE_INPUT, "/b/0", true, "{'b':[1]}"); - _assert(SIMPLE_INPUT, "/b/1", true, "{'b':[2]}"); - _assert(SIMPLE_INPUT, "/b/2", true, "{'b':[3]}"); - _assert(SIMPLE_INPUT, "/b/3", true, ""); + _assert(SIMPLE_INPUT, "/c", Inclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); + _assert(SIMPLE_INPUT, "/c/d", Inclusion.INCLUDE_ALL_AND_PATH, "{'c':{'d':{'a':true}}}"); + _assert(SIMPLE_INPUT, "/a", Inclusion.INCLUDE_ALL_AND_PATH, "{'a':1}"); + _assert(SIMPLE_INPUT, "/b", Inclusion.INCLUDE_ALL_AND_PATH, "{'b':[1,2,3]}"); + _assert(SIMPLE_INPUT, "/b/0", Inclusion.INCLUDE_ALL_AND_PATH, "{'b':[1]}"); + _assert(SIMPLE_INPUT, "/b/1", Inclusion.INCLUDE_ALL_AND_PATH, "{'b':[2]}"); + _assert(SIMPLE_INPUT, "/b/2", Inclusion.INCLUDE_ALL_AND_PATH, "{'b':[3]}"); + _assert(SIMPLE_INPUT, "/b/3", Inclusion.INCLUDE_ALL_AND_PATH, ""); } public void testSimpleNoPath() throws Exception { - _assert(SIMPLE_INPUT, "/c", false, "{'d':{'a':true}}"); + _assert(SIMPLE_INPUT, "/c", Inclusion.ONLY_INCLUDE_ALL, "{'d':{'a':true}}"); - _assert(SIMPLE_INPUT, "/c/d", false, "{'a':true}"); - _assert(SIMPLE_INPUT, "/a", false, "1"); - _assert(SIMPLE_INPUT, "/b", false, "[1,2,3]"); - _assert(SIMPLE_INPUT, "/b/0", false, "1"); - _assert(SIMPLE_INPUT, "/b/1", false, "2"); - _assert(SIMPLE_INPUT, "/b/2", false, "3"); - _assert(SIMPLE_INPUT, "/b/3", false, ""); + _assert(SIMPLE_INPUT, "/c/d", Inclusion.ONLY_INCLUDE_ALL, "{'a':true}"); + _assert(SIMPLE_INPUT, "/a", Inclusion.ONLY_INCLUDE_ALL, "1"); + _assert(SIMPLE_INPUT, "/b", Inclusion.ONLY_INCLUDE_ALL, "[1,2,3]"); + _assert(SIMPLE_INPUT, "/b/0", Inclusion.ONLY_INCLUDE_ALL, "1"); + _assert(SIMPLE_INPUT, "/b/1", Inclusion.ONLY_INCLUDE_ALL, "2"); + _assert(SIMPLE_INPUT, "/b/2", Inclusion.ONLY_INCLUDE_ALL, "3"); + _assert(SIMPLE_INPUT, "/b/3", Inclusion.ONLY_INCLUDE_ALL, ""); } @SuppressWarnings("resource") - void _assert(String input, String pathExpr, boolean includeParent, String exp) + void _assert(String input, String pathExpr, TokenFilter.Inclusion inclusion, String exp) throws Exception { JsonParser p0 = JSON_F.createParser(input); FilteringParserDelegate p = new FilteringParserDelegate(p0, new JsonPointerBasedFilter(pathExpr), - includeParent, false); + inclusion, false); StringWriter w = new StringWriter(); JsonGenerator g = JSON_F.createGenerator(w); diff --git a/src/test/java/com/fasterxml/jackson/core/json/async/AsyncTokenFilterTest.java b/src/test/java/com/fasterxml/jackson/core/json/async/AsyncTokenFilterTest.java index ded3a27cc6..33e77a194d 100644 --- a/src/test/java/com/fasterxml/jackson/core/json/async/AsyncTokenFilterTest.java +++ b/src/test/java/com/fasterxml/jackson/core/json/async/AsyncTokenFilterTest.java @@ -6,6 +6,7 @@ import com.fasterxml.jackson.core.async.AsyncTestBase; import com.fasterxml.jackson.core.filter.FilteringParserDelegate; import com.fasterxml.jackson.core.filter.TokenFilter; +import com.fasterxml.jackson.core.filter.TokenFilter.Inclusion; // [core#462], [core#463] public class AsyncTokenFilterTest extends AsyncTestBase @@ -33,7 +34,7 @@ public void testFilteredNonBlockingParserAllContent() throws IOException { NonBlockingJsonParser nonBlockingParser = (NonBlockingJsonParser) JSON_F.createNonBlockingByteArrayParser(); FilteringParserDelegate filteredParser = new FilteringParserDelegate(nonBlockingParser, - TOKEN_FILTER, true, true); + TOKEN_FILTER, Inclusion.INCLUDE_ALL_AND_PATH, true); nonBlockingParser.feedInput(INPUT_BYTES, 0, INPUT_BYTES.length); int expectedIdx = 0; while (expectedIdx < EXPECTED_TOKENS.length) { @@ -54,7 +55,7 @@ public void testSkipChildrenFailOnSplit() throws IOException NonBlockingJsonParser nbParser = (NonBlockingJsonParser) JSON_F.createNonBlockingByteArrayParser(); @SuppressWarnings("resource") FilteringParserDelegate filteredParser = new FilteringParserDelegate(nbParser, - TOKEN_FILTER, true, true); + TOKEN_FILTER, Inclusion.INCLUDE_ALL_AND_PATH, true); nbParser.feedInput(INPUT_BYTES, 0, 5); assertToken(JsonToken.START_OBJECT, nbParser.nextToken()); From 1c175553af4b9236fdf9768953135fca4bcc8c87 Mon Sep 17 00:00:00 2001 From: jhaber Date: Sat, 26 Oct 2019 09:04:55 -0400 Subject: [PATCH 13/15] Add tests --- .../core/filter/BasicParserFilteringTest.java | 152 ++++++++++++++++++ 1 file changed, 152 insertions(+) diff --git a/src/test/java/com/fasterxml/jackson/core/filter/BasicParserFilteringTest.java b/src/test/java/com/fasterxml/jackson/core/filter/BasicParserFilteringTest.java index ec7615074c..4fef137dc6 100644 --- a/src/test/java/com/fasterxml/jackson/core/filter/BasicParserFilteringTest.java +++ b/src/test/java/com/fasterxml/jackson/core/filter/BasicParserFilteringTest.java @@ -1,5 +1,6 @@ package com.fasterxml.jackson.core.filter; +import java.io.StringWriter; import java.util.*; import com.fasterxml.jackson.core.*; @@ -33,6 +34,23 @@ public TokenFilter includeProperty(String name) { protected boolean _includeScalar() { return false; } } + static class StrictNameMatchFilter extends TokenFilter + { + private final Set _names; + + public StrictNameMatchFilter(String... names) { + _names = new HashSet(Arrays.asList(names)); + } + + @Override + public TokenFilter includeProperty(String name) { + if (_names.contains(name)) { + return TokenFilter.INCLUDE_ALL; + } + return null; + } + } + static class IndexMatchFilter extends TokenFilter { private final BitSet _indices; @@ -61,6 +79,22 @@ public TokenFilter includeElement(int index) { protected boolean _includeScalar() { return false; } } + static class NoArraysFilter extends TokenFilter + { + @Override + public TokenFilter filterStartArray() { + return null; + } + } + + static class NoObjectsFilter extends TokenFilter + { + @Override + public TokenFilter filterStartObject() { + return null; + } + } + /* /********************************************************** /* Test methods @@ -297,6 +331,124 @@ public void testMultipleMatchFilteringWithPath3() throws Exception assertEquals(2, p.getMatchCount()); } + public void testNoMatchFiltering1() throws Exception + { + String jsonString = aposToQuotes("{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"); + JsonParser p0 = JSON_F.createParser(jsonString); + FilteringParserDelegate p = new FilteringParserDelegate(p0, + new NameMatchFilter("invalid"), + Inclusion.INCLUDE_NON_NULL, + true // multipleMatches + ); + String result = readAndWrite(JSON_F, p); + assertEquals(aposToQuotes("{'array':[],'ob':{}}"), result); + assertEquals(0, p.getMatchCount()); + } + + public void testNoMatchFiltering2() throws Exception + { + String object = aposToQuotes("{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"); + String jsonString = String.format("[%s,%s,%s]", object, object, object); + JsonParser p0 = JSON_F.createParser(jsonString); + FilteringParserDelegate p = new FilteringParserDelegate(p0, + new NameMatchFilter("invalid"), + Inclusion.INCLUDE_NON_NULL, + true // multipleMatches + ); + String result = readAndWrite(JSON_F, p); + assertEquals(aposToQuotes("[{'array':[],'ob':{}},{'array':[],'ob':{}},{'array':[],'ob':{}}]"), result); + assertEquals(0, p.getMatchCount()); + } + + public void testNoMatchFiltering3() throws Exception + { + String object = aposToQuotes("{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"); + String jsonString = String.format("[[%s],[%s],[%s]]", object, object, object); + JsonParser p0 = JSON_F.createParser(jsonString); + FilteringParserDelegate p = new FilteringParserDelegate(p0, + new NameMatchFilter("invalid"), + Inclusion.INCLUDE_NON_NULL, + true // multipleMatches + ); + String result = readAndWrite(JSON_F, p); + assertEquals(aposToQuotes("[[{'array':[],'ob':{}}],[{'array':[],'ob':{}}],[{'array':[],'ob':{}}]]"), result); + assertEquals(0, p.getMatchCount()); + + StringWriter w = new StringWriter(); + } + + public void testNoMatchFiltering4() throws Exception + { + String jsonString = aposToQuotes("{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"); + JsonParser p0 = JSON_F.createParser(jsonString); + FilteringParserDelegate p = new FilteringParserDelegate(p0, + new StrictNameMatchFilter("invalid"), + Inclusion.INCLUDE_NON_NULL, + true // multipleMatches + ); + String result = readAndWrite(JSON_F, p); + assertEquals(aposToQuotes("{}"), result); + assertEquals(0, p.getMatchCount()); + } + + public void testNoMatchFiltering5() throws Exception + { + String object = aposToQuotes("{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"); + String jsonString = String.format("[%s,%s,%s]", object, object, object); + JsonParser p0 = JSON_F.createParser(jsonString); + FilteringParserDelegate p = new FilteringParserDelegate(p0, + new StrictNameMatchFilter("invalid"), + Inclusion.INCLUDE_NON_NULL, + true // multipleMatches + ); + String result = readAndWrite(JSON_F, p); + assertEquals(aposToQuotes("[{},{},{}]"), result); + assertEquals(0, p.getMatchCount()); + } + + public void testNoMatchFiltering6() throws Exception + { + String object = aposToQuotes("{'a':123,'array':[1,2],'ob':{'value0':2,'value':3,'value2':4},'b':true}"); + String jsonString = String.format("[[%s],[%s],[%s]]", object, object, object); + JsonParser p0 = JSON_F.createParser(jsonString); + FilteringParserDelegate p = new FilteringParserDelegate(p0, + new StrictNameMatchFilter("invalid"), + Inclusion.INCLUDE_NON_NULL, + true // multipleMatches + ); + String result = readAndWrite(JSON_F, p); + assertEquals(aposToQuotes("[[{}],[{}],[{}]]"), result); + assertEquals(0, p.getMatchCount()); + } + + public void testValueOmitsFieldName1() throws Exception + { + String jsonString = aposToQuotes("{'a':123,'array':[1,2]}"); + JsonParser p0 = JSON_F.createParser(jsonString); + FilteringParserDelegate p = new FilteringParserDelegate(p0, + new NoArraysFilter(), + Inclusion.INCLUDE_NON_NULL, + true // multipleMatches + ); + String result = readAndWrite(JSON_F, p); + assertEquals(aposToQuotes("{'a':123}"), result); + assertEquals(0, p.getMatchCount()); + } + + public void testValueOmitsFieldName2() throws Exception + { + String jsonString = aposToQuotes("['a',{'value0':3,'b':{'value':4}}]"); + JsonParser p0 = JSON_F.createParser(jsonString); + FilteringParserDelegate p = new FilteringParserDelegate(p0, + new NoObjectsFilter(), + Inclusion.INCLUDE_NON_NULL, + true // multipleMatches + ); + String result = readAndWrite(JSON_F, p); + assertEquals(aposToQuotes("['a']"), result); + assertEquals(1, p.getMatchCount()); + } + public void testIndexMatchWithPath1() throws Exception { FilteringParserDelegate p = new FilteringParserDelegate(JSON_F.createParser(SIMPLE), From 9704d48e55ec34c60289f0bd26ff40ed02da897e Mon Sep 17 00:00:00 2001 From: Jonathan Haber Date: Sun, 5 Jan 2020 23:54:44 -0500 Subject: [PATCH 14/15] Put back star imports --- .../core/filter/JsonPointerGeneratorFilteringTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java b/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java index ae27aa9eff..9fcac6c597 100644 --- a/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java +++ b/src/test/java/com/fasterxml/jackson/core/filter/JsonPointerGeneratorFilteringTest.java @@ -1,9 +1,8 @@ package com.fasterxml.jackson.core.filter; -import java.io.StringWriter; +import java.io.*; -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.core.filter.TokenFilter.Inclusion; @SuppressWarnings("resource") From 34387b4e6eb2448046111e78aa0a103e595e70d6 Mon Sep 17 00:00:00 2001 From: Jonathan Haber Date: Sun, 5 Jan 2020 23:55:52 -0500 Subject: [PATCH 15/15] More star imports --- .../com/fasterxml/jackson/core/write/UTF8GeneratorTest.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/test/java/com/fasterxml/jackson/core/write/UTF8GeneratorTest.java b/src/test/java/com/fasterxml/jackson/core/write/UTF8GeneratorTest.java index 2bc27b710c..f8f20f4d5e 100644 --- a/src/test/java/com/fasterxml/jackson/core/write/UTF8GeneratorTest.java +++ b/src/test/java/com/fasterxml/jackson/core/write/UTF8GeneratorTest.java @@ -1,10 +1,6 @@ package com.fasterxml.jackson.core.write; -import com.fasterxml.jackson.core.BaseTest; -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.core.filter.FilteringGeneratorDelegate; import com.fasterxml.jackson.core.filter.JsonPointerBasedFilter; import com.fasterxml.jackson.core.filter.TokenFilter.Inclusion;