001 /**
002 *
003 * Copyright 2005 LogicBlaze, Inc. http://www.logicblaze.com
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 *
017 **/
018 package groovy.util;
019
020 import groovy.xml.QName;
021
022 import java.util.ArrayList;
023 import java.util.Collection;
024 import java.util.Iterator;
025
026 /**
027 * A List implementation which is returned by queries on a {@link Node} which provides some XPath like helper methods for GPath
028 *
029 * @version $Revision$
030 */
031 public class NodeList extends ArrayList {
032
033 public NodeList() {
034 }
035
036 public NodeList(Collection collection) {
037 super(collection);
038 }
039
040 public NodeList(int size) {
041 super(size);
042 }
043
044 /**
045 * Provides lookup of elements by non-namespaced name
046 */
047 public NodeList getAt(String name) {
048 NodeList answer = new NodeList();
049 for (Iterator iter = iterator(); iter.hasNext();) {
050 Object child = iter.next();
051 if (child instanceof Node) {
052 Node childNode = (Node) child;
053 Object temp = childNode.get(name);
054 if (temp instanceof Collection) {
055 answer.addAll((Collection) temp);
056 }
057 else {
058 answer.add(temp);
059 }
060 }
061 }
062 return answer;
063 }
064
065 /**
066 * Provides lookup of elements by QName
067 */
068 public NodeList getAt(QName name) {
069 NodeList answer = new NodeList();
070 for (Iterator iter = iterator(); iter.hasNext();) {
071 Object child = iter.next();
072 if (child instanceof Node) {
073 Node childNode = (Node) child;
074 NodeList temp = childNode.getAt(name);
075 answer.addAll(temp);
076 }
077 }
078 return answer;
079 }
080
081 /**
082 * Returns the text value of all of the elements in the collection
083 *
084 * @return the text value of all the elements in the collection or null
085 */
086 public String text() {
087 String previousText = null;
088 StringBuffer buffer = null;
089 for (Iterator iter = this.iterator(); iter.hasNext();) {
090 Object child = iter.next();
091 String text = null;
092 if (child instanceof String) {
093 text = (String) child;
094 }
095 else if (child instanceof Node) {
096 text = ((Node) child).text();
097 }
098 if (text != null) {
099 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 }