325N/A/*
325N/A * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
325N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
325N/A *
325N/A * This code is free software; you can redistribute it and/or modify it
325N/A * under the terms of the GNU General Public License version 2 only, as
325N/A * published by the Free Software Foundation. Oracle designates this
325N/A * particular file as subject to the "Classpath" exception as provided
325N/A * by Oracle in the LICENSE file that accompanied this code.
325N/A *
325N/A * This code is distributed in the hope that it will be useful, but WITHOUT
325N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
325N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
325N/A * version 2 for more details (a copy is included in the LICENSE file that
325N/A * accompanied this code).
325N/A *
325N/A * You should have received a copy of the GNU General Public License version
325N/A * 2 along with this work; if not, write to the Free Software Foundation,
325N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
325N/A *
325N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
325N/A * or visit www.oracle.com if you need additional information or have any
325N/A * questions.
325N/A *
325N/A * THIS FILE WAS MODIFIED BY SUN MICROSYSTEMS, INC.
325N/A */
325N/A
325N/Apackage com.sun.xml.internal.fastinfoset.stax;
325N/A
325N/Aimport com.sun.xml.internal.fastinfoset.Decoder;
325N/Aimport com.sun.xml.internal.fastinfoset.DecoderStateTables;
325N/Aimport com.sun.xml.internal.fastinfoset.EncodingConstants;
325N/Aimport com.sun.xml.internal.fastinfoset.OctetBufferListener;
325N/Aimport com.sun.xml.internal.fastinfoset.QualifiedName;
325N/Aimport com.sun.xml.internal.fastinfoset.algorithm.BuiltInEncodingAlgorithmFactory;
325N/Aimport com.sun.xml.internal.fastinfoset.sax.AttributesHolder;
325N/Aimport com.sun.xml.internal.fastinfoset.util.CharArray;
325N/Aimport com.sun.xml.internal.fastinfoset.util.CharArrayString;
325N/Aimport java.io.IOException;
325N/Aimport java.io.InputStream;
325N/Aimport java.util.Iterator;
325N/Aimport java.util.NoSuchElementException;
325N/Aimport javax.xml.namespace.NamespaceContext;
325N/Aimport javax.xml.namespace.QName;
325N/Aimport javax.xml.stream.Location;
325N/Aimport javax.xml.stream.XMLStreamException;
325N/Aimport javax.xml.stream.XMLStreamReader;
325N/Aimport com.sun.xml.internal.org.jvnet.fastinfoset.EncodingAlgorithm;
325N/Aimport com.sun.xml.internal.org.jvnet.fastinfoset.EncodingAlgorithmException;
325N/Aimport com.sun.xml.internal.org.jvnet.fastinfoset.EncodingAlgorithmIndexes;
325N/Aimport com.sun.xml.internal.org.jvnet.fastinfoset.FastInfosetException;
325N/Aimport com.sun.xml.internal.fastinfoset.CommonResourceBundle;
325N/Aimport com.sun.xml.internal.fastinfoset.org.apache.xerces.util.XMLChar;
325N/Aimport com.sun.xml.internal.fastinfoset.util.DuplicateAttributeVerifier;
325N/Aimport java.util.logging.Level;
325N/Aimport java.util.logging.Logger;
325N/Aimport com.sun.xml.internal.org.jvnet.fastinfoset.stax.FastInfosetStreamReader;
325N/A
325N/A/**
325N/A * The Fast Infoset StAX parser.
325N/A * <p>
325N/A * Instantiate this parser to parse a fast infoset document in accordance
325N/A * with the StAX API.
325N/A *
325N/A * <p>
325N/A * More than one fast infoset document may be decoded from the
325N/A * {@link java.io.InputStream}.
325N/A */
325N/Apublic class StAXDocumentParser extends Decoder
325N/A implements XMLStreamReader, FastInfosetStreamReader, OctetBufferListener {
325N/A private static final Logger logger = Logger.getLogger(StAXDocumentParser.class.getName());
325N/A
325N/A protected static final int INTERNAL_STATE_START_DOCUMENT = 0;
325N/A protected static final int INTERNAL_STATE_START_ELEMENT_TERMINATE = 1;
325N/A protected static final int INTERNAL_STATE_SINGLE_TERMINATE_ELEMENT_WITH_NAMESPACES = 2;
325N/A protected static final int INTERNAL_STATE_DOUBLE_TERMINATE_ELEMENT = 3;
325N/A protected static final int INTERNAL_STATE_END_DOCUMENT = 4;
325N/A protected static final int INTERNAL_STATE_VOID = -1;
325N/A
325N/A protected int _internalState;
325N/A
325N/A /**
325N/A * Current event
325N/A */
325N/A protected int _eventType;
325N/A
325N/A /**
325N/A * Stack of qualified names and namespaces
325N/A */
325N/A protected QualifiedName[] _qNameStack = new QualifiedName[32];
325N/A protected int[] _namespaceAIIsStartStack = new int[32];
325N/A protected int[] _namespaceAIIsEndStack = new int[32];
325N/A protected int _stackCount = -1;
325N/A
325N/A protected String[] _namespaceAIIsPrefix = new String[32];
325N/A protected String[] _namespaceAIIsNamespaceName = new String[32];
325N/A protected int[] _namespaceAIIsPrefixIndex = new int[32];
325N/A protected int _namespaceAIIsIndex;
325N/A
325N/A /**
325N/A * Namespaces associated with START_ELEMENT or END_ELEMENT
325N/A */
325N/A protected int _currentNamespaceAIIsStart;
325N/A protected int _currentNamespaceAIIsEnd;
325N/A
325N/A /**
325N/A * Qualified name associated with START_ELEMENT or END_ELEMENT.
325N/A */
325N/A protected QualifiedName _qualifiedName;
325N/A
325N/A /**
325N/A * List of attributes
325N/A */
325N/A protected AttributesHolder _attributes = new AttributesHolder();
325N/A
325N/A protected boolean _clearAttributes = false;
325N/A
325N/A /**
325N/A * Characters associated with event.
325N/A */
325N/A protected char[] _characters;
325N/A protected int _charactersOffset;
325N/A
325N/A protected String _algorithmURI;
325N/A protected int _algorithmId;
325N/A protected boolean _isAlgorithmDataCloned;
325N/A protected byte[] _algorithmData;
325N/A protected int _algorithmDataOffset;
325N/A protected int _algorithmDataLength;
325N/A
325N/A /**
325N/A * State for processing instruction
325N/A */
325N/A protected String _piTarget;
325N/A protected String _piData;
325N/A
325N/A protected NamespaceContextImpl _nsContext = new NamespaceContextImpl();
325N/A
325N/A protected String _characterEncodingScheme;
325N/A
325N/A protected StAXManager _manager;
325N/A
325N/A public StAXDocumentParser() {
325N/A reset();
325N/A _manager = new StAXManager(StAXManager.CONTEXT_READER);
325N/A }
325N/A
325N/A public StAXDocumentParser(InputStream s) {
325N/A this();
325N/A setInputStream(s);
325N/A _manager = new StAXManager(StAXManager.CONTEXT_READER);
325N/A }
325N/A
325N/A public StAXDocumentParser(InputStream s, StAXManager manager) {
325N/A this(s);
325N/A _manager = manager;
325N/A }
325N/A
325N/A @Override
325N/A public void setInputStream(InputStream s) {
325N/A super.setInputStream(s);
325N/A reset();
325N/A }
325N/A
325N/A @Override
325N/A public void reset() {
325N/A super.reset();
325N/A if (_internalState != INTERNAL_STATE_START_DOCUMENT &&
325N/A _internalState != INTERNAL_STATE_END_DOCUMENT) {
325N/A
325N/A for (int i = _namespaceAIIsIndex - 1; i >= 0; i--) {
325N/A _prefixTable.popScopeWithPrefixEntry(_namespaceAIIsPrefixIndex[i]);
325N/A }
325N/A
325N/A _stackCount = -1;
325N/A
325N/A _namespaceAIIsIndex = 0;
325N/A _characters = null;
325N/A _algorithmData = null;
325N/A }
325N/A
325N/A _characterEncodingScheme = "UTF-8";
325N/A _eventType = START_DOCUMENT;
325N/A _internalState = INTERNAL_STATE_START_DOCUMENT;
325N/A }
325N/A
325N/A protected void resetOnError() {
325N/A super.reset();
325N/A
325N/A if (_v != null) {
325N/A _prefixTable.clearCompletely();
325N/A }
325N/A _duplicateAttributeVerifier.clear();
325N/A
325N/A _stackCount = -1;
325N/A
325N/A _namespaceAIIsIndex = 0;
325N/A _characters = null;
325N/A _algorithmData = null;
325N/A
325N/A _eventType = START_DOCUMENT;
325N/A _internalState = INTERNAL_STATE_START_DOCUMENT;
325N/A }
325N/A
325N/A // -- XMLStreamReader Interface -------------------------------------------
325N/A
325N/A public Object getProperty(java.lang.String name)
325N/A throws java.lang.IllegalArgumentException {
325N/A if (_manager != null) {
325N/A return _manager.getProperty(name);
325N/A }
325N/A return null;
325N/A }
325N/A
325N/A public int next() throws XMLStreamException {
325N/A try {
325N/A if (_internalState != INTERNAL_STATE_VOID) {
325N/A switch (_internalState) {
325N/A case INTERNAL_STATE_START_DOCUMENT:
325N/A decodeHeader();
325N/A processDII();
325N/A
325N/A _internalState = INTERNAL_STATE_VOID;
325N/A break;
325N/A case INTERNAL_STATE_START_ELEMENT_TERMINATE:
325N/A if (_currentNamespaceAIIsEnd > 0) {
325N/A for (int i = _currentNamespaceAIIsEnd - 1; i >= _currentNamespaceAIIsStart; i--) {
325N/A _prefixTable.popScopeWithPrefixEntry(_namespaceAIIsPrefixIndex[i]);
325N/A }
325N/A _namespaceAIIsIndex = _currentNamespaceAIIsStart;
325N/A }
325N/A
325N/A // Pop information off the stack
325N/A popStack();
325N/A
325N/A _internalState = INTERNAL_STATE_VOID;
325N/A return _eventType = END_ELEMENT;
325N/A case INTERNAL_STATE_SINGLE_TERMINATE_ELEMENT_WITH_NAMESPACES:
325N/A // Undeclare namespaces
325N/A for (int i = _currentNamespaceAIIsEnd - 1; i >= _currentNamespaceAIIsStart; i--) {
325N/A _prefixTable.popScopeWithPrefixEntry(_namespaceAIIsPrefixIndex[i]);
325N/A }
325N/A _namespaceAIIsIndex = _currentNamespaceAIIsStart;
325N/A _internalState = INTERNAL_STATE_VOID;
325N/A break;
325N/A case INTERNAL_STATE_DOUBLE_TERMINATE_ELEMENT:
325N/A // Undeclare namespaces
325N/A if (_currentNamespaceAIIsEnd > 0) {
325N/A for (int i = _currentNamespaceAIIsEnd - 1; i >= _currentNamespaceAIIsStart; i--) {
325N/A _prefixTable.popScopeWithPrefixEntry(_namespaceAIIsPrefixIndex[i]);
325N/A }
325N/A _namespaceAIIsIndex = _currentNamespaceAIIsStart;
325N/A }
325N/A
325N/A if (_stackCount == -1) {
325N/A _internalState = INTERNAL_STATE_END_DOCUMENT;
325N/A return _eventType = END_DOCUMENT;
325N/A }
325N/A
325N/A // Pop information off the stack
325N/A popStack();
325N/A
325N/A _internalState = (_currentNamespaceAIIsEnd > 0) ?
325N/A INTERNAL_STATE_SINGLE_TERMINATE_ELEMENT_WITH_NAMESPACES :
325N/A INTERNAL_STATE_VOID;
325N/A return _eventType = END_ELEMENT;
325N/A case INTERNAL_STATE_END_DOCUMENT:
325N/A throw new NoSuchElementException(CommonResourceBundle.getInstance().getString("message.noMoreEvents"));
325N/A }
325N/A }
325N/A
325N/A // Reset internal state
325N/A _characters = null;
325N/A _algorithmData = null;
325N/A _currentNamespaceAIIsEnd = 0;
325N/A
325N/A // Process information item
325N/A final int b = read();
325N/A switch(DecoderStateTables.EII(b)) {
325N/A case DecoderStateTables.EII_NO_AIIS_INDEX_SMALL:
325N/A processEII(_elementNameTable._array[b], false);
325N/A return _eventType;
325N/A case DecoderStateTables.EII_AIIS_INDEX_SMALL:
325N/A processEII(_elementNameTable._array[b & EncodingConstants.INTEGER_3RD_BIT_SMALL_MASK], true);
325N/A return _eventType;
325N/A case DecoderStateTables.EII_INDEX_MEDIUM:
325N/A processEII(processEIIIndexMedium(b), (b & EncodingConstants.ELEMENT_ATTRIBUTE_FLAG) > 0);
325N/A return _eventType;
325N/A case DecoderStateTables.EII_INDEX_LARGE:
325N/A processEII(processEIIIndexLarge(b), (b & EncodingConstants.ELEMENT_ATTRIBUTE_FLAG) > 0);
325N/A return _eventType;
325N/A case DecoderStateTables.EII_LITERAL:
325N/A {
325N/A final QualifiedName qn = processLiteralQualifiedName(
325N/A b & EncodingConstants.LITERAL_QNAME_PREFIX_NAMESPACE_NAME_MASK,
325N/A _elementNameTable.getNext());
325N/A _elementNameTable.add(qn);
325N/A processEII(qn, (b & EncodingConstants.ELEMENT_ATTRIBUTE_FLAG) > 0);
325N/A return _eventType;
325N/A }
325N/A case DecoderStateTables.EII_NAMESPACES:
325N/A processEIIWithNamespaces((b & EncodingConstants.ELEMENT_ATTRIBUTE_FLAG) > 0);
325N/A return _eventType;
325N/A case DecoderStateTables.CII_UTF8_SMALL_LENGTH:
325N/A _octetBufferLength = (b & EncodingConstants.OCTET_STRING_LENGTH_7TH_BIT_SMALL_MASK)
325N/A + 1;
325N/A processUtf8CharacterString(b);
325N/A return _eventType = CHARACTERS;
325N/A case DecoderStateTables.CII_UTF8_MEDIUM_LENGTH:
325N/A _octetBufferLength = read() + EncodingConstants.OCTET_STRING_LENGTH_7TH_BIT_SMALL_LIMIT;
325N/A processUtf8CharacterString(b);
325N/A return _eventType = CHARACTERS;
325N/A case DecoderStateTables.CII_UTF8_LARGE_LENGTH:
325N/A _octetBufferLength = ((read() << 24) |
325N/A (read() << 16) |
325N/A (read() << 8) |
325N/A read())
325N/A + EncodingConstants.OCTET_STRING_LENGTH_7TH_BIT_MEDIUM_LIMIT;
325N/A processUtf8CharacterString(b);
325N/A return _eventType = CHARACTERS;
325N/A case DecoderStateTables.CII_UTF16_SMALL_LENGTH:
325N/A _octetBufferLength = (b & EncodingConstants.OCTET_STRING_LENGTH_7TH_BIT_SMALL_MASK)
325N/A + 1;
325N/A processUtf16CharacterString(b);
325N/A return _eventType = CHARACTERS;
325N/A case DecoderStateTables.CII_UTF16_MEDIUM_LENGTH:
325N/A _octetBufferLength = read() + EncodingConstants.OCTET_STRING_LENGTH_7TH_BIT_SMALL_LIMIT;
325N/A processUtf16CharacterString(b);
325N/A return _eventType = CHARACTERS;
325N/A case DecoderStateTables.CII_UTF16_LARGE_LENGTH:
325N/A _octetBufferLength = ((read() << 24) |
325N/A (read() << 16) |
325N/A (read() << 8) |
325N/A read())
325N/A + EncodingConstants.OCTET_STRING_LENGTH_7TH_BIT_MEDIUM_LIMIT;
325N/A processUtf16CharacterString(b);
325N/A return _eventType = CHARACTERS;
325N/A case DecoderStateTables.CII_RA:
325N/A {
325N/A final boolean addToTable = (b & EncodingConstants.CHARACTER_CHUNK_ADD_TO_TABLE_FLAG) > 0;
325N/A
325N/A _identifier = (b & 0x02) << 6;
325N/A final int b2 = read();
325N/A _identifier |= (b2 & 0xFC) >> 2;
325N/A
325N/A decodeOctetsOnSeventhBitOfNonIdentifyingStringOnThirdBit(b2);
325N/A
325N/A decodeRestrictedAlphabetAsCharBuffer();
325N/A
325N/A if (addToTable) {
325N/A _charactersOffset = _characterContentChunkTable.add(_charBuffer, _charBufferLength);
325N/A _characters = _characterContentChunkTable._array;
325N/A } else {
325N/A _characters = _charBuffer;
325N/A _charactersOffset = 0;
325N/A }
325N/A return _eventType = CHARACTERS;
325N/A }
325N/A case DecoderStateTables.CII_EA:
325N/A {
325N/A final boolean addToTable = (b & EncodingConstants.CHARACTER_CHUNK_ADD_TO_TABLE_FLAG) > 0;
325N/A // Decode encoding algorithm integer
325N/A _algorithmId = (b & 0x02) << 6;
325N/A final int b2 = read();
325N/A _algorithmId |= (b2 & 0xFC) >> 2;
325N/A
325N/A decodeOctetsOnSeventhBitOfNonIdentifyingStringOnThirdBit(b2);
325N/A processCIIEncodingAlgorithm(addToTable);
325N/A
325N/A if (_algorithmId == EncodingAlgorithmIndexes.CDATA) {
325N/A return _eventType = CDATA;
325N/A }
325N/A
325N/A return _eventType = CHARACTERS;
325N/A }
325N/A case DecoderStateTables.CII_INDEX_SMALL:
325N/A {
325N/A final int index = b & EncodingConstants.INTEGER_4TH_BIT_SMALL_MASK;
325N/A _characterContentChunkTable._cachedIndex = index;
325N/A
325N/A _characters = _characterContentChunkTable._array;
325N/A _charactersOffset = _characterContentChunkTable._offset[index];
325N/A _charBufferLength = _characterContentChunkTable._length[index];
325N/A return _eventType = CHARACTERS;
325N/A }
325N/A case DecoderStateTables.CII_INDEX_MEDIUM:
325N/A {
325N/A final int index = (((b & EncodingConstants.INTEGER_4TH_BIT_MEDIUM_MASK) << 8) | read())
325N/A + EncodingConstants.INTEGER_4TH_BIT_SMALL_LIMIT;
325N/A _characterContentChunkTable._cachedIndex = index;
325N/A
325N/A _characters = _characterContentChunkTable._array;
325N/A _charactersOffset = _characterContentChunkTable._offset[index];
325N/A _charBufferLength = _characterContentChunkTable._length[index];
325N/A return _eventType = CHARACTERS;
325N/A }
325N/A case DecoderStateTables.CII_INDEX_LARGE:
325N/A {
325N/A final int index = (((b & EncodingConstants.INTEGER_4TH_BIT_LARGE_MASK) << 16) |
325N/A (read() << 8) |
325N/A read())
325N/A + EncodingConstants.INTEGER_4TH_BIT_MEDIUM_LIMIT;
325N/A _characterContentChunkTable._cachedIndex = index;
325N/A
325N/A _characters = _characterContentChunkTable._array;
325N/A _charactersOffset = _characterContentChunkTable._offset[index];
325N/A _charBufferLength = _characterContentChunkTable._length[index];
325N/A return _eventType = CHARACTERS;
325N/A }
325N/A case DecoderStateTables.CII_INDEX_LARGE_LARGE:
325N/A {
325N/A final int index = ((read() << 16) |
325N/A (read() << 8) |
325N/A read())
325N/A + EncodingConstants.INTEGER_4TH_BIT_LARGE_LIMIT;
325N/A _characterContentChunkTable._cachedIndex = index;
325N/A
325N/A _characters = _characterContentChunkTable._array;
325N/A _charactersOffset = _characterContentChunkTable._offset[index];
325N/A _charBufferLength = _characterContentChunkTable._length[index];
325N/A return _eventType = CHARACTERS;
325N/A }
325N/A case DecoderStateTables.COMMENT_II:
325N/A processCommentII();
325N/A return _eventType;
325N/A case DecoderStateTables.PROCESSING_INSTRUCTION_II:
325N/A processProcessingII();
325N/A return _eventType;
325N/A case DecoderStateTables.UNEXPANDED_ENTITY_REFERENCE_II:
325N/A {
325N/A processUnexpandedEntityReference(b);
325N/A // Skip the reference
325N/A return next();
325N/A }
325N/A case DecoderStateTables.TERMINATOR_DOUBLE:
325N/A if (_stackCount != -1) {
325N/A // Pop information off the stack
325N/A popStack();
325N/A
325N/A _internalState = INTERNAL_STATE_DOUBLE_TERMINATE_ELEMENT;
325N/A return _eventType = END_ELEMENT;
325N/A }
325N/A
325N/A _internalState = INTERNAL_STATE_END_DOCUMENT;
325N/A return _eventType = END_DOCUMENT;
325N/A case DecoderStateTables.TERMINATOR_SINGLE:
325N/A if (_stackCount != -1) {
325N/A // Pop information off the stack
325N/A popStack();
325N/A
325N/A if (_currentNamespaceAIIsEnd > 0) {
325N/A _internalState = INTERNAL_STATE_SINGLE_TERMINATE_ELEMENT_WITH_NAMESPACES;
325N/A }
325N/A return _eventType = END_ELEMENT;
325N/A }
325N/A
325N/A _internalState = INTERNAL_STATE_END_DOCUMENT;
325N/A return _eventType = END_DOCUMENT;
325N/A default:
325N/A throw new FastInfosetException(CommonResourceBundle.getInstance().getString("message.IllegalStateDecodingEII"));
325N/A }
325N/A } catch (IOException e) {
325N/A resetOnError();
325N/A logger.log(Level.FINE, "next() exception", e);
325N/A throw new XMLStreamException(e);
325N/A } catch (FastInfosetException e) {
325N/A resetOnError();
325N/A logger.log(Level.FINE, "next() exception", e);
325N/A throw new XMLStreamException(e);
325N/A } catch (RuntimeException e) {
325N/A resetOnError();
325N/A logger.log(Level.FINE, "next() exception", e);
325N/A throw e;
325N/A }
325N/A }
325N/A
325N/A private final void processUtf8CharacterString(final int b) throws IOException {
325N/A if ((b & EncodingConstants.CHARACTER_CHUNK_ADD_TO_TABLE_FLAG) > 0) {
325N/A _characterContentChunkTable.ensureSize(_octetBufferLength);
325N/A _characters = _characterContentChunkTable._array;
325N/A _charactersOffset = _characterContentChunkTable._arrayIndex;
325N/A decodeUtf8StringAsCharBuffer(_characterContentChunkTable._array, _charactersOffset);
325N/A _characterContentChunkTable.add(_charBufferLength);
325N/A } else {
325N/A decodeUtf8StringAsCharBuffer();
325N/A _characters = _charBuffer;
325N/A _charactersOffset = 0;
325N/A }
325N/A }
325N/A
325N/A private final void processUtf16CharacterString(final int b) throws IOException {
325N/A decodeUtf16StringAsCharBuffer();
325N/A if ((b & EncodingConstants.CHARACTER_CHUNK_ADD_TO_TABLE_FLAG) > 0) {
325N/A _charactersOffset = _characterContentChunkTable.add(_charBuffer, _charBufferLength);
325N/A _characters = _characterContentChunkTable._array;
325N/A } else {
325N/A _characters = _charBuffer;
325N/A _charactersOffset = 0;
325N/A }
325N/A }
325N/A
325N/A private final void popStack() {
325N/A // Pop information off the stack
325N/A _qualifiedName = _qNameStack[_stackCount];
325N/A _currentNamespaceAIIsStart = _namespaceAIIsStartStack[_stackCount];
325N/A _currentNamespaceAIIsEnd = _namespaceAIIsEndStack[_stackCount];
325N/A _qNameStack[_stackCount--] = null;
325N/A }
325N/A
325N/A /** Test if the current event is of the given type and if the namespace and name match the current namespace and name of the current event.
325N/A * If the namespaceURI is null it is not checked for equality, if the localName is null it is not checked for equality.
325N/A * @param type the event type
325N/A * @param namespaceURI the uri of the event, may be null
325N/A * @param localName the localName of the event, may be null
325N/A * @throws XMLStreamException if the required values are not matched.
325N/A */
325N/A public final void require(int type, String namespaceURI, String localName)
325N/A throws XMLStreamException {
325N/A if( type != _eventType)
325N/A throw new XMLStreamException(CommonResourceBundle.getInstance().getString("message.eventTypeNotMatch", new Object[]{getEventTypeString(type)}));
325N/A if( namespaceURI != null && !namespaceURI.equals(getNamespaceURI()) )
325N/A throw new XMLStreamException(CommonResourceBundle.getInstance().getString("message.namespaceURINotMatch", new Object[]{namespaceURI}));
325N/A if(localName != null && !localName.equals(getLocalName()))
325N/A throw new XMLStreamException(CommonResourceBundle.getInstance().getString("message.localNameNotMatch", new Object[]{localName}));
325N/A
325N/A return;
325N/A }
325N/A
325N/A /** Reads the content of a text-only element. Precondition:
325N/A * the current event is START_ELEMENT. Postcondition:
325N/A * The current event is the corresponding END_ELEMENT.
325N/A * @throws XMLStreamException if the current event is not a START_ELEMENT or if
325N/A * a non text element is encountered
325N/A */
325N/A public final String getElementText() throws XMLStreamException {
325N/A
325N/A if(getEventType() != START_ELEMENT) {
325N/A throw new XMLStreamException(
325N/A CommonResourceBundle.getInstance().getString("message.mustBeOnSTARTELEMENT"), getLocation());
325N/A }
325N/A //current is StartElement, move to the next
325N/A next();
325N/A return getElementText(true);
325N/A }
325N/A /**
325N/A * @param startElementRead flag if start element has already been read
325N/A */
325N/A public final String getElementText(boolean startElementRead) throws XMLStreamException {
325N/A if (!startElementRead) {
325N/A throw new XMLStreamException(
325N/A CommonResourceBundle.getInstance().getString("message.mustBeOnSTARTELEMENT"), getLocation());
325N/A }
325N/A int eventType = getEventType();
325N/A StringBuffer content = new StringBuffer();
325N/A while(eventType != END_ELEMENT ) {
325N/A if(eventType == CHARACTERS
325N/A || eventType == CDATA
325N/A || eventType == SPACE
325N/A || eventType == ENTITY_REFERENCE) {
325N/A content.append(getText());
325N/A } else if(eventType == PROCESSING_INSTRUCTION
325N/A || eventType == COMMENT) {
325N/A // skipping
325N/A } else if(eventType == END_DOCUMENT) {
325N/A throw new XMLStreamException(CommonResourceBundle.getInstance().getString("message.unexpectedEOF"));
325N/A } else if(eventType == START_ELEMENT) {
325N/A throw new XMLStreamException(
325N/A CommonResourceBundle.getInstance().getString("message.getElementTextExpectTextOnly"), getLocation());
325N/A } else {
325N/A throw new XMLStreamException(
325N/A CommonResourceBundle.getInstance().getString("message.unexpectedEventType")+ getEventTypeString(eventType), getLocation());
325N/A }
325N/A eventType = next();
325N/A }
325N/A return content.toString();
325N/A }
325N/A
325N/A /** Skips any white space (isWhiteSpace() returns true), COMMENT,
325N/A * or PROCESSING_INSTRUCTION,
325N/A * until a START_ELEMENT or END_ELEMENT is reached.
325N/A * If other than white space characters, COMMENT, PROCESSING_INSTRUCTION, START_ELEMENT, END_ELEMENT
325N/A * are encountered, an exception is thrown. This method should
325N/A * be used when processing element-only content seperated by white space.
325N/A * This method should
325N/A * be used when processing element-only content because
325N/A * the parser is not able to recognize ignorable whitespace if
325N/A * then DTD is missing or not interpreted.
325N/A * @return the event type of the element read
325N/A * @throws XMLStreamException if the current event is not white space
325N/A */
325N/A public final int nextTag() throws XMLStreamException {
325N/A next();
325N/A return nextTag(true);
325N/A }
325N/A /** if the current tag has already read, such as in the case EventReader's
325N/A * peek() has been called, the current cursor should not move before the loop
325N/A */
325N/A public final int nextTag(boolean currentTagRead) throws XMLStreamException {
325N/A int eventType = getEventType();
325N/A if (!currentTagRead) {
325N/A eventType = next();
325N/A }
325N/A while((eventType == CHARACTERS && isWhiteSpace()) // skip whitespace
325N/A || (eventType == CDATA && isWhiteSpace())
325N/A || eventType == SPACE
325N/A || eventType == PROCESSING_INSTRUCTION
325N/A || eventType == COMMENT) {
325N/A eventType = next();
325N/A }
325N/A if (eventType != START_ELEMENT && eventType != END_ELEMENT) {
325N/A throw new XMLStreamException(CommonResourceBundle.getInstance().getString("message.expectedStartOrEnd"), getLocation());
325N/A }
325N/A return eventType;
325N/A }
325N/A
325N/A public final boolean hasNext() throws XMLStreamException {
325N/A return (_eventType != END_DOCUMENT);
325N/A }
325N/A
325N/A public void close() throws XMLStreamException {
325N/A try {
325N/A super.closeIfRequired();
325N/A } catch (IOException ex) {
325N/A }
325N/A }
325N/A
325N/A public final String getNamespaceURI(String prefix) {
325N/A String namespace = getNamespaceDecl(prefix);
325N/A if (namespace == null) {
325N/A if (prefix == null) {
325N/A throw new IllegalArgumentException(CommonResourceBundle.getInstance().getString("message.nullPrefix"));
325N/A }
325N/A return null; // unbound
325N/A }
325N/A return namespace;
325N/A }
325N/A
325N/A public final boolean isStartElement() {
325N/A return (_eventType == START_ELEMENT);
325N/A }
325N/A
325N/A public final boolean isEndElement() {
325N/A return (_eventType == END_ELEMENT);
325N/A }
325N/A
325N/A public final boolean isCharacters() {
325N/A return (_eventType == CHARACTERS);
325N/A }
325N/A
325N/A /**
325N/A * Returns true if the cursor points to a character data event that consists of all whitespace
325N/A * Application calling this method needs to cache the value and avoid calling this method again
325N/A * for the same event.
325N/A * @return true if the cursor points to all whitespace, false otherwise
325N/A */
325N/A public final boolean isWhiteSpace() {
325N/A if(isCharacters() || (_eventType == CDATA)){
325N/A char [] ch = this.getTextCharacters();
325N/A int start = this.getTextStart();
325N/A int length = this.getTextLength();
325N/A for (int i = start; i < start + length; i++){
325N/A if(!XMLChar.isSpace(ch[i])){
325N/A return false;
325N/A }
325N/A }
325N/A return true;
325N/A }
325N/A return false;
325N/A }
325N/A
325N/A public final String getAttributeValue(String namespaceURI, String localName) {
325N/A if (_eventType != START_ELEMENT) {
325N/A throw new IllegalStateException(CommonResourceBundle.getInstance().getString("message.invalidCallingGetAttributeValue"));
325N/A }
325N/A
325N/A if (localName == null)
325N/A throw new IllegalArgumentException();
325N/A
325N/A // Search for the attributes in _attributes
325N/A if (namespaceURI != null) {
325N/A for (int i = 0; i < _attributes.getLength(); i++) {
325N/A if (_attributes.getLocalName(i).equals(localName) &&
325N/A _attributes.getURI(i).equals(namespaceURI)) {
325N/A return _attributes.getValue(i);
325N/A }
325N/A }
325N/A } else {
325N/A for (int i = 0; i < _attributes.getLength(); i++) {
325N/A if (_attributes.getLocalName(i).equals(localName)) {
325N/A return _attributes.getValue(i);
325N/A }
325N/A }
325N/A }
325N/A
325N/A return null;
325N/A }
325N/A
325N/A public final int getAttributeCount() {
325N/A if (_eventType != START_ELEMENT) {
325N/A throw new IllegalStateException(CommonResourceBundle.getInstance().getString("message.invalidCallingGetAttributeValue"));
325N/A }
325N/A
325N/A return _attributes.getLength();
325N/A }
325N/A
325N/A public final javax.xml.namespace.QName getAttributeName(int index) {
325N/A if (_eventType != START_ELEMENT) {
325N/A throw new IllegalStateException(CommonResourceBundle.getInstance().getString("message.invalidCallingGetAttributeValue"));
325N/A }
325N/A return _attributes.getQualifiedName(index).getQName();
325N/A }
325N/A
325N/A public final String getAttributeNamespace(int index) {
325N/A if (_eventType != START_ELEMENT) {
325N/A throw new IllegalStateException(CommonResourceBundle.getInstance().getString("message.invalidCallingGetAttributeValue"));
325N/A }
325N/A
325N/A return _attributes.getURI(index);
325N/A }
325N/A
325N/A public final String getAttributeLocalName(int index) {
325N/A if (_eventType != START_ELEMENT) {
325N/A throw new IllegalStateException(CommonResourceBundle.getInstance().getString("message.invalidCallingGetAttributeValue"));
325N/A }
325N/A return _attributes.getLocalName(index);
325N/A }
325N/A
325N/A public final String getAttributePrefix(int index) {
325N/A if (_eventType != START_ELEMENT) {
325N/A throw new IllegalStateException(CommonResourceBundle.getInstance().getString("message.invalidCallingGetAttributeValue"));
325N/A }
325N/A return _attributes.getPrefix(index);
325N/A }
325N/A
325N/A public final String getAttributeType(int index) {
325N/A if (_eventType != START_ELEMENT) {
325N/A throw new IllegalStateException(CommonResourceBundle.getInstance().getString("message.invalidCallingGetAttributeValue"));
325N/A }
325N/A return _attributes.getType(index);
325N/A }
325N/A
325N/A public final String getAttributeValue(int index) {
325N/A if (_eventType != START_ELEMENT) {
325N/A throw new IllegalStateException(CommonResourceBundle.getInstance().getString("message.invalidCallingGetAttributeValue"));
325N/A }
325N/A return _attributes.getValue(index);
325N/A }
325N/A
325N/A public final boolean isAttributeSpecified(int index) {
325N/A return false; // non-validating parser
325N/A }
325N/A
325N/A public final int getNamespaceCount() {
325N/A if (_eventType == START_ELEMENT || _eventType == END_ELEMENT) {
325N/A return (_currentNamespaceAIIsEnd > 0) ? (_currentNamespaceAIIsEnd - _currentNamespaceAIIsStart) : 0;
325N/A } else {
325N/A throw new IllegalStateException(CommonResourceBundle.getInstance().getString("message.invalidCallingGetNamespaceCount"));
325N/A }
325N/A }
325N/A
325N/A public final String getNamespacePrefix(int index) {
325N/A if (_eventType == START_ELEMENT || _eventType == END_ELEMENT) {
325N/A return _namespaceAIIsPrefix[_currentNamespaceAIIsStart + index];
325N/A } else {
325N/A throw new IllegalStateException(CommonResourceBundle.getInstance().getString("message.invalidCallingGetNamespacePrefix"));
325N/A }
325N/A }
325N/A
325N/A public final String getNamespaceURI(int index) {
325N/A if (_eventType == START_ELEMENT || _eventType == END_ELEMENT) {
325N/A return _namespaceAIIsNamespaceName[_currentNamespaceAIIsStart + index];
325N/A } else {
325N/A throw new IllegalStateException(CommonResourceBundle.getInstance().getString("message.invalidCallingGetNamespacePrefix"));
325N/A }
325N/A }
325N/A
325N/A public final NamespaceContext getNamespaceContext() {
325N/A return _nsContext;
325N/A }
325N/A
325N/A public final int getEventType() {
325N/A return _eventType;
325N/A }
325N/A
325N/A public final String getText() {
325N/A if (_characters == null) {
325N/A checkTextState();
325N/A }
325N/A
325N/A if (_characters == _characterContentChunkTable._array) {
325N/A return _characterContentChunkTable.getString(_characterContentChunkTable._cachedIndex);
325N/A } else {
325N/A return new String(_characters, _charactersOffset, _charBufferLength);
325N/A }
325N/A }
325N/A
325N/A public final char[] getTextCharacters() {
325N/A if (_characters == null) {
325N/A checkTextState();
325N/A }
325N/A
325N/A return _characters;
325N/A }
325N/A
325N/A public final int getTextStart() {
325N/A if (_characters == null) {
325N/A checkTextState();
325N/A }
325N/A
325N/A return _charactersOffset;
325N/A }
325N/A
325N/A public final int getTextLength() {
325N/A if (_characters == null) {
325N/A checkTextState();
325N/A }
325N/A
325N/A return _charBufferLength;
325N/A }
325N/A
325N/A public final int getTextCharacters(int sourceStart, char[] target,
325N/A int targetStart, int length) throws XMLStreamException {
325N/A if (_characters == null) {
325N/A checkTextState();
325N/A }
325N/A
325N/A try {
325N/A int bytesToCopy = Math.min(_charBufferLength, length);
325N/A System.arraycopy(_characters, _charactersOffset + sourceStart,
325N/A target, targetStart, bytesToCopy);
325N/A return bytesToCopy;
325N/A } catch (IndexOutOfBoundsException e) {
325N/A throw new XMLStreamException(e);
325N/A }
325N/A }
325N/A
325N/A protected final void checkTextState() {
325N/A if (_algorithmData == null) {
325N/A throw new IllegalStateException(CommonResourceBundle.getInstance().getString("message.InvalidStateForText"));
325N/A }
325N/A
325N/A try {
325N/A convertEncodingAlgorithmDataToCharacters();
325N/A } catch (Exception e) {
325N/A throw new IllegalStateException(CommonResourceBundle.getInstance().getString("message.InvalidStateForText"));
325N/A }
325N/A }
325N/A
325N/A public final String getEncoding() {
325N/A return _characterEncodingScheme;
325N/A }
325N/A
325N/A public final boolean hasText() {
325N/A return (_characters != null);
325N/A }
325N/A
325N/A public final Location getLocation() {
325N/A //location should be created in next()
325N/A //returns a nil location for now
325N/A return EventLocation.getNilLocation();
325N/A }
325N/A
325N/A public final QName getName() {
325N/A if (_eventType == START_ELEMENT || _eventType == END_ELEMENT) {
325N/A return _qualifiedName.getQName();
325N/A } else {
325N/A throw new IllegalStateException(CommonResourceBundle.getInstance().getString("message.invalidCallingGetName"));
325N/A }
325N/A }
325N/A
325N/A public final String getLocalName() {
325N/A if (_eventType == START_ELEMENT || _eventType == END_ELEMENT) {
325N/A return _qualifiedName.localName;
325N/A } else {
325N/A throw new IllegalStateException(CommonResourceBundle.getInstance().getString("message.invalidCallingGetLocalName"));
325N/A }
325N/A }
325N/A
325N/A public final boolean hasName() {
325N/A return (_eventType == START_ELEMENT || _eventType == END_ELEMENT);
325N/A }
325N/A
325N/A public final String getNamespaceURI() {
325N/A if (_eventType == START_ELEMENT || _eventType == END_ELEMENT) {
325N/A return _qualifiedName.namespaceName;
325N/A } else {
325N/A throw new IllegalStateException(CommonResourceBundle.getInstance().getString("message.invalidCallingGetNamespaceURI"));
325N/A }
325N/A }
325N/A
325N/A public final String getPrefix() {
325N/A if (_eventType == START_ELEMENT || _eventType == END_ELEMENT) {
325N/A return _qualifiedName.prefix;
325N/A } else {
325N/A throw new IllegalStateException(CommonResourceBundle.getInstance().getString("message.invalidCallingGetPrefix"));
325N/A }
325N/A }
325N/A
325N/A public final String getVersion() {
325N/A return null;
325N/A }
325N/A
325N/A public final boolean isStandalone() {
325N/A return false;
325N/A }
325N/A
325N/A public final boolean standaloneSet() {
325N/A return false;
325N/A }
325N/A
325N/A public final String getCharacterEncodingScheme() {
325N/A return null;
325N/A }
325N/A
325N/A public final String getPITarget() {
325N/A if (_eventType != PROCESSING_INSTRUCTION) {
325N/A throw new IllegalStateException(CommonResourceBundle.getInstance().getString("message.invalidCallingGetPITarget"));
325N/A }
325N/A
325N/A return _piTarget;
325N/A }
325N/A
325N/A public final String getPIData() {
325N/A if (_eventType != PROCESSING_INSTRUCTION) {
325N/A throw new IllegalStateException(CommonResourceBundle.getInstance().getString("message.invalidCallingGetPIData"));
325N/A }
325N/A
325N/A return _piData;
325N/A }
325N/A
325N/A
325N/A
325N/A
325N/A public final String getNameString() {
325N/A if (_eventType == START_ELEMENT || _eventType == END_ELEMENT) {
325N/A return _qualifiedName.getQNameString();
325N/A } else {
325N/A throw new IllegalStateException(CommonResourceBundle.getInstance().getString("message.invalidCallingGetName"));
325N/A }
325N/A }
325N/A
325N/A public final String getAttributeNameString(int index) {
325N/A if (_eventType != START_ELEMENT) {
325N/A throw new IllegalStateException(CommonResourceBundle.getInstance().getString("message.invalidCallingGetAttributeValue"));
325N/A }
325N/A return _attributes.getQualifiedName(index).getQNameString();
325N/A }
325N/A
325N/A
325N/A public final String getTextAlgorithmURI() {
325N/A return _algorithmURI;
325N/A }
325N/A
325N/A public final int getTextAlgorithmIndex() {
325N/A return _algorithmId;
325N/A }
325N/A
325N/A public final byte[] getTextAlgorithmBytes() {
325N/A return _algorithmData;
325N/A }
325N/A
325N/A public final byte[] getTextAlgorithmBytesClone() {
325N/A if (_algorithmData == null) {
325N/A return null;
325N/A }
325N/A
325N/A byte[] algorithmData = new byte[_algorithmDataLength];
325N/A System.arraycopy(_algorithmData, _algorithmDataOffset, algorithmData, 0, _algorithmDataLength);
325N/A return algorithmData;
325N/A }
325N/A
325N/A public final int getTextAlgorithmStart() {
325N/A return _algorithmDataOffset;
325N/A }
325N/A
325N/A public final int getTextAlgorithmLength() {
325N/A return _algorithmDataLength;
325N/A }
325N/A
325N/A public final int getTextAlgorithmBytes(int sourceStart, byte[] target,
325N/A int targetStart, int length) throws XMLStreamException {
325N/A try {
325N/A System.arraycopy(_algorithmData, sourceStart, target,
325N/A targetStart, length);
325N/A return length;
325N/A } catch (IndexOutOfBoundsException e) {
325N/A throw new XMLStreamException(e);
325N/A }
325N/A }
325N/A
325N/A // FastInfosetStreamReader impl
325N/A
325N/A public final int peekNext() throws XMLStreamException {
325N/A try {
325N/A switch(DecoderStateTables.EII(peek(this))) {
325N/A case DecoderStateTables.EII_NO_AIIS_INDEX_SMALL:
325N/A case DecoderStateTables.EII_AIIS_INDEX_SMALL:
325N/A case DecoderStateTables.EII_INDEX_MEDIUM:
325N/A case DecoderStateTables.EII_INDEX_LARGE:
325N/A case DecoderStateTables.EII_LITERAL:
325N/A case DecoderStateTables.EII_NAMESPACES:
325N/A return START_ELEMENT;
325N/A case DecoderStateTables.CII_UTF8_SMALL_LENGTH:
325N/A case DecoderStateTables.CII_UTF8_MEDIUM_LENGTH:
325N/A case DecoderStateTables.CII_UTF8_LARGE_LENGTH:
325N/A case DecoderStateTables.CII_UTF16_SMALL_LENGTH:
325N/A case DecoderStateTables.CII_UTF16_MEDIUM_LENGTH:
325N/A case DecoderStateTables.CII_UTF16_LARGE_LENGTH:
325N/A case DecoderStateTables.CII_RA:
325N/A case DecoderStateTables.CII_EA:
325N/A case DecoderStateTables.CII_INDEX_SMALL:
325N/A case DecoderStateTables.CII_INDEX_MEDIUM:
325N/A case DecoderStateTables.CII_INDEX_LARGE:
325N/A case DecoderStateTables.CII_INDEX_LARGE_LARGE:
325N/A return CHARACTERS;
325N/A case DecoderStateTables.COMMENT_II:
325N/A return COMMENT;
325N/A case DecoderStateTables.PROCESSING_INSTRUCTION_II:
325N/A return PROCESSING_INSTRUCTION;
325N/A case DecoderStateTables.UNEXPANDED_ENTITY_REFERENCE_II:
325N/A return ENTITY_REFERENCE;
325N/A case DecoderStateTables.TERMINATOR_DOUBLE:
325N/A case DecoderStateTables.TERMINATOR_SINGLE:
325N/A return (_stackCount != -1) ? END_ELEMENT : END_DOCUMENT;
325N/A default:
325N/A throw new FastInfosetException(
325N/A CommonResourceBundle.getInstance().getString("message.IllegalStateDecodingEII"));
325N/A }
325N/A } catch (IOException e) {
325N/A throw new XMLStreamException(e);
325N/A } catch (FastInfosetException e) {
325N/A throw new XMLStreamException(e);
325N/A }
325N/A }
325N/A
325N/A public void onBeforeOctetBufferOverwrite() {
325N/A if (_algorithmData != null) {
325N/A _algorithmData = getTextAlgorithmBytesClone();
325N/A _algorithmDataOffset = 0;
325N/A _isAlgorithmDataCloned = true;
325N/A }
325N/A }
325N/A
325N/A // Faster access methods without checks
325N/A
325N/A public final int accessNamespaceCount() {
325N/A return (_currentNamespaceAIIsEnd > 0) ? (_currentNamespaceAIIsEnd - _currentNamespaceAIIsStart) : 0;
325N/A }
325N/A
325N/A public final String accessLocalName() {
325N/A return _qualifiedName.localName;
325N/A }
325N/A
325N/A public final String accessNamespaceURI() {
325N/A return _qualifiedName.namespaceName;
325N/A }
325N/A
325N/A public final String accessPrefix() {
325N/A return _qualifiedName.prefix;
325N/A }
325N/A
325N/A public final char[] accessTextCharacters() {
325N/A return _characters;
325N/A }
325N/A
325N/A public final int accessTextStart() {
325N/A return _charactersOffset;
325N/A }
325N/A
325N/A public final int accessTextLength() {
325N/A return _charBufferLength;
325N/A }
325N/A
325N/A //
325N/A
325N/A protected final void processDII() throws FastInfosetException, IOException {
325N/A final int b = read();
325N/A if (b > 0) {
325N/A processDIIOptionalProperties(b);
325N/A }
325N/A }
325N/A
325N/A protected final void processDIIOptionalProperties(int b) throws FastInfosetException, IOException {
325N/A // Optimize for the most common case
325N/A if (b == EncodingConstants.DOCUMENT_INITIAL_VOCABULARY_FLAG) {
325N/A decodeInitialVocabulary();
325N/A return;
325N/A }
325N/A
325N/A if ((b & EncodingConstants.DOCUMENT_ADDITIONAL_DATA_FLAG) > 0) {
325N/A decodeAdditionalData();
325N/A /*
325N/A * TODO
325N/A * how to report the additional data?
325N/A */
325N/A }
325N/A
325N/A if ((b & EncodingConstants.DOCUMENT_INITIAL_VOCABULARY_FLAG) > 0) {
325N/A decodeInitialVocabulary();
325N/A }
325N/A
325N/A if ((b & EncodingConstants.DOCUMENT_NOTATIONS_FLAG) > 0) {
325N/A decodeNotations();
325N/A /*
325N/A try {
325N/A _dtdHandler.notationDecl(name, public_identifier, system_identifier);
325N/A } catch (SAXException e) {
325N/A throw new IOException("NotationsDeclarationII");
325N/A }
325N/A */
325N/A }
325N/A
325N/A if ((b & EncodingConstants.DOCUMENT_UNPARSED_ENTITIES_FLAG) > 0) {
325N/A decodeUnparsedEntities();
325N/A /*
325N/A try {
325N/A _dtdHandler.unparsedEntityDecl(name, public_identifier, system_identifier, notation_name);
325N/A } catch (SAXException e) {
325N/A throw new IOException("UnparsedEntitiesII");
325N/A }
325N/A */
325N/A }
325N/A
325N/A if ((b & EncodingConstants.DOCUMENT_CHARACTER_ENCODING_SCHEME) > 0) {
325N/A _characterEncodingScheme = decodeCharacterEncodingScheme();
325N/A }
325N/A
325N/A if ((b & EncodingConstants.DOCUMENT_STANDALONE_FLAG) > 0) {
325N/A boolean standalone = (read() > 0) ? true : false ;
325N/A /*
325N/A * TODO
325N/A * how to report the standalone flag?
325N/A */
325N/A }
325N/A
325N/A if ((b & EncodingConstants.DOCUMENT_VERSION_FLAG) > 0) {
325N/A decodeVersion();
325N/A /*
325N/A * TODO
325N/A * how to report the standalone flag?
325N/A */
325N/A }
325N/A }
325N/A
325N/A
325N/A protected final void resizeNamespaceAIIs() {
325N/A final String[] namespaceAIIsPrefix = new String[_namespaceAIIsIndex * 2];
325N/A System.arraycopy(_namespaceAIIsPrefix, 0, namespaceAIIsPrefix, 0, _namespaceAIIsIndex);
325N/A _namespaceAIIsPrefix = namespaceAIIsPrefix;
325N/A
325N/A final String[] namespaceAIIsNamespaceName = new String[_namespaceAIIsIndex * 2];
325N/A System.arraycopy(_namespaceAIIsNamespaceName, 0, namespaceAIIsNamespaceName, 0, _namespaceAIIsIndex);
325N/A _namespaceAIIsNamespaceName = namespaceAIIsNamespaceName;
325N/A
325N/A final int[] namespaceAIIsPrefixIndex = new int[_namespaceAIIsIndex * 2];
325N/A System.arraycopy(_namespaceAIIsPrefixIndex, 0, namespaceAIIsPrefixIndex, 0, _namespaceAIIsIndex);
325N/A _namespaceAIIsPrefixIndex = namespaceAIIsPrefixIndex;
325N/A }
325N/A
325N/A protected final void processEIIWithNamespaces(boolean hasAttributes) throws FastInfosetException, IOException {
325N/A if (++_prefixTable._declarationId == Integer.MAX_VALUE) {
325N/A _prefixTable.clearDeclarationIds();
325N/A }
325N/A
325N/A _currentNamespaceAIIsStart = _namespaceAIIsIndex;
325N/A String prefix = "", namespaceName = "";
325N/A int b = read();
325N/A while ((b & EncodingConstants.NAMESPACE_ATTRIBUTE_MASK) == EncodingConstants.NAMESPACE_ATTRIBUTE) {
325N/A if (_namespaceAIIsIndex == _namespaceAIIsPrefix.length) {
325N/A resizeNamespaceAIIs();
325N/A }
325N/A
325N/A switch (b & EncodingConstants.NAMESPACE_ATTRIBUTE_PREFIX_NAME_MASK) {
325N/A // no prefix, no namespace
325N/A // Undeclaration of default namespace
325N/A case 0:
325N/A prefix = namespaceName =
325N/A _namespaceAIIsPrefix[_namespaceAIIsIndex] =
325N/A _namespaceAIIsNamespaceName[_namespaceAIIsIndex] = "";
325N/A
325N/A _namespaceNameIndex = _prefixIndex = _namespaceAIIsPrefixIndex[_namespaceAIIsIndex++] = -1;
325N/A break;
325N/A // no prefix, namespace
325N/A // Declaration of default namespace
325N/A case 1:
325N/A prefix = _namespaceAIIsPrefix[_namespaceAIIsIndex] = "";
325N/A namespaceName = _namespaceAIIsNamespaceName[_namespaceAIIsIndex] =
325N/A decodeIdentifyingNonEmptyStringOnFirstBitAsNamespaceName(false);
325N/A
325N/A _prefixIndex = _namespaceAIIsPrefixIndex[_namespaceAIIsIndex++] = -1;
325N/A break;
325N/A // prefix, no namespace
325N/A // Undeclaration of namespace
325N/A case 2:
325N/A prefix = _namespaceAIIsPrefix[_namespaceAIIsIndex] =
325N/A decodeIdentifyingNonEmptyStringOnFirstBitAsPrefix(false);
325N/A namespaceName = _namespaceAIIsNamespaceName[_namespaceAIIsIndex] = "";
325N/A
325N/A _namespaceNameIndex = -1;
325N/A _namespaceAIIsPrefixIndex[_namespaceAIIsIndex++] = _prefixIndex;
325N/A break;
325N/A // prefix, namespace
325N/A // Declaration of prefixed namespace
325N/A case 3:
325N/A prefix = _namespaceAIIsPrefix[_namespaceAIIsIndex] =
325N/A decodeIdentifyingNonEmptyStringOnFirstBitAsPrefix(true);
325N/A namespaceName = _namespaceAIIsNamespaceName[_namespaceAIIsIndex] =
325N/A decodeIdentifyingNonEmptyStringOnFirstBitAsNamespaceName(true);
325N/A
325N/A _namespaceAIIsPrefixIndex[_namespaceAIIsIndex++] = _prefixIndex;
325N/A break;
325N/A }
325N/A
325N/A // Push namespace declarations onto the stack
325N/A _prefixTable.pushScopeWithPrefixEntry(prefix, namespaceName, _prefixIndex, _namespaceNameIndex);
325N/A
325N/A b = read();
325N/A }
325N/A if (b != EncodingConstants.TERMINATOR) {
325N/A throw new FastInfosetException(CommonResourceBundle.getInstance().getString("message.EIInamespaceNameNotTerminatedCorrectly"));
325N/A }
325N/A _currentNamespaceAIIsEnd = _namespaceAIIsIndex;
325N/A
325N/A b = read();
325N/A switch(DecoderStateTables.EII(b)) {
325N/A case DecoderStateTables.EII_NO_AIIS_INDEX_SMALL:
325N/A processEII(_elementNameTable._array[b], hasAttributes);
325N/A break;
325N/A case DecoderStateTables.EII_INDEX_MEDIUM:
325N/A processEII(processEIIIndexMedium(b), hasAttributes);
325N/A break;
325N/A case DecoderStateTables.EII_INDEX_LARGE:
325N/A processEII(processEIIIndexLarge(b), hasAttributes);
325N/A break;
325N/A case DecoderStateTables.EII_LITERAL:
325N/A {
325N/A final QualifiedName qn = processLiteralQualifiedName(
325N/A b & EncodingConstants.LITERAL_QNAME_PREFIX_NAMESPACE_NAME_MASK,
325N/A _elementNameTable.getNext());
325N/A _elementNameTable.add(qn);
325N/A processEII(qn, hasAttributes);
325N/A break;
325N/A }
325N/A default:
325N/A throw new FastInfosetException(CommonResourceBundle.getInstance().getString("message.IllegalStateDecodingEIIAfterAIIs"));
325N/A }
325N/A }
325N/A
325N/A protected final void processEII(QualifiedName name, boolean hasAttributes) throws FastInfosetException, IOException {
325N/A if (_prefixTable._currentInScope[name.prefixIndex] != name.namespaceNameIndex) {
325N/A throw new FastInfosetException(CommonResourceBundle.getInstance().getString("message.qnameOfEIINotInScope"));
325N/A }
325N/A
325N/A _eventType = START_ELEMENT;
325N/A _qualifiedName = name;
325N/A
325N/A if (_clearAttributes) {
325N/A _attributes.clear();
325N/A _clearAttributes = false;
325N/A }
325N/A
325N/A if (hasAttributes) {
325N/A processAIIs();
325N/A }
325N/A
325N/A // Push element holder onto the stack
325N/A _stackCount++;
325N/A if (_stackCount == _qNameStack.length) {
325N/A QualifiedName[] qNameStack = new QualifiedName[_qNameStack.length * 2];
325N/A System.arraycopy(_qNameStack, 0, qNameStack, 0, _qNameStack.length);
325N/A _qNameStack = qNameStack;
325N/A
325N/A int[] namespaceAIIsStartStack = new int[_namespaceAIIsStartStack.length * 2];
325N/A System.arraycopy(_namespaceAIIsStartStack, 0, namespaceAIIsStartStack, 0, _namespaceAIIsStartStack.length);
325N/A _namespaceAIIsStartStack = namespaceAIIsStartStack;
325N/A
325N/A int[] namespaceAIIsEndStack = new int[_namespaceAIIsEndStack.length * 2];
325N/A System.arraycopy(_namespaceAIIsEndStack, 0, namespaceAIIsEndStack, 0, _namespaceAIIsEndStack.length);
325N/A _namespaceAIIsEndStack = namespaceAIIsEndStack;
325N/A }
325N/A _qNameStack[_stackCount] = _qualifiedName;
325N/A _namespaceAIIsStartStack[_stackCount] = _currentNamespaceAIIsStart;
325N/A _namespaceAIIsEndStack[_stackCount] = _currentNamespaceAIIsEnd;
325N/A }
325N/A
325N/A protected final void processAIIs() throws FastInfosetException, IOException {
325N/A QualifiedName name;
325N/A int b;
325N/A String value;
325N/A
325N/A if (++_duplicateAttributeVerifier._currentIteration == Integer.MAX_VALUE) {
325N/A _duplicateAttributeVerifier.clear();
325N/A }
325N/A
325N/A _clearAttributes = true;
325N/A boolean terminate = false;
325N/A do {
325N/A // AII qualified name
325N/A b = read();
325N/A switch (DecoderStateTables.AII(b)) {
325N/A case DecoderStateTables.AII_INDEX_SMALL:
325N/A name = _attributeNameTable._array[b];
325N/A break;
325N/A case DecoderStateTables.AII_INDEX_MEDIUM:
325N/A {
325N/A final int i = (((b & EncodingConstants.INTEGER_2ND_BIT_MEDIUM_MASK) << 8) | read())
325N/A + EncodingConstants.INTEGER_2ND_BIT_SMALL_LIMIT;
325N/A name = _attributeNameTable._array[i];
325N/A break;
325N/A }
325N/A case DecoderStateTables.AII_INDEX_LARGE:
325N/A {
325N/A final int i = (((b & EncodingConstants.INTEGER_2ND_BIT_LARGE_MASK) << 16) | (read() << 8) | read())
325N/A + EncodingConstants.INTEGER_2ND_BIT_MEDIUM_LIMIT;
325N/A name = _attributeNameTable._array[i];
325N/A break;
325N/A }
325N/A case DecoderStateTables.AII_LITERAL:
325N/A name = processLiteralQualifiedName(
325N/A b & EncodingConstants.LITERAL_QNAME_PREFIX_NAMESPACE_NAME_MASK,
325N/A _attributeNameTable.getNext());
325N/A name.createAttributeValues(DuplicateAttributeVerifier.MAP_SIZE);
325N/A _attributeNameTable.add(name);
325N/A break;
325N/A case DecoderStateTables.AII_TERMINATOR_DOUBLE:
325N/A _internalState = INTERNAL_STATE_START_ELEMENT_TERMINATE;
325N/A case DecoderStateTables.AII_TERMINATOR_SINGLE:
325N/A terminate = true;
325N/A // AIIs have finished break out of loop
325N/A continue;
325N/A default:
325N/A throw new FastInfosetException(CommonResourceBundle.getInstance().getString("message.decodingAIIs"));
325N/A }
325N/A
325N/A // [normalized value] of AII
325N/A
325N/A if (name.prefixIndex > 0 && _prefixTable._currentInScope[name.prefixIndex] != name.namespaceNameIndex) {
325N/A throw new FastInfosetException(CommonResourceBundle.getInstance().getString("message.AIIqNameNotInScope"));
325N/A }
325N/A
325N/A _duplicateAttributeVerifier.checkForDuplicateAttribute(name.attributeHash, name.attributeId);
325N/A
325N/A b = read();
325N/A switch(DecoderStateTables.NISTRING(b)) {
325N/A case DecoderStateTables.NISTRING_UTF8_SMALL_LENGTH:
325N/A _octetBufferLength = (b & EncodingConstants.OCTET_STRING_LENGTH_5TH_BIT_SMALL_MASK) + 1;
325N/A value = decodeUtf8StringAsString();
325N/A if ((b & EncodingConstants.NISTRING_ADD_TO_TABLE_FLAG) > 0) {
325N/A _attributeValueTable.add(value);
325N/A }
325N/A
325N/A _attributes.addAttribute(name, value);
325N/A break;
325N/A case DecoderStateTables.NISTRING_UTF8_MEDIUM_LENGTH:
325N/A _octetBufferLength = read() + EncodingConstants.OCTET_STRING_LENGTH_5TH_BIT_SMALL_LIMIT;
325N/A value = decodeUtf8StringAsString();
325N/A if ((b & EncodingConstants.NISTRING_ADD_TO_TABLE_FLAG) > 0) {
325N/A _attributeValueTable.add(value);
325N/A }
325N/A
325N/A _attributes.addAttribute(name, value);
325N/A break;
325N/A case DecoderStateTables.NISTRING_UTF8_LARGE_LENGTH:
325N/A _octetBufferLength = ((read() << 24) |
325N/A (read() << 16) |
325N/A (read() << 8) |
325N/A read())
325N/A + EncodingConstants.OCTET_STRING_LENGTH_5TH_BIT_MEDIUM_LIMIT;
325N/A value = decodeUtf8StringAsString();
325N/A if ((b & EncodingConstants.NISTRING_ADD_TO_TABLE_FLAG) > 0) {
325N/A _attributeValueTable.add(value);
325N/A }
325N/A
325N/A _attributes.addAttribute(name, value);
325N/A break;
325N/A case DecoderStateTables.NISTRING_UTF16_SMALL_LENGTH:
325N/A _octetBufferLength = (b & EncodingConstants.OCTET_STRING_LENGTH_5TH_BIT_SMALL_MASK) + 1;
325N/A value = decodeUtf16StringAsString();
325N/A if ((b & EncodingConstants.NISTRING_ADD_TO_TABLE_FLAG) > 0) {
325N/A _attributeValueTable.add(value);
325N/A }
325N/A
325N/A _attributes.addAttribute(name, value);
325N/A break;
325N/A case DecoderStateTables.NISTRING_UTF16_MEDIUM_LENGTH:
325N/A _octetBufferLength = read() + EncodingConstants.OCTET_STRING_LENGTH_5TH_BIT_SMALL_LIMIT;
325N/A value = decodeUtf16StringAsString();
325N/A if ((b & EncodingConstants.NISTRING_ADD_TO_TABLE_FLAG) > 0) {
325N/A _attributeValueTable.add(value);
325N/A }
325N/A
325N/A _attributes.addAttribute(name, value);
325N/A break;
325N/A case DecoderStateTables.NISTRING_UTF16_LARGE_LENGTH:
325N/A _octetBufferLength = ((read() << 24) |
325N/A (read() << 16) |
325N/A (read() << 8) |
325N/A read())
325N/A + EncodingConstants.OCTET_STRING_LENGTH_5TH_BIT_MEDIUM_LIMIT;
325N/A value = decodeUtf16StringAsString();
325N/A if ((b & EncodingConstants.NISTRING_ADD_TO_TABLE_FLAG) > 0) {
325N/A _attributeValueTable.add(value);
325N/A }
325N/A
325N/A _attributes.addAttribute(name, value);
325N/A break;
325N/A case DecoderStateTables.NISTRING_RA:
325N/A {
325N/A final boolean addToTable = (b & EncodingConstants.NISTRING_ADD_TO_TABLE_FLAG) > 0;
325N/A // Decode resitricted alphabet integer
325N/A _identifier = (b & 0x0F) << 4;
325N/A b = read();
325N/A _identifier |= (b & 0xF0) >> 4;
325N/A
325N/A decodeOctetsOnFifthBitOfNonIdentifyingStringOnFirstBit(b);
325N/A
325N/A value = decodeRestrictedAlphabetAsString();
325N/A if (addToTable) {
325N/A _attributeValueTable.add(value);
325N/A }
325N/A
325N/A _attributes.addAttribute(name, value);
325N/A break;
325N/A }
325N/A case DecoderStateTables.NISTRING_EA:
325N/A {
325N/A final boolean addToTable = (b & EncodingConstants.NISTRING_ADD_TO_TABLE_FLAG) > 0;
325N/A // Decode encoding algorithm integer
325N/A _identifier = (b & 0x0F) << 4;
325N/A b = read();
325N/A _identifier |= (b & 0xF0) >> 4;
325N/A
325N/A decodeOctetsOnFifthBitOfNonIdentifyingStringOnFirstBit(b);
325N/A processAIIEncodingAlgorithm(name, addToTable);
325N/A break;
325N/A }
325N/A case DecoderStateTables.NISTRING_INDEX_SMALL:
325N/A _attributes.addAttribute(name,
325N/A _attributeValueTable._array[b & EncodingConstants.INTEGER_2ND_BIT_SMALL_MASK]);
325N/A break;
325N/A case DecoderStateTables.NISTRING_INDEX_MEDIUM:
325N/A {
325N/A final int index = (((b & EncodingConstants.INTEGER_2ND_BIT_MEDIUM_MASK) << 8) | read())
325N/A + EncodingConstants.INTEGER_2ND_BIT_SMALL_LIMIT;
325N/A
325N/A _attributes.addAttribute(name,
325N/A _attributeValueTable._array[index]);
325N/A break;
325N/A }
325N/A case DecoderStateTables.NISTRING_INDEX_LARGE:
325N/A {
325N/A final int index = (((b & EncodingConstants.INTEGER_2ND_BIT_LARGE_MASK) << 16) | (read() << 8) | read())
325N/A + EncodingConstants.INTEGER_2ND_BIT_MEDIUM_LIMIT;
325N/A
325N/A _attributes.addAttribute(name,
325N/A _attributeValueTable._array[index]);
325N/A break;
325N/A }
325N/A case DecoderStateTables.NISTRING_EMPTY:
325N/A _attributes.addAttribute(name, "");
325N/A break;
325N/A default:
325N/A throw new FastInfosetException(CommonResourceBundle.getInstance().getString("message.decodingAIIValue"));
325N/A }
325N/A
325N/A } while (!terminate);
325N/A
325N/A // Reset duplication attribute verfifier
325N/A _duplicateAttributeVerifier._poolCurrent = _duplicateAttributeVerifier._poolHead;
325N/A }
325N/A
325N/A protected final QualifiedName processEIIIndexMedium(int b) throws FastInfosetException, IOException {
325N/A final int i = (((b & EncodingConstants.INTEGER_3RD_BIT_MEDIUM_MASK) << 8) | read())
325N/A + EncodingConstants.INTEGER_3RD_BIT_SMALL_LIMIT;
325N/A return _elementNameTable._array[i];
325N/A }
325N/A
325N/A protected final QualifiedName processEIIIndexLarge(int b) throws FastInfosetException, IOException {
325N/A int i;
325N/A if ((b & EncodingConstants.INTEGER_3RD_BIT_LARGE_LARGE_FLAG) == 0x20) {
325N/A // EII large index
325N/A i = (((b & EncodingConstants.INTEGER_3RD_BIT_LARGE_MASK) << 16) | (read() << 8) | read())
325N/A + EncodingConstants.INTEGER_3RD_BIT_MEDIUM_LIMIT;
325N/A } else {
325N/A // EII large large index
325N/A i = (((read() & EncodingConstants.INTEGER_3RD_BIT_LARGE_LARGE_MASK) << 16) | (read() << 8) | read())
325N/A + EncodingConstants.INTEGER_3RD_BIT_LARGE_LIMIT;
325N/A }
325N/A return _elementNameTable._array[i];
325N/A }
325N/A
325N/A protected final QualifiedName processLiteralQualifiedName(int state, QualifiedName q)
325N/A throws FastInfosetException, IOException {
325N/A if (q == null) q = new QualifiedName();
325N/A
325N/A switch (state) {
325N/A // no prefix, no namespace
325N/A case 0:
325N/A return q.set(
325N/A "",
325N/A "",
325N/A decodeIdentifyingNonEmptyStringOnFirstBit(_v.localName),
325N/A "",
325N/A 0,
325N/A -1,
325N/A -1,
325N/A _identifier);
325N/A // no prefix, namespace
325N/A case 1:
325N/A return q.set(
325N/A "",
325N/A decodeIdentifyingNonEmptyStringIndexOnFirstBitAsNamespaceName(false),
325N/A decodeIdentifyingNonEmptyStringOnFirstBit(_v.localName),
325N/A "",
325N/A 0,
325N/A -1,
325N/A _namespaceNameIndex,
325N/A _identifier);
325N/A // prefix, no namespace
325N/A case 2:
325N/A throw new FastInfosetException(CommonResourceBundle.getInstance().getString("message.qNameMissingNamespaceName"));
325N/A // prefix, namespace
325N/A case 3:
325N/A return q.set(
325N/A decodeIdentifyingNonEmptyStringIndexOnFirstBitAsPrefix(true),
325N/A decodeIdentifyingNonEmptyStringIndexOnFirstBitAsNamespaceName(true),
325N/A decodeIdentifyingNonEmptyStringOnFirstBit(_v.localName),
325N/A "",
325N/A 0,
325N/A _prefixIndex,
325N/A _namespaceNameIndex,
325N/A _identifier);
325N/A default:
325N/A throw new FastInfosetException(CommonResourceBundle.getInstance().getString("message.decodingEII"));
325N/A }
325N/A }
325N/A
325N/A protected final void processCommentII() throws FastInfosetException, IOException {
325N/A _eventType = COMMENT;
325N/A
325N/A switch(decodeNonIdentifyingStringOnFirstBit()) {
325N/A case NISTRING_STRING:
325N/A if (_addToTable) {
325N/A _v.otherString.add(new CharArray(_charBuffer, 0, _charBufferLength, true));
325N/A }
325N/A
325N/A _characters = _charBuffer;
325N/A _charactersOffset = 0;
325N/A break;
325N/A case NISTRING_ENCODING_ALGORITHM:
325N/A throw new FastInfosetException(CommonResourceBundle.getInstance().getString("message.commentIIAlgorithmNotSupported"));
325N/A case NISTRING_INDEX:
325N/A final CharArray ca = _v.otherString.get(_integer);
325N/A
325N/A _characters = ca.ch;
325N/A _charactersOffset = ca.start;
325N/A _charBufferLength = ca.length;
325N/A break;
325N/A case NISTRING_EMPTY_STRING:
325N/A _characters = _charBuffer;
325N/A _charactersOffset = 0;
325N/A _charBufferLength = 0;
325N/A break;
325N/A }
325N/A }
325N/A
325N/A protected final void processProcessingII() throws FastInfosetException, IOException {
325N/A _eventType = PROCESSING_INSTRUCTION;
325N/A
325N/A _piTarget = decodeIdentifyingNonEmptyStringOnFirstBit(_v.otherNCName);
325N/A
325N/A switch(decodeNonIdentifyingStringOnFirstBit()) {
325N/A case NISTRING_STRING:
325N/A _piData = new String(_charBuffer, 0, _charBufferLength);
325N/A if (_addToTable) {
325N/A _v.otherString.add(new CharArrayString(_piData));
325N/A }
325N/A break;
325N/A case NISTRING_ENCODING_ALGORITHM:
325N/A throw new FastInfosetException(CommonResourceBundle.getInstance().getString("message.processingIIWithEncodingAlgorithm"));
325N/A case NISTRING_INDEX:
325N/A _piData = _v.otherString.get(_integer).toString();
325N/A break;
325N/A case NISTRING_EMPTY_STRING:
325N/A _piData = "";
325N/A break;
325N/A }
325N/A }
325N/A
325N/A protected final void processUnexpandedEntityReference(final int b) throws FastInfosetException, IOException {
325N/A _eventType = ENTITY_REFERENCE;
325N/A
325N/A /*
325N/A * TODO
325N/A * How does StAX report such events?
325N/A */
325N/A String entity_reference_name = decodeIdentifyingNonEmptyStringOnFirstBit(_v.otherNCName);
325N/A
325N/A String system_identifier = ((b & EncodingConstants.UNEXPANDED_ENTITY_SYSTEM_IDENTIFIER_FLAG) > 0)
325N/A ? decodeIdentifyingNonEmptyStringOnFirstBit(_v.otherURI) : "";
325N/A String public_identifier = ((b & EncodingConstants.UNEXPANDED_ENTITY_PUBLIC_IDENTIFIER_FLAG) > 0)
325N/A ? decodeIdentifyingNonEmptyStringOnFirstBit(_v.otherURI) : "";
325N/A }
325N/A
325N/A protected final void processCIIEncodingAlgorithm(boolean addToTable) throws FastInfosetException, IOException {
325N/A _algorithmData = _octetBuffer;
325N/A _algorithmDataOffset = _octetBufferStart;
325N/A _algorithmDataLength = _octetBufferLength;
325N/A _isAlgorithmDataCloned = false;
325N/A
325N/A if (_algorithmId >= EncodingConstants.ENCODING_ALGORITHM_APPLICATION_START) {
325N/A _algorithmURI = _v.encodingAlgorithm.get(_algorithmId - EncodingConstants.ENCODING_ALGORITHM_APPLICATION_START);
325N/A if (_algorithmURI == null) {
325N/A throw new EncodingAlgorithmException(CommonResourceBundle.getInstance().getString("message.URINotPresent", new Object[]{Integer.valueOf(_identifier)}));
325N/A }
325N/A } else if (_algorithmId > EncodingConstants.ENCODING_ALGORITHM_BUILTIN_END) {
325N/A // Reserved built-in algorithms for future use
325N/A // TODO should use sax property to decide if event will be
325N/A // reported, allows for support through handler if required.
325N/A throw new EncodingAlgorithmException(CommonResourceBundle.getInstance().getString("message.identifiers10to31Reserved"));
325N/A }
325N/A
325N/A if (addToTable) {
325N/A convertEncodingAlgorithmDataToCharacters();
325N/A _characterContentChunkTable.add(_characters, _characters.length);
325N/A }
325N/A }
325N/A
325N/A protected final void processAIIEncodingAlgorithm(QualifiedName name, boolean addToTable) throws FastInfosetException, IOException {
325N/A EncodingAlgorithm ea = null;
325N/A String URI = null;
325N/A if (_identifier >= EncodingConstants.ENCODING_ALGORITHM_APPLICATION_START) {
325N/A URI = _v.encodingAlgorithm.get(_identifier - EncodingConstants.ENCODING_ALGORITHM_APPLICATION_START);
325N/A if (URI == null) {
325N/A throw new EncodingAlgorithmException(CommonResourceBundle.getInstance().getString("message.URINotPresent", new Object[]{Integer.valueOf(_identifier)}));
325N/A } else if (_registeredEncodingAlgorithms != null) {
325N/A ea = (EncodingAlgorithm)_registeredEncodingAlgorithms.get(URI);
325N/A }
325N/A } else if (_identifier >= EncodingConstants.ENCODING_ALGORITHM_BUILTIN_END) {
325N/A if (_identifier == EncodingAlgorithmIndexes.CDATA) {
325N/A throw new EncodingAlgorithmException(CommonResourceBundle.getInstance().getString("message.CDATAAlgorithmNotSupported"));
325N/A }
325N/A
325N/A // Reserved built-in algorithms for future use
325N/A // TODO should use sax property to decide if event will be
325N/A // reported, allows for support through handler if required.
325N/A throw new EncodingAlgorithmException(CommonResourceBundle.getInstance().getString("message.identifiers10to31Reserved"));
325N/A } else {
325N/A ea = BuiltInEncodingAlgorithmFactory.getAlgorithm(_identifier);
325N/A }
325N/A
325N/A Object algorithmData;
325N/A
325N/A if (ea != null) {
325N/A algorithmData = ea.decodeFromBytes(_octetBuffer, _octetBufferStart,
325N/A _octetBufferLength);
325N/A } else {
325N/A final byte[] data = new byte[_octetBufferLength];
325N/A System.arraycopy(_octetBuffer, _octetBufferStart, data, 0,
325N/A _octetBufferLength);
325N/A algorithmData = data;
325N/A }
325N/A
325N/A _attributes.addAttributeWithAlgorithmData(name, URI, _identifier,
325N/A algorithmData);
325N/A if (addToTable) {
325N/A _attributeValueTable.add(_attributes.getValue(_attributes.getIndex(name.qName)));
325N/A }
325N/A }
325N/A
325N/A protected final void convertEncodingAlgorithmDataToCharacters() throws FastInfosetException, IOException {
325N/A StringBuffer buffer = new StringBuffer();
325N/A if (_algorithmId == EncodingAlgorithmIndexes.BASE64) {
325N/A convertBase64AlorithmDataToCharacters(buffer);
325N/A } else if (_algorithmId < EncodingConstants.ENCODING_ALGORITHM_BUILTIN_END) {
325N/A Object array = BuiltInEncodingAlgorithmFactory.getAlgorithm(_algorithmId).
325N/A decodeFromBytes(_algorithmData, _algorithmDataOffset, _algorithmDataLength);
325N/A BuiltInEncodingAlgorithmFactory.getAlgorithm(_algorithmId).convertToCharacters(array, buffer);
325N/A } else if (_algorithmId == EncodingAlgorithmIndexes.CDATA) {
325N/A _octetBufferOffset -= _octetBufferLength;
325N/A decodeUtf8StringIntoCharBuffer();
325N/A
325N/A _characters = _charBuffer;
325N/A _charactersOffset = 0;
325N/A return;
325N/A } else if (_algorithmId >= EncodingConstants.ENCODING_ALGORITHM_APPLICATION_START) {
325N/A final EncodingAlgorithm ea = (EncodingAlgorithm)_registeredEncodingAlgorithms.get(_algorithmURI);
325N/A if (ea != null) {
325N/A final Object data = ea.decodeFromBytes(_octetBuffer, _octetBufferStart, _octetBufferLength);
325N/A ea.convertToCharacters(data, buffer);
325N/A } else {
325N/A throw new EncodingAlgorithmException(
325N/A CommonResourceBundle.getInstance().getString("message.algorithmDataCannotBeReported"));
325N/A }
325N/A }
325N/A
325N/A _characters = new char[buffer.length()];
325N/A buffer.getChars(0, buffer.length(), _characters, 0);
325N/A _charactersOffset = 0;
325N/A _charBufferLength = _characters.length;
325N/A }
325N/A
325N/A /* If base64 data comes is chunks, bytes, which were cut to align 3,
325N/A * from prev. base64 chunk are stored in this buffer */
325N/A private byte[] base64TaleBytes = new byte[3];
325N/A private int base64TaleLength;
325N/A /*
325N/A * Method converts _algorithmData to base64 encoded String
325N/A * Counts with base64 data coming in chunks, aligning input chunks by 3,
325N/A * avoiding double cloning, happening after possible peek, peek2 cloning by Base64 algorithm
325N/A */
325N/A protected void convertBase64AlorithmDataToCharacters(StringBuffer buffer) throws EncodingAlgorithmException, IOException {
325N/A // How much new came data was serialized with prev. tale
325N/A int afterTaleOffset = 0;
325N/A
325N/A if (base64TaleLength > 0) {
325N/A // Serialize tale left from prev. chunk
325N/A int bytesToCopy = Math.min(3 - base64TaleLength, _algorithmDataLength);
325N/A System.arraycopy(_algorithmData, _algorithmDataOffset, base64TaleBytes, base64TaleLength, bytesToCopy);
325N/A if (base64TaleLength + bytesToCopy == 3) {
325N/A base64DecodeWithCloning(buffer, base64TaleBytes, 0, 3);
325N/A } else if (!isBase64Follows()) {
325N/A // End of text was read to temp array
325N/A base64DecodeWithCloning(buffer, base64TaleBytes, 0, base64TaleLength + bytesToCopy);
325N/A return;
325N/A } else {
325N/A // If the end of chunk fit to tmp array, but next chunk is expected
325N/A base64TaleLength += bytesToCopy;
325N/A return;
325N/A }
325N/A
325N/A afterTaleOffset = bytesToCopy;
325N/A base64TaleLength = 0;
325N/A }
325N/A
325N/A int taleBytesRemaining = isBase64Follows() ? (_algorithmDataLength - afterTaleOffset) % 3 : 0;
325N/A
325N/A if (_isAlgorithmDataCloned) {
325N/A base64DecodeWithoutCloning(buffer, _algorithmData, _algorithmDataOffset + afterTaleOffset,
325N/A _algorithmDataLength - afterTaleOffset - taleBytesRemaining);
325N/A } else {
325N/A base64DecodeWithCloning(buffer, _algorithmData, _algorithmDataOffset + afterTaleOffset,
325N/A _algorithmDataLength - afterTaleOffset - taleBytesRemaining);
325N/A }
325N/A
325N/A if (taleBytesRemaining > 0) {
325N/A System.arraycopy(_algorithmData, _algorithmDataOffset + _algorithmDataLength - taleBytesRemaining,
325N/A base64TaleBytes, 0, taleBytesRemaining);
325N/A base64TaleLength = taleBytesRemaining;
325N/A }
325N/A }
325N/A
325N/A /*
325N/A * Encodes incoming data to Base64 string.
325N/A * Method performs additional input data cloning
325N/A */
325N/A private void base64DecodeWithCloning(StringBuffer dstBuffer, byte[] data, int offset, int length) throws EncodingAlgorithmException {
325N/A Object array = BuiltInEncodingAlgorithmFactory.base64EncodingAlgorithm.
325N/A decodeFromBytes(data, offset, length);
325N/A BuiltInEncodingAlgorithmFactory.base64EncodingAlgorithm.convertToCharacters(array, dstBuffer);
325N/A }
325N/A
325N/A /*
325N/A * Encodes incoming data to Base64 string.
325N/A * Avoids input data cloning
325N/A */
325N/A private void base64DecodeWithoutCloning(StringBuffer dstBuffer, byte[] data, int offset, int length) throws EncodingAlgorithmException {
325N/A BuiltInEncodingAlgorithmFactory.base64EncodingAlgorithm.convertToCharacters(data, offset, length, dstBuffer);
325N/A }
325N/A
325N/A
325N/A /*
325N/A * Looks ahead in InputStream, whether next data is Base64 chunk
325N/A */
325N/A public boolean isBase64Follows() throws IOException {
325N/A // Process information item
325N/A int b = peek(this);
325N/A switch (DecoderStateTables.EII(b)) {
325N/A case DecoderStateTables.CII_EA:
325N/A int algorithmId = (b & 0x02) << 6;
325N/A int b2 = peek2(this);
325N/A algorithmId |= (b2 & 0xFC) >> 2;
325N/A
325N/A return algorithmId == EncodingAlgorithmIndexes.BASE64;
325N/A default:
325N/A return false;
325N/A }
325N/A }
325N/A
325N/A protected class NamespaceContextImpl implements NamespaceContext {
325N/A public final String getNamespaceURI(String prefix) {
325N/A return _prefixTable.getNamespaceFromPrefix(prefix);
325N/A }
325N/A
325N/A public final String getPrefix(String namespaceURI) {
325N/A return _prefixTable.getPrefixFromNamespace(namespaceURI);
325N/A }
325N/A
325N/A public final Iterator getPrefixes(String namespaceURI) {
325N/A return _prefixTable.getPrefixesFromNamespace(namespaceURI);
325N/A }
325N/A }
325N/A
325N/A public final String getNamespaceDecl(String prefix) {
325N/A return _prefixTable.getNamespaceFromPrefix(prefix);
325N/A }
325N/A
325N/A public final String getURI(String prefix) {
325N/A return getNamespaceDecl(prefix);
325N/A }
325N/A
325N/A public final Iterator getPrefixes() {
325N/A return _prefixTable.getPrefixes();
325N/A }
325N/A
325N/A public final AttributesHolder getAttributesHolder() {
325N/A return _attributes;
325N/A }
325N/A
325N/A public final void setManager(StAXManager manager) {
325N/A _manager = manager;
325N/A }
325N/A
325N/A final static String getEventTypeString(int eventType) {
325N/A switch (eventType){
325N/A case START_ELEMENT:
325N/A return "START_ELEMENT";
325N/A case END_ELEMENT:
325N/A return "END_ELEMENT";
325N/A case PROCESSING_INSTRUCTION:
325N/A return "PROCESSING_INSTRUCTION";
325N/A case CHARACTERS:
325N/A return "CHARACTERS";
325N/A case COMMENT:
325N/A return "COMMENT";
325N/A case START_DOCUMENT:
325N/A return "START_DOCUMENT";
325N/A case END_DOCUMENT:
325N/A return "END_DOCUMENT";
325N/A case ENTITY_REFERENCE:
325N/A return "ENTITY_REFERENCE";
325N/A case ATTRIBUTE:
325N/A return "ATTRIBUTE";
325N/A case DTD:
325N/A return "DTD";
325N/A case CDATA:
325N/A return "CDATA";
325N/A }
325N/A return "UNKNOWN_EVENT_TYPE";
325N/A }
325N/A}