package org.zalando.riptide.stream; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; final class StreamFilter extends FilterInputStream { private static final int JSON_SEQUENCE_RECORD_SEPARATOR = 30; final int size; protected StreamFilter(final InputStream in) { this(in, 8192); } protected StreamFilter(final InputStream in, final int size) { super(in); this.size = size; } private boolean filtered(final byte read) { return read == JSON_SEQUENCE_RECORD_SEPARATOR; } @Override public int read() throws IOException { while (true) { final int read = super.read(); if (read == -1) { return -1; } else if (!filtered((byte) read)) { return read; } } } @Override public int read(final byte[] b, final int off, final int len) throws IOException { final int read = super.read(b, off, len); if (read == -1) { return -1; } final int until = off + read; int last = off; for (int index = off; index < until; index++) { if (!filtered(b[index])) { if (index != last) { b[last] = b[index]; } last++; } } for (int index = last; index < until; index++) { b[index] = 0; } return last - off; } @Override public long skip(final long n) throws IOException { long sum = 0; final byte[] b = new byte[size]; while (sum < n) { final int left = (int) (n - sum); final int len = left > size ? size : left; final int read = read(b, 0, len); if (read == -1) { return sum; } sum += read; } return sum; } }