From dfe24c55042214d34eb463a56b4fed9659c831e4 Mon Sep 17 00:00:00 2001 From: Bryant Date: Thu, 1 Aug 2019 14:04:33 +0800 Subject: [PATCH] =?UTF-8?q?REPORT-19507=20=E6=BB=9A=E5=8A=A8=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E6=8F=92=E4=BB=B6=EF=BC=8C=E6=95=88=E6=9E=9C=E4=B8=8D?= =?UTF-8?q?=E6=AD=A3=E5=B8=B8,=E5=8C=85=E5=90=8D=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javax/xml/stream/XMLEntityReaderImpl.java | 1133 +++++++++++++++++ 1 file changed, 1133 insertions(+) create mode 100644 fine-third-default/src/com/fr/third/javax/xml/stream/XMLEntityReaderImpl.java diff --git a/fine-third-default/src/com/fr/third/javax/xml/stream/XMLEntityReaderImpl.java b/fine-third-default/src/com/fr/third/javax/xml/stream/XMLEntityReaderImpl.java new file mode 100644 index 000000000..90649414f --- /dev/null +++ b/fine-third-default/src/com/fr/third/javax/xml/stream/XMLEntityReaderImpl.java @@ -0,0 +1,1133 @@ +package com.fr.third.javax.xml.stream; + +import com.fr.third.javax.xml.stream.xerces.xni.parser.*; +import java.util.*; +import com.fr.third.javax.xml.stream.xerces.xni.*; +import com.fr.third.javax.xml.stream.xerces.impl.io.*; +import com.fr.third.javax.xml.stream.xerces.util.*; +import java.io.*; + +import static com.fr.third.javax.xml.stream.xerces.util.XMLChar.isInvalid; + +public class XMLEntityReaderImpl extends XMLEntityReader +{ + protected Entity.ScannedEntity fCurrentEntity; + protected XMLEntityManager fEntityManager; + private static final boolean DEBUG_ENCODINGS = false; + private Vector listeners; + public static final boolean[] validContent; + public static final boolean[] validNames; + private static final boolean DEBUG_BUFFER = false; + private static final boolean DEBUG_SKIP_STRING = false; + protected SymbolTable fSymbolTable; + protected XMLErrorReporter fErrorReporter; + int[] whiteSpaceLookup; + int whiteSpaceLen; + boolean whiteSpaceInfoNeeded; + char[] scannedName; + protected boolean fAllowJavaEncodings; + protected static final String SYMBOL_TABLE = "http://apache.org/xml/properties/internal/symbol-table"; + protected static final String ERROR_REPORTER = "http://apache.org/xml/properties/internal/error-reporter"; + protected static final String ALLOW_JAVA_ENCODINGS = "http://apache.org/xml/features/allow-java-encodings"; + protected PropertyManager fPropertyManager; + boolean isExternal; + + static { + validContent = new boolean[127]; + validNames = new boolean[127]; + for (char i = ' '; i < '\u007f'; ++i) { + XMLEntityReaderImpl.validContent[i] = true; + } + XMLEntityReaderImpl.validContent[9] = true; + XMLEntityReaderImpl.validContent[38] = false; + XMLEntityReaderImpl.validContent[60] = false; + for (int j = 65; j <= 90; ++j) { + XMLEntityReaderImpl.validNames[j] = true; + } + for (int j = 97; j <= 122; ++j) { + XMLEntityReaderImpl.validNames[j] = true; + } + for (int j = 48; j <= 57; ++j) { + XMLEntityReaderImpl.validNames[j] = true; + } + XMLEntityReaderImpl.validNames[45] = true; + XMLEntityReaderImpl.validNames[46] = true; + XMLEntityReaderImpl.validNames[58] = true; + XMLEntityReaderImpl.validNames[95] = true; + } + + public XMLEntityReaderImpl(final XMLEntityManager entityManager) { + this.fCurrentEntity = null; + this.listeners = new Vector(); + this.fSymbolTable = null; + this.fErrorReporter = null; + this.whiteSpaceLookup = new int[100]; + this.whiteSpaceLen = 0; + this.whiteSpaceInfoNeeded = true; + this.scannedName = null; + this.fPropertyManager = null; + this.isExternal = false; + this.fEntityManager = entityManager; + } + + public XMLEntityReaderImpl(final PropertyManager propertyManager, final XMLEntityManager entityManager) { + this.fCurrentEntity = null; + this.listeners = new Vector(); + this.fSymbolTable = null; + this.fErrorReporter = null; + this.whiteSpaceLookup = new int[100]; + this.whiteSpaceLen = 0; + this.whiteSpaceInfoNeeded = true; + this.scannedName = null; + this.fPropertyManager = null; + this.isExternal = false; + this.fEntityManager = entityManager; + this.reset(propertyManager); + } + + public void reset(final PropertyManager propertyManager) { + this.fSymbolTable = (SymbolTable)propertyManager.getProperty("http://apache.org/xml/properties/internal/symbol-table"); + this.fErrorReporter = (XMLErrorReporter)propertyManager.getProperty("http://apache.org/xml/properties/internal/error-reporter"); + this.fCurrentEntity = null; + this.whiteSpaceLen = 0; + this.whiteSpaceInfoNeeded = true; + this.scannedName = null; + this.listeners.clear(); + } + + public void reset(final XMLComponentManager componentManager) throws XMLConfigurationException { + try { + this.fAllowJavaEncodings = componentManager.getFeature("http://apache.org/xml/features/allow-java-encodings"); + } + catch (XMLConfigurationException e) { + this.fAllowJavaEncodings = false; + } + this.fSymbolTable = (SymbolTable)componentManager.getProperty("http://apache.org/xml/properties/internal/symbol-table"); + this.fErrorReporter = (XMLErrorReporter)componentManager.getProperty("http://apache.org/xml/properties/internal/error-reporter"); + } + + public void setCurrentEntity(final Entity.ScannedEntity scannedEntity) { + this.fCurrentEntity = scannedEntity; + if (this.fCurrentEntity != null) { + this.isExternal = this.fCurrentEntity.isExternal(); + } + } + + public Entity.ScannedEntity getCurrentEntity() { + return this.fCurrentEntity; + } + + public String getBaseSystemId() { + return (this.fCurrentEntity != null && this.fCurrentEntity.entityLocation != null) ? this.fCurrentEntity.entityLocation.getExpandedSystemId() : null; + } + + public int getLineNumber() { + return (this.fCurrentEntity != null) ? this.fCurrentEntity.lineNumber : -1; + } + + public int getColumnNumber() { + return (this.fCurrentEntity != null) ? this.fCurrentEntity.columnNumber : -1; + } + + public int getCharacterOffset() { + return (this.fCurrentEntity != null) ? (this.fCurrentEntity.fTotalCountTillLastLoad + this.fCurrentEntity.position) : -1; + } + + public String getExpandedSystemId() { + return (this.fCurrentEntity != null && this.fCurrentEntity.entityLocation != null) ? this.fCurrentEntity.entityLocation.getExpandedSystemId() : null; + } + + public String getLiteralSystemId() { + return (this.fCurrentEntity != null && this.fCurrentEntity.entityLocation != null) ? this.fCurrentEntity.entityLocation.getLiteralSystemId() : null; + } + + public String getPublicId() { + return (this.fCurrentEntity != null && this.fCurrentEntity.entityLocation != null) ? this.fCurrentEntity.entityLocation.getPublicId() : null; + } + + public void setVersion(final String version) { + this.fCurrentEntity.version = version; + } + + public String getVersion() { + return this.fCurrentEntity.version; + } + + public String getEncoding() { + return this.fCurrentEntity.encoding; + } + + public void setEncoding(final String encoding) throws IOException { + if (this.fCurrentEntity.stream != null && (this.fCurrentEntity.encoding == null || !this.fCurrentEntity.encoding.equals(encoding))) { + if (this.fCurrentEntity.encoding != null && this.fCurrentEntity.encoding.startsWith("UTF-16")) { + final String ENCODING = encoding.toUpperCase(Locale.ENGLISH); + if (ENCODING.equals("UTF-16")) { + return; + } + if (ENCODING.equals("ISO-10646-UCS-4")) { + if (this.fCurrentEntity.encoding.equals("UTF-16BE")) { + this.fCurrentEntity.reader = new UCSReader(this.fCurrentEntity.stream, (short)8); + } + else { + this.fCurrentEntity.reader = new UCSReader(this.fCurrentEntity.stream, (short)4); + } + return; + } + if (ENCODING.equals("ISO-10646-UCS-2")) { + if (this.fCurrentEntity.encoding.equals("UTF-16BE")) { + this.fCurrentEntity.reader = new UCSReader(this.fCurrentEntity.stream, (short)2); + } + else { + this.fCurrentEntity.reader = new UCSReader(this.fCurrentEntity.stream, (short)1); + } + return; + } + } + this.fCurrentEntity.reader = this.createReader(this.fCurrentEntity.stream, encoding, null); + this.fCurrentEntity.encoding = encoding; + } + } + + public boolean isExternal() { + return this.fCurrentEntity.isExternal(); + } + + public int getChar(final int relative) throws IOException { + if (this.arrangeCapacity(relative + 1, false)) { + return this.fCurrentEntity.ch[this.fCurrentEntity.position + relative]; + } + return -1; + } + + public int peekChar() throws IOException { + if (this.fCurrentEntity.position == this.fCurrentEntity.count) { + this.invokeListeners(0); + this.load(0, true); + } + final int c = this.fCurrentEntity.ch[this.fCurrentEntity.position]; + if (this.isExternal) { + return (c != 13) ? c : 10; + } + return c; + } + + public int scanChar() throws IOException { + if (this.fCurrentEntity.position == this.fCurrentEntity.count) { + this.invokeListeners(0); + this.load(0, true); + } + int c = this.fCurrentEntity.ch[this.fCurrentEntity.position++]; + if (c == 10 || (c == 13 && this.isExternal)) { + final Entity.ScannedEntity fCurrentEntity = this.fCurrentEntity; + ++fCurrentEntity.lineNumber; + this.fCurrentEntity.columnNumber = 1; + if (this.fCurrentEntity.position == this.fCurrentEntity.count) { + this.invokeListeners(1); + this.fCurrentEntity.ch[0] = (char)c; + this.load(1, false); + } + if (c == 13 && this.isExternal) { + if (this.fCurrentEntity.ch[this.fCurrentEntity.position++] != '\n') { + final Entity.ScannedEntity fCurrentEntity2 = this.fCurrentEntity; + --fCurrentEntity2.position; + } + c = 10; + } + } + final Entity.ScannedEntity fCurrentEntity3 = this.fCurrentEntity; + ++fCurrentEntity3.columnNumber; + return c; + } + + public String scanNmtoken() throws IOException { + if (this.fCurrentEntity.position == this.fCurrentEntity.count) { + this.invokeListeners(0); + this.load(0, true); + } + int offset = this.fCurrentEntity.position; + boolean vc = false; + while (true) { + final char c = this.fCurrentEntity.ch[this.fCurrentEntity.position]; + if (c < '\u007f') { + vc = XMLEntityReaderImpl.validNames[c]; + } + else { + vc = XMLChar.isName(c); + } + if (!vc) { + break; + } + if (++this.fCurrentEntity.position != this.fCurrentEntity.count) { + continue; + } + final int length = this.fCurrentEntity.position - offset; + this.invokeListeners(length); + if (length == this.fCurrentEntity.fBufferSize) { + final char[] tmp = new char[this.fCurrentEntity.fBufferSize * 2]; + System.arraycopy(this.fCurrentEntity.ch, offset, tmp, 0, length); + this.fCurrentEntity.ch = tmp; + final Entity.ScannedEntity fCurrentEntity = this.fCurrentEntity; + fCurrentEntity.fBufferSize *= 2; + } + else { + System.arraycopy(this.fCurrentEntity.ch, offset, this.fCurrentEntity.ch, 0, length); + } + offset = 0; + if (this.load(length, false)) { + break; + } + } + final int length = this.fCurrentEntity.position - offset; + final Entity.ScannedEntity fCurrentEntity2 = this.fCurrentEntity; + fCurrentEntity2.columnNumber += length; + String symbol = null; + if (length > 0) { + symbol = this.fSymbolTable.addSymbol(this.fCurrentEntity.ch, offset, length); + } + return symbol; + } + + public String scanName() throws IOException { + if (this.fCurrentEntity.position == this.fCurrentEntity.count) { + this.invokeListeners(0); + this.load(0, true); + } + int offset = this.fCurrentEntity.position; + if (XMLChar.isNameStart(this.fCurrentEntity.ch[offset])) { + if (++this.fCurrentEntity.position == this.fCurrentEntity.count) { + this.invokeListeners(1); + this.fCurrentEntity.ch[0] = this.fCurrentEntity.ch[offset]; + offset = 0; + if (this.load(1, false)) { + final Entity.ScannedEntity fCurrentEntity = this.fCurrentEntity; + ++fCurrentEntity.columnNumber; + final String symbol = this.fSymbolTable.addSymbol(this.fCurrentEntity.ch, 0, 1); + this.scannedName = this.fSymbolTable.getCharArray(); + return symbol; + } + } + boolean vc = false; + while (true) { + final char c = this.fCurrentEntity.ch[this.fCurrentEntity.position]; + if (c < '\u007f') { + vc = XMLEntityReaderImpl.validNames[c]; + } + else { + vc = XMLChar.isName(c); + } + if (!vc) { + break; + } + if (++this.fCurrentEntity.position != this.fCurrentEntity.count) { + continue; + } + final int length = this.fCurrentEntity.position - offset; + this.invokeListeners(length); + if (length == this.fCurrentEntity.fBufferSize) { + final char[] tmp = new char[this.fCurrentEntity.fBufferSize * 2]; + System.arraycopy(this.fCurrentEntity.ch, offset, tmp, 0, length); + this.fCurrentEntity.ch = tmp; + final Entity.ScannedEntity fCurrentEntity2 = this.fCurrentEntity; + fCurrentEntity2.fBufferSize *= 2; + } + else { + System.arraycopy(this.fCurrentEntity.ch, offset, this.fCurrentEntity.ch, 0, length); + } + offset = 0; + if (this.load(length, false)) { + break; + } + } + } + final int length2 = this.fCurrentEntity.position - offset; + final Entity.ScannedEntity fCurrentEntity3 = this.fCurrentEntity; + fCurrentEntity3.columnNumber += length2; + String symbol2 = null; + if (length2 > 0) { + symbol2 = this.fSymbolTable.addSymbol(this.fCurrentEntity.ch, offset, length2); + this.scannedName = this.fSymbolTable.getCharArray(); + } + return symbol2; + } + + public boolean scanQName(final QName qname) throws IOException { + if (this.fCurrentEntity.position == this.fCurrentEntity.count) { + this.invokeListeners(0); + this.load(0, true); + } + int offset = this.fCurrentEntity.position; + if (XMLChar.isNameStart(this.fCurrentEntity.ch[offset])) { + if (++this.fCurrentEntity.position == this.fCurrentEntity.count) { + this.invokeListeners(1); + this.fCurrentEntity.ch[0] = this.fCurrentEntity.ch[offset]; + offset = 0; + if (this.load(1, false)) { + final Entity.ScannedEntity fCurrentEntity = this.fCurrentEntity; + ++fCurrentEntity.columnNumber; + final String name = this.fSymbolTable.addSymbol(this.fCurrentEntity.ch, 0, 1); + qname.setValues(null, name, name, null); + qname.characters = this.fSymbolTable.getCharArray(); + return true; + } + } + int index = -1; + boolean vc = false; + while (true) { + final char c = this.fCurrentEntity.ch[this.fCurrentEntity.position]; + if (c < '\u007f') { + vc = XMLEntityReaderImpl.validNames[c]; + } + else { + vc = XMLChar.isName(c); + } + if (!vc) { + break; + } + if (c == ':') { + if (index != -1) { + break; + } + index = this.fCurrentEntity.position; + } + if (++this.fCurrentEntity.position != this.fCurrentEntity.count) { + continue; + } + final int length = this.fCurrentEntity.position - offset; + this.invokeListeners(length); + if (length == this.fCurrentEntity.fBufferSize) { + final char[] tmp = new char[this.fCurrentEntity.fBufferSize * 2]; + System.arraycopy(this.fCurrentEntity.ch, offset, tmp, 0, length); + this.fCurrentEntity.ch = tmp; + final Entity.ScannedEntity fCurrentEntity2 = this.fCurrentEntity; + fCurrentEntity2.fBufferSize *= 2; + } + else { + System.arraycopy(this.fCurrentEntity.ch, offset, this.fCurrentEntity.ch, 0, length); + } + if (index != -1) { + index -= offset; + } + offset = 0; + if (this.load(length, false)) { + break; + } + } + final int length2 = this.fCurrentEntity.position - offset; + final Entity.ScannedEntity fCurrentEntity3 = this.fCurrentEntity; + fCurrentEntity3.columnNumber += length2; + if (length2 > 0) { + String prefix = null; + String localpart = null; + final String rawname = this.fSymbolTable.addSymbol(this.fCurrentEntity.ch, offset, length2); + qname.characters = this.fSymbolTable.getCharArray(); + if (index != -1) { + final int prefixLength = index - offset; + prefix = this.fSymbolTable.addSymbol(this.fCurrentEntity.ch, offset, prefixLength); + final int len = length2 - prefixLength - 1; + localpart = this.fSymbolTable.addSymbol(this.fCurrentEntity.ch, index + 1, len); + } + else { + localpart = rawname; + } + qname.setValues(prefix, localpart, rawname, null); + return true; + } + } + return false; + } + + public int scanContent(final XMLString content) throws IOException { + if (this.fCurrentEntity.position == this.fCurrentEntity.count) { + this.invokeListeners(0); + this.load(0, true); + } + else if (this.fCurrentEntity.position == this.fCurrentEntity.count - 1) { + this.invokeListeners(0); + this.fCurrentEntity.ch[0] = this.fCurrentEntity.ch[this.fCurrentEntity.count - 1]; + this.load(1, false); + this.fCurrentEntity.position = 0; + } + int offset = this.fCurrentEntity.position; + int c = this.fCurrentEntity.ch[offset]; + int newlines = 0; + if (c == 10 || (c == 13 && this.isExternal)) { + do { + c = this.fCurrentEntity.ch[this.fCurrentEntity.position++]; + if (c == 13 && this.isExternal) { + ++newlines; + final Entity.ScannedEntity fCurrentEntity = this.fCurrentEntity; + ++fCurrentEntity.lineNumber; + this.fCurrentEntity.columnNumber = 1; + if (this.fCurrentEntity.position == this.fCurrentEntity.count) { + offset = 0; + this.invokeListeners(newlines); + this.fCurrentEntity.position = newlines; + if (this.load(newlines, false)) { + break; + } + } + if (this.fCurrentEntity.ch[this.fCurrentEntity.position] == '\n') { + final Entity.ScannedEntity fCurrentEntity2 = this.fCurrentEntity; + ++fCurrentEntity2.position; + ++offset; + } + else { + ++newlines; + } + } + else { + if (c != 10) { + final Entity.ScannedEntity fCurrentEntity3 = this.fCurrentEntity; + --fCurrentEntity3.position; + break; + } + ++newlines; + final Entity.ScannedEntity fCurrentEntity4 = this.fCurrentEntity; + ++fCurrentEntity4.lineNumber; + this.fCurrentEntity.columnNumber = 1; + if (this.fCurrentEntity.position != this.fCurrentEntity.count) { + continue; + } + offset = 0; + this.invokeListeners(newlines); + this.fCurrentEntity.position = newlines; + if (this.load(newlines, false)) { + break; + } + continue; + } + } while (this.fCurrentEntity.position < this.fCurrentEntity.count - 1); + for (int i = offset; i < this.fCurrentEntity.position; ++i) { + this.fCurrentEntity.ch[i] = '\n'; + } + final int length = this.fCurrentEntity.position - offset; + if (this.fCurrentEntity.position == this.fCurrentEntity.count - 1) { + content.setValues(this.fCurrentEntity.ch, offset, length); + return -1; + } + } + boolean vc = false; + while (this.fCurrentEntity.position < this.fCurrentEntity.count) { + c = this.fCurrentEntity.ch[this.fCurrentEntity.position++]; + if (c < 127) { + vc = XMLEntityReaderImpl.validContent[c]; + } + else { + vc = XMLChar.isContent(c); + } + if (!vc) { + final Entity.ScannedEntity fCurrentEntity5 = this.fCurrentEntity; + --fCurrentEntity5.position; + break; + } + } + final int length2 = this.fCurrentEntity.position - offset; + final Entity.ScannedEntity fCurrentEntity6 = this.fCurrentEntity; + fCurrentEntity6.columnNumber += length2 - newlines; + content.setValues(this.fCurrentEntity.ch, offset, length2); + if (this.fCurrentEntity.position != this.fCurrentEntity.count) { + c = this.fCurrentEntity.ch[this.fCurrentEntity.position]; + if (c == 13 && this.isExternal) { + c = 10; + } + } + else { + c = -1; + } + return c; + } + + public int scanLiteral(final int quote, final XMLString content) throws IOException { + if (this.fCurrentEntity.position == this.fCurrentEntity.count) { + this.invokeListeners(0); + this.load(0, true); + } + else if (this.fCurrentEntity.position == this.fCurrentEntity.count - 1) { + this.invokeListeners(0); + this.fCurrentEntity.ch[0] = this.fCurrentEntity.ch[this.fCurrentEntity.count - 1]; + this.load(1, false); + this.fCurrentEntity.position = 0; + } + int offset = this.fCurrentEntity.position; + int c = this.fCurrentEntity.ch[offset]; + int newlines = 0; + if (this.whiteSpaceInfoNeeded) { + this.whiteSpaceLen = 0; + } + if (c == 10 || (c == 13 && this.isExternal)) { + do { + c = this.fCurrentEntity.ch[this.fCurrentEntity.position++]; + if (c == 13 && this.isExternal) { + ++newlines; + final Entity.ScannedEntity fCurrentEntity = this.fCurrentEntity; + ++fCurrentEntity.lineNumber; + this.fCurrentEntity.columnNumber = 1; + if (this.fCurrentEntity.position == this.fCurrentEntity.count) { + this.invokeListeners(newlines); + offset = 0; + this.fCurrentEntity.position = newlines; + if (this.load(newlines, false)) { + break; + } + } + if (this.fCurrentEntity.ch[this.fCurrentEntity.position] == '\n') { + final Entity.ScannedEntity fCurrentEntity2 = this.fCurrentEntity; + ++fCurrentEntity2.position; + ++offset; + } + else { + ++newlines; + } + } + else { + if (c != 10) { + final Entity.ScannedEntity fCurrentEntity3 = this.fCurrentEntity; + --fCurrentEntity3.position; + break; + } + ++newlines; + final Entity.ScannedEntity fCurrentEntity4 = this.fCurrentEntity; + ++fCurrentEntity4.lineNumber; + this.fCurrentEntity.columnNumber = 1; + if (this.fCurrentEntity.position != this.fCurrentEntity.count) { + continue; + } + offset = 0; + this.invokeListeners(newlines); + this.fCurrentEntity.position = newlines; + if (this.load(newlines, false)) { + break; + } + continue; + } + } while (this.fCurrentEntity.position < this.fCurrentEntity.count - 1); + int i; + for (i = 0, i = offset; i < this.fCurrentEntity.position; ++i) { + this.fCurrentEntity.ch[i] = '\n'; + this.whiteSpaceLookup[this.whiteSpaceLen++] = i; + } + final int length = this.fCurrentEntity.position - offset; + if (this.fCurrentEntity.position == this.fCurrentEntity.count - 1) { + content.setValues(this.fCurrentEntity.ch, offset, length); + return -1; + } + } + boolean vc = true; + while (this.fCurrentEntity.position < this.fCurrentEntity.count) { + c = this.fCurrentEntity.ch[this.fCurrentEntity.position++]; + if ((c == quote && (!this.fCurrentEntity.literal || this.isExternal)) || c == 37) { + final Entity.ScannedEntity fCurrentEntity5 = this.fCurrentEntity; + --fCurrentEntity5.position; + break; + } + if (c < 127) { + vc = XMLEntityReaderImpl.validContent[c]; + } + else { + vc = XMLChar.isContent(c); + } + if (!vc) { + final Entity.ScannedEntity fCurrentEntity6 = this.fCurrentEntity; + --fCurrentEntity6.position; + break; + } + if (!this.whiteSpaceInfoNeeded || (c != 32 && c != 9)) { + continue; + } + if (this.whiteSpaceLen < this.whiteSpaceLookup.length) { + this.whiteSpaceLookup[this.whiteSpaceLen++] = this.fCurrentEntity.position - 1; + } + else { + final int[] tmp = new int[this.whiteSpaceLookup.length + 20]; + System.arraycopy(this.whiteSpaceLookup, 0, tmp, 0, this.whiteSpaceLookup.length); + (this.whiteSpaceLookup = tmp)[this.whiteSpaceLen++] = this.fCurrentEntity.position - 1; + } + } + final int length = this.fCurrentEntity.position - offset; + final Entity.ScannedEntity fCurrentEntity7 = this.fCurrentEntity; + fCurrentEntity7.columnNumber += length - newlines; + content.setValues(this.fCurrentEntity.ch, offset, length); + if (this.fCurrentEntity.position != this.fCurrentEntity.count) { + c = this.fCurrentEntity.ch[this.fCurrentEntity.position]; + if (c == quote && this.fCurrentEntity.literal) { + c = -1; + } + } + else { + c = -1; + } + return c; + } + + public boolean scanData(final String delimiter, final XMLStringBuffer buffer) throws IOException { + boolean done = false; + final int delimLen = delimiter.length(); + final char charAt0 = delimiter.charAt(0); + do { + if (this.fCurrentEntity.position == this.fCurrentEntity.count) { + this.invokeListeners(0); + this.load(0, true); + } + else if (this.fCurrentEntity.position >= this.fCurrentEntity.count - delimLen) { + this.invokeListeners(this.fCurrentEntity.count - this.fCurrentEntity.position); + System.arraycopy(this.fCurrentEntity.ch, this.fCurrentEntity.position, this.fCurrentEntity.ch, 0, this.fCurrentEntity.count - this.fCurrentEntity.position); + this.load(this.fCurrentEntity.count - this.fCurrentEntity.position, false); + this.fCurrentEntity.position = 0; + } + if (this.fCurrentEntity.position >= this.fCurrentEntity.count - delimLen) { + this.invokeListeners(0); + final int length = this.fCurrentEntity.count - this.fCurrentEntity.position; + buffer.append(this.fCurrentEntity.ch, this.fCurrentEntity.position, length); + final Entity.ScannedEntity fCurrentEntity = this.fCurrentEntity; + fCurrentEntity.columnNumber += this.fCurrentEntity.count; + this.fCurrentEntity.position = this.fCurrentEntity.count; + this.load(0, true); + return false; + } + int offset = this.fCurrentEntity.position; + int c = this.fCurrentEntity.ch[offset]; + int newlines = 0; + if (c == 10 || (c == 13 && this.isExternal)) { + do { + c = this.fCurrentEntity.ch[this.fCurrentEntity.position++]; + if (c == 13 && this.isExternal) { + ++newlines; + final Entity.ScannedEntity fCurrentEntity2 = this.fCurrentEntity; + ++fCurrentEntity2.lineNumber; + this.fCurrentEntity.columnNumber = 1; + if (this.fCurrentEntity.position == this.fCurrentEntity.count) { + offset = 0; + this.invokeListeners(newlines); + this.fCurrentEntity.position = newlines; + if (this.load(newlines, false)) { + break; + } + } + if (this.fCurrentEntity.ch[this.fCurrentEntity.position] == '\n') { + final Entity.ScannedEntity fCurrentEntity3 = this.fCurrentEntity; + ++fCurrentEntity3.position; + ++offset; + } + else { + ++newlines; + } + } + else { + if (c != 10) { + final Entity.ScannedEntity fCurrentEntity4 = this.fCurrentEntity; + --fCurrentEntity4.position; + break; + } + ++newlines; + final Entity.ScannedEntity fCurrentEntity5 = this.fCurrentEntity; + ++fCurrentEntity5.lineNumber; + this.fCurrentEntity.columnNumber = 1; + if (this.fCurrentEntity.position != this.fCurrentEntity.count) { + continue; + } + offset = 0; + this.invokeListeners(newlines); + this.fCurrentEntity.position = newlines; + this.fCurrentEntity.count = newlines; + if (this.load(newlines, false)) { + break; + } + continue; + } + } while (this.fCurrentEntity.position < this.fCurrentEntity.count - 1); + for (int i = offset; i < this.fCurrentEntity.position; ++i) { + this.fCurrentEntity.ch[i] = '\n'; + } + final int length2 = this.fCurrentEntity.position - offset; + if (this.fCurrentEntity.position == this.fCurrentEntity.count - 1) { + buffer.append(this.fCurrentEntity.ch, offset, length2); + return true; + } + } + Label_0949: + while (this.fCurrentEntity.position < this.fCurrentEntity.count) { + c = this.fCurrentEntity.ch[this.fCurrentEntity.position++]; + if (c == charAt0) { + final int delimOffset = this.fCurrentEntity.position - 1; + for (int j = 1; j < delimLen; ++j) { + if (this.fCurrentEntity.position == this.fCurrentEntity.count) { + final Entity.ScannedEntity fCurrentEntity6 = this.fCurrentEntity; + fCurrentEntity6.position -= j; + break Label_0949; + } + c = this.fCurrentEntity.ch[this.fCurrentEntity.position++]; + if (delimiter.charAt(j) != c) { + final Entity.ScannedEntity fCurrentEntity7 = this.fCurrentEntity; + fCurrentEntity7.position -= j; + break; + } + } + if (this.fCurrentEntity.position == delimOffset + delimLen) { + done = true; + break; + } + } + else { + if (c == 10 || (this.isExternal && c == 13)) { + final Entity.ScannedEntity fCurrentEntity8 = this.fCurrentEntity; + --fCurrentEntity8.position; + break; + } + if (isInvalid(c)) { + if(XMLChar.isHighSurrogate(c)){ + this.fCurrentEntity.position--; + if (this.fCurrentEntity.position - offset > 0){ + int length2 = this.fCurrentEntity.position - offset; + final Entity.ScannedEntity fCurrentEntity10 = this.fCurrentEntity; + fCurrentEntity10.columnNumber += length2 - newlines; + buffer.append(this.fCurrentEntity.ch, offset, length2); + } + final int high = this.scanChar(); + final int low = this.peekChar(); + if (!XMLChar.isLowSurrogate(low)) { + return false; + } + int x = XMLChar.supplemental((char)high, (char)low); + if (isInvalid(x)) { + return false; + } + buffer.append((char)high); + buffer.append((char)low); + offset = ++this.fCurrentEntity.position; + break; + } + final Entity.ScannedEntity fCurrentEntity9 = this.fCurrentEntity; + --fCurrentEntity9.position; + final int length2 = this.fCurrentEntity.position - offset; + final Entity.ScannedEntity fCurrentEntity10 = this.fCurrentEntity; + fCurrentEntity10.columnNumber += length2 - newlines; + buffer.append(this.fCurrentEntity.ch, offset, length2); + return true; + } + continue; + } + } + int length2 = this.fCurrentEntity.position - offset; + if (length2 != 0){ + final Entity.ScannedEntity fCurrentEntity11 = this.fCurrentEntity; + fCurrentEntity11.columnNumber += length2 - newlines; + if (done) { + length2 -= delimLen; + } + buffer.append(this.fCurrentEntity.ch, offset, length2); + } + } while (!done); + return !done; + } + + public boolean skipChar(final int c) throws IOException { + if (this.fCurrentEntity.position == this.fCurrentEntity.count) { + this.invokeListeners(0); + this.load(0, true); + } + final int cc = this.fCurrentEntity.ch[this.fCurrentEntity.position]; + if (cc == c) { + final Entity.ScannedEntity fCurrentEntity = this.fCurrentEntity; + ++fCurrentEntity.position; + if (c == 10) { + final Entity.ScannedEntity fCurrentEntity2 = this.fCurrentEntity; + ++fCurrentEntity2.lineNumber; + this.fCurrentEntity.columnNumber = 1; + } + else { + final Entity.ScannedEntity fCurrentEntity3 = this.fCurrentEntity; + ++fCurrentEntity3.columnNumber; + } + return true; + } + if (c == 10 && cc == 13 && this.isExternal) { + if (this.fCurrentEntity.position == this.fCurrentEntity.count) { + this.invokeListeners(1); + this.fCurrentEntity.ch[0] = (char)cc; + this.load(1, false); + } + final Entity.ScannedEntity fCurrentEntity4 = this.fCurrentEntity; + ++fCurrentEntity4.position; + if (this.fCurrentEntity.ch[this.fCurrentEntity.position] == '\n') { + final Entity.ScannedEntity fCurrentEntity5 = this.fCurrentEntity; + ++fCurrentEntity5.position; + } + final Entity.ScannedEntity fCurrentEntity6 = this.fCurrentEntity; + ++fCurrentEntity6.lineNumber; + this.fCurrentEntity.columnNumber = 1; + return true; + } + return false; + } + + public boolean isSpace(final char ch) { + return ch == ' ' || ch == '\n' || ch == '\t' || ch == '\r'; + } + + public boolean skipSpaces() throws IOException { + if (this.fCurrentEntity.position == this.fCurrentEntity.count) { + this.invokeListeners(0); + this.load(0, true); + } + if (this.fCurrentEntity == null) { + return false; + } + int c = this.fCurrentEntity.ch[this.fCurrentEntity.position]; + if (XMLChar.isSpace(c)) { + do { + boolean entityChanged = false; + if (c == 10 || (this.isExternal && c == 13)) { + final Entity.ScannedEntity fCurrentEntity = this.fCurrentEntity; + ++fCurrentEntity.lineNumber; + this.fCurrentEntity.columnNumber = 1; + if (this.fCurrentEntity.position == this.fCurrentEntity.count - 1) { + this.invokeListeners(0); + this.fCurrentEntity.ch[0] = (char)c; + entityChanged = this.load(1, true); + if (!entityChanged) { + this.fCurrentEntity.position = 0; + } + else if (this.fCurrentEntity == null) { + return true; + } + } + if (c == 13 && this.isExternal && this.fCurrentEntity.ch[++this.fCurrentEntity.position] != '\n') { + final Entity.ScannedEntity fCurrentEntity2 = this.fCurrentEntity; + --fCurrentEntity2.position; + } + } + else { + final Entity.ScannedEntity fCurrentEntity3 = this.fCurrentEntity; + ++fCurrentEntity3.columnNumber; + } + if (!entityChanged) { + final Entity.ScannedEntity fCurrentEntity4 = this.fCurrentEntity; + ++fCurrentEntity4.position; + } + if (this.fCurrentEntity.position == this.fCurrentEntity.count) { + this.invokeListeners(0); + this.load(0, true); + if (this.fCurrentEntity == null) { + return true; + } + continue; + } + } while (XMLChar.isSpace(c = this.fCurrentEntity.ch[this.fCurrentEntity.position])); + return true; + } + return false; + } + + public boolean arrangeCapacity(final int length) throws IOException { + return this.arrangeCapacity(length, false); + } + + public boolean arrangeCapacity(final int length, final boolean changeEntity) throws IOException { + if (this.fCurrentEntity.count - this.fCurrentEntity.position >= length) { + return true; + } + boolean entityChanged = false; + while (this.fCurrentEntity.count - this.fCurrentEntity.position < length) { + if (this.fCurrentEntity.ch.length - this.fCurrentEntity.position < length) { + this.invokeListeners(0); + System.arraycopy(this.fCurrentEntity.ch, this.fCurrentEntity.position, this.fCurrentEntity.ch, 0, this.fCurrentEntity.count - this.fCurrentEntity.position); + final Entity.ScannedEntity fCurrentEntity = this.fCurrentEntity; + fCurrentEntity.count -= this.fCurrentEntity.position; + this.fCurrentEntity.position = 0; + } + if (this.fCurrentEntity.count - this.fCurrentEntity.position < length) { + final int pos = this.fCurrentEntity.position; + this.invokeListeners(pos); + entityChanged = this.load(this.fCurrentEntity.count, changeEntity); + this.fCurrentEntity.position = pos; + if (entityChanged) { + break; + } + continue; + } + } + return this.fCurrentEntity.count - this.fCurrentEntity.position >= length; + } + + public boolean skipString(final String s) throws IOException { + final int length = s.length(); + if (this.arrangeCapacity(length, false)) { + final int beforeSkip = this.fCurrentEntity.position; + int afterSkip = this.fCurrentEntity.position + length - 1; + int i = length - 1; + while (s.charAt(i--) == this.fCurrentEntity.ch[afterSkip]) { + if (afterSkip-- == beforeSkip) { + this.fCurrentEntity.position += length; + final Entity.ScannedEntity fCurrentEntity = this.fCurrentEntity; + fCurrentEntity.columnNumber += length; + return true; + } + } + } + return false; + } + + public boolean skipString(final char[] s) throws IOException { + final int length = s.length; + if (this.arrangeCapacity(length, false)) { + int beforeSkip = this.fCurrentEntity.position; + final int afterSkip = this.fCurrentEntity.position + length; + for (int i = 0; i < length; ++i) { + if (this.fCurrentEntity.ch[beforeSkip++] != s[i]) { + return false; + } + } + this.fCurrentEntity.position += length; + final Entity.ScannedEntity fCurrentEntity = this.fCurrentEntity; + fCurrentEntity.columnNumber += length; + return true; + } + return false; + } + + final boolean load(final int offset, final boolean changeEntity) throws IOException { + this.fCurrentEntity.fTotalCountTillLastLoad += this.fCurrentEntity.fLastCount; + final int length = this.fCurrentEntity.mayReadChunks ? (this.fCurrentEntity.ch.length - offset) : 64; + final int count = this.fCurrentEntity.reader.read(this.fCurrentEntity.ch, offset, length); + boolean entityChanged = false; + if (count != -1) { + if (count != 0) { + this.fCurrentEntity.fLastCount = count; + this.fCurrentEntity.count = count + offset; + this.fCurrentEntity.position = offset; + } + } + else { + this.fCurrentEntity.count = offset; + this.fCurrentEntity.position = offset; + entityChanged = true; + if (changeEntity) { + this.fEntityManager.endEntity(); + if (this.fCurrentEntity == null) { + return true; + } + if (this.fCurrentEntity.position == this.fCurrentEntity.count) { + this.load(0, true); + } + } + } + return entityChanged; + } + + protected Reader createReader(final InputStream inputStream, String encoding, final Boolean isBigEndian) throws IOException { + if (encoding == null) { + encoding = "UTF-8"; + } + final String ENCODING = encoding.toUpperCase(Locale.ENGLISH); + if (ENCODING.equals("UTF-8")) { + return new UTF8Reader(inputStream, this.fCurrentEntity.fBufferSize, this.fErrorReporter.getMessageFormatter("http://www.w3.org/TR/1998/REC-xml-19980210"), this.fErrorReporter.getLocale()); + } + if (ENCODING.equals("US-ASCII")) { + return new ASCIIReader(inputStream, this.fCurrentEntity.fBufferSize, this.fErrorReporter.getMessageFormatter("http://www.w3.org/TR/1998/REC-xml-19980210"), this.fErrorReporter.getLocale()); + } + if (ENCODING.equals("ISO-10646-UCS-4")) { + if (isBigEndian != null) { + final boolean isBE = isBigEndian; + if (isBE) { + return new UCSReader(inputStream, (short)8); + } + return new UCSReader(inputStream, (short)4); + } + else { + this.fErrorReporter.reportError("http://www.w3.org/TR/1998/REC-xml-19980210", "EncodingByteOrderUnsupported", new Object[] { encoding }, (short)2); + } + } + if (ENCODING.equals("ISO-10646-UCS-2")) { + if (isBigEndian != null) { + final boolean isBE = isBigEndian; + if (isBE) { + return new UCSReader(inputStream, (short)2); + } + return new UCSReader(inputStream, (short)1); + } + else { + this.fErrorReporter.reportError("http://www.w3.org/TR/1998/REC-xml-19980210", "EncodingByteOrderUnsupported", new Object[] { encoding }, (short)2); + } + } + final boolean validIANA = XMLChar.isValidIANAEncoding(encoding); + final boolean validJava = XMLChar.isValidJavaEncoding(encoding); + if (!validIANA || (this.fAllowJavaEncodings && !validJava)) { + this.fErrorReporter.reportError("http://www.w3.org/TR/1998/REC-xml-19980210", "EncodingDeclInvalid", new Object[] { encoding }, (short)2); + encoding = "ISO-8859-1"; + } + String javaEncoding = EncodingMap.getIANA2JavaMapping(ENCODING); + if (javaEncoding == null) { + if (this.fAllowJavaEncodings) { + javaEncoding = encoding; + } + else { + this.fErrorReporter.reportError("http://www.w3.org/TR/1998/REC-xml-19980210", "EncodingDeclInvalid", new Object[] { encoding }, (short)2); + javaEncoding = "ISO8859_1"; + } + } + return new InputStreamReader(inputStream, javaEncoding); + } + + protected Object[] getEncodingName(final byte[] b4, final int count) { + if (count < 2) { + return new Object[] { "UTF-8", null }; + } + final int b5 = b4[0] & 0xFF; + final int b6 = b4[1] & 0xFF; + if (b5 == 254 && b6 == 255) { + return new Object[] { "UTF-16BE", new Boolean(true) }; + } + if (b5 == 255 && b6 == 254) { + return new Object[] { "UTF-16LE", new Boolean(false) }; + } + if (count < 3) { + return new Object[] { "UTF-8", null }; + } + final int b7 = b4[2] & 0xFF; + if (b5 == 239 && b6 == 187 && b7 == 191) { + return new Object[] { "UTF-8", null }; + } + if (count < 4) { + return new Object[] { "UTF-8", null }; + } + final int b8 = b4[3] & 0xFF; + if (b5 == 0 && b6 == 0 && b7 == 0 && b8 == 60) { + return new Object[] { "ISO-10646-UCS-4", new Boolean(true) }; + } + if (b5 == 60 && b6 == 0 && b7 == 0 && b8 == 0) { + return new Object[] { "ISO-10646-UCS-4", new Boolean(false) }; + } + if (b5 == 0 && b6 == 0 && b7 == 60 && b8 == 0) { + return new Object[] { "ISO-10646-UCS-4", null }; + } + if (b5 == 0 && b6 == 60 && b7 == 0 && b8 == 0) { + return new Object[] { "ISO-10646-UCS-4", null }; + } + if (b5 == 0 && b6 == 60 && b7 == 0 && b8 == 63) { + return new Object[] { "UTF-16BE", new Boolean(true) }; + } + if (b5 == 60 && b6 == 0 && b7 == 63 && b8 == 0) { + return new Object[] { "UTF-16LE", new Boolean(false) }; + } + if (b5 == 76 && b6 == 111 && b7 == 167 && b8 == 148) { + return new Object[] { "CP037", null }; + } + return new Object[] { "UTF-8", null }; + } + + final void print() { + } + + public void registerListener(final XMLBufferListener listener) { + if (!this.listeners.contains(listener)) { + this.listeners.add(listener); + } + } + + private void invokeListeners(final int loadPos) { + for (int i = 0; i < this.listeners.size(); ++i) { + final XMLBufferListener listener = (XMLBufferListener) this.listeners.get(i); + listener.refresh(loadPos); + } + } +}