Javolution 6.0.0 java
NamespacesImpl.java
Go to the documentation of this file.
1 /*
2  * Javolution - Java(TM) Solution for Real-Time and Embedded Systems
3  * Copyright (C) 2012 - Javolution (http://javolution.org/)
4  * All rights reserved.
5  *
6  * Permission to use, copy, modify, and distribute this software is
7  * freely granted, provided that this notice is preserved.
8  */
9 package javolution.xml.internal.stream;
10 
11 import java.util.Iterator;
15 
22 public final class NamespacesImpl implements NamespaceContext {
23 
27  static final int NBR_PREDEFINED_NAMESPACES = 3;
28 
33  final CharArray _nullNsURI = new CharArray(""); // No namespace URI.
34 
36 
37  final CharArray _xml = new CharArray("xml");
38 
40  "http://www.w3.org/XML/1998/namespace");
41 
42  final CharArray _xmlns = new CharArray("xmlns");
43 
44  final CharArray _xmlnsURI = new CharArray("http://www.w3.org/2000/xmlns/");
45 
49  private int _nesting = 0;
50 
55 
60 
64  boolean[] _prefixesWritten = new boolean[_prefixes.length];
65 
69  int[] _namespacesCount = new int[16];
70 
75 
80 
84  public NamespacesImpl() {
87  _prefixes[1] = _xml;
88  _namespaces[1] = _xmlURI;
89  _prefixes[2] = _xmlns;
92  }
93 
94  // Implements NamespaceContext
95  public CharArray getNamespaceURI(CharSequence prefix) {
96  if (prefix == null)
97  throw new IllegalArgumentException("null prefix not allowed");
98  return getNamespaceURINullAllowed(prefix);
99  }
100 
101  CharArray getNamespaceURINullAllowed(CharSequence prefix) {
102  if ((prefix == null) || (prefix.length() == 0))
103  return _defaultNamespace;
104  final int count = _namespacesCount[_nesting];
105  for (int i = count; --i >= 0;) {
106  if (_prefixes[i].equals(prefix))
107  return _namespaces[i];
108  }
109  return null; // Not bound.
110  }
111 
112  // Implements NamespaceContext
113  public CharArray getPrefix(CharSequence uri) {
114  if (uri == null)
115  throw new IllegalArgumentException("null namespace URI not allowed");
117  uri, _namespacesCount[_nesting]);
118  }
119 
120  CharArray getPrefix(CharSequence uri, int count) {
121  for (int i = count; --i >= 0;) {
122  CharArray prefix = _prefixes[i];
123  CharArray namespace = _namespaces[i];
124  if (namespace.equals(uri)) { // Find matching uri.
125  // Checks that the prefix has not been overwriten after being set.
126  boolean isPrefixOverwritten = false;
127  for (int j = i + 1; j < count; j++) {
128  if (prefix.equals(_prefixes[j])) {
129  isPrefixOverwritten = true;
130  break;
131  }
132  }
133  if (!isPrefixOverwritten)
134  return prefix;
135  }
136  }
137  return null; // Not bound.
138  }
139 
140  // Implements NamespaceContext
141  public Iterator<CharArray> getPrefixes(CharSequence namespaceURI) {
143  for (int i = _namespacesCount[_nesting]; --i >= 0;) {
144  if (_namespaces[i].equals(namespaceURI)) {
145  prefixes.add(_prefixes[i]);
146  }
147  }
148  return prefixes.iterator();
149  }
150 
151  // Null values are not allowed.
152  void setPrefix(CharArray prefix, CharArray uri) {
153  int index = _namespacesCount[_nesting];
154  _prefixes[index] = prefix;
155  _namespaces[index] = uri;
156  if (prefix.length() == 0) { // The default namespace is set.
157  _defaultNamespaceIndex = index;
158  _defaultNamespace = uri;
159  }
162  }
163 
164  // Used only by XMLStreamWriter (converts CharSequence to CharArray).
165  // Null values are not allowed.
166  void setPrefix(final CharSequence prefix, CharSequence uri,
167  boolean isWritten) {
168  final int index = _namespacesCount[_nesting];
169  _prefixesWritten[index] = isWritten;
170  final int prefixLength = prefix.length();
171  CharArray prefixTmp = _prefixesTmp[index];
172  if ((prefixTmp == null) || (prefixTmp.array().length < prefixLength)) {
173  _prefixesTmp[index] = new CharArray().setArray(
174  new char[prefixLength + 32], 0, 0);
175  prefixTmp = _prefixesTmp[index];
176  }
177  for (int i = 0; i < prefixLength; i++) {
178  prefixTmp.array()[i] = prefix.charAt(i);
179  }
180  prefixTmp.setArray(prefixTmp.array(), 0, prefixLength);
181 
182  final int uriLength = uri.length();
183  CharArray namespaceTmp = _namespacesTmp[index];
184  if ((namespaceTmp == null) || (namespaceTmp.array().length < uriLength)) {
185  _namespacesTmp[index] = new CharArray().setArray(
186  new char[uriLength + 32], 0, 0);
187  namespaceTmp = _namespacesTmp[index];
188  }
189  for (int i = 0; i < uriLength; i++) {
190  namespaceTmp.array()[i] = uri.charAt(i);
191  }
192  namespaceTmp.setArray(namespaceTmp.array(), 0, uriLength);
193 
194  // Sets the prefix using CharArray instances.
195  setPrefix(prefixTmp, namespaceTmp);
196  }
197 
199 
201 
202  void pop() {
205  }
206  }
207 
208  private void searchDefaultNamespace() {
209  int count = _namespacesCount[_nesting];
210  for (int i = count; --i >= 0;) {
211  if (_prefixes[i].length() == 0) {
213  return;
214  }
215  }
216  throw new Error("Cannot find default namespace");
217  }
218 
219  void push() {
220  _nesting++;
221  if (_nesting >= _namespacesCount.length) {
223  }
225  }
226 
227  public void reset() {
231  _nesting = 0;
232  }
233 
234  private void resizeNamespacesCount() {
235  final int oldLength = _namespacesCount.length;
236  final int newLength = oldLength * 2;
237 
238  // Resizes namespaces counts.
239  int[] tmp = new int[newLength];
240  System.arraycopy(_namespacesCount, 0, tmp, 0, oldLength);
241  _namespacesCount = tmp;
242  }
243 
244  // Resizes prefix mapping stack.
245  private void resizePrefixStack() {
246  final int oldLength = _prefixes.length;
247  final int newLength = oldLength * 2;
248 
249  // Resizes prefixes.
250  CharArray[] tmp0 = new CharArray[newLength];
251  System.arraycopy(_prefixes, 0, tmp0, 0, oldLength);
252  _prefixes = tmp0;
253 
254  // Resizes namespaces uri.
255  CharArray[] tmp1 = new CharArray[newLength];
256  System.arraycopy(_namespaces, 0, tmp1, 0, oldLength);
257  _namespaces = tmp1;
258 
259  // Resizes prefix sets.
260  boolean[] tmp2 = new boolean[newLength];
261  System.arraycopy(_prefixesWritten, 0, tmp2, 0, oldLength);
262  _prefixesWritten = tmp2;
263 
264  // Resizes temporary prefix (CharSequence to CharArray conversion).
265  CharArray[] tmp3 = new CharArray[newLength];
266  System.arraycopy(_prefixesTmp, 0, tmp3, 0, oldLength);
267  _prefixesTmp = tmp3;
268 
269  // Resizes temporary namespaces (CharSequence to CharArray conversion).
270  CharArray[] tmp4 = new CharArray[newLength];
271  System.arraycopy(_namespacesTmp, 0, tmp4, 0, oldLength);
272  _namespacesTmp = tmp4;
273 
274  }
275 
276 }
javolution.xml.internal.stream.NamespacesImpl.setPrefix
void setPrefix(CharArray prefix, CharArray uri)
Definition: NamespacesImpl.java:152
javolution.text.CharArray
Definition: CharArray.java:36
javolution
javolution.xml.internal.stream.NamespacesImpl.getPrefix
CharArray getPrefix(CharSequence uri)
Definition: NamespacesImpl.java:113
javolution.xml.internal.stream.NamespacesImpl._defaultNsPrefix
final CharArray _defaultNsPrefix
Definition: NamespacesImpl.java:35
javolution.xml.internal.stream.NamespacesImpl._xmlnsURI
final CharArray _xmlnsURI
Definition: NamespacesImpl.java:44
javolution.xml.internal.stream.NamespacesImpl.push
void push()
Definition: NamespacesImpl.java:219
javolution.xml.internal.stream.NamespacesImpl._defaultNamespaceIndex
int _defaultNamespaceIndex
Definition: NamespacesImpl.java:79
javolution.text.CharArray.equals
boolean equals(Object that)
Definition: CharArray.java:204
javolution.xml.internal.stream.NamespacesImpl._prefixesTmp
CharArray[] _prefixesTmp
Definition: NamespacesImpl.java:198
javolution.xml.internal.stream.NamespacesImpl._prefixes
CharArray[] _prefixes
Definition: NamespacesImpl.java:54
javolution.xml.internal.stream.NamespacesImpl._namespacesTmp
CharArray[] _namespacesTmp
Definition: NamespacesImpl.java:200
javolution.util.FastTable.add
void add(int index, E element)
Definition: FastTable.java:182
javolution.util.FastCollection.iterator
Iterator< E > iterator()
Definition: FastCollection.java:455
javolution.xml.internal.stream.NamespacesImpl.NBR_PREDEFINED_NAMESPACES
static final int NBR_PREDEFINED_NAMESPACES
Definition: NamespacesImpl.java:27
javolution.xml.internal.stream.NamespacesImpl._namespacesCount
int[] _namespacesCount
Definition: NamespacesImpl.java:69
javolution.xml.internal.stream.NamespacesImpl
Definition: NamespacesImpl.java:22
javolution.xml.internal.stream.NamespacesImpl._xml
final CharArray _xml
Definition: NamespacesImpl.java:37
javolution.text
Definition: CharArray.java:9
javolution.xml.internal.stream.NamespacesImpl.reset
void reset()
Definition: NamespacesImpl.java:227
javolution.xml.internal.stream.NamespacesImpl.NamespacesImpl
NamespacesImpl()
Definition: NamespacesImpl.java:84
javolution.xml.stream.NamespaceContext
Definition: NamespaceContext.java:20
javolution.xml.internal.stream.NamespacesImpl._nesting
int _nesting
Definition: NamespacesImpl.java:49
javolution.text.CharArray.length
int length()
Definition: CharArray.java:95
javolution.xml.internal.stream.NamespacesImpl.getNamespaceURI
CharArray getNamespaceURI(CharSequence prefix)
Definition: NamespacesImpl.java:95
javolution.xml.internal.stream.NamespacesImpl.getPrefixes
Iterator< CharArray > getPrefixes(CharSequence namespaceURI)
Definition: NamespacesImpl.java:141
javolution.xml.internal.stream.NamespacesImpl.getPrefix
CharArray getPrefix(CharSequence uri, int count)
Definition: NamespacesImpl.java:120
javolution.xml.internal.stream.NamespacesImpl.searchDefaultNamespace
void searchDefaultNamespace()
Definition: NamespacesImpl.java:208
javolution.text.CharArray.array
char[] array()
Definition: CharArray.java:86
javolution.xml.internal.stream.NamespacesImpl._namespaces
CharArray[] _namespaces
Definition: NamespacesImpl.java:59
javolution.xml.internal.stream.NamespacesImpl.setPrefix
void setPrefix(final CharSequence prefix, CharSequence uri, boolean isWritten)
Definition: NamespacesImpl.java:166
javolution.xml.internal.stream.NamespacesImpl._nullNsURI
final CharArray _nullNsURI
Definition: NamespacesImpl.java:33
javolution.xml.internal.stream.NamespacesImpl._xmlns
final CharArray _xmlns
Definition: NamespacesImpl.java:42
javolution.text.CharArray.setArray
CharArray setArray(char[] array, int offset, int length)
Definition: CharArray.java:116
javolution.xml.internal.stream.NamespacesImpl._xmlURI
final CharArray _xmlURI
Definition: NamespacesImpl.java:39
javolution.xml
Definition: DefaultXMLFormat.java:9
javolution.xml.stream
Definition: Location.java:9
javolution.xml.internal.stream.NamespacesImpl.getNamespaceURINullAllowed
CharArray getNamespaceURINullAllowed(CharSequence prefix)
Definition: NamespacesImpl.java:101
javolution.xml.internal.stream.NamespacesImpl._defaultNamespace
CharArray _defaultNamespace
Definition: NamespacesImpl.java:74
javolution.xml.internal.stream.NamespacesImpl._prefixesWritten
boolean[] _prefixesWritten
Definition: NamespacesImpl.java:64
javolution.xml.internal.stream.NamespacesImpl.pop
void pop()
Definition: NamespacesImpl.java:202
javolution.xml.internal.stream.NamespacesImpl.resizeNamespacesCount
void resizeNamespacesCount()
Definition: NamespacesImpl.java:234
javolution.xml.internal.stream.NamespacesImpl.resizePrefixStack
void resizePrefixStack()
Definition: NamespacesImpl.java:245
javolution.util
Definition: FastBitSet.java:9
javolution.util.FastTable
Definition: FastTable.java:88