325N/A/*
325N/A * Copyright (c) 2005, 2010, 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
325N/Apackage com.sun.xml.internal.stream.buffer;
325N/A
325N/A/**
325N/A * Base class for classes that processes {@link XMLStreamBuffer}
325N/A * and produces infoset in API-specific form.
325N/A */
325N/Apublic abstract class AbstractProcessor extends AbstractCreatorProcessor {
325N/A protected static final int STATE_ILLEGAL = 0;
325N/A
325N/A protected static final int STATE_DOCUMENT = 1;
325N/A protected static final int STATE_DOCUMENT_FRAGMENT = 2;
325N/A protected static final int STATE_ELEMENT_U_LN_QN = 3;
325N/A protected static final int STATE_ELEMENT_P_U_LN = 4;
325N/A protected static final int STATE_ELEMENT_U_LN = 5;
325N/A protected static final int STATE_ELEMENT_LN = 6;
325N/A protected static final int STATE_TEXT_AS_CHAR_ARRAY_SMALL = 7;
325N/A protected static final int STATE_TEXT_AS_CHAR_ARRAY_MEDIUM = 8;
325N/A protected static final int STATE_TEXT_AS_CHAR_ARRAY_COPY = 9;
325N/A protected static final int STATE_TEXT_AS_STRING = 10;
325N/A protected static final int STATE_TEXT_AS_OBJECT = 11;
325N/A protected static final int STATE_COMMENT_AS_CHAR_ARRAY_SMALL = 12;
325N/A protected static final int STATE_COMMENT_AS_CHAR_ARRAY_MEDIUM = 13;
325N/A protected static final int STATE_COMMENT_AS_CHAR_ARRAY_COPY = 14;
325N/A protected static final int STATE_COMMENT_AS_STRING = 15;
325N/A protected static final int STATE_PROCESSING_INSTRUCTION = 16;
325N/A protected static final int STATE_END = 17;
325N/A private static final int[] _eiiStateTable = new int[256];
325N/A
325N/A protected static final int STATE_NAMESPACE_ATTRIBUTE = 1;
325N/A protected static final int STATE_NAMESPACE_ATTRIBUTE_P = 2;
325N/A protected static final int STATE_NAMESPACE_ATTRIBUTE_P_U = 3;
325N/A protected static final int STATE_NAMESPACE_ATTRIBUTE_U = 4;
325N/A private static final int[] _niiStateTable = new int[256];
325N/A
325N/A protected static final int STATE_ATTRIBUTE_U_LN_QN = 1;
325N/A protected static final int STATE_ATTRIBUTE_P_U_LN = 2;
325N/A protected static final int STATE_ATTRIBUTE_U_LN = 3;
325N/A protected static final int STATE_ATTRIBUTE_LN = 4;
325N/A protected static final int STATE_ATTRIBUTE_U_LN_QN_OBJECT = 5;
325N/A protected static final int STATE_ATTRIBUTE_P_U_LN_OBJECT = 6;
325N/A protected static final int STATE_ATTRIBUTE_U_LN_OBJECT = 7;
325N/A protected static final int STATE_ATTRIBUTE_LN_OBJECT = 8;
325N/A private static final int[] _aiiStateTable = new int[256];
325N/A
325N/A static {
325N/A /*
325N/A * Create a state table from information items and options.
325N/A * The swtich statement using such states will often generate a more
325N/A * efficient byte code representation that can be hotspotted using
325N/A * jump tables.
325N/A */
325N/A _eiiStateTable[T_DOCUMENT] = STATE_DOCUMENT;
325N/A _eiiStateTable[T_DOCUMENT_FRAGMENT] = STATE_DOCUMENT_FRAGMENT;
325N/A _eiiStateTable[T_ELEMENT_U_LN_QN] = STATE_ELEMENT_U_LN_QN;
325N/A _eiiStateTable[T_ELEMENT_P_U_LN] = STATE_ELEMENT_P_U_LN;
325N/A _eiiStateTable[T_ELEMENT_U_LN] = STATE_ELEMENT_U_LN;
325N/A _eiiStateTable[T_ELEMENT_LN] = STATE_ELEMENT_LN;
325N/A _eiiStateTable[T_TEXT_AS_CHAR_ARRAY_SMALL] = STATE_TEXT_AS_CHAR_ARRAY_SMALL;
325N/A _eiiStateTable[T_TEXT_AS_CHAR_ARRAY_MEDIUM] = STATE_TEXT_AS_CHAR_ARRAY_MEDIUM;
325N/A _eiiStateTable[T_TEXT_AS_CHAR_ARRAY_COPY] = STATE_TEXT_AS_CHAR_ARRAY_COPY;
325N/A _eiiStateTable[T_TEXT_AS_STRING] = STATE_TEXT_AS_STRING;
325N/A _eiiStateTable[T_TEXT_AS_OBJECT] = STATE_TEXT_AS_OBJECT;
325N/A _eiiStateTable[T_COMMENT_AS_CHAR_ARRAY_SMALL] = STATE_COMMENT_AS_CHAR_ARRAY_SMALL;
325N/A _eiiStateTable[T_COMMENT_AS_CHAR_ARRAY_MEDIUM] = STATE_COMMENT_AS_CHAR_ARRAY_MEDIUM;
325N/A _eiiStateTable[T_COMMENT_AS_CHAR_ARRAY_COPY] = STATE_COMMENT_AS_CHAR_ARRAY_COPY;
325N/A _eiiStateTable[T_COMMENT_AS_STRING] = STATE_COMMENT_AS_STRING;
325N/A _eiiStateTable[T_PROCESSING_INSTRUCTION] = STATE_PROCESSING_INSTRUCTION;
325N/A _eiiStateTable[T_END] = STATE_END;
325N/A
325N/A _niiStateTable[T_NAMESPACE_ATTRIBUTE] = STATE_NAMESPACE_ATTRIBUTE;
325N/A _niiStateTable[T_NAMESPACE_ATTRIBUTE_P] = STATE_NAMESPACE_ATTRIBUTE_P;
325N/A _niiStateTable[T_NAMESPACE_ATTRIBUTE_P_U] = STATE_NAMESPACE_ATTRIBUTE_P_U;
325N/A _niiStateTable[T_NAMESPACE_ATTRIBUTE_U] = STATE_NAMESPACE_ATTRIBUTE_U;
325N/A
325N/A _aiiStateTable[T_ATTRIBUTE_U_LN_QN] = STATE_ATTRIBUTE_U_LN_QN;
325N/A _aiiStateTable[T_ATTRIBUTE_P_U_LN] = STATE_ATTRIBUTE_P_U_LN;
325N/A _aiiStateTable[T_ATTRIBUTE_U_LN] = STATE_ATTRIBUTE_U_LN;
325N/A _aiiStateTable[T_ATTRIBUTE_LN] = STATE_ATTRIBUTE_LN;
325N/A _aiiStateTable[T_ATTRIBUTE_U_LN_QN_OBJECT] = STATE_ATTRIBUTE_U_LN_QN_OBJECT;
325N/A _aiiStateTable[T_ATTRIBUTE_P_U_LN_OBJECT] = STATE_ATTRIBUTE_P_U_LN_OBJECT;
325N/A _aiiStateTable[T_ATTRIBUTE_U_LN_OBJECT] = STATE_ATTRIBUTE_U_LN_OBJECT;
325N/A _aiiStateTable[T_ATTRIBUTE_LN_OBJECT] = STATE_ATTRIBUTE_LN_OBJECT;
325N/A }
325N/A
325N/A protected XMLStreamBuffer _buffer;
325N/A
325N/A /**
325N/A * True if this processor should create a fragment of XML, without the start/end document markers.
325N/A */
325N/A protected boolean _fragmentMode;
325N/A
325N/A protected boolean _stringInterningFeature = false;
325N/A
325N/A /**
325N/A * Number of remaining XML element trees that should be visible
325N/A * through this {@link AbstractProcessor}.
325N/A */
325N/A protected int _treeCount;
325N/A
325N/A /**
325N/A * @deprecated
325N/A * Use {@link #setBuffer(XMLStreamBuffer, boolean)}
325N/A */
325N/A protected final void setBuffer(XMLStreamBuffer buffer) {
325N/A setBuffer(buffer,buffer.isFragment());
325N/A }
325N/A protected final void setBuffer(XMLStreamBuffer buffer, boolean fragmentMode) {
325N/A _buffer = buffer;
325N/A _fragmentMode = fragmentMode;
325N/A
325N/A _currentStructureFragment = _buffer.getStructure();
325N/A _structure = _currentStructureFragment.getArray();
325N/A _structurePtr = _buffer.getStructurePtr();
325N/A
325N/A _currentStructureStringFragment = _buffer.getStructureStrings();
325N/A _structureStrings = _currentStructureStringFragment.getArray();
325N/A _structureStringsPtr = _buffer.getStructureStringsPtr();
325N/A
325N/A _currentContentCharactersBufferFragment = _buffer.getContentCharactersBuffer();
325N/A _contentCharactersBuffer = _currentContentCharactersBufferFragment.getArray();
325N/A _contentCharactersBufferPtr = _buffer.getContentCharactersBufferPtr();
325N/A
325N/A _currentContentObjectFragment = _buffer.getContentObjects();
325N/A _contentObjects = _currentContentObjectFragment.getArray();
325N/A _contentObjectsPtr = _buffer.getContentObjectsPtr();
325N/A
325N/A _stringInterningFeature = _buffer.hasInternedStrings();
325N/A _treeCount = _buffer.treeCount;
325N/A }
325N/A
325N/A protected final int peekStructure() {
325N/A if (_structurePtr < _structure.length) {
325N/A return _structure[_structurePtr] & 255;
325N/A }
325N/A
325N/A return readFromNextStructure(0);
325N/A }
325N/A
325N/A protected final int readStructure() {
325N/A if (_structurePtr < _structure.length) {
325N/A return _structure[_structurePtr++] & 255;
325N/A }
325N/A
325N/A return readFromNextStructure(1);
325N/A }
325N/A
325N/A protected final int readEiiState() {
325N/A return _eiiStateTable[readStructure()];
325N/A }
325N/A
325N/A protected static int getEIIState(int item) {
325N/A return _eiiStateTable[item];
325N/A }
325N/A
325N/A protected static int getNIIState(int item) {
325N/A return _niiStateTable[item];
325N/A }
325N/A
325N/A protected static int getAIIState(int item) {
325N/A return _aiiStateTable[item];
325N/A }
325N/A
325N/A protected final int readStructure16() {
325N/A return (readStructure() << 8) | readStructure();
325N/A }
325N/A
325N/A private int readFromNextStructure(int v) {
325N/A _structurePtr = v;
325N/A _currentStructureFragment = _currentStructureFragment.getNext();
325N/A _structure = _currentStructureFragment.getArray();
325N/A return _structure[0] & 255;
325N/A }
325N/A
325N/A protected final String readStructureString() {
325N/A if (_structureStringsPtr < _structureStrings.length) {
325N/A return _structureStrings[_structureStringsPtr++];
325N/A }
325N/A
325N/A _structureStringsPtr = 1;
325N/A _currentStructureStringFragment = _currentStructureStringFragment.getNext();
325N/A _structureStrings = _currentStructureStringFragment.getArray();
325N/A return _structureStrings[0];
325N/A }
325N/A
325N/A protected final String readContentString() {
325N/A return (String)readContentObject();
325N/A }
325N/A
325N/A protected final char[] readContentCharactersCopy() {
325N/A return (char[])readContentObject();
325N/A }
325N/A
325N/A protected final int readContentCharactersBuffer(int length) {
325N/A if (_contentCharactersBufferPtr + length < _contentCharactersBuffer.length) {
325N/A final int start = _contentCharactersBufferPtr;
325N/A _contentCharactersBufferPtr += length;
325N/A return start;
325N/A }
325N/A
325N/A _contentCharactersBufferPtr = length;
325N/A _currentContentCharactersBufferFragment = _currentContentCharactersBufferFragment.getNext();
325N/A _contentCharactersBuffer = _currentContentCharactersBufferFragment.getArray();
325N/A return 0;
325N/A }
325N/A
325N/A protected final Object readContentObject() {
325N/A if (_contentObjectsPtr < _contentObjects.length) {
325N/A return _contentObjects[_contentObjectsPtr++];
325N/A }
325N/A
325N/A _contentObjectsPtr = 1;
325N/A _currentContentObjectFragment = _currentContentObjectFragment.getNext();
325N/A _contentObjects = _currentContentObjectFragment.getArray();
325N/A return _contentObjects[0];
325N/A }
325N/A
325N/A protected final StringBuilder _qNameBuffer = new StringBuilder();
325N/A
325N/A protected final String getQName(String prefix, String localName) {
325N/A _qNameBuffer.append(prefix).append(':').append(localName);
325N/A final String qName = _qNameBuffer.toString();
325N/A _qNameBuffer.setLength(0);
325N/A return (_stringInterningFeature) ? qName.intern() : qName;
325N/A }
325N/A
325N/A protected final String getPrefixFromQName(String qName) {
325N/A int pIndex = qName.indexOf(':');
325N/A if (_stringInterningFeature) {
325N/A return (pIndex != -1) ? qName.substring(0,pIndex).intern() : "";
325N/A } else {
325N/A return (pIndex != -1) ? qName.substring(0,pIndex) : "";
325N/A }
325N/A }
325N/A}