1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.jcr.wrapper;
35
36 import info.magnolia.jcr.iterator.FilteringNodeIterator;
37 import info.magnolia.jcr.predicate.AbstractPredicate;
38
39 import javax.jcr.Node;
40 import javax.jcr.NodeIterator;
41 import javax.jcr.PathNotFoundException;
42 import javax.jcr.RepositoryException;
43
44
45
46
47
48
49
50 public class ChildFilteringNodeWrapper extends ChildWrappingNodeWrapper {
51
52 private AbstractPredicate<Node> predicate;
53 private boolean filterDescendants = false;
54
55 public ChildFilteringNodeWrapper(Node wrapped, AbstractPredicate<Node> predicate) {
56 super(wrapped);
57 this.predicate = predicate;
58 }
59
60 public ChildFilteringNodeWrapper(Node wrapped, AbstractPredicate<Node> predicate, boolean filterDescendants) {
61 this(wrapped, predicate);
62 this.filterDescendants = filterDescendants;
63 }
64
65 @Override
66 public Node getNode(String relPath) throws PathNotFoundException, RepositoryException {
67 Node node = super.getNode(relPath);
68 if (!predicate.evaluate(node)) {
69 throw new PathNotFoundException("Path not found [" + relPath + "]");
70 }
71 return wrapNode(node);
72 }
73
74 @Override
75 public NodeIterator getNodes() throws RepositoryException {
76 return wrapNodeIterator(super.getNodes());
77 }
78
79 @Override
80 public NodeIterator getNodes(String namePattern) throws RepositoryException {
81 return wrapNodeIterator(super.getNodes(namePattern));
82 }
83
84 @Override
85 public NodeIterator getNodes(String[] nameGlobs) throws RepositoryException {
86 return wrapNodeIterator(super.getNodes(nameGlobs));
87 }
88
89 @Override
90 public boolean hasNode(String relPath) throws RepositoryException {
91 return super.hasNode(relPath) && predicate.evaluate(super.getNode(relPath));
92 }
93
94 @Override
95 public boolean hasNodes() throws RepositoryException {
96 return getNodes().hasNext();
97 }
98
99 @Override
100 public Node wrapNode(Node node) {
101 return filterDescendants ? new ChildFilteringNodeWrapper(node, predicate) : node;
102 }
103
104 @Override
105 protected NodeIterator wrapNodeIterator(NodeIterator nodeIterator) {
106 return new FilteringNodeIterator(nodeIterator, predicate, filterDescendants ? this : null);
107 }
108 }