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.ui.contentapp;
35
36
37 import java.util.Comparator;
38 import java.util.Iterator;
39 import java.util.Spliterator;
40 import java.util.Spliterators;
41 import java.util.stream.Stream;
42 import java.util.stream.StreamSupport;
43
44 import javax.jcr.Item;
45 import javax.jcr.Node;
46 import javax.jcr.RepositoryException;
47
48 import org.apache.commons.collections4.iterators.IteratorChain;
49 import org.slf4j.Logger;
50 import org.slf4j.LoggerFactory;
51
52 import com.vaadin.data.provider.Query;
53
54
55
56
57 class JcrDataProviderUtils {
58 private static final Logger log = LoggerFactory.getLogger(JcrDataProviderUtils.class);
59
60 private JcrDataProviderUtils() {
61 }
62
63 static Stream<Item> streamJcrItems(Iterator<Item> items) {
64
65 return StreamSupport.stream(Spliterators.spliteratorUnknownSize(items, Spliterator.DISTINCT | Spliterator.NONNULL), false);
66 }
67
68 static Stream<Item> streamQueryResults(Query<Item, DataFilter> query, Iterator<Item> items) {
69 return streamJcrItems(items)
70 .filter(node ->
71 query.getFilter()
72 .map(DataFilter::getPathFilter)
73 .map(path -> isItemPathMatching(node, path))
74 .orElse(true)
75 );
76 }
77
78 static IteratorChain<Item> getChildren(Item item, boolean includeProperties) throws RepositoryException {
79 IteratorChain<Item> iteratorChain = new IteratorChain<>();
80 if (item.isNode()) {
81 Node node = (Node) item;
82 iteratorChain.addIterator(node.getNodes());
83 if (includeProperties) {
84 final Stream<Item> stream = streamJcrItems(node.getProperties());
85 iteratorChain.addIterator(stream.sorted(Comparator.comparing(property -> {
86 try {
87 return property.getName();
88 } catch (RepositoryException e) {
89 return "";
90 }
91 })).iterator());
92 }
93 }
94 return iteratorChain;
95 }
96
97 private static Boolean isItemPathMatching(Item item, String pathFragment) {
98 try {
99 final String itemPath = item.getPath();
100 return itemPath.startsWith(pathFragment) || pathFragment.startsWith(itemPath);
101 } catch (RepositoryException e) {
102 log.warn("Failed to check whether item path [{}] matches prefix [{}}, since the item is missing", item, pathFragment, e.getMessage());
103 return false;
104 }
105 }
106 }