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.filter.DataFilter;
37
38 import java.util.stream.Stream;
39
40 import com.vaadin.data.provider.ConfigurableFilterDataProvider;
41 import com.vaadin.data.provider.DataProvider;
42 import com.vaadin.data.provider.HierarchicalDataProvider;
43 import com.vaadin.data.provider.HierarchicalQuery;
44 import com.vaadin.data.provider.Query;
45
46
47
48
49
50 public class FilterableHierarchicalDataProvider<T> extends HierarchicalDataProviderWrapper<T, DataFilter> implements ConfigurableFilterDataProvider<T, DataFilter, DataFilter> {
51
52 private final DataProvider<T, DataFilter> filteringDataProvider;
53
54 public static <T> FilterableHierarchicalDataProvider<T> wrap(HierarchicalDataProvider<T, DataFilter> hierarchicalDataProvider, DataProvider<T, DataFilter> filteringDataProvider) {
55 return new FilterableHierarchicalDataProvider<>(hierarchicalDataProvider, filteringDataProvider);
56 }
57
58
59
60
61 @Deprecated
62 public static <T> FilterableHierarchicalDataProvider<T> wrap(HierarchicalDataProvider<T, DataFilter> src) {
63 return new FilterableHierarchicalDataProvider<>(src, null);
64 }
65
66 private FilterableHierarchicalDataProvider(HierarchicalDataProvider<T, DataFilter> dataProvider, DataProvider<T, DataFilter> filteringDataProvider) {
67 super(dataProvider);
68 this.filteringDataProvider = filteringDataProvider;
69 }
70
71 private DataFilter filter;
72
73
74
75
76 @Deprecated
77 public void setDataFilter(DataFilter dataFilter) {
78 setFilter(dataFilter);
79 }
80
81 @Override
82 public void setFilter(DataFilter filter) {
83 this.filter = filter;
84 }
85
86 @Override
87 public Stream<T> fetch(Query<T, DataFilter> t) {
88 return dataProvider.fetch(new HierarchicalQuery<>(t.getOffset(), t.getLimit(),
89 t.getSortOrders(), t.getInMemorySorting(), getFilter(t), null));
90 }
91
92 @Override
93 public Stream<T> fetchChildren(HierarchicalQuery<T, DataFilter> query) {
94 Stream<T> stream;
95 if (isFlatFiltering()) {
96 stream = filteringDataProvider.fetch(createQueryWithFilter(query));
97 } else {
98 stream = super.fetchChildren(query);
99 }
100 if (query.getInMemorySorting() != null) {
101 stream = stream.sorted(query.getInMemorySorting());
102 }
103 return stream;
104 }
105
106 @Override
107 public int getChildCount(HierarchicalQuery<T, DataFilter> query) {
108 if (isFlatFiltering()) {
109 if (query.getParent() == null) {
110 return (int) fetchChildren(query).count();
111 } else {
112 return 0;
113 }
114 }
115 return super.getChildCount(query);
116 }
117
118 @Override
119 public DataFilter getFilter(Query<T, DataFilter> query) {
120 return filter;
121 }
122
123 @Override
124 public boolean hasChildren(T item) {
125 return isFlatFiltering() ? getChildCount(new HierarchicalQuery<>(filter, item)) > 0 : super.hasChildren(item);
126 }
127
128 private boolean isFlatFiltering() {
129 return filteringDataProvider != null && filter != null && !filter.isEmpty();
130 }
131 }