001 /*
002 * Copyright 2005 John G. Wilson
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 *
016 */
017
018 package groovy.util.slurpersupport;
019
020 import groovy.lang.Closure;
021 import groovy.lang.GroovyObject;
022 import groovy.lang.GroovyRuntimeException;
023
024 import java.io.IOException;
025 import java.io.Writer;
026 import java.util.Iterator;
027 import java.util.Map;
028
029 /**
030 * @author John Wilson
031 *
032 */
033
034 public class NodeChild extends GPathResult {
035 private final Node node;
036
037 public NodeChild(final Node node, final GPathResult parent, final String namespacePrefix, final Map namespaceTagHints) {
038 super(parent, node.name(), namespacePrefix, namespaceTagHints);
039 this.node = node;
040 }
041
042 public NodeChild(final Node node, final GPathResult parent, final Map namespaceTagHints) {
043 this(node, parent, "*", namespaceTagHints);
044 }
045
046 /* (non-Javadoc)
047 * @see org.codehaus.groovy.sandbox.util.slurpersupport.Node#size()
048 */
049 public int size() {
050 return 1;
051 }
052
053 /* (non-Javadoc)
054 * @see org.codehaus.groovy.sandbox.util.slurpersupport.GPathResult#text()
055 */
056 public String text() {
057 return this.node.text();
058 }
059
060 /* (non-Javadoc)
061 * @see org.codehaus.groovy.sandbox.util.slurpersupport.Node#parents()
062 */
063 public GPathResult parents() {
064 // TODO Auto-generated method stub
065 throw new GroovyRuntimeException("parents() not implemented yet");
066 }
067
068 /* (non-Javadoc)
069 * @see org.codehaus.groovy.sandbox.util.slurpersupport.GPathResult#iterator()
070 */
071 public Iterator iterator() {
072 return new Iterator() {
073 private boolean hasNext = true;
074
075 public boolean hasNext() {
076 return this.hasNext;
077 }
078
079 public Object next() {
080 try {
081 return (this.hasNext) ? NodeChild.this : null;
082 } finally {
083 this.hasNext = false;
084 }
085 }
086
087 public void remove() {
088 throw new UnsupportedOperationException();
089 }
090 };
091 }
092
093 /* (non-Javadoc)
094 * @see org.codehaus.groovy.sandbox.util.slurpersupport.Node#iterator()
095 */
096 public Iterator nodeIterator() {
097 return new Iterator() {
098 private boolean hasNext = true;
099
100 public boolean hasNext() {
101 return this.hasNext;
102 }
103
104 public Object next() {
105 try {
106 return (this.hasNext) ? NodeChild.this.node : null;
107 } finally {
108 this.hasNext = false;
109 }
110 }
111
112 public void remove() {
113 throw new UnsupportedOperationException();
114 }
115 };
116 }
117
118 /* (non-Javadoc)
119 * @see org.codehaus.groovy.sandbox.util.slurpersupport.Node#getAt(int)
120 */
121 public Object getAt(final int index) {
122 if (index == 0) {
123 return node;
124 } else {
125 throw new ArrayIndexOutOfBoundsException(index);
126 }
127 }
128 public Iterator childNodes() {
129 return this.node.childNodes();
130 }
131 /* (non-Javadoc)
132 * @see org.codehaus.groovy.sandbox.util.slurpersupport.Node#find(groovy.lang.Closure)
133 */
134 public GPathResult find(final Closure closure) {
135 if (((Boolean)closure.call(new Object[]{this})).booleanValue()) {
136 return this;
137 } else {
138 return null;
139 }
140 }
141
142 /* (non-Javadoc)
143 * @see org.codehaus.groovy.sandbox.util.slurpersupport.Node#findAll(groovy.lang.Closure)
144 */
145 public GPathResult findAll(final Closure closure) {
146 return find(closure);
147 }
148
149 /* (non-Javadoc)
150 * @see org.codehaus.groovy.sandbox.util.slurpersupport.Node#build(groovy.lang.GroovyObject)
151 */
152 public void build(final GroovyObject builder) {
153 this.node.build(builder, this.namespaceMap, this.namespaceTagHints);
154 }
155
156 /* (non-Javadoc)
157 * @see org.codehaus.groovy.sandbox.util.slurpersupport.Node#writeTo(java.io.Writer)
158 */
159 public Writer writeTo(final Writer out) throws IOException {
160 return this.node.writeTo(out);
161 }
162 }