/
PagedDataProvider.java
86 lines (69 loc) · 2.03 KB
/
PagedDataProvider.java
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package org.vaadin.teemusa.gridextensions.paging;
import java.util.Objects;
import java.util.stream.Stream;
import com.vaadin.data.provider.AbstractDataProvider;
import com.vaadin.data.provider.DataChangeEvent.DataRefreshEvent;
import com.vaadin.data.provider.DataProvider;
import com.vaadin.data.provider.Query;
public class PagedDataProvider<T, F> extends AbstractDataProvider<T, F> {
static final int DEFAULT_PAGE_LENGTH = 10;
private final PagingControls pagingControls;
final DataProvider<T, F> dataProvider;
Integer backendSize;
F filter;
public PagedDataProvider(DataProvider<T, F> dataProvider) {
this(dataProvider, DEFAULT_PAGE_LENGTH);
}
public PagedDataProvider(DataProvider<T, F> dataProvider, int pageLength) {
pagingControls = new PagingControls(this, pageLength);
this.dataProvider = dataProvider;
this.dataProvider.addDataProviderListener(event -> {
if (event instanceof DataRefreshEvent) {
fireEvent(event);
} else {
setBackendSize(null);
refreshAll();
}
});
}
@Override
public boolean isInMemory() {
return dataProvider.isInMemory();
}
@Override
public int size(Query<T, F> query) {
int size;
if (this.backendSize == null) {
size = getBackendSize(query);
} else if (Objects.equals(filter, query.getFilter().orElse(null))){
size = this.backendSize;
} else {
size = dataProvider.size(query);
}
return getPagingControls().getSizeOfPage(size);
}
public PagingControls getPagingControls() {
return pagingControls;
}
void setBackendSize(Integer size) {
backendSize = size;
if (size != null) {
getPagingControls().updatePageNumber();
}
}
@Override
public Stream<T> fetch(Query<T, F> query) {
Query<T, F> newQuery = getPagingControls().alignQuery(query);
return dataProvider.fetch(newQuery);
}
int getBackendSize() {
return getBackendSize(new Query<>(filter));
}
int getBackendSize(Query<T, F> query) {
if (backendSize == null) {
setBackendSize(dataProvider.size(query));
filter = query.getFilter().orElse(null);
}
return backendSize;
}
}