1. /*
  2. * The Apache Software License, Version 1.1
  3. *
  4. *
  5. * Copyright (c) 1999,2000 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) 1999, 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. /*
  58. * The Apache Software License, Version 1.1
  59. *
  60. *
  61. * Copyright (c) 1999 The Apache Software Foundation. All rights
  62. * reserved.
  63. *
  64. * Redistribution and use in source and binary forms, with or without
  65. * modification, are permitted provided that the following conditions
  66. * are met:
  67. *
  68. * 1. Redistributions of source code must retain the above copyright
  69. * notice, this list of conditions and the following disclaimer.
  70. *
  71. * 2. Redistributions in binary form must reproduce the above copyright
  72. * notice, this list of conditions and the following disclaimer in
  73. * the documentation and/or other materials provided with the
  74. * distribution.
  75. *
  76. * 3. The end-user documentation included with the redistribution,
  77. * if any, must include the following acknowledgment:
  78. * "This product includes software developed by the
  79. * Apache Software Foundation (http://www.apache.org/)."
  80. * Alternately, this acknowledgment may appear in the software itself,
  81. * if and wherever such third-party acknowledgments normally appear.
  82. *
  83. * 4. The names "Xerces" and "Apache Software Foundation" must
  84. * not be used to endorse or promote products derived from this
  85. * software without prior written permission. For written
  86. * permission, please contact apache@apache.org.
  87. *
  88. * 5. Products derived from this software may not be called "Apache",
  89. * nor may "Apache" appear in their name, without prior written
  90. * permission of the Apache Software Foundation.
  91. *
  92. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  93. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  94. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  95. * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  96. * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  97. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  98. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  99. * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  100. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  101. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  102. * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  103. * SUCH DAMAGE.
  104. * ====================================================================
  105. *
  106. * This software consists of voluntary contributions made by many
  107. * individuals on behalf of the Apache Software Foundation and was
  108. * originally based on software copyright (c) 1999, International
  109. * Business Machines, Inc., http://www.apache.org. For more
  110. * information on the Apache Software Foundation, please see
  111. * <http://www.apache.org/>.
  112. */
  113. package com.sun.org.apache.html.internal.dom;
  114. import com.sun.org.apache.xerces.internal.dom.DeepNodeListImpl;
  115. import com.sun.org.apache.xerces.internal.dom.ElementImpl;
  116. import com.sun.org.apache.xerces.internal.dom.NodeImpl;
  117. import org.w3c.dom.Node;
  118. import org.w3c.dom.NodeList;
  119. /**
  120. * This class implements the DOM's NodeList behavior for
  121. * HTMLDocuemnt.getElementsByName().
  122. *
  123. * @version $Id: NameNodeListImpl.java,v 1.6 2003/05/08 20:13:09 elena Exp $
  124. * @since PR-DOM-Level-1-19980818.
  125. * @see DeepNodeListImpl
  126. */
  127. public class NameNodeListImpl
  128. extends DeepNodeListImpl
  129. implements NodeList {
  130. /** Constructor. */
  131. public NameNodeListImpl(NodeImpl rootNode, String tagName) {
  132. super( rootNode, tagName );
  133. }
  134. /**
  135. * Iterative tree-walker. When you have a Parent link, there's often no
  136. * need to resort to recursion. NOTE THAT only Element nodes are matched
  137. * since we're specifically supporting getElementsByTagName().
  138. */
  139. protected Node nextMatchingElementAfter(Node current) {
  140. Node next;
  141. while (current != null) {
  142. // Look down to first child.
  143. if (current.hasChildNodes()) {
  144. current = (current.getFirstChild());
  145. }
  146. // Look right to sibling (but not from root!)
  147. else if (current != rootNode && null != (next = current.getNextSibling())) {
  148. current = next;
  149. }
  150. // Look up and right (but not past root!)
  151. else {
  152. next = null;
  153. for (; current != rootNode; // Stop when we return to starting point
  154. current = current.getParentNode()) {
  155. next = current.getNextSibling();
  156. if (next != null)
  157. break;
  158. }
  159. current = next;
  160. }
  161. // Have we found an Element with the right tagName?
  162. // ("*" matches anything.)
  163. if (current != rootNode && current != null
  164. && current.getNodeType() == Node.ELEMENT_NODE ) {
  165. String name = ((ElementImpl) current).getAttribute( "name" );
  166. if ( name.equals("*") || name.equals(tagName))
  167. return current;
  168. }
  169. // Otherwise continue walking the tree
  170. }
  171. // Fell out of tree-walk; no more instances found
  172. return null;
  173. } // nextMatchingElementAfter(int):Node
  174. } // class NameNodeListImpl