Thu, 12 Oct 2017 19:44:07 +0800
merge
aoqi@0 | 1 | /* |
aoqi@0 | 2 | * Copyright (c) 2004, 2011, 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 | * THIS FILE WAS MODIFIED BY SUN MICROSYSTEMS, INC. |
aoqi@0 | 26 | */ |
aoqi@0 | 27 | |
aoqi@0 | 28 | package com.sun.xml.internal.fastinfoset.vocab; |
aoqi@0 | 29 | |
aoqi@0 | 30 | import com.sun.xml.internal.fastinfoset.EncodingConstants; |
aoqi@0 | 31 | import com.sun.xml.internal.fastinfoset.QualifiedName; |
aoqi@0 | 32 | import com.sun.xml.internal.fastinfoset.util.CharArrayIntMap; |
aoqi@0 | 33 | import com.sun.xml.internal.fastinfoset.util.FixedEntryStringIntMap; |
aoqi@0 | 34 | import com.sun.xml.internal.fastinfoset.util.KeyIntMap; |
aoqi@0 | 35 | import com.sun.xml.internal.fastinfoset.util.LocalNameQualifiedNamesMap; |
aoqi@0 | 36 | import com.sun.xml.internal.fastinfoset.util.StringIntMap; |
aoqi@0 | 37 | import java.util.Iterator; |
aoqi@0 | 38 | import javax.xml.namespace.QName; |
aoqi@0 | 39 | |
aoqi@0 | 40 | public class SerializerVocabulary extends Vocabulary { |
aoqi@0 | 41 | public final StringIntMap restrictedAlphabet; |
aoqi@0 | 42 | public final StringIntMap encodingAlgorithm; |
aoqi@0 | 43 | |
aoqi@0 | 44 | public final StringIntMap namespaceName; |
aoqi@0 | 45 | public final StringIntMap prefix; |
aoqi@0 | 46 | public final StringIntMap localName; |
aoqi@0 | 47 | public final StringIntMap otherNCName; |
aoqi@0 | 48 | public final StringIntMap otherURI; |
aoqi@0 | 49 | public final StringIntMap attributeValue; |
aoqi@0 | 50 | public final CharArrayIntMap otherString; |
aoqi@0 | 51 | |
aoqi@0 | 52 | public final CharArrayIntMap characterContentChunk; |
aoqi@0 | 53 | |
aoqi@0 | 54 | public final LocalNameQualifiedNamesMap elementName; |
aoqi@0 | 55 | public final LocalNameQualifiedNamesMap attributeName; |
aoqi@0 | 56 | |
aoqi@0 | 57 | public final KeyIntMap[] tables = new KeyIntMap[12]; |
aoqi@0 | 58 | |
aoqi@0 | 59 | protected boolean _useLocalNameAsKey; |
aoqi@0 | 60 | |
aoqi@0 | 61 | protected SerializerVocabulary _readOnlyVocabulary; |
aoqi@0 | 62 | |
aoqi@0 | 63 | public SerializerVocabulary() { |
aoqi@0 | 64 | tables[RESTRICTED_ALPHABET] = restrictedAlphabet = new StringIntMap(4); |
aoqi@0 | 65 | tables[ENCODING_ALGORITHM] = encodingAlgorithm = new StringIntMap(4); |
aoqi@0 | 66 | tables[PREFIX] = prefix = new FixedEntryStringIntMap(EncodingConstants.XML_NAMESPACE_PREFIX, 8); |
aoqi@0 | 67 | tables[NAMESPACE_NAME] = namespaceName = new FixedEntryStringIntMap(EncodingConstants.XML_NAMESPACE_NAME, 8); |
aoqi@0 | 68 | tables[LOCAL_NAME] = localName = new StringIntMap(); |
aoqi@0 | 69 | tables[OTHER_NCNAME] = otherNCName = new StringIntMap(4); |
aoqi@0 | 70 | tables[OTHER_URI] = otherURI = new StringIntMap(4); |
aoqi@0 | 71 | tables[ATTRIBUTE_VALUE] = attributeValue = new StringIntMap(); |
aoqi@0 | 72 | tables[OTHER_STRING] = otherString = new CharArrayIntMap(4); |
aoqi@0 | 73 | tables[CHARACTER_CONTENT_CHUNK] = characterContentChunk = new CharArrayIntMap(); |
aoqi@0 | 74 | tables[ELEMENT_NAME] = elementName = new LocalNameQualifiedNamesMap(); |
aoqi@0 | 75 | tables[ATTRIBUTE_NAME] = attributeName = new LocalNameQualifiedNamesMap(); |
aoqi@0 | 76 | } |
aoqi@0 | 77 | |
aoqi@0 | 78 | public SerializerVocabulary(com.sun.xml.internal.org.jvnet.fastinfoset.Vocabulary v, |
aoqi@0 | 79 | boolean useLocalNameAsKey) { |
aoqi@0 | 80 | this(); |
aoqi@0 | 81 | |
aoqi@0 | 82 | _useLocalNameAsKey = useLocalNameAsKey; |
aoqi@0 | 83 | convertVocabulary(v); |
aoqi@0 | 84 | } |
aoqi@0 | 85 | |
aoqi@0 | 86 | public SerializerVocabulary getReadOnlyVocabulary() { |
aoqi@0 | 87 | return _readOnlyVocabulary; |
aoqi@0 | 88 | } |
aoqi@0 | 89 | |
aoqi@0 | 90 | protected void setReadOnlyVocabulary(SerializerVocabulary readOnlyVocabulary, |
aoqi@0 | 91 | boolean clear) { |
aoqi@0 | 92 | for (int i = 0; i < tables.length; i++) { |
aoqi@0 | 93 | tables[i].setReadOnlyMap(readOnlyVocabulary.tables[i], clear); |
aoqi@0 | 94 | } |
aoqi@0 | 95 | } |
aoqi@0 | 96 | |
aoqi@0 | 97 | public void setInitialVocabulary(SerializerVocabulary initialVocabulary, |
aoqi@0 | 98 | boolean clear) { |
aoqi@0 | 99 | setExternalVocabularyURI(null); |
aoqi@0 | 100 | setInitialReadOnlyVocabulary(true); |
aoqi@0 | 101 | setReadOnlyVocabulary(initialVocabulary, clear); |
aoqi@0 | 102 | } |
aoqi@0 | 103 | |
aoqi@0 | 104 | public void setExternalVocabulary(String externalVocabularyURI, |
aoqi@0 | 105 | SerializerVocabulary externalVocabulary, boolean clear) { |
aoqi@0 | 106 | setInitialReadOnlyVocabulary(false); |
aoqi@0 | 107 | setExternalVocabularyURI(externalVocabularyURI); |
aoqi@0 | 108 | setReadOnlyVocabulary(externalVocabulary, clear); |
aoqi@0 | 109 | } |
aoqi@0 | 110 | |
aoqi@0 | 111 | public void clear() { |
aoqi@0 | 112 | for (int i = 0; i < tables.length; i++) { |
aoqi@0 | 113 | tables[i].clear(); |
aoqi@0 | 114 | } |
aoqi@0 | 115 | } |
aoqi@0 | 116 | |
aoqi@0 | 117 | private void convertVocabulary(com.sun.xml.internal.org.jvnet.fastinfoset.Vocabulary v) { |
aoqi@0 | 118 | addToTable(v.restrictedAlphabets.iterator(), restrictedAlphabet); |
aoqi@0 | 119 | addToTable(v.encodingAlgorithms.iterator(), encodingAlgorithm); |
aoqi@0 | 120 | addToTable(v.prefixes.iterator(), prefix); |
aoqi@0 | 121 | addToTable(v.namespaceNames.iterator(), namespaceName); |
aoqi@0 | 122 | addToTable(v.localNames.iterator(), localName); |
aoqi@0 | 123 | addToTable(v.otherNCNames.iterator(), otherNCName); |
aoqi@0 | 124 | addToTable(v.otherURIs.iterator(), otherURI); |
aoqi@0 | 125 | addToTable(v.attributeValues.iterator(), attributeValue); |
aoqi@0 | 126 | addToTable(v.otherStrings.iterator(), otherString); |
aoqi@0 | 127 | addToTable(v.characterContentChunks.iterator(), characterContentChunk); |
aoqi@0 | 128 | addToTable(v.elements.iterator(), elementName); |
aoqi@0 | 129 | addToTable(v.attributes.iterator(), attributeName); |
aoqi@0 | 130 | } |
aoqi@0 | 131 | |
aoqi@0 | 132 | private void addToTable(Iterator i, StringIntMap m) { |
aoqi@0 | 133 | while (i.hasNext()) { |
aoqi@0 | 134 | addToTable((String)i.next(), m); |
aoqi@0 | 135 | } |
aoqi@0 | 136 | } |
aoqi@0 | 137 | |
aoqi@0 | 138 | private void addToTable(String s, StringIntMap m) { |
aoqi@0 | 139 | if (s.length() == 0) { |
aoqi@0 | 140 | return; |
aoqi@0 | 141 | } |
aoqi@0 | 142 | |
aoqi@0 | 143 | m.obtainIndex(s); |
aoqi@0 | 144 | } |
aoqi@0 | 145 | |
aoqi@0 | 146 | private void addToTable(Iterator i, CharArrayIntMap m) { |
aoqi@0 | 147 | while (i.hasNext()) { |
aoqi@0 | 148 | addToTable((String)i.next(), m); |
aoqi@0 | 149 | } |
aoqi@0 | 150 | } |
aoqi@0 | 151 | |
aoqi@0 | 152 | private void addToTable(String s, CharArrayIntMap m) { |
aoqi@0 | 153 | if (s.length() == 0) { |
aoqi@0 | 154 | return; |
aoqi@0 | 155 | } |
aoqi@0 | 156 | |
aoqi@0 | 157 | char[] c = s.toCharArray(); |
aoqi@0 | 158 | m.obtainIndex(c, 0, c.length, false); |
aoqi@0 | 159 | } |
aoqi@0 | 160 | |
aoqi@0 | 161 | private void addToTable(Iterator i, LocalNameQualifiedNamesMap m) { |
aoqi@0 | 162 | while (i.hasNext()) { |
aoqi@0 | 163 | addToNameTable((QName)i.next(), m); |
aoqi@0 | 164 | } |
aoqi@0 | 165 | } |
aoqi@0 | 166 | |
aoqi@0 | 167 | private void addToNameTable(QName n, LocalNameQualifiedNamesMap m) { |
aoqi@0 | 168 | int namespaceURIIndex = -1; |
aoqi@0 | 169 | int prefixIndex = -1; |
aoqi@0 | 170 | if (n.getNamespaceURI().length() > 0) { |
aoqi@0 | 171 | namespaceURIIndex = namespaceName.obtainIndex(n.getNamespaceURI()); |
aoqi@0 | 172 | if (namespaceURIIndex == KeyIntMap.NOT_PRESENT) { |
aoqi@0 | 173 | namespaceURIIndex = namespaceName.get(n.getNamespaceURI()); |
aoqi@0 | 174 | } |
aoqi@0 | 175 | |
aoqi@0 | 176 | if (n.getPrefix().length() > 0) { |
aoqi@0 | 177 | prefixIndex = prefix.obtainIndex(n.getPrefix()); |
aoqi@0 | 178 | if (prefixIndex == KeyIntMap.NOT_PRESENT) { |
aoqi@0 | 179 | prefixIndex = prefix.get(n.getPrefix()); |
aoqi@0 | 180 | } |
aoqi@0 | 181 | } |
aoqi@0 | 182 | } |
aoqi@0 | 183 | |
aoqi@0 | 184 | int localNameIndex = localName.obtainIndex(n.getLocalPart()); |
aoqi@0 | 185 | if (localNameIndex == KeyIntMap.NOT_PRESENT) { |
aoqi@0 | 186 | localNameIndex = localName.get(n.getLocalPart()); |
aoqi@0 | 187 | } |
aoqi@0 | 188 | |
aoqi@0 | 189 | QualifiedName name = new QualifiedName(n.getPrefix(), n.getNamespaceURI(), n.getLocalPart(), |
aoqi@0 | 190 | m.getNextIndex(), |
aoqi@0 | 191 | prefixIndex, namespaceURIIndex, localNameIndex); |
aoqi@0 | 192 | |
aoqi@0 | 193 | LocalNameQualifiedNamesMap.Entry entry = null; |
aoqi@0 | 194 | if (_useLocalNameAsKey) { |
aoqi@0 | 195 | entry = m.obtainEntry(n.getLocalPart()); |
aoqi@0 | 196 | } else { |
aoqi@0 | 197 | String qName = (prefixIndex == -1) |
aoqi@0 | 198 | ? n.getLocalPart() |
aoqi@0 | 199 | : n.getPrefix() + ":" + n.getLocalPart(); |
aoqi@0 | 200 | entry = m.obtainEntry(qName); |
aoqi@0 | 201 | } |
aoqi@0 | 202 | |
aoqi@0 | 203 | entry.addQualifiedName(name); |
aoqi@0 | 204 | } |
aoqi@0 | 205 | } |