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, final GPathResult parent, final String namespacePrefix, final Map namespaceTagHints) {
036 super(parent, name, namespacePrefix, namespaceTagHints);
037 this.value = value;
038 }
039
040 public String name() {
041 // this name contains @name we need to return name
042 return this.name.substring(1);
043 }
044
045 public int size() {
046 return 1;
047 }
048
049 public String text() {
050 return this.value;
051 }
052
053 public GPathResult parents() {
054 // TODO Auto-generated method stub
055 throw new GroovyRuntimeException("parents() not implemented yet");
056 }
057
058 public Iterator childNodes() {
059 throw new GroovyRuntimeException("can't call childNodes() in the attribute " + this.name);
060 }
061
062 public Iterator iterator() {
063 return nodeIterator();
064 }
065
066 public GPathResult find(final Closure closure) {
067 if (DefaultTypeTransformation.castToBoolean(closure.call(new Object[]{this}))) {
068 return this;
069 } else {
070 return new NoChildren(this, "", this.namespaceTagHints);
071 }
072 }
073
074 public GPathResult findAll(final Closure closure) {
075 return find(closure);
076 }
077
078 public Iterator nodeIterator() {
079 return new Iterator() {
080 private boolean hasNext = true;
081
082 public boolean hasNext() {
083 return this.hasNext;
084 }
085
086 public Object next() {
087 try {
088 return (this.hasNext) ? Attribute.this : null;
089 } finally {
090 this.hasNext = false;
091 }
092 }
093
094 public void remove() {
095 throw new UnsupportedOperationException();
096 }
097 };
098 }
099
100 public Writer writeTo(final Writer out) throws IOException {
101 out.write(this.value);
102 return out;
103 }
104
105 public void build(final GroovyObject builder) {
106 builder.getProperty("mkp");
107 builder.invokeMethod("yield", new Object[]{this.value});
108 }
109
110 protected void replaceNode(final Closure newValue) {
111 }
112
113 protected void replaceBody(final Object newValue) {
114 }
115
116 protected void appendNode(final Object newValue) {
117 }
118 }