/* * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.xml.internal.stream.buffer; /** * Base class for classes that creates {@link MutableXMLStreamBuffer} * and from infoset in API-specific form. */ public class AbstractCreator extends AbstractCreatorProcessor { protected MutableXMLStreamBuffer _buffer; public void setXMLStreamBuffer(MutableXMLStreamBuffer buffer) { if (buffer == null) { throw new NullPointerException("buffer cannot be null"); } setBuffer(buffer); } public MutableXMLStreamBuffer getXMLStreamBuffer() { return _buffer; } protected final void createBuffer() { setBuffer(new MutableXMLStreamBuffer()); } /** * Should be called whenever a new tree is stored on the buffer. */ protected final void increaseTreeCount() { _buffer.treeCount++; } protected final void setBuffer(MutableXMLStreamBuffer buffer) { _buffer = buffer; _currentStructureFragment = _buffer.getStructure(); _structure = _currentStructureFragment.getArray(); _structurePtr = 0; _currentStructureStringFragment = _buffer.getStructureStrings(); _structureStrings = _currentStructureStringFragment.getArray(); _structureStringsPtr = 0; _currentContentCharactersBufferFragment = _buffer.getContentCharactersBuffer(); _contentCharactersBuffer = _currentContentCharactersBufferFragment.getArray(); _contentCharactersBufferPtr = 0; _currentContentObjectFragment = _buffer.getContentObjects(); _contentObjects = _currentContentObjectFragment.getArray(); _contentObjectsPtr = 0; } protected final void setHasInternedStrings(boolean hasInternedStrings) { _buffer.setHasInternedStrings(hasInternedStrings); } protected final void storeStructure(int b) { _structure[_structurePtr++] = (byte)b; if (_structurePtr == _structure.length) { resizeStructure(); } } protected final void resizeStructure() { _structurePtr = 0; if (_currentStructureFragment.getNext() != null) { _currentStructureFragment = _currentStructureFragment.getNext(); _structure = _currentStructureFragment.getArray(); } else { _structure = new byte[_structure.length]; _currentStructureFragment = new FragmentedArray(_structure, _currentStructureFragment); } } protected final void storeStructureString(String s) { _structureStrings[_structureStringsPtr++] = s; if (_structureStringsPtr == _structureStrings.length) { resizeStructureStrings(); } } protected final void resizeStructureStrings() { _structureStringsPtr = 0; if (_currentStructureStringFragment.getNext() != null) { _currentStructureStringFragment = _currentStructureStringFragment.getNext(); _structureStrings = _currentStructureStringFragment.getArray(); } else { _structureStrings = new String[_structureStrings.length]; _currentStructureStringFragment = new FragmentedArray(_structureStrings, _currentStructureStringFragment); } } protected final void storeContentString(String s) { storeContentObject(s); } protected final void storeContentCharacters(int type, char[] ch, int start, int length) { if (_contentCharactersBufferPtr + length >= _contentCharactersBuffer.length) { if (length >= 512) { storeStructure(type | CONTENT_TYPE_CHAR_ARRAY_COPY); storeContentCharactersCopy(ch, start, length); return; } resizeContentCharacters(); } if (length < CHAR_ARRAY_LENGTH_SMALL_SIZE) { storeStructure(type); storeStructure(length); System.arraycopy(ch, start, _contentCharactersBuffer, _contentCharactersBufferPtr, length); _contentCharactersBufferPtr += length; } else if (length < CHAR_ARRAY_LENGTH_MEDIUM_SIZE) { storeStructure(type | CHAR_ARRAY_LENGTH_MEDIUM); storeStructure(length >> 8); storeStructure(length & 255); System.arraycopy(ch, start, _contentCharactersBuffer, _contentCharactersBufferPtr, length); _contentCharactersBufferPtr += length; } else { storeStructure(type | CONTENT_TYPE_CHAR_ARRAY_COPY); storeContentCharactersCopy(ch, start, length); } } protected final void resizeContentCharacters() { _contentCharactersBufferPtr = 0; if (_currentContentCharactersBufferFragment.getNext() != null) { _currentContentCharactersBufferFragment = _currentContentCharactersBufferFragment.getNext(); _contentCharactersBuffer = _currentContentCharactersBufferFragment.getArray(); } else { _contentCharactersBuffer = new char[_contentCharactersBuffer.length]; _currentContentCharactersBufferFragment = new FragmentedArray(_contentCharactersBuffer, _currentContentCharactersBufferFragment); } } protected final void storeContentCharactersCopy(char[] ch, int start, int length) { char[] copyOfCh = new char[length]; System.arraycopy(ch, start, copyOfCh, 0, length); storeContentObject(copyOfCh); } protected final Object peekAtContentObject() { return _contentObjects[_contentObjectsPtr]; } protected final void storeContentObject(Object s) { _contentObjects[_contentObjectsPtr++] = s; if (_contentObjectsPtr == _contentObjects.length) { resizeContentObjects(); } } protected final void resizeContentObjects() { _contentObjectsPtr = 0; if (_currentContentObjectFragment.getNext() != null) { _currentContentObjectFragment = _currentContentObjectFragment.getNext(); _contentObjects = _currentContentObjectFragment.getArray(); } else { _contentObjects = new Object[_contentObjects.length]; _currentContentObjectFragment = new FragmentedArray(_contentObjects, _currentContentObjectFragment); } } }