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.xs.XSObject;
  59. import com.sun.org.apache.xerces.internal.xs.XSTypeDefinition;
  60. import com.sun.org.apache.xerces.internal.util.SymbolHash;
  61. /**
  62. * Containts the map between qnames and XSObject's.
  63. *
  64. * @author Sandy Gao, IBM
  65. *
  66. * @version $Id: XSNamedMap4Types.java,v 1.5 2003/11/11 20:15:00 sandygao Exp $
  67. */
  68. public class XSNamedMap4Types extends XSNamedMapImpl {
  69. // the type of component stored here: complex or simple type
  70. short fType;
  71. /**
  72. * Construct an XSNamedMap implmentation for one namespace
  73. *
  74. * @param namespace the namespace to which the components belong
  75. * @param map the map from local names to components
  76. * @param type the type of components
  77. */
  78. public XSNamedMap4Types(String namespace, SymbolHash map, short type) {
  79. super(namespace, map);
  80. fType = type;
  81. }
  82. /**
  83. * Construct an XSNamedMap implmentation for a list of namespaces
  84. *
  85. * @param namespaces the namespaces to which the components belong
  86. * @param maps the maps from local names to components
  87. * @param num the number of namespaces
  88. * @param type the type of components
  89. */
  90. public XSNamedMap4Types(String[] namespaces, SymbolHash[] maps, int num, short type) {
  91. super(namespaces, maps, num);
  92. fType = type;
  93. }
  94. /**
  95. * The number of <code>XSObjects</code> in the <code>XSObjectList</code>. The
  96. * range of valid child node indices is 0 to <code>length-1</code>
  97. * inclusive.
  98. */
  99. public synchronized int getLength() {
  100. if (fLength == -1) {
  101. // first get the number of components for all types
  102. int length = 0;
  103. for (int i = 0; i < fNSNum; i++)
  104. length += fMaps[i].getLength();
  105. // then copy all types to an temporary array
  106. int pos = 0;
  107. XSObject[] array = new XSObject[length];
  108. for (int i = 0; i < fNSNum; i++) {
  109. pos += fMaps[i].getValues(array, pos);
  110. }
  111. // then copy either simple or complex types to fArray,
  112. // depending on which kind is required
  113. fLength = 0;
  114. fArray = new XSObject[length];
  115. XSTypeDefinition type;
  116. for (int i = 0; i < length; i++) {
  117. type = (XSTypeDefinition)array[i];
  118. if (type.getTypeCategory() == fType) {
  119. fArray[fLength++] = type;
  120. }
  121. }
  122. }
  123. return fLength;
  124. }
  125. /**
  126. * Retrieves an <code>XSObject</code> specified by local name and namespace
  127. * URI.
  128. * @param namespace The namespace URI of the <code>XSObject</code> to
  129. * retrieve.
  130. * @param localName The local name of the <code>XSObject</code> to retrieve.
  131. * @return A <code>XSObject</code> (of any type) with the specified local
  132. * name and namespace URI, or <code>null</code> if they do not
  133. * identify any <code>XSObject</code> in this map.
  134. */
  135. public XSObject itemByName(String namespace, String localName) {
  136. if (namespace != null)
  137. namespace = namespace.intern();
  138. for (int i = 0; i < fNSNum; i++) {
  139. if (namespace == fNamespaces[i]) {
  140. XSTypeDefinition type = (XSTypeDefinition)fMaps[i].get(localName);
  141. // only return it if it mataches the required type
  142. if (type.getTypeCategory() == fType)
  143. return type;
  144. return null;
  145. }
  146. }
  147. return null;
  148. }
  149. /**
  150. * Returns the <code>index</code>th item in the map. The index starts at
  151. * 0. If <code>index</code> is greater than or equal to the number of
  152. * nodes in the list, this returns <code>null</code>.
  153. * @param index The position in the map from which the item is to be
  154. * retrieved.
  155. * @return The <code>XSObject</code> at the <code>index</code>th position
  156. * in the <code>XSNamedMap</code>, or <code>null</code> if that is
  157. * not a valid index.
  158. */
  159. public synchronized XSObject item(int index) {
  160. if (fArray == null) {
  161. getLength();
  162. }
  163. if (index < 0 || index >= fLength)
  164. return null;
  165. return fArray[index];
  166. }
  167. } // class XSNamedMapImpl