001: /*
002: * The Apache Software License, Version 1.1
003: *
004: *
005: * Copyright (c) 1999,2000 The Apache Software Foundation. All rights
006: * reserved.
007: *
008: * Redistribution and use in source and binary forms, with or without
009: * modification, are permitted provided that the following conditions
010: * are met:
011: *
012: * 1. Redistributions of source code must retain the above copyright
013: * notice, this list of conditions and the following disclaimer.
014: *
015: * 2. Redistributions in binary form must reproduce the above copyright
016: * notice, this list of conditions and the following disclaimer in
017: * the documentation and/or other materials provided with the
018: * distribution.
019: *
020: * 3. The end-user documentation included with the redistribution,
021: * if any, must include the following acknowledgment:
022: * "This product includes software developed by the
023: * Apache Software Foundation (http://www.apache.org/)."
024: * Alternately, this acknowledgment may appear in the software itself,
025: * if and wherever such third-party acknowledgments normally appear.
026: *
027: * 4. The names "Xerces" and "Apache Software Foundation" must
028: * not be used to endorse or promote products derived from this
029: * software without prior written permission. For written
030: * permission, please contact apache@apache.org.
031: *
032: * 5. Products derived from this software may not be called "Apache",
033: * nor may "Apache" appear in their name, without prior written
034: * permission of the Apache Software Foundation.
035: *
036: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
037: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
038: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
039: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
040: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
041: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
042: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
043: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
044: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
045: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
046: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
047: * SUCH DAMAGE.
048: * ====================================================================
049: *
050: * This software consists of voluntary contributions made by many
051: * individuals on behalf of the Apache Software Foundation and was
052: * originally based on software copyright (c) 1999, International
053: * Business Machines, Inc., http://www.apache.org. For more
054: * information on the Apache Software Foundation, please see
055: * <http://www.apache.org/>.
056: */
057: /*
058: * The Apache Software License, Version 1.1
059: *
060: *
061: * Copyright (c) 1999 The Apache Software Foundation. All rights
062: * reserved.
063: *
064: * Redistribution and use in source and binary forms, with or without
065: * modification, are permitted provided that the following conditions
066: * are met:
067: *
068: * 1. Redistributions of source code must retain the above copyright
069: * notice, this list of conditions and the following disclaimer.
070: *
071: * 2. Redistributions in binary form must reproduce the above copyright
072: * notice, this list of conditions and the following disclaimer in
073: * the documentation and/or other materials provided with the
074: * distribution.
075: *
076: * 3. The end-user documentation included with the redistribution,
077: * if any, must include the following acknowledgment:
078: * "This product includes software developed by the
079: * Apache Software Foundation (http://www.apache.org/)."
080: * Alternately, this acknowledgment may appear in the software itself,
081: * if and wherever such third-party acknowledgments normally appear.
082: *
083: * 4. The names "Xerces" and "Apache Software Foundation" must
084: * not be used to endorse or promote products derived from this
085: * software without prior written permission. For written
086: * permission, please contact apache@apache.org.
087: *
088: * 5. Products derived from this software may not be called "Apache",
089: * nor may "Apache" appear in their name, without prior written
090: * permission of the Apache Software Foundation.
091: *
092: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
093: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
094: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
095: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
096: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
097: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
098: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
099: * 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:
114: package org.apache.html.dom;
115:
116: import org.w3c.dom.*;
117: import java.util.Vector;
118: import org.apache.xerces.dom.NodeImpl;
119: import org.apache.xerces.dom.ElementImpl;
120: import org.apache.xerces.dom.DeepNodeListImpl;
121:
122: /**
123: * This class implements the DOM's NodeList behavior for
124: * HTMLDocuemnt.getElementsByName().
125: *
126: * @version
127: * @since PR-DOM-Level-1-19980818.
128: * @see DeepNodeListImpl
129: */
130: public class NameNodeListImpl extends DeepNodeListImpl implements
131: NodeList {
132:
133: /** Constructor. */
134: public NameNodeListImpl(NodeImpl rootNode, String tagName) {
135: super (rootNode, tagName);
136: }
137:
138: /**
139: * Iterative tree-walker. When you have a Parent link, there's often no
140: * need to resort to recursion. NOTE THAT only Element nodes are matched
141: * since we're specifically supporting getElementsByTagName().
142: */
143: protected Node nextMatchingElementAfter(Node current) {
144:
145: Node next;
146: while (current != null) {
147: // Look down to first child.
148: if (current.hasChildNodes()) {
149: current = (current.getFirstChild());
150: }
151:
152: // Look right to sibling (but not from root!)
153: else if (current != rootNode
154: && null != (next = current.getNextSibling())) {
155: current = next;
156: }
157:
158: // Look up and right (but not past root!)
159: else {
160: next = null;
161: for (; current != rootNode; // Stop when we return to starting point
162: current = current.getParentNode()) {
163:
164: next = current.getNextSibling();
165: if (next != null)
166: break;
167: }
168: current = next;
169: }
170:
171: // Have we found an Element with the right tagName?
172: // ("*" matches anything.)
173: if (current != rootNode && current != null
174: && current.getNodeType() == Node.ELEMENT_NODE) {
175: String name = ((ElementImpl) current)
176: .getAttribute("name");
177: if (name.equals("*") || name.equals(tagName))
178: return current;
179: }
180:
181: // Otherwise continue walking the tree
182: }
183:
184: // Fell out of tree-walk; no more instances found
185: return null;
186:
187: } // nextMatchingElementAfter(int):Node
188:
189: } // class NameNodeListImpl
|