package com.fasterxml.jackson.core.filter;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.math.BigDecimal;
import java.math.BigInteger;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.util.JsonGeneratorDelegate;
public class FilteringGeneratorDelegate extends JsonGeneratorDelegate
{
protected TokenFilter rootFilter;
protected boolean _allowMultipleMatches;
protected boolean _includePath;
@Deprecated
protected boolean _includeImmediateParent;
protected TokenFilterContext _filterContext;
protected TokenFilter _itemFilter;
protected int _matchCount;
public FilteringGeneratorDelegate(JsonGenerator d, TokenFilter f,
boolean includePath, boolean allowMultipleMatches)
{
super(d, false);
rootFilter = f;
_itemFilter = f;
_filterContext = TokenFilterContext.createRootContext(f);
_includePath = includePath;
_allowMultipleMatches = allowMultipleMatches;
}
public TokenFilter getFilter() { return rootFilter; }
public JsonStreamContext getFilterContext() {
return _filterContext;
}
public int getMatchCount() {
return _matchCount;
}
@Override
public JsonStreamContext getOutputContext() {
return _filterContext;
}
@Override
public void writeStartArray() throws IOException
{
if (_itemFilter == null) {
_filterContext = _filterContext.createChildArrayContext(null, false);
return;
}
if (_itemFilter == TokenFilter.INCLUDE_ALL) {
_filterContext = _filterContext.createChildArrayContext(_itemFilter, true);
delegate.writeStartArray();
return;
}
_itemFilter = _filterContext.checkValue(_itemFilter);
if (_itemFilter == null) {
_filterContext = _filterContext.createChildArrayContext(null, false);
return;
}
if (_itemFilter != TokenFilter.INCLUDE_ALL) {
_itemFilter = _itemFilter.filterStartArray();
}
if (_itemFilter == TokenFilter.INCLUDE_ALL) {
_checkParentPath();
_filterContext = _filterContext.createChildArrayContext(_itemFilter, true);
delegate.writeStartArray();
} else {
_filterContext = _filterContext.createChildArrayContext(_itemFilter, false);
}
}
@Override
public void writeStartArray(int size) throws IOException
{
if (_itemFilter == null) {
_filterContext = _filterContext.createChildArrayContext(null, false);
return;
}
if (_itemFilter == TokenFilter.INCLUDE_ALL) {
_filterContext = _filterContext.createChildArrayContext(_itemFilter, true);
delegate.writeStartArray(size);
return;
}
_itemFilter = _filterContext.checkValue(_itemFilter);
if (_itemFilter == null) {
_filterContext = _filterContext.createChildArrayContext(null, false);
return;
}
if (_itemFilter != TokenFilter.INCLUDE_ALL) {
_itemFilter = _itemFilter.filterStartArray();
}
if (_itemFilter == TokenFilter.INCLUDE_ALL) {
_checkParentPath();
_filterContext = _filterContext.createChildArrayContext(_itemFilter, true);
delegate.writeStartArray(size);
} else {
_filterContext = _filterContext.createChildArrayContext(_itemFilter, false);
}
}
@Override
public void writeStartArray(Object forValue) throws IOException
{
if (_itemFilter == null) {
_filterContext = _filterContext.createChildArrayContext(null, false);
return;
}
if (_itemFilter == TokenFilter.INCLUDE_ALL) {
_filterContext = _filterContext.createChildArrayContext(_itemFilter, true);
delegate.writeStartArray(forValue);
return;
}
_itemFilter = _filterContext.checkValue(_itemFilter);
if (_itemFilter == null) {
_filterContext = _filterContext.createChildArrayContext(null, false);
return;
}
if (_itemFilter != TokenFilter.INCLUDE_ALL) {
_itemFilter = _itemFilter.filterStartArray();
}
if (_itemFilter == TokenFilter.INCLUDE_ALL) {
_checkParentPath();
_filterContext = _filterContext.createChildArrayContext(_itemFilter, true);
delegate.writeStartArray(forValue);
} else {
_filterContext = _filterContext.createChildArrayContext(_itemFilter, false);
}
}
@Override
public void writeStartArray(Object forValue, int size) throws IOException
{
if (_itemFilter == null) {
_filterContext = _filterContext.createChildArrayContext(null, false);
return;
}
if (_itemFilter == TokenFilter.INCLUDE_ALL) {
_filterContext = _filterContext.createChildArrayContext(_itemFilter, true);
delegate.writeStartArray(forValue, size);
return;
}
_itemFilter = _filterContext.checkValue(_itemFilter);
if (_itemFilter == null) {
_filterContext = _filterContext.createChildArrayContext(null, false);
return;
}
if (_itemFilter != TokenFilter.INCLUDE_ALL) {
_itemFilter = _itemFilter.filterStartArray();
}
if (_itemFilter == TokenFilter.INCLUDE_ALL) {
_checkParentPath();
_filterContext = _filterContext.createChildArrayContext(_itemFilter, true);
delegate.writeStartArray(forValue, size);
} else {
_filterContext = _filterContext.createChildArrayContext(_itemFilter, false);
}
}
@Override
public void writeEndArray() throws IOException
{
_filterContext = _filterContext.closeArray(delegate);
if (_filterContext != null) {
_itemFilter = _filterContext.getFilter();
}
}
@Override
public void writeStartObject() throws IOException
{
if (_itemFilter == null) {
_filterContext = _filterContext.createChildObjectContext(_itemFilter, false);
return;
}
if (_itemFilter == TokenFilter.INCLUDE_ALL) {
_filterContext = _filterContext.createChildObjectContext(_itemFilter, true);
delegate.writeStartObject();
return;
}
TokenFilter f = _filterContext.checkValue(_itemFilter);
if (f == null) {
return;
}
if (f != TokenFilter.INCLUDE_ALL) {
f = f.filterStartObject();
}
if (f == TokenFilter.INCLUDE_ALL) {
_checkParentPath();
_filterContext = _filterContext.createChildObjectContext(f, true);
delegate.writeStartObject();
} else {
_filterContext = _filterContext.createChildObjectContext(f, false);
}
}
@Override
public void writeStartObject(Object forValue) throws IOException
{
if (_itemFilter == null) {
_filterContext = _filterContext.createChildObjectContext(_itemFilter, false);
return;
}
if (_itemFilter == TokenFilter.INCLUDE_ALL) {
_filterContext = _filterContext.createChildObjectContext(_itemFilter, true);
delegate.writeStartObject(forValue);
return;
}
TokenFilter f = _filterContext.checkValue(_itemFilter);
if (f == null) {
return;
}
if (f != TokenFilter.INCLUDE_ALL) {
f = f.filterStartObject();
}
if (f == TokenFilter.INCLUDE_ALL) {
_checkParentPath();
_filterContext = _filterContext.createChildObjectContext(f, true);
delegate.writeStartObject(forValue);
} else {
_filterContext = _filterContext.createChildObjectContext(f, false);
}
}
@Override
public void writeStartObject(Object forValue, int size) throws IOException
{
if (_itemFilter == null) {
_filterContext = _filterContext.createChildObjectContext(_itemFilter, false);
return;
}
if (_itemFilter == TokenFilter.INCLUDE_ALL) {
_filterContext = _filterContext.createChildObjectContext(_itemFilter, true);
delegate.writeStartObject(forValue, size);
return;
}
TokenFilter f = _filterContext.checkValue(_itemFilter);
if (f == null) {
return;
}
if (f != TokenFilter.INCLUDE_ALL) {
f = f.filterStartObject();
}
if (f == TokenFilter.INCLUDE_ALL) {
_checkParentPath();
_filterContext = _filterContext.createChildObjectContext(f, true);
delegate.writeStartObject(forValue, size);
} else {
_filterContext = _filterContext.createChildObjectContext(f, false);
}
}
@Override
public void writeEndObject() throws IOException
{
_filterContext = _filterContext.closeObject(delegate);
if (_filterContext != null) {
_itemFilter = _filterContext.getFilter();
}
}
@Override
public void writeFieldName(String name) throws IOException
{
TokenFilter state = _filterContext.setFieldName(name);
if (state == null) {
_itemFilter = null;
return;
}
if (state == TokenFilter.INCLUDE_ALL) {
_itemFilter = state;
delegate.writeFieldName(name);
return;
}
state = state.includeProperty(name);
_itemFilter = state;
if (state == TokenFilter.INCLUDE_ALL) {
_checkPropertyParentPath();
}
}
@Override
public void writeFieldName(SerializableString name) throws IOException
{
TokenFilter state = _filterContext.setFieldName(name.getValue());
if (state == null) {
_itemFilter = null;
return;
}
if (state == TokenFilter.INCLUDE_ALL) {
_itemFilter = state;
delegate.writeFieldName(name);
return;
}
state = state.includeProperty(name.getValue());
_itemFilter = state;
if (state == TokenFilter.INCLUDE_ALL) {
_checkPropertyParentPath();
}
}
@Override
public void writeFieldId(long id) throws IOException {
writeFieldName(Long.toString(id));
}
@Override
public void writeString(String value) throws IOException
{
if (_itemFilter == null) {
return;
}
if (_itemFilter != TokenFilter.INCLUDE_ALL) {
TokenFilter state = _filterContext.checkValue(_itemFilter);
if (state == null) {
return;
}
if (state != TokenFilter.INCLUDE_ALL) {
if (!state.includeString(value)) {
return;
}
}
_checkParentPath();
}
delegate.writeString(value);
}
@Override
public void writeString(char[] text, int offset, int len) throws IOException
{
if (_itemFilter == null) {
return;
}
if (_itemFilter != TokenFilter.INCLUDE_ALL) {
String value = new String(text, offset, len);
TokenFilter state = _filterContext.checkValue(_itemFilter);
if (state == null) {
return;
}
if (state != TokenFilter.INCLUDE_ALL) {
if (!state.includeString(value)) {
return;
}
}
_checkParentPath();
}
delegate.writeString(text, offset, len);
}
@Override
public void writeString(SerializableString value) throws IOException
{
if (_itemFilter == null) {
return;
}
if (_itemFilter != TokenFilter.INCLUDE_ALL) {
TokenFilter state = _filterContext.checkValue(_itemFilter);
if (state == null) {
return;
}
if (state != TokenFilter.INCLUDE_ALL) {
if (!state.includeString(value.getValue())) {
return;
}
}
_checkParentPath();
}
delegate.writeString(value);
}
@Override
public void writeString(Reader reader, int len) throws IOException {
if (_itemFilter == null) {
return;
}
if (_itemFilter != TokenFilter.INCLUDE_ALL) {
TokenFilter state = _filterContext.checkValue(_itemFilter);
if (state == null) {
return;
}
if (state != TokenFilter.INCLUDE_ALL) {
if (!state.includeString(reader, len)) {
return;
}
}
_checkParentPath();
}
delegate.writeString(reader, len);
}
@Override
public void writeRawUTF8String(byte[] text, int offset, int length) throws IOException
{
if (_checkRawValueWrite()) {
delegate.writeRawUTF8String(text, offset, length);
}
}
@Override
public void writeUTF8String(byte[] text, int offset, int length) throws IOException
{
if (_checkRawValueWrite()) {
delegate.writeUTF8String(text, offset, length);
}
}
@Override
public void writeRaw(String text) throws IOException
{
if (_checkRawValueWrite()) {
delegate.writeRaw(text);
}
}
@Override
public void writeRaw(String text, int offset, int len) throws IOException
{
if (_checkRawValueWrite()) {
delegate.writeRaw(text, offset, len);
}
}
@Override
public void writeRaw(SerializableString text) throws IOException
{
if (_checkRawValueWrite()) {
delegate.writeRaw(text);
}
}
@Override
public void writeRaw(char[] text, int offset, int len) throws IOException
{
if (_checkRawValueWrite()) {
delegate.writeRaw(text, offset, len);
}
}
@Override
public void writeRaw(char c) throws IOException
{
if (_checkRawValueWrite()) {
delegate.writeRaw(c);
}
}
@Override
public void writeRawValue(String text) throws IOException
{
if (_checkRawValueWrite()) {
delegate.writeRawValue(text);
}
}
@Override
public void writeRawValue(String text, int offset, int len) throws IOException
{
if (_checkRawValueWrite()) {
delegate.writeRawValue(text, offset, len);
}
}
@Override
public void writeRawValue(char[] text, int offset, int len) throws IOException
{
if (_checkRawValueWrite()) {
delegate.writeRawValue(text, offset, len);
}
}
@Override
public void writeBinary(Base64Variant b64variant, byte[] data, int offset, int len) throws IOException
{
if (_checkBinaryWrite()) {
delegate.writeBinary(b64variant, data, offset, len);
}
}
@Override
public int writeBinary(Base64Variant b64variant, InputStream data, int dataLength) throws IOException
{
if (_checkBinaryWrite()) {
return delegate.writeBinary(b64variant, data, dataLength);
}
return -1;
}
@Override
public void writeNumber(short v) throws IOException
{
if (_itemFilter == null) {
return;
}
if (_itemFilter != TokenFilter.INCLUDE_ALL) {
TokenFilter state = _filterContext.checkValue(_itemFilter);
if (state == null) {
return;
}
if (state != TokenFilter.INCLUDE_ALL) {
if (!state.includeNumber(v)) {
return;
}
}
_checkParentPath();
}
delegate.writeNumber(v);
}
@Override
public void writeNumber(int v) throws IOException
{
if (_itemFilter == null) {
return;
}
if (_itemFilter != TokenFilter.INCLUDE_ALL) {
TokenFilter state = _filterContext.checkValue(_itemFilter);
if (state == null) {
return;
}
if (state != TokenFilter.INCLUDE_ALL) {
if (!state.includeNumber(v)) {
return;
}
}
_checkParentPath();
}
delegate.writeNumber(v);
}
@Override
public void writeNumber(long v) throws IOException
{
if (_itemFilter == null) {
return;
}
if (_itemFilter != TokenFilter.INCLUDE_ALL) {
TokenFilter state = _filterContext.checkValue(_itemFilter);
if (state == null) {
return;
}
if (state != TokenFilter.INCLUDE_ALL) {
if (!state.includeNumber(v)) {
return;
}
}
_checkParentPath();
}
delegate.writeNumber(v);
}
@Override
public void writeNumber(BigInteger v) throws IOException
{
if (_itemFilter == null) {
return;
}
if (_itemFilter != TokenFilter.INCLUDE_ALL) {
TokenFilter state = _filterContext.checkValue(_itemFilter);
if (state == null) {
return;
}
if (state != TokenFilter.INCLUDE_ALL) {
if (!state.includeNumber(v)) {
return;
}
}
_checkParentPath();
}
delegate.writeNumber(v);
}
@Override
public void writeNumber(double v) throws IOException
{
if (_itemFilter == null) {
return;
}
if (_itemFilter != TokenFilter.INCLUDE_ALL) {
TokenFilter state = _filterContext.checkValue(_itemFilter);
if (state == null) {
return;
}
if (state != TokenFilter.INCLUDE_ALL) {
if (!state.includeNumber(v)) {
return;
}
}
_checkParentPath();
}
delegate.writeNumber(v);
}
@Override
public void writeNumber(float v) throws IOException
{
if (_itemFilter == null) {
return;
}
if (_itemFilter != TokenFilter.INCLUDE_ALL) {
TokenFilter state = _filterContext.checkValue(_itemFilter);
if (state == null) {
return;
}
if (state != TokenFilter.INCLUDE_ALL) {
if (!state.includeNumber(v)) {
return;
}
}
_checkParentPath();
}
delegate.writeNumber(v);
}
@Override
public void writeNumber(BigDecimal v) throws IOException
{
if (_itemFilter == null) {
return;
}
if (_itemFilter != TokenFilter.INCLUDE_ALL) {
TokenFilter state = _filterContext.checkValue(_itemFilter);
if (state == null) {
return;
}
if (state != TokenFilter.INCLUDE_ALL) {
if (!state.includeNumber(v)) {
return;
}
}
_checkParentPath();
}
delegate.writeNumber(v);
}
@Override
public void writeNumber(String encodedValue) throws IOException, UnsupportedOperationException
{
if (_itemFilter == null) {
return;
}
if (_itemFilter != TokenFilter.INCLUDE_ALL) {
TokenFilter state = _filterContext.checkValue(_itemFilter);
if (state == null) {
return;
}
if (state != TokenFilter.INCLUDE_ALL) {
if (!state.includeRawValue()) {
return;
}
}
_checkParentPath();
}
delegate.writeNumber(encodedValue);
}
@Override
public void writeNumber(char[] encodedValueBuffer, int offset, int length) throws IOException, UnsupportedOperationException
{
if (_itemFilter == null) {
return;
}
if (_itemFilter != TokenFilter.INCLUDE_ALL) {
TokenFilter state = _filterContext.checkValue(_itemFilter);
if (state == null) {
return;
}
if (state != TokenFilter.INCLUDE_ALL) {
if (!state.includeRawValue()) {
return;
}
}
_checkParentPath();
}
delegate.writeNumber(encodedValueBuffer, offset, length);
}
@Override
public void writeBoolean(boolean v) throws IOException
{
if (_itemFilter == null) {
return;
}
if (_itemFilter != TokenFilter.INCLUDE_ALL) {
TokenFilter state = _filterContext.checkValue(_itemFilter);
if (state == null) {
return;
}
if (state != TokenFilter.INCLUDE_ALL) {
if (!state.includeBoolean(v)) {
return;
}
}
_checkParentPath();
}
delegate.writeBoolean(v);
}
@Override
public void writeNull() throws IOException
{
if (_itemFilter == null) {
return;
}
if (_itemFilter != TokenFilter.INCLUDE_ALL) {
TokenFilter state = _filterContext.checkValue(_itemFilter);
if (state == null) {
return;
}
if (state != TokenFilter.INCLUDE_ALL) {
if (!state.includeNull()) {
return;
}
}
_checkParentPath();
}
delegate.writeNull();
}
@Override
public void writeOmittedField(String fieldName) throws IOException {
if (_itemFilter != null) {
delegate.writeOmittedField(fieldName);
}
}
@Override
public void writeObjectId(Object id) throws IOException {
if (_itemFilter != null) {
delegate.writeObjectId(id);
}
}
@Override
public void writeObjectRef(Object id) throws IOException {
if (_itemFilter != null) {
delegate.writeObjectRef(id);
}
}
@Override
public void writeTypeId(Object id) throws IOException {
if (_itemFilter != null) {
delegate.writeTypeId(id);
}
}
protected void _checkParentPath() throws IOException
{
++_matchCount;
if (_includePath) {
_filterContext.writePath(delegate);
}
if (!_allowMultipleMatches) {
_filterContext.skipParentChecks();
}
}
protected void _checkPropertyParentPath() throws IOException
{
++_matchCount;
if (_includePath) {
_filterContext.writePath(delegate);
} else if (_includeImmediateParent) {
_filterContext.writeImmediatePath(delegate);
}
if (!_allowMultipleMatches) {
_filterContext.skipParentChecks();
}
}
protected boolean _checkBinaryWrite() throws IOException
{
if (_itemFilter == null) {
return false;
}
if (_itemFilter == TokenFilter.INCLUDE_ALL) {
return true;
}
if (_itemFilter.includeBinary()) {
_checkParentPath();
return true;
}
return false;
}
protected boolean _checkRawValueWrite() throws IOException
{
if (_itemFilter == null) {
return false;
}
if (_itemFilter == TokenFilter.INCLUDE_ALL) {
return true;
}
if (_itemFilter.includeRawValue()) {
_checkParentPath();
return true;
}
return false;
}
}