Skip to content
Snippets Groups Projects

Add supports for sets to pagination along with lists

Merged Martin Lowe requested to merge malowe/eclipsefdn-api-common:malowe/master/9 into master
1 file
+ 30
21
Compare changes
  • Side-by-side
  • Inline
@@ -2,6 +2,9 @@ package org.eclipsefoundation.core.response;
import java.io.IOException;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;
import javax.annotation.Priority;
import javax.enterprise.inject.Instance;
@@ -60,33 +63,39 @@ public class PaginatedResultsFilter implements ContainerResponseFilter {
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
throws IOException {
if (enablePagination.get()) {
int pageSize = getCurrentLimit(responseContext);
Object entity = responseContext.getEntity();
// only try and paginate if there are multiple entities
if (entity instanceof List) {
List<?> listEntity = (List<?>) entity;
// if available, use max results header value
String rawMaxSize = (String) getResponseHeader(responseContext, MAX_RESULTS_SIZE_HEADER);
int maxSize = listEntity.size();
if (StringUtils.isNumeric(rawMaxSize)) {
maxSize = Integer.valueOf(rawMaxSize);
}
int page = getRequestedPage(maxSize, pageSize);
int lastPage = (int) Math.ceil((double) maxSize / pageSize);
// slice if the results set is larger than page size
if (listEntity.size() > pageSize) {
// set the sliced array as the entity
responseContext.setEntity(
listEntity.subList(getArrayLimitedNumber(listEntity, Math.max(0, page - 1) * pageSize),
getArrayLimitedNumber(listEntity, pageSize * page)));
}
// set the link header to the response
responseContext.getHeaders().add("Link", createLinkHeader(page, lastPage));
if (entity instanceof Set) {
paginateResults(responseContext,
(new TreeSet<>((Set<?>) entity)).stream().collect(Collectors.toList()));
} else if (entity instanceof List) {
paginateResults(responseContext, (List<?>) entity);
}
}
}
private void paginateResults(ContainerResponseContext responseContext, List<?> listEntity) {
int pageSize = getCurrentLimit(responseContext);
// if available, use max results header value
String rawMaxSize = (String) getResponseHeader(responseContext, MAX_RESULTS_SIZE_HEADER);
int maxSize = listEntity.size();
if (StringUtils.isNumeric(rawMaxSize)) {
maxSize = Integer.valueOf(rawMaxSize);
}
int page = getRequestedPage(maxSize, pageSize);
int lastPage = (int) Math.ceil((double) maxSize / pageSize);
// slice if the results set is larger than page size
if (listEntity.size() > pageSize) {
// set the sliced array as the entity
responseContext
.setEntity(listEntity.subList(getArrayLimitedNumber(listEntity, Math.max(0, page - 1) * pageSize),
getArrayLimitedNumber(listEntity, pageSize * page)));
}
// set the link header to the response
responseContext.getHeaders().add("Link", createLinkHeader(page, lastPage));
}
/**
* Gets a header value if available, checking first the servlet response then the mutable response wrapper.
*
Loading