src/share/jaxws_classes/com/sun/xml/internal/stream/buffer/AbstractProcessor.java

Thu, 31 Aug 2017 15:18:52 +0800

author
aoqi
date
Thu, 31 Aug 2017 15:18:52 +0800
changeset 637
9c07ef4934dd
parent 397
b99d7e355d4b
parent 0
373ffda63c9a
permissions
-rw-r--r--

merge

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation. Oracle designates this
aoqi@0 8 * particular file as subject to the "Classpath" exception as provided
aoqi@0 9 * by Oracle in the LICENSE file that accompanied this code.
aoqi@0 10 *
aoqi@0 11 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 14 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 15 * accompanied this code).
aoqi@0 16 *
aoqi@0 17 * You should have received a copy of the GNU General Public License version
aoqi@0 18 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 20 *
aoqi@0 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 22 * or visit www.oracle.com if you need additional information or have any
aoqi@0 23 * questions.
aoqi@0 24 */
aoqi@0 25
aoqi@0 26 package com.sun.xml.internal.stream.buffer;
aoqi@0 27
aoqi@0 28 /**
aoqi@0 29 * Base class for classes that processes {@link XMLStreamBuffer}
aoqi@0 30 * and produces infoset in API-specific form.
aoqi@0 31 */
aoqi@0 32 public abstract class AbstractProcessor extends AbstractCreatorProcessor {
aoqi@0 33 protected static final int STATE_ILLEGAL = 0;
aoqi@0 34
aoqi@0 35 protected static final int STATE_DOCUMENT = 1;
aoqi@0 36 protected static final int STATE_DOCUMENT_FRAGMENT = 2;
aoqi@0 37 protected static final int STATE_ELEMENT_U_LN_QN = 3;
aoqi@0 38 protected static final int STATE_ELEMENT_P_U_LN = 4;
aoqi@0 39 protected static final int STATE_ELEMENT_U_LN = 5;
aoqi@0 40 protected static final int STATE_ELEMENT_LN = 6;
aoqi@0 41 protected static final int STATE_TEXT_AS_CHAR_ARRAY_SMALL = 7;
aoqi@0 42 protected static final int STATE_TEXT_AS_CHAR_ARRAY_MEDIUM = 8;
aoqi@0 43 protected static final int STATE_TEXT_AS_CHAR_ARRAY_COPY = 9;
aoqi@0 44 protected static final int STATE_TEXT_AS_STRING = 10;
aoqi@0 45 protected static final int STATE_TEXT_AS_OBJECT = 11;
aoqi@0 46 protected static final int STATE_COMMENT_AS_CHAR_ARRAY_SMALL = 12;
aoqi@0 47 protected static final int STATE_COMMENT_AS_CHAR_ARRAY_MEDIUM = 13;
aoqi@0 48 protected static final int STATE_COMMENT_AS_CHAR_ARRAY_COPY = 14;
aoqi@0 49 protected static final int STATE_COMMENT_AS_STRING = 15;
aoqi@0 50 protected static final int STATE_PROCESSING_INSTRUCTION = 16;
aoqi@0 51 protected static final int STATE_END = 17;
aoqi@0 52 private static final int[] _eiiStateTable = new int[256];
aoqi@0 53
aoqi@0 54 protected static final int STATE_NAMESPACE_ATTRIBUTE = 1;
aoqi@0 55 protected static final int STATE_NAMESPACE_ATTRIBUTE_P = 2;
aoqi@0 56 protected static final int STATE_NAMESPACE_ATTRIBUTE_P_U = 3;
aoqi@0 57 protected static final int STATE_NAMESPACE_ATTRIBUTE_U = 4;
aoqi@0 58 private static final int[] _niiStateTable = new int[256];
aoqi@0 59
aoqi@0 60 protected static final int STATE_ATTRIBUTE_U_LN_QN = 1;
aoqi@0 61 protected static final int STATE_ATTRIBUTE_P_U_LN = 2;
aoqi@0 62 protected static final int STATE_ATTRIBUTE_U_LN = 3;
aoqi@0 63 protected static final int STATE_ATTRIBUTE_LN = 4;
aoqi@0 64 protected static final int STATE_ATTRIBUTE_U_LN_QN_OBJECT = 5;
aoqi@0 65 protected static final int STATE_ATTRIBUTE_P_U_LN_OBJECT = 6;
aoqi@0 66 protected static final int STATE_ATTRIBUTE_U_LN_OBJECT = 7;
aoqi@0 67 protected static final int STATE_ATTRIBUTE_LN_OBJECT = 8;
aoqi@0 68 private static final int[] _aiiStateTable = new int[256];
aoqi@0 69
aoqi@0 70 static {
aoqi@0 71 /*
aoqi@0 72 * Create a state table from information items and options.
aoqi@0 73 * The swtich statement using such states will often generate a more
aoqi@0 74 * efficient byte code representation that can be hotspotted using
aoqi@0 75 * jump tables.
aoqi@0 76 */
aoqi@0 77 _eiiStateTable[T_DOCUMENT] = STATE_DOCUMENT;
aoqi@0 78 _eiiStateTable[T_DOCUMENT_FRAGMENT] = STATE_DOCUMENT_FRAGMENT;
aoqi@0 79 _eiiStateTable[T_ELEMENT_U_LN_QN] = STATE_ELEMENT_U_LN_QN;
aoqi@0 80 _eiiStateTable[T_ELEMENT_P_U_LN] = STATE_ELEMENT_P_U_LN;
aoqi@0 81 _eiiStateTable[T_ELEMENT_U_LN] = STATE_ELEMENT_U_LN;
aoqi@0 82 _eiiStateTable[T_ELEMENT_LN] = STATE_ELEMENT_LN;
aoqi@0 83 _eiiStateTable[T_TEXT_AS_CHAR_ARRAY_SMALL] = STATE_TEXT_AS_CHAR_ARRAY_SMALL;
aoqi@0 84 _eiiStateTable[T_TEXT_AS_CHAR_ARRAY_MEDIUM] = STATE_TEXT_AS_CHAR_ARRAY_MEDIUM;
aoqi@0 85 _eiiStateTable[T_TEXT_AS_CHAR_ARRAY_COPY] = STATE_TEXT_AS_CHAR_ARRAY_COPY;
aoqi@0 86 _eiiStateTable[T_TEXT_AS_STRING] = STATE_TEXT_AS_STRING;
aoqi@0 87 _eiiStateTable[T_TEXT_AS_OBJECT] = STATE_TEXT_AS_OBJECT;
aoqi@0 88 _eiiStateTable[T_COMMENT_AS_CHAR_ARRAY_SMALL] = STATE_COMMENT_AS_CHAR_ARRAY_SMALL;
aoqi@0 89 _eiiStateTable[T_COMMENT_AS_CHAR_ARRAY_MEDIUM] = STATE_COMMENT_AS_CHAR_ARRAY_MEDIUM;
aoqi@0 90 _eiiStateTable[T_COMMENT_AS_CHAR_ARRAY_COPY] = STATE_COMMENT_AS_CHAR_ARRAY_COPY;
aoqi@0 91 _eiiStateTable[T_COMMENT_AS_STRING] = STATE_COMMENT_AS_STRING;
aoqi@0 92 _eiiStateTable[T_PROCESSING_INSTRUCTION] = STATE_PROCESSING_INSTRUCTION;
aoqi@0 93 _eiiStateTable[T_END] = STATE_END;
aoqi@0 94
aoqi@0 95 _niiStateTable[T_NAMESPACE_ATTRIBUTE] = STATE_NAMESPACE_ATTRIBUTE;
aoqi@0 96 _niiStateTable[T_NAMESPACE_ATTRIBUTE_P] = STATE_NAMESPACE_ATTRIBUTE_P;
aoqi@0 97 _niiStateTable[T_NAMESPACE_ATTRIBUTE_P_U] = STATE_NAMESPACE_ATTRIBUTE_P_U;
aoqi@0 98 _niiStateTable[T_NAMESPACE_ATTRIBUTE_U] = STATE_NAMESPACE_ATTRIBUTE_U;
aoqi@0 99
aoqi@0 100 _aiiStateTable[T_ATTRIBUTE_U_LN_QN] = STATE_ATTRIBUTE_U_LN_QN;
aoqi@0 101 _aiiStateTable[T_ATTRIBUTE_P_U_LN] = STATE_ATTRIBUTE_P_U_LN;
aoqi@0 102 _aiiStateTable[T_ATTRIBUTE_U_LN] = STATE_ATTRIBUTE_U_LN;
aoqi@0 103 _aiiStateTable[T_ATTRIBUTE_LN] = STATE_ATTRIBUTE_LN;
aoqi@0 104 _aiiStateTable[T_ATTRIBUTE_U_LN_QN_OBJECT] = STATE_ATTRIBUTE_U_LN_QN_OBJECT;
aoqi@0 105 _aiiStateTable[T_ATTRIBUTE_P_U_LN_OBJECT] = STATE_ATTRIBUTE_P_U_LN_OBJECT;
aoqi@0 106 _aiiStateTable[T_ATTRIBUTE_U_LN_OBJECT] = STATE_ATTRIBUTE_U_LN_OBJECT;
aoqi@0 107 _aiiStateTable[T_ATTRIBUTE_LN_OBJECT] = STATE_ATTRIBUTE_LN_OBJECT;
aoqi@0 108 }
aoqi@0 109
aoqi@0 110 protected XMLStreamBuffer _buffer;
aoqi@0 111
aoqi@0 112 /**
aoqi@0 113 * True if this processor should create a fragment of XML, without the start/end document markers.
aoqi@0 114 */
aoqi@0 115 protected boolean _fragmentMode;
aoqi@0 116
aoqi@0 117 protected boolean _stringInterningFeature = false;
aoqi@0 118
aoqi@0 119 /**
aoqi@0 120 * Number of remaining XML element trees that should be visible
aoqi@0 121 * through this {@link AbstractProcessor}.
aoqi@0 122 */
aoqi@0 123 protected int _treeCount;
aoqi@0 124
aoqi@0 125 /**
aoqi@0 126 * @deprecated
aoqi@0 127 * Use {@link #setBuffer(XMLStreamBuffer, boolean)}
aoqi@0 128 */
aoqi@0 129 protected final void setBuffer(XMLStreamBuffer buffer) {
aoqi@0 130 setBuffer(buffer,buffer.isFragment());
aoqi@0 131 }
aoqi@0 132 protected final void setBuffer(XMLStreamBuffer buffer, boolean fragmentMode) {
aoqi@0 133 _buffer = buffer;
aoqi@0 134 _fragmentMode = fragmentMode;
aoqi@0 135
aoqi@0 136 _currentStructureFragment = _buffer.getStructure();
aoqi@0 137 _structure = _currentStructureFragment.getArray();
aoqi@0 138 _structurePtr = _buffer.getStructurePtr();
aoqi@0 139
aoqi@0 140 _currentStructureStringFragment = _buffer.getStructureStrings();
aoqi@0 141 _structureStrings = _currentStructureStringFragment.getArray();
aoqi@0 142 _structureStringsPtr = _buffer.getStructureStringsPtr();
aoqi@0 143
aoqi@0 144 _currentContentCharactersBufferFragment = _buffer.getContentCharactersBuffer();
aoqi@0 145 _contentCharactersBuffer = _currentContentCharactersBufferFragment.getArray();
aoqi@0 146 _contentCharactersBufferPtr = _buffer.getContentCharactersBufferPtr();
aoqi@0 147
aoqi@0 148 _currentContentObjectFragment = _buffer.getContentObjects();
aoqi@0 149 _contentObjects = _currentContentObjectFragment.getArray();
aoqi@0 150 _contentObjectsPtr = _buffer.getContentObjectsPtr();
aoqi@0 151
aoqi@0 152 _stringInterningFeature = _buffer.hasInternedStrings();
aoqi@0 153 _treeCount = _buffer.treeCount;
aoqi@0 154 }
aoqi@0 155
aoqi@0 156 protected final int peekStructure() {
aoqi@0 157 if (_structurePtr < _structure.length) {
aoqi@0 158 return _structure[_structurePtr] & 255;
aoqi@0 159 }
aoqi@0 160
aoqi@0 161 return readFromNextStructure(0);
aoqi@0 162 }
aoqi@0 163
aoqi@0 164 protected final int readStructure() {
aoqi@0 165 if (_structurePtr < _structure.length) {
aoqi@0 166 return _structure[_structurePtr++] & 255;
aoqi@0 167 }
aoqi@0 168
aoqi@0 169 return readFromNextStructure(1);
aoqi@0 170 }
aoqi@0 171
aoqi@0 172 protected final int readEiiState() {
aoqi@0 173 return _eiiStateTable[readStructure()];
aoqi@0 174 }
aoqi@0 175
aoqi@0 176 protected static int getEIIState(int item) {
aoqi@0 177 return _eiiStateTable[item];
aoqi@0 178 }
aoqi@0 179
aoqi@0 180 protected static int getNIIState(int item) {
aoqi@0 181 return _niiStateTable[item];
aoqi@0 182 }
aoqi@0 183
aoqi@0 184 protected static int getAIIState(int item) {
aoqi@0 185 return _aiiStateTable[item];
aoqi@0 186 }
aoqi@0 187
aoqi@0 188 protected final int readStructure16() {
aoqi@0 189 return (readStructure() << 8) | readStructure();
aoqi@0 190 }
aoqi@0 191
aoqi@0 192 private int readFromNextStructure(int v) {
aoqi@0 193 _structurePtr = v;
aoqi@0 194 _currentStructureFragment = _currentStructureFragment.getNext();
aoqi@0 195 _structure = _currentStructureFragment.getArray();
aoqi@0 196 return _structure[0] & 255;
aoqi@0 197 }
aoqi@0 198
aoqi@0 199 protected final String readStructureString() {
aoqi@0 200 if (_structureStringsPtr < _structureStrings.length) {
aoqi@0 201 return _structureStrings[_structureStringsPtr++];
aoqi@0 202 }
aoqi@0 203
aoqi@0 204 _structureStringsPtr = 1;
aoqi@0 205 _currentStructureStringFragment = _currentStructureStringFragment.getNext();
aoqi@0 206 _structureStrings = _currentStructureStringFragment.getArray();
aoqi@0 207 return _structureStrings[0];
aoqi@0 208 }
aoqi@0 209
aoqi@0 210 protected final String readContentString() {
aoqi@0 211 return (String)readContentObject();
aoqi@0 212 }
aoqi@0 213
aoqi@0 214 protected final char[] readContentCharactersCopy() {
aoqi@0 215 return (char[])readContentObject();
aoqi@0 216 }
aoqi@0 217
aoqi@0 218 protected final int readContentCharactersBuffer(int length) {
aoqi@0 219 if (_contentCharactersBufferPtr + length < _contentCharactersBuffer.length) {
aoqi@0 220 final int start = _contentCharactersBufferPtr;
aoqi@0 221 _contentCharactersBufferPtr += length;
aoqi@0 222 return start;
aoqi@0 223 }
aoqi@0 224
aoqi@0 225 _contentCharactersBufferPtr = length;
aoqi@0 226 _currentContentCharactersBufferFragment = _currentContentCharactersBufferFragment.getNext();
aoqi@0 227 _contentCharactersBuffer = _currentContentCharactersBufferFragment.getArray();
aoqi@0 228 return 0;
aoqi@0 229 }
aoqi@0 230
aoqi@0 231 protected final Object readContentObject() {
aoqi@0 232 if (_contentObjectsPtr < _contentObjects.length) {
aoqi@0 233 return _contentObjects[_contentObjectsPtr++];
aoqi@0 234 }
aoqi@0 235
aoqi@0 236 _contentObjectsPtr = 1;
aoqi@0 237 _currentContentObjectFragment = _currentContentObjectFragment.getNext();
aoqi@0 238 _contentObjects = _currentContentObjectFragment.getArray();
aoqi@0 239 return _contentObjects[0];
aoqi@0 240 }
aoqi@0 241
aoqi@0 242 protected final StringBuilder _qNameBuffer = new StringBuilder();
aoqi@0 243
aoqi@0 244 protected final String getQName(String prefix, String localName) {
aoqi@0 245 _qNameBuffer.append(prefix).append(':').append(localName);
aoqi@0 246 final String qName = _qNameBuffer.toString();
aoqi@0 247 _qNameBuffer.setLength(0);
aoqi@0 248 return (_stringInterningFeature) ? qName.intern() : qName;
aoqi@0 249 }
aoqi@0 250
aoqi@0 251 protected final String getPrefixFromQName(String qName) {
aoqi@0 252 int pIndex = qName.indexOf(':');
aoqi@0 253 if (_stringInterningFeature) {
aoqi@0 254 return (pIndex != -1) ? qName.substring(0,pIndex).intern() : "";
aoqi@0 255 } else {
aoqi@0 256 return (pIndex != -1) ? qName.substring(0,pIndex) : "";
aoqi@0 257 }
aoqi@0 258 }
aoqi@0 259 }

mercurial