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.FilteringMode.OFF;
37
38 import java.util.stream.Stream;
39
40 import org.apache.commons.lang3.StringUtils;
41
42 import com.vaadin.data.provider.DataProvider;
43 import com.vaadin.data.provider.DataProviderWrapper;
44 import com.vaadin.data.provider.HierarchicalDataProvider;
45 import com.vaadin.data.provider.HierarchicalQuery;
46 import com.vaadin.data.provider.Query;
47 import com.vaadin.ui.ComboBox;
48 import com.vaadin.ui.ItemCaptionGenerator;
49
50
51
52
53
54
55
56 public class CaptionFilteringDataProviderWrapper<T, F> extends DataProviderWrapper<T, String, F> {
57
58 public static <T, F> CaptionFilteringDataProviderWrapper<T, F> wrap(DataProvider<T, F> src) {
59 return new CaptionFilteringDataProviderWrapper<>(src);
60 }
61
62 private FilteringMode filteringMode = OFF;
63 private ItemCaptionGenerator<T> itemCaptionGenerator = Object::toString;
64
65 private CaptionFilteringDataProviderWrapper(DataProvider<T, F> dataProvider) {
66 super(dataProvider);
67 }
68
69 public CaptionFilteringDataProviderWrapper<T, F> withItemCaptionGenerator(ItemCaptionGenerator<T> itemCaptionGenerator) {
70 this.itemCaptionGenerator = itemCaptionGenerator;
71 return this;
72 }
73
74 public CaptionFilteringDataProviderWrapper<T, F> withFilteringMode(FilteringMode filteringMode) {
75 this.filteringMode = filteringMode;
76 return this;
77 }
78
79 @Override
80 public Stream<T> fetch(Query<T, String> t) {
81 final Stream<T> stream;
82 if (dataProvider instanceof HierarchicalDataProvider) {
83 stream = super.fetch(new HierarchicalQuery<>(t.getFilter().orElse(null), null));
84 } else {
85 stream = super.fetch(new Query<>(t.getFilter().orElse(null)));
86 }
87 return stream
88 .filter(item -> getCaptionFilter().test(itemCaptionGenerator.apply(item), t.getFilter().orElse(StringUtils.EMPTY)))
89 .skip(t.getOffset())
90 .limit(t.getLimit());
91 }
92
93 @Override
94 public int size(Query<T, String> t) {
95 return (int) fetch(t).count();
96 }
97
98
99
100
101 @Override
102 protected F getFilter(Query<T, String> query) {
103 return null;
104 }
105
106 private ComboBox.CaptionFilter getCaptionFilter() {
107 switch (filteringMode) {
108 case CONTAINS:
109 return StringUtils::containsIgnoreCase;
110 case STARTSWITH:
111 return StringUtils::startsWithIgnoreCase;
112 default:
113 return (itemCaption, filterText) -> true;
114 }
115 }
116
117 }