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 import static info.magnolia.ui.contentapp.JcrDataProviderUtils.*;
37
38 import info.magnolia.jcr.RuntimeRepositoryException;
39 import info.magnolia.ui.datasource.jcr.JcrDatasourceDefinition;
40 import info.magnolia.ui.datasource.jcr.JcrSessionManager;
41
42 import java.util.stream.Stream;
43
44 import javax.jcr.Item;
45 import javax.jcr.RepositoryException;
46 import javax.jcr.Session;
47
48 import com.vaadin.data.provider.AbstractBackEndHierarchicalDataProvider;
49 import com.vaadin.data.provider.HierarchicalQuery;
50
51
52
53
54 public class HierarchicalJcrDataProvider extends AbstractBackEndHierarchicalDataProvider<Item, DataFilter> {
55
56 private final JcrSessionManager contentDecorator;
57 private final JcrDatasourceDefinition datasourceDefinition;
58
59 public HierarchicalJcrDataProvider(JcrDatasourceDefinition definition, JcrSessionManager contentDecorator) {
60 this.contentDecorator = contentDecorator;
61 this.datasourceDefinition = definition;
62 }
63
64 @Override
65 public int getChildCount(HierarchicalQuery<Item, DataFilter> query) {
66 try {
67 Item parent = query.getParent() == null ? getJcrSession().getRootNode() : query.getParent();
68 return (int) streamQueryResults(query, getChildren(parent, datasourceDefinition.isIncludeProperties())).count();
69 } catch (RepositoryException e) {
70 throw new RuntimeRepositoryException(e);
71 }
72 }
73
74 @Override
75 public boolean hasChildren(Item item) {
76 try {
77 return getChildren(item, datasourceDefinition.isIncludeProperties()).hasNext();
78 } catch (RepositoryException e) {
79 throw new RuntimeRepositoryException(e);
80 }
81 }
82
83 @Override
84 protected Stream<Item> fetchChildrenFromBackEnd(HierarchicalQuery<Item, DataFilter> query) {
85 try {
86 final Item parent = query.getParent() == null ? getJcrSession().getRootNode() : query.getParent();
87 return streamQueryResults(query, getChildren(parent, datasourceDefinition.isIncludeProperties()))
88 .skip(query.getOffset())
89 .limit(query.getLimit());
90 } catch (RepositoryException e) {
91 throw new RuntimeRepositoryException(e);
92 }
93 }
94
95 private Session getJcrSession() throws RepositoryException {
96 return contentDecorator.getJCRSession();
97 }
98 }