1 package org.nuiton.util.pagination;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 import com.google.common.base.Preconditions;
26
27 import java.io.Serializable;
28 import java.util.LinkedList;
29 import java.util.List;
30 import java.util.function.Function;
31 import java.util.stream.Collectors;
32
33
34
35
36
37
38
39
40
41 public class PaginationResult<O> implements Serializable {
42
43 private static final long serialVersionUID = 1L;
44
45 protected List<O> elements;
46 protected long count;
47 protected PaginationParameter currentPage;
48
49 protected PaginationResult(List<O> elements, long count, PaginationParameter currentPage) {
50 this.elements = elements;
51 this.count = count;
52 this.currentPage = currentPage;
53 }
54
55
56
57
58
59
60
61
62
63
64
65 public static <T> PaginationResult<T> of(List<T> elements, long count, PaginationParameter currentPage) {
66 PaginationResult<T> result = new PaginationResult<T>(elements, count, currentPage);
67 return result;
68 }
69
70
71
72
73
74
75
76
77
78
79
80 public static <T> PaginationResult<T> fromFullList(List<T> fullList, PaginationParameter requestedPage) {
81
82 List<T> subList;
83
84 int startIndex = requestedPage.getStartIndex();
85
86 if (requestedPage.isAll()) {
87
88 subList = fullList;
89 } else if (startIndex >= fullList.size()) {
90
91 subList = new LinkedList<T>();
92 } else {
93 int toIndex = Math.min(requestedPage.getEndIndex() + 1, fullList.size());
94 subList = fullList.subList(startIndex, toIndex);
95 }
96
97 PaginationResult<T> result = PaginationResult.of(subList, fullList.size(), requestedPage);
98 return result;
99 }
100
101 public List<O> getElements() {
102 return elements;
103 }
104
105 public long getCount() {
106 return count;
107 }
108
109 public PaginationParameter getCurrentPage() {
110 return currentPage;
111 }
112
113 public PaginationParameter getNextPage() {
114 int nextPageNumber = currentPage.getPageNumber() + 1;
115 int pageSize = currentPage.getPageSize();
116 List<PaginationOrder> orderClauses = currentPage.getOrderClauses();
117 PaginationParameter result = PaginationParameter.
118 builder(nextPageNumber, pageSize).
119 addOrderClauses(orderClauses).
120 build();
121 return result;
122 }
123
124 public PaginationParameter getPreviousPage() {
125
126 Preconditions.checkState(hasPreviousPage(), "You cannot get a previous page to the first one");
127 int previousPageNumber = currentPage.getPageNumber() - 1;
128 int pageSize = currentPage.getPageSize();
129 List<PaginationOrder> orderClauses = currentPage.getOrderClauses();
130 PaginationParameter result = PaginationParameter.
131 builder(previousPageNumber, pageSize).
132 addOrderClauses(orderClauses).
133 build();
134 return result;
135 }
136
137 public PaginationParameter getFirstPage() {
138 int firstPageNumber = 0;
139 int pageSize = currentPage.getPageSize();
140 List<PaginationOrder> orderClauses = currentPage.getOrderClauses();
141 PaginationParameter result = PaginationParameter.
142 builder(firstPageNumber, pageSize).
143 addOrderClauses(orderClauses).
144 build();
145 return result;
146 }
147
148 public PaginationParameter getLastPage() {
149
150 int lastPageNumber = Math.max(0, getPageCount() - 1);
151 int pageSize = currentPage.getPageSize();
152 List<PaginationOrder> orderClauses = currentPage.getOrderClauses();
153 PaginationParameter result = PaginationParameter.
154 builder(lastPageNumber, pageSize).
155 addOrderClauses(orderClauses).
156 build();
157 return result;
158 }
159
160 public int getPageCount() {
161 int pageCount = 1;
162 int pageSize = currentPage.getPageSize();
163 if (pageSize >= 1) {
164 double countDouble = Long.valueOf(count).doubleValue();
165 double pageSizeDouble = Integer.valueOf(pageSize).doubleValue();
166 double pageNumberDouble = Math.ceil(countDouble / pageSizeDouble);
167 pageCount = Double.valueOf(pageNumberDouble).intValue();
168 }
169 return pageCount;
170 }
171
172 public boolean hasNextPage() {
173 int lastPageNumber = getPageCount() - 1;
174 boolean result = currentPage.getPageNumber() < lastPageNumber;
175 return result;
176 }
177
178 public boolean hasPreviousPage() {
179 boolean result = currentPage.getPageNumber() > 0;
180 return result;
181 }
182
183
184
185
186 public <T> PaginationResult<T> transform(Function<? super O, ? extends T> function) {
187 List<T> transformedElements = getElements().stream()
188 .map(function)
189 .collect(Collectors.toList());
190 PaginationResult<T> result = PaginationResult.of(transformedElements, getCount(), getCurrentPage());
191 return result;
192 }
193
194 }