aoqi@0: /* aoqi@0: * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. Oracle designates this aoqi@0: * particular file as subject to the "Classpath" exception as provided aoqi@0: * by Oracle in the LICENSE file that accompanied this code. aoqi@0: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). aoqi@0: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: * aoqi@0: * THIS FILE WAS MODIFIED BY SUN MICROSYSTEMS, INC. aoqi@0: */ aoqi@0: aoqi@0: package com.sun.xml.internal.fastinfoset.vocab; aoqi@0: aoqi@0: import com.sun.xml.internal.fastinfoset.EncodingConstants; aoqi@0: import com.sun.xml.internal.fastinfoset.QualifiedName; aoqi@0: import com.sun.xml.internal.fastinfoset.util.CharArrayIntMap; aoqi@0: import com.sun.xml.internal.fastinfoset.util.FixedEntryStringIntMap; aoqi@0: import com.sun.xml.internal.fastinfoset.util.KeyIntMap; aoqi@0: import com.sun.xml.internal.fastinfoset.util.LocalNameQualifiedNamesMap; aoqi@0: import com.sun.xml.internal.fastinfoset.util.StringIntMap; aoqi@0: import java.util.Iterator; aoqi@0: import javax.xml.namespace.QName; aoqi@0: aoqi@0: public class SerializerVocabulary extends Vocabulary { aoqi@0: public final StringIntMap restrictedAlphabet; aoqi@0: public final StringIntMap encodingAlgorithm; aoqi@0: aoqi@0: public final StringIntMap namespaceName; aoqi@0: public final StringIntMap prefix; aoqi@0: public final StringIntMap localName; aoqi@0: public final StringIntMap otherNCName; aoqi@0: public final StringIntMap otherURI; aoqi@0: public final StringIntMap attributeValue; aoqi@0: public final CharArrayIntMap otherString; aoqi@0: aoqi@0: public final CharArrayIntMap characterContentChunk; aoqi@0: aoqi@0: public final LocalNameQualifiedNamesMap elementName; aoqi@0: public final LocalNameQualifiedNamesMap attributeName; aoqi@0: aoqi@0: public final KeyIntMap[] tables = new KeyIntMap[12]; aoqi@0: aoqi@0: protected boolean _useLocalNameAsKey; aoqi@0: aoqi@0: protected SerializerVocabulary _readOnlyVocabulary; aoqi@0: aoqi@0: public SerializerVocabulary() { aoqi@0: tables[RESTRICTED_ALPHABET] = restrictedAlphabet = new StringIntMap(4); aoqi@0: tables[ENCODING_ALGORITHM] = encodingAlgorithm = new StringIntMap(4); aoqi@0: tables[PREFIX] = prefix = new FixedEntryStringIntMap(EncodingConstants.XML_NAMESPACE_PREFIX, 8); aoqi@0: tables[NAMESPACE_NAME] = namespaceName = new FixedEntryStringIntMap(EncodingConstants.XML_NAMESPACE_NAME, 8); aoqi@0: tables[LOCAL_NAME] = localName = new StringIntMap(); aoqi@0: tables[OTHER_NCNAME] = otherNCName = new StringIntMap(4); aoqi@0: tables[OTHER_URI] = otherURI = new StringIntMap(4); aoqi@0: tables[ATTRIBUTE_VALUE] = attributeValue = new StringIntMap(); aoqi@0: tables[OTHER_STRING] = otherString = new CharArrayIntMap(4); aoqi@0: tables[CHARACTER_CONTENT_CHUNK] = characterContentChunk = new CharArrayIntMap(); aoqi@0: tables[ELEMENT_NAME] = elementName = new LocalNameQualifiedNamesMap(); aoqi@0: tables[ATTRIBUTE_NAME] = attributeName = new LocalNameQualifiedNamesMap(); aoqi@0: } aoqi@0: aoqi@0: public SerializerVocabulary(com.sun.xml.internal.org.jvnet.fastinfoset.Vocabulary v, aoqi@0: boolean useLocalNameAsKey) { aoqi@0: this(); aoqi@0: aoqi@0: _useLocalNameAsKey = useLocalNameAsKey; aoqi@0: convertVocabulary(v); aoqi@0: } aoqi@0: aoqi@0: public SerializerVocabulary getReadOnlyVocabulary() { aoqi@0: return _readOnlyVocabulary; aoqi@0: } aoqi@0: aoqi@0: protected void setReadOnlyVocabulary(SerializerVocabulary readOnlyVocabulary, aoqi@0: boolean clear) { aoqi@0: for (int i = 0; i < tables.length; i++) { aoqi@0: tables[i].setReadOnlyMap(readOnlyVocabulary.tables[i], clear); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: public void setInitialVocabulary(SerializerVocabulary initialVocabulary, aoqi@0: boolean clear) { aoqi@0: setExternalVocabularyURI(null); aoqi@0: setInitialReadOnlyVocabulary(true); aoqi@0: setReadOnlyVocabulary(initialVocabulary, clear); aoqi@0: } aoqi@0: aoqi@0: public void setExternalVocabulary(String externalVocabularyURI, aoqi@0: SerializerVocabulary externalVocabulary, boolean clear) { aoqi@0: setInitialReadOnlyVocabulary(false); aoqi@0: setExternalVocabularyURI(externalVocabularyURI); aoqi@0: setReadOnlyVocabulary(externalVocabulary, clear); aoqi@0: } aoqi@0: aoqi@0: public void clear() { aoqi@0: for (int i = 0; i < tables.length; i++) { aoqi@0: tables[i].clear(); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: private void convertVocabulary(com.sun.xml.internal.org.jvnet.fastinfoset.Vocabulary v) { aoqi@0: addToTable(v.restrictedAlphabets.iterator(), restrictedAlphabet); aoqi@0: addToTable(v.encodingAlgorithms.iterator(), encodingAlgorithm); aoqi@0: addToTable(v.prefixes.iterator(), prefix); aoqi@0: addToTable(v.namespaceNames.iterator(), namespaceName); aoqi@0: addToTable(v.localNames.iterator(), localName); aoqi@0: addToTable(v.otherNCNames.iterator(), otherNCName); aoqi@0: addToTable(v.otherURIs.iterator(), otherURI); aoqi@0: addToTable(v.attributeValues.iterator(), attributeValue); aoqi@0: addToTable(v.otherStrings.iterator(), otherString); aoqi@0: addToTable(v.characterContentChunks.iterator(), characterContentChunk); aoqi@0: addToTable(v.elements.iterator(), elementName); aoqi@0: addToTable(v.attributes.iterator(), attributeName); aoqi@0: } aoqi@0: aoqi@0: private void addToTable(Iterator i, StringIntMap m) { aoqi@0: while (i.hasNext()) { aoqi@0: addToTable((String)i.next(), m); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: private void addToTable(String s, StringIntMap m) { aoqi@0: if (s.length() == 0) { aoqi@0: return; aoqi@0: } aoqi@0: aoqi@0: m.obtainIndex(s); aoqi@0: } aoqi@0: aoqi@0: private void addToTable(Iterator i, CharArrayIntMap m) { aoqi@0: while (i.hasNext()) { aoqi@0: addToTable((String)i.next(), m); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: private void addToTable(String s, CharArrayIntMap m) { aoqi@0: if (s.length() == 0) { aoqi@0: return; aoqi@0: } aoqi@0: aoqi@0: char[] c = s.toCharArray(); aoqi@0: m.obtainIndex(c, 0, c.length, false); aoqi@0: } aoqi@0: aoqi@0: private void addToTable(Iterator i, LocalNameQualifiedNamesMap m) { aoqi@0: while (i.hasNext()) { aoqi@0: addToNameTable((QName)i.next(), m); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: private void addToNameTable(QName n, LocalNameQualifiedNamesMap m) { aoqi@0: int namespaceURIIndex = -1; aoqi@0: int prefixIndex = -1; aoqi@0: if (n.getNamespaceURI().length() > 0) { aoqi@0: namespaceURIIndex = namespaceName.obtainIndex(n.getNamespaceURI()); aoqi@0: if (namespaceURIIndex == KeyIntMap.NOT_PRESENT) { aoqi@0: namespaceURIIndex = namespaceName.get(n.getNamespaceURI()); aoqi@0: } aoqi@0: aoqi@0: if (n.getPrefix().length() > 0) { aoqi@0: prefixIndex = prefix.obtainIndex(n.getPrefix()); aoqi@0: if (prefixIndex == KeyIntMap.NOT_PRESENT) { aoqi@0: prefixIndex = prefix.get(n.getPrefix()); aoqi@0: } aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: int localNameIndex = localName.obtainIndex(n.getLocalPart()); aoqi@0: if (localNameIndex == KeyIntMap.NOT_PRESENT) { aoqi@0: localNameIndex = localName.get(n.getLocalPart()); aoqi@0: } aoqi@0: aoqi@0: QualifiedName name = new QualifiedName(n.getPrefix(), n.getNamespaceURI(), n.getLocalPart(), aoqi@0: m.getNextIndex(), aoqi@0: prefixIndex, namespaceURIIndex, localNameIndex); aoqi@0: aoqi@0: LocalNameQualifiedNamesMap.Entry entry = null; aoqi@0: if (_useLocalNameAsKey) { aoqi@0: entry = m.obtainEntry(n.getLocalPart()); aoqi@0: } else { aoqi@0: String qName = (prefixIndex == -1) aoqi@0: ? n.getLocalPart() aoqi@0: : n.getPrefix() + ":" + n.getLocalPart(); aoqi@0: entry = m.obtainEntry(qName); aoqi@0: } aoqi@0: aoqi@0: entry.addQualifiedName(name); aoqi@0: } aoqi@0: }