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 info.magnolia.ui.framework.ioc.Destructible;
37
38 import java.util.stream.Stream;
39
40 import com.vaadin.data.provider.HierarchicalDataProvider;
41 import com.vaadin.data.provider.HierarchicalQuery;
42 import com.vaadin.data.provider.Query;
43
44
45
46
47
48 public class FilterableHierarchicalDataProvider<T> extends HierarchicalDataProviderWrapper<T, DataFilter> implements FilterableDataProvider<T> {
49
50 public static <T> FilterableHierarchicalDataProvider<T> wrap(HierarchicalDataProvider<T, DataFilter> src) {
51 return new FilterableHierarchicalDataProvider<>(src);
52 }
53
54 private FilterableHierarchicalDataProvider(HierarchicalDataProvider<T, DataFilter> dataProvider) {
55 super(dataProvider);
56 }
57
58 private DataFilter filter;
59
60 @Override
61 public void setDataFilter(DataFilter dataFilter) {
62 this.filter = dataFilter;
63 }
64
65 @Override
66 public Stream<T> fetch(Query<T, DataFilter> t) {
67 return dataProvider.fetch(new HierarchicalQuery<>(t.getOffset(), t.getLimit(),
68 t.getSortOrders(), t.getInMemorySorting(), getFilter(t), null));
69 }
70
71 @Override
72 public Stream<T> fetchChildren(HierarchicalQuery<T, DataFilter> query) {
73 return super.fetchChildren(query)
74 .sorted(getComparator(query));
75 }
76
77 @Override
78 public DataFilter getFilter(Query<T, DataFilter> query) {
79 return filter;
80 }
81
82 @Override
83 public void destroy() {
84 if (dataProvider instanceof Destructible) {
85 ((Destructible) dataProvider).destroy();
86 }
87 }
88
89 @Override
90 public boolean hasChildren(T item) {
91 return fetchChildren(new HierarchicalQuery<>(filter, item)).count() > 0;
92 }
93 }