View Javadoc

1   /***
2    * 
3    * Copyright 2005 LogicBlaze, Inc. http://www.logicblaze.com
4    * 
5    * Licensed under the Apache License, Version 2.0 (the "License"); 
6    * you may not use this file except in compliance with the License. 
7    * You may obtain a copy of the License at 
8    * 
9    * http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS, 
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
14   * See the License for the specific language governing permissions and 
15   * limitations under the License. 
16   * 
17   **/
18  package groovy.util;
19  
20  import groovy.xml.QName;
21  
22  import java.util.ArrayList;
23  import java.util.Collection;
24  import java.util.Iterator;
25  
26  /***
27   * A List implementation which is returned by queries on a {@link Node} which provides some XPath like helper methods for GPath
28   * 
29   * @version $Revision$
30   */
31  public class NodeList extends ArrayList {
32  
33      public NodeList() {
34      }
35  
36      public NodeList(Collection collection) {
37          super(collection);
38      }
39  
40      public NodeList(int size) {
41          super(size);
42      }
43      
44      /***
45       * Provides lookup of elements by non-namespaced name
46       */
47      public NodeList getAt(String name) {
48          NodeList answer = new NodeList();
49          for (Iterator iter = iterator(); iter.hasNext();) {
50              Object child = iter.next();
51              if (child instanceof Node) {
52                  Node childNode = (Node) child;
53                  Object temp = childNode.get(name);
54                  if (temp instanceof Collection) {
55                      answer.addAll((Collection) temp);
56                  }
57                  else {
58                      answer.add(temp);
59                  }
60              }
61          }
62          return answer;
63      }
64  
65      /***
66       * Provides lookup of elements by QName
67       */
68      public NodeList getAt(QName name) {
69          NodeList answer = new NodeList();
70          for (Iterator iter = iterator(); iter.hasNext();) {
71              Object child = iter.next();
72              if (child instanceof Node) {
73                  Node childNode = (Node) child;
74                  NodeList temp = childNode.getAt(name);
75                  answer.addAll(temp);
76              }
77          }
78          return answer;
79      }
80  
81      /***
82       * Returns the text value of all of the elements in the collection
83       * 
84       * @return the text value of all the elements in the collection or null
85       */
86      public String text() {
87          String previousText = null;
88          StringBuffer buffer = null;
89          for (Iterator iter = this.iterator(); iter.hasNext();) {
90              Object child = iter.next();
91              String text = null;
92              if (child instanceof String) {
93                  text = (String) child;
94              }
95              else if (child instanceof Node) {
96                  text = ((Node) child).text();
97              }
98              if (text != null) {
99                  if (previousText == null) {
100                     previousText = text;
101                 }
102                 else {
103                     if (buffer == null) {
104                         buffer = new StringBuffer();
105                         buffer.append(previousText);
106                     }
107                     buffer.append(text);
108                 }
109             }
110         }
111         if (buffer != null) {
112             return buffer.toString();
113         }
114         else {
115             if (previousText != null) {
116                 return previousText;
117             }
118         }
119         return "";
120     }
121 }