/* * ==================================================================== * Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at http://svnkit.com/license.html * If newer versions of this license are posted there, you may use a * newer version instead, at your option. * ==================================================================== */ package org.tmatesoft.svn.core.internal.io.dav.http; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.UnsupportedEncodingException; /** * @version 1.3 * @author TMate Software Ltd. */ public class XMLReader extends Reader { public static final char COLON_REPLACEMENT = '\u3007'; // ideografic char. private Reader mySource; private boolean myIsEscaping; private int myColonCount; private boolean myIsClosed; public XMLReader(InputStream is) throws UnsupportedEncodingException { mySource = new InputStreamReader(is, "UTF-8"); } public int read(char[] b, int off, int len) throws IOException { int read = mySource.read(b, off, len); for(int i = 0; i < read; i++) { char ch = b[off + i]; if (ch < 0x20 && ch != '\r' && ch != '\n' && ch != '\t') { b[off + i] = ' '; continue; } else if (ch == 0xffff || ch == 0xfffe) { b[off + i] = ' '; continue; } if (myIsEscaping) { if (ch == ':') { myColonCount++; if (myColonCount > 1) { b[off + i] = COLON_REPLACEMENT; } } else if (Character.isWhitespace(ch) || ch == '>') { myIsEscaping = false; } } else if (!myIsEscaping && ch == '<') { myIsEscaping = true; myColonCount = 0; } } myIsClosed = read < 0; return read; } public boolean isClosed() { return myIsClosed; } public void close() throws IOException { } }