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.rest.delivery.jcr.filter;
35
36 import info.magnolia.jcr.decoration.ContentDecoratorNodeIterator;
37 import info.magnolia.jcr.decoration.ContentDecoratorNodeWrapper;
38 import info.magnolia.jcr.predicate.JCRMgnlPropertyHidingPredicate;
39 import info.magnolia.jcr.wrapper.ChildFilteringContentDecorator;
40 import info.magnolia.jcr.wrapper.PropertyFilteringContentDecorator;
41 import info.magnolia.rest.delivery.jcr.decorator.ReferenceExpandDecorator;
42 import info.magnolia.rest.delivery.jcr.decorator.ReferenceExpandWrapper;
43 import info.magnolia.rest.reference.ReferenceDefinition;
44
45 import java.util.ArrayList;
46 import java.util.List;
47
48 import javax.jcr.Node;
49 import javax.jcr.NodeIterator;
50 import javax.jcr.RepositoryException;
51
52
53
54
55 public class FilteringContentDecoratorBuilder {
56 private List<String> childNodeTypes = new ArrayList<>();
57 private boolean includeSystemProperties;
58 private int depth;
59 private List<ReferenceDefinition> references = new ArrayList<>();
60
61 public FilteringContentDecoratorBuilder childNodeTypes(List<String> childrenNodeTypes) {
62 this.childNodeTypes = childrenNodeTypes;
63 return this;
64 }
65
66 public FilteringContentDecoratorBuilder includeSystemProperties(boolean includeSystemProperties) {
67 this.includeSystemProperties = includeSystemProperties;
68 return this;
69 }
70
71 public FilteringContentDecoratorBuilder depth(int depth) {
72 this.depth = depth;
73 return this;
74 }
75
76 public FilteringContentDecoratorBuilder references(List<ReferenceDefinition> references) {
77 this.references = references;
78 return this;
79 }
80
81 public Node wrapNode(Node node) {
82 if (!childNodeTypes.isEmpty()) {
83 node = new ContentDecoratorNodeWrapper<>(node, new ChildFilteringContentDecorator(new NodeTypesPredicate(childNodeTypes), true));
84 }
85
86 if (!includeSystemProperties) {
87 node = new ContentDecoratorNodeWrapper<>(node, new PropertyFilteringContentDecorator(new JCRMgnlPropertyHidingPredicate()));
88 }
89
90 if (depth >= 0) {
91 ChildFilteringContentDecorator depthDecorator = new ChildFilteringContentDecorator(new DepthFilteringPredicate(getDepth(node), getDepth(node) + depth), true);
92 node = new ContentDecoratorNodeWrapper<>(node, depthDecorator);
93 }
94
95 if (references != null && !references.isEmpty()) {
96 FilteringContentDecoratorBuilder expandDecorators = new FilteringContentDecoratorBuilder();
97 expandDecorators
98 .includeSystemProperties(includeSystemProperties)
99 .depth(-1);
100
101 node = new ReferenceExpandWrapper(node, references, expandDecorators);
102 }
103
104 return node;
105 }
106
107 public NodeIterator wrapNodeIterator(NodeIterator nodeIterator) {
108
109 if (!childNodeTypes.isEmpty()) {
110 nodeIterator = new ChildNodeTypesFilteringNodeIterator(nodeIterator, childNodeTypes);
111 }
112
113 if (!includeSystemProperties) {
114 nodeIterator = new ContentDecoratorNodeIterator(nodeIterator, new PropertyFilteringContentDecorator(new JCRMgnlPropertyHidingPredicate()));
115 }
116
117 if (depth >= 0) {
118 nodeIterator = new DepthFilteringDecoratorNodeIterator(nodeIterator, depth);
119 }
120
121 if (references != null && !references.isEmpty()) {
122 FilteringContentDecoratorBuilder expandDecorators = new FilteringContentDecoratorBuilder();
123 expandDecorators
124 .includeSystemProperties(includeSystemProperties)
125 .depth(-1);
126
127 nodeIterator = new ContentDecoratorNodeIterator(nodeIterator, new ReferenceExpandDecorator(references, expandDecorators));
128 }
129
130 return nodeIterator;
131 }
132
133 private int getDepth(Node node) {
134 try {
135 return node.getDepth();
136 } catch (RepositoryException e) {
137 return 0;
138 }
139 }
140 }