Java tutorial
/* * Copyright 2016 NewTranx Co. Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.newtranx.util.xml; import java.io.IOException; import java.io.Reader; import java.util.ArrayList; import org.apache.commons.lang3.ArrayUtils; import org.apache.xerces.util.XMLChar; public class XmlFilterReader extends Reader { private Reader underlying; private ArrayList<Integer> toRemove = new ArrayList<Integer>(); public XmlFilterReader(Reader underlying) { this.underlying = underlying; } @Override public int read(char[] cbuf, int off, int len) throws IOException { int ret = underlying.read(cbuf, off, len); for (int i = off; i < off + ret; i++) { if (!isValid(cbuf[i])) toRemove.add(i); } if (!toRemove.isEmpty()) { int[] indices = new int[toRemove.size()]; for (int i = 0; i < indices.length; i++) { indices[i] = toRemove.get(i); } toRemove.clear(); ret -= indices.length; char[] newArr = ArrayUtils.removeAll(cbuf, indices); System.arraycopy(newArr, off, cbuf, off, ret); } return ret; } @Override public void close() throws IOException { underlying.close(); } private boolean isValid(char c) { return XMLChar.isValid(c); } }