View Javadoc

1   /*
2    * Copyright 2005 John G. Wilson
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   *
16   */
17  package groovy.util.slurpersupport;
18  
19  import groovy.lang.Closure;
20  import groovy.lang.GroovyObject;
21  import groovy.lang.GroovyRuntimeException;
22  
23  import java.io.IOException;
24  import java.io.Writer;
25  import java.util.Map;
26  import java.util.Iterator;
27  import java.util.List;
28  import java.util.ArrayList;
29  
30  /***
31   * @author John Wilson
32   */
33  
34  class Attributes extends NodeChildren {
35      final String attributeName;
36  
37      public Attributes(final GPathResult parent, final String name, final String namespacePrefix, final Map namespaceTagHints) {
38          super(parent, name, namespacePrefix, namespaceTagHints);
39          this.attributeName = this.name.substring(1);
40      }
41  
42      public Attributes(final GPathResult parent, final String name, final Map namespaceTagHints) {
43          this(parent, name, "*", namespaceTagHints);
44      }
45  
46      public String name() {
47          // this name contains @name we need to return name
48          return this.name.substring(1);
49      }
50  
51      public Iterator childNodes() {
52          throw new GroovyRuntimeException("Can't get the child nodes on a a GPath expression selecting attributes: ...." + this.parent.name() + "." + name() + ".childNodes()");
53      }
54  
55      public Iterator iterator() {
56          return new NodeIterator(nodeIterator()) {
57              protected Object getNextNode(final Iterator iter) {
58                  while (iter.hasNext()) {
59                      final Object next = iter.next();
60                      if (next instanceof Attribute) {
61                          return next;
62                      } else {
63                          final String value = (String) ((Node) next).attributes().get(Attributes.this.attributeName);
64                          if (value != null) {
65                              return new Attribute(Attributes.this.attributeName,
66                                      value,
67                                      new NodeChild((Node) next, Attributes.this.parent.parent, "", Attributes.this.namespaceTagHints),
68                                      "",
69                                      Attributes.this.namespaceTagHints);
70                          }
71                      }
72                  }
73                  return null;
74              }
75          };
76      }
77  
78      public Iterator nodeIterator() {
79          return this.parent.nodeIterator();
80      }
81  
82      public GPathResult parents() {
83          return super.parents();
84      }
85  
86      public String text() {
87          final StringBuffer buf = new StringBuffer();
88          final Iterator iter = iterator();
89          while (iter.hasNext()) {
90              buf.append(iter.next());
91          }
92          return buf.toString();
93      }
94  
95      public List list() {
96          final Iterator iter = iterator();
97          final List result = new ArrayList();
98          while (iter.hasNext()) {
99              result.add(iter.next());
100         }
101         return result;
102     }
103 
104     public GPathResult findAll(final Closure closure) {
105         return new FilteredAttributes(this, closure, this.namespaceTagHints);
106     }
107 
108     public Writer writeTo(final Writer out) throws IOException {
109         out.write(text());
110         return out;
111     }
112 
113     public void build(final GroovyObject builder) {
114         builder.getProperty("mkp");
115         builder.invokeMethod("yield", new Object[]{text()});
116     }
117 }