package org.xcolab.service.utils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import java.util.ArrayList; import java.util.List; public class PaginationHelper { private static final int DEFAULT_PAGE_SIZE = 20; public static final PaginationHelper EVERYTHING = new PaginationHelper(0, Integer.MAX_VALUE, ""); private final int startRecord; private final int limitRecord; private final List<SortColumn> sortColumns = new ArrayList<>(); public PaginationHelper(Integer startRecord, Integer limitRecord, String sort) { this.startRecord = startRecord != null ? startRecord : 0; this.limitRecord = limitRecord != null ? limitRecord : this.startRecord + DEFAULT_PAGE_SIZE; Validate.isTrue(this.startRecord >= 0, "startRecord is %d, must be zero or positive", this.startRecord); Validate.isTrue(this.limitRecord > 0, "limitRecord is %d, must be positive", this.limitRecord); Validate.isTrue(this.limitRecord > this.startRecord, "limitRecord (%d) has to be greater than startRecord (%d)", this.limitRecord, this.startRecord); if (StringUtils.isNotBlank(sort)) { for (String sortString : sort.split(",")) { sortColumns.add(new SortColumn(sortString)); } } } public int getStartRecord() { return startRecord; } public int getLimitRecord() { return limitRecord; } public int getCount() { final int difference = limitRecord - startRecord; if (difference < Integer.MAX_VALUE) { return difference + 1; } else { return Integer.MAX_VALUE; } } public List<SortColumn> getSortColumns() { return sortColumns; } public boolean containsSortColumn(String columnName) { for (SortColumn sortColumn : sortColumns) { if (sortColumn.getColumnName().equalsIgnoreCase(columnName)) { return true; } } return false; } public static class SortColumn { private final boolean isAscending; private final String columnName; public SortColumn(String sortString) { if (sortString.startsWith("-")) { isAscending = false; columnName = sortString.substring(1); } else { isAscending = true; columnName = sortString; } } public boolean isAscending() { return isAscending; } public String getColumnName() { return columnName; } } }