more work on parsing-filter side; not complete.
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 ae26808..f4d2533 100644
--- a/src/main/java/com/fasterxml/jackson/core/filter/FilteringParserDelegate.java
+++ b/src/main/java/com/fasterxml/jackson/core/filter/FilteringParserDelegate.java
@@ -241,34 +241,68 @@
}
// otherwise... to include or not?
- switch (_currToken.id()) {
+ TokenFilter f;
+
+ switch (t.id()) {
case ID_START_ARRAY:
- if (_itemFilter == null) {
+ f = _itemFilter;
+ if (f == TokenFilter.INCLUDE_ALL) {
+ _headContext = _headContext.createChildArrayContext(f, true);
+ return (_currToken = t);
+ }
+ if (f == null) { // does this occur?
delegate.skipChildren();
break;
}
- if (_itemFilter == TokenFilter.INCLUDE_ALL) {
- _headContext = _headContext.createChildArrayContext(_itemFilter, true);
+ // Otherwise still iffy, need to check
+ f = _headContext.checkValue(f);
+ if (f == null) {
+ delegate.skipChildren();
+ break;
+ }
+ if (f != TokenFilter.INCLUDE_ALL) {
+ f = f.filterStartArray();
+ }
+ _itemFilter = f;
+ _headContext = _headContext.createChildArrayContext(f, true);
+ if (f == TokenFilter.INCLUDE_ALL) {
return (_currToken = t);
}
- // TODO
+ // but if we didn't figure it out yet, need to buffer possible events
+ return _nextTokenWithBuffering(_headContext);
case ID_START_OBJECT:
- if (_itemFilter == null) {
+ f = _itemFilter;
+ if (f == TokenFilter.INCLUDE_ALL) {
+ _headContext = _headContext.createChildObjectContext(f, true);
+ return (_currToken = t);
+ }
+ if (f == null) { // does this occur?
delegate.skipChildren();
break;
}
- if (_itemFilter == TokenFilter.INCLUDE_ALL) {
- _headContext = _headContext.createChildObjectContext(_itemFilter, true);
+ // Otherwise still iffy, need to check
+ f = _headContext.checkValue(f);
+ if (f == null) {
+ delegate.skipChildren();
+ break;
+ }
+ if (f != TokenFilter.INCLUDE_ALL) {
+ f = f.filterStartObject();
+ }
+ _itemFilter = f;
+ _headContext = _headContext.createChildObjectContext(f, true);
+ if (f == TokenFilter.INCLUDE_ALL) {
return (_currToken = t);
}
- // TODO
+ // but if we didn't figure it out yet, need to buffer possible events
+ return _nextTokenWithBuffering(_headContext);
case ID_END_ARRAY:
case ID_END_OBJECT:
{
boolean returnEnd = _headContext.isStartHandled();
- TokenFilter f = _headContext.getFilter();
+ f = _headContext.getFilter();
if ((f != null) && (f != TokenFilter.INCLUDE_ALL)) {
f.filterFinishArray();
}
@@ -281,16 +315,133 @@
break;
case ID_FIELD_NAME:
+ {
+ final String name = delegate.getCurrentName();
+ f = _headContext.setFieldName(name);
+ if (f == TokenFilter.INCLUDE_ALL) {
+ _itemFilter = f;
+ return (_currToken = t);
+ }
+ if (f == null) { // filter out the value
+ delegate.nextToken();
+ delegate.skipChildren();
+ break;
+ }
+ f = f.includeProperty(name);
+ if (f == null) { // filter out the value
+ delegate.nextToken();
+ delegate.skipChildren();
+ break;
+ }
+ if (f == TokenFilter.INCLUDE_ALL) {
+ _itemFilter = f;
+ return (_currToken = t);
+ }
+ // !!! TODO: still not decided if to include, so...
+
+ _itemFilter = f;
+ }
+ break;
default: // scalar value
+ if (_itemFilter == TokenFilter.INCLUDE_ALL) {
+ return (_currToken = t);
+ }
+ // Otherwise not included (leaves must be explicitly included)
+ break;
}
// We get here if token was not yet found; offlined handling
return _nextToken2();
}
+ /**
+ * Offlined handling for cases where there was no buffered token to
+ * return, and the token read next could not be returned as-is,
+ * at least not yet.
+ */
protected final JsonToken _nextToken2() throws IOException
{
+ while (true) {
+ JsonToken t = delegate.nextToken();
+ if (t == null) { // is this really legal? For the moment, assume it is
+ return (_currToken = t);
+ }
+ switch (_currToken.id()) {
+ case ID_START_ARRAY:
+ if (_itemFilter == TokenFilter.INCLUDE_ALL) {
+ _headContext = _headContext.createChildArrayContext(_itemFilter, true);
+ return (_currToken = t);
+ }
+ if (_itemFilter == null) { // does this occur?
+ delegate.skipChildren();
+ break;
+ }
+ _exposedContext = _headContext = _headContext.createChildArrayContext(_itemFilter, false);
+ break;
+
+ case ID_START_OBJECT:
+ if (_itemFilter == TokenFilter.INCLUDE_ALL) {
+ _headContext = _headContext.createChildObjectContext(_itemFilter, true);
+ return (_currToken = t);
+ }
+ if (_itemFilter == null) { // does this occur?
+ delegate.skipChildren();
+ break;
+ }
+ _exposedContext = _headContext = _headContext.createChildObjectContext(_itemFilter, false);
+ break;
+
+ case ID_END_ARRAY:
+ case ID_END_OBJECT:
+ {
+ boolean returnEnd = _headContext.isStartHandled();
+ TokenFilter f = _headContext.getFilter();
+ if ((f != null) && (f != TokenFilter.INCLUDE_ALL)) {
+ f.filterFinishArray();
+ }
+ _headContext = _headContext.getParent();
+ _itemFilter = _headContext.getFilter();
+ if (returnEnd) {
+ return (_currToken = t);
+ }
+ }
+ break;
+
+ case ID_FIELD_NAME:
+ {
+ final String name = delegate.getCurrentName();
+ TokenFilter f = _headContext.setFieldName(name);
+ if (f == null) { // filter out the value
+ delegate.nextToken();
+ delegate.skipChildren();
+ break;
+ }
+ if (_itemFilter == TokenFilter.INCLUDE_ALL) {
+ _itemFilter = f;
+ return (_currToken = t);
+ }
+ f = f.includeProperty(name);
+ _itemFilter = f;
+ }
+ break;
+
+ default: // scalar value
+ if (_itemFilter == TokenFilter.INCLUDE_ALL) {
+ return (_currToken = t);
+ }
+ // Otherwise not included (leaves must be explicitly included)
+ break;
+ }
+ }
+ }
+
+ /**
+ * Method called when a new potentially included context is found.
+ */
+ protected final JsonToken _nextTokenWithBuffering(TokenFilterContext buffRoot) throws IOException
+ {
+ _exposedContext = _headContext;
// !!! TODO
return null;
}