001: /*
002: * Created on Jul 15, 2006
003: *
004: * Copyright 2006 John G. Wilson
005: *
006: * Licensed under the Apache License, Version 2.0 (the "License");
007: * you may not use this file except in compliance with the License.
008: * You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing, software
013: * distributed under the License is distributed on an "AS IS" BASIS,
014: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: * See the License for the specific language governing permissions and
016: * limitations under the License.
017: *
018: */
019: package groovy.util.slurpersupport;
020:
021: import groovy.lang.Closure;
022: import groovy.lang.GroovyObject;
023: import groovy.lang.GroovyRuntimeException;
024:
025: import java.io.IOException;
026: import java.io.Writer;
027: import java.util.Iterator;
028: import java.util.Map;
029:
030: import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
031:
032: public class Attribute extends GPathResult {
033: private final String value;
034:
035: public Attribute(final String name, final String value,
036: final GPathResult parent, final String namespacePrefix,
037: final Map namespaceTagHints) {
038: super (parent, name, namespacePrefix, namespaceTagHints);
039: this .value = value;
040: }
041:
042: public String name() {
043: // this name contains @name we need to return name
044: return this .name.substring(1);
045: }
046:
047: public int size() {
048: return 1;
049: }
050:
051: public String text() {
052: return this .value;
053: }
054:
055: public GPathResult parents() {
056: // TODO Auto-generated method stub
057: throw new GroovyRuntimeException(
058: "parents() not implemented yet");
059: }
060:
061: public Iterator childNodes() {
062: throw new GroovyRuntimeException(
063: "can't call childNodes() in the attribute " + this .name);
064: }
065:
066: public Iterator iterator() {
067: return nodeIterator();
068: }
069:
070: public GPathResult find(final Closure closure) {
071: if (DefaultTypeTransformation.castToBoolean(closure
072: .call(new Object[] { this }))) {
073: return this ;
074: } else {
075: return new NoChildren(this , "", this .namespaceTagHints);
076: }
077: }
078:
079: public GPathResult findAll(final Closure closure) {
080: return find(closure);
081: }
082:
083: public Iterator nodeIterator() {
084: return new Iterator() {
085: private boolean hasNext = true;
086:
087: public boolean hasNext() {
088: return this .hasNext;
089: }
090:
091: public Object next() {
092: try {
093: return (this .hasNext) ? Attribute.this : null;
094: } finally {
095: this .hasNext = false;
096: }
097: }
098:
099: public void remove() {
100: throw new UnsupportedOperationException();
101: }
102: };
103: }
104:
105: public Writer writeTo(final Writer out) throws IOException {
106: out.write(this .value);
107: return out;
108: }
109:
110: public void build(final GroovyObject builder) {
111: builder.getProperty("mkp");
112: builder.invokeMethod("yield", new Object[] { this .value });
113: }
114:
115: protected void replaceNode(final Closure newValue) {
116: }
117:
118: protected void replaceBody(final Object newValue) {
119: }
120:
121: protected void appendNode(final Object newValue) {
122: }
123: }
|