1. /*
  2. * The Apache Software License, Version 1.1
  3. *
  4. *
  5. * Copyright (c) 2002 The Apache Software Foundation. All rights
  6. * reserved.
  7. *
  8. * Redistribution and use in source and binary forms, with or without
  9. * modification, are permitted provided that the following conditions
  10. * are met:
  11. *
  12. * 1. Redistributions of source code must retain the above copyright
  13. * notice, this list of conditions and the following disclaimer.
  14. *
  15. * 2. Redistributions in binary form must reproduce the above copyright
  16. * notice, this list of conditions and the following disclaimer in
  17. * the documentation and/or other materials provided with the
  18. * distribution.
  19. *
  20. * 3. The end-user documentation included with the redistribution,
  21. * if any, must include the following acknowledgment:
  22. * "This product includes software developed by the
  23. * Apache Software Foundation (http://www.apache.org/)."
  24. * Alternately, this acknowledgment may appear in the software itself,
  25. * if and wherever such third-party acknowledgments normally appear.
  26. *
  27. * 4. The names "Xerces" and "Apache Software Foundation" must
  28. * not be used to endorse or promote products derived from this
  29. * software without prior written permission. For written
  30. * permission, please contact apache@apache.org.
  31. *
  32. * 5. Products derived from this software may not be called "Apache",
  33. * nor may "Apache" appear in their name, without prior written
  34. * permission of the Apache Software Foundation.
  35. *
  36. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  37. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  38. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  39. * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  40. * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  41. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  42. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  43. * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  44. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  45. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  46. * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  47. * SUCH DAMAGE.
  48. * ====================================================================
  49. *
  50. * This software consists of voluntary contributions made by many
  51. * individuals on behalf of the Apache Software Foundation and was
  52. * originally based on software copyright (c) 2001, International
  53. * Business Machines, Inc., http://www.apache.org. For more
  54. * information on the Apache Software Foundation, please see
  55. * <http://www.apache.org/>.
  56. */
  57. package com.sun.org.apache.xerces.internal.impl.xs.util;
  58. import com.sun.org.apache.xerces.internal.util.SymbolHash;
  59. import com.sun.org.apache.xerces.internal.xni.QName;
  60. import com.sun.org.apache.xerces.internal.xs.*;
  61. /**
  62. * Containts the map between qnames and XSObject's.
  63. *
  64. * @author Sandy Gao, IBM
  65. *
  66. * @version $Id: XSNamedMapImpl.java,v 1.5 2003/11/11 20:15:00 sandygao Exp $
  67. */
  68. public class XSNamedMapImpl implements XSNamedMap {
  69. // components of these namespaces are stored in this map
  70. String[] fNamespaces;
  71. // number of namespaces
  72. int fNSNum;
  73. // each entry contains components in one namespace
  74. SymbolHash[] fMaps;
  75. // store all components from all namespace.
  76. // used when this map is accessed as a list.
  77. XSObject[] fArray = null;
  78. // store the number of componetns.
  79. // used when this map is accessed as a list.
  80. int fLength = -1;
  81. // temprory QName object
  82. QName fName = new QName();
  83. /**
  84. * Construct an XSNamedMap implmentation for one namespace
  85. *
  86. * @param namespace the namespace to which the components belong
  87. * @param map the map from local names to components
  88. */
  89. public XSNamedMapImpl(String namespace, SymbolHash map) {
  90. fNamespaces = new String[] {namespace};
  91. fMaps = new SymbolHash[] {map};
  92. fNSNum = 1;
  93. }
  94. /**
  95. * Construct an XSNamedMap implmentation for a list of namespaces
  96. *
  97. * @param namespaces the namespaces to which the components belong
  98. * @param maps the maps from local names to components
  99. * @param num the number of namespaces
  100. */
  101. public XSNamedMapImpl(String[] namespaces, SymbolHash[] maps, int num) {
  102. fNamespaces = namespaces;
  103. fMaps = maps;
  104. fNSNum = num;
  105. }
  106. /**
  107. * Construct an XSNamedMap implmentation one namespace from an array
  108. *
  109. * @param array containing all components
  110. * @param length number of components
  111. */
  112. public XSNamedMapImpl(XSObject[] array, int length) {
  113. if (length == 0) {
  114. fNSNum = 0;
  115. fLength = 0;
  116. return;
  117. }
  118. // because all components are from the same target namesapce,
  119. // get the namespace from the first one.
  120. fNamespaces = new String[]{array[0].getNamespace()};
  121. fMaps = null;
  122. fNSNum = 1;
  123. // copy elements to the Vector
  124. fArray = array;
  125. fLength = length;
  126. }
  127. /**
  128. * The number of <code>XSObjects</code> in the <code>XSObjectList</code>. The
  129. * range of valid child node indices is 0 to <code>length-1</code>
  130. * inclusive.
  131. */
  132. public synchronized int getLength() {
  133. if (fLength == -1) {
  134. fLength = 0;
  135. for (int i = 0; i < fNSNum; i++)
  136. fLength += fMaps[i].getLength();
  137. }
  138. return fLength;
  139. }
  140. /**
  141. * Retrieves an <code>XSObject</code> specified by local name and namespace
  142. * URI.
  143. * @param namespace The namespace URI of the <code>XSObject</code> to
  144. * retrieve.
  145. * @param localName The local name of the <code>XSObject</code> to retrieve.
  146. * @return A <code>XSObject</code> (of any type) with the specified local
  147. * name and namespace URI, or <code>null</code> if they do not
  148. * identify any <code>XSObject</code> in this map.
  149. */
  150. public XSObject itemByName(String namespace, String localName) {
  151. if (namespace != null)
  152. namespace = namespace.intern();
  153. for (int i = 0; i < fNSNum; i++) {
  154. if (namespace == fNamespaces[i]) {
  155. // when this map is created from SymbolHash's
  156. // get the component from SymbolHash
  157. if (fMaps != null)
  158. return (XSObject)fMaps[i].get(localName);
  159. // Otherwise (it's created from an array)
  160. // go through the array to find a matcing name
  161. XSObject ret;
  162. for (int j = 0; j < fLength; j++) {
  163. ret = fArray[j];
  164. if (ret.getName().equals(localName))
  165. return ret;
  166. }
  167. return null;
  168. }
  169. }
  170. return null;
  171. }
  172. /**
  173. * Returns the <code>index</code>th item in the map. The index starts at
  174. * 0. If <code>index</code> is greater than or equal to the number of
  175. * nodes in the list, this returns <code>null</code>.
  176. * @param index The position in the map from which the item is to be
  177. * retrieved.
  178. * @return The <code>XSObject</code> at the <code>index</code>th position
  179. * in the <code>XSNamedMap</code>, or <code>null</code> if that is
  180. * not a valid index.
  181. */
  182. public synchronized XSObject item(int index) {
  183. if (fArray == null) {
  184. // calculate the total number of elements
  185. getLength();
  186. fArray = new XSObject[fLength];
  187. int pos = 0;
  188. // get components from all SymbolHash's
  189. for (int i = 0; i < fNSNum; i++) {
  190. pos += fMaps[i].getValues(fArray, pos);
  191. }
  192. }
  193. if (index < 0 || index >= fLength)
  194. return null;
  195. return fArray[index];
  196. }
  197. } // class XSNamedMapImpl