1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package groovy.util.slurpersupport;
19
20 import java.util.Iterator;
21 import java.util.Map;
22
23 import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
24
25 import groovy.lang.Closure;
26
27 /***
28 * Lazy evaluated representation of nodes filtered by attributes.
29 *
30 * @author John Wilson
31 */
32 public class FilteredAttributes extends Attributes
33 {
34 private final Closure closure;
35
36 public FilteredAttributes(final GPathResult parent, final Closure closure, final Map namespaceTagHints) {
37 super(parent, parent.name, namespaceTagHints);
38 this.closure = closure;
39 }
40
41 public Iterator nodeIterator() {
42 return new NodeIterator(this.parent.iterator())
43 {
44 protected Object getNextNode(final Iterator iter) {
45 while (iter.hasNext()) {
46 final Object node = iter.next();
47 if (DefaultTypeTransformation.castToBoolean(FilteredAttributes.this.closure.call(new Object[]{node}))) {
48 return node;
49 }
50 }
51 return null;
52 }
53 };
54 }
55
56 }