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.framework.datasource.impl;
35
36 import info.magnolia.ui.contentapp.DataFilter;
37 import info.magnolia.ui.form.OptionDefinition;
38
39 import java.util.Comparator;
40 import java.util.stream.Stream;
41
42 import javax.inject.Inject;
43
44 import org.apache.commons.collections4.ComparatorUtils;
45 import org.apache.commons.lang3.StringUtils;
46
47 import com.vaadin.data.provider.AbstractDataProvider;
48 import com.vaadin.data.provider.Query;
49
50
51
52
53
54 public class FixedSizeDataProvider extends AbstractDataProvider<OptionDefinition, DataFilter> {
55 private final FixedSizeDatasourceDefinition definition;
56
57 private static final PreconfiguredOptionComparator PRECONFIGURED_OPTION_COMPARATOR = new PreconfiguredOptionComparator();
58
59 @Inject
60 public FixedSizeDataProvider(FixedSizeDatasourceDefinition definition) {
61 this.definition = definition;
62 }
63
64 @Override
65 public boolean isInMemory() {
66 return true;
67 }
68
69 @Override
70 public int size(Query<OptionDefinition, DataFilter> query) {
71 return (int) fetch(query).count();
72 }
73
74 @Override
75 public Stream<OptionDefinition> fetch(Query<OptionDefinition, DataFilter> query) {
76 final Stream<OptionDefinition> stream = definition.getOptions()
77 .stream()
78 .filter(property ->
79 query.getFilter()
80 .map(f -> isValueMatching(f, property.getValue()))
81 .orElse(true));
82
83 return definition.isSortable() ? stream.sorted(PRECONFIGURED_OPTION_COMPARATOR) : stream;
84 }
85
86
87
88
89 private static class PreconfiguredOptionComparator implements Comparator<OptionDefinition> {
90 @Override
91 public int compare(OptionDefinition def, OptionDefinition otherDef) {
92
93 return ComparatorUtils.nullLowComparator(String.CASE_INSENSITIVE_ORDER)
94 .compare(StringUtils.defaultIfBlank(def.getLabel(), def.getValue()),
95 StringUtils.defaultIfBlank(otherDef.getLabel(), otherDef.getValue()));
96 }
97 }
98
99 private boolean isValueMatching(DataFilter filter, String property) {
100 final String value = String.valueOf(filter.getValue());
101 switch (filter.getFilteringMode()) {
102 case STARTSWITH:
103 return property.startsWith(value);
104 case CONTAINS:
105 return property.contains(value);
106 }
107 return false;
108 }
109 }