package org.constellation.database.api.domain; import java.io.Serializable; import java.util.*; import static org.apache.sis.util.ArgumentChecks.ensureBetween; /** * @author Fabien Bernard (Geomatys). */ public class PageRequest implements Pageable, Serializable { private static final long serialVersionUID = 267788788516611715L; // ------------------------------------------------------------------------- // Properties // ------------------------------------------------------------------------- private final int page; private final int size; private final Set<Order> orders; // ------------------------------------------------------------------------- // Constructors // ------------------------------------------------------------------------- public PageRequest(int page, int size) { ensureBetween("page", 1, Integer.MAX_VALUE, page); ensureBetween("size", 1, Integer.MAX_VALUE, size); this.page = page; this.size = size; this.orders = new HashSet<>(); } // ------------------------------------------------------------------------- // Public methods // ------------------------------------------------------------------------- public Pageable sort(Order.Direction direction, String... properties) { if (properties != null && properties.length > 0) { for (String property : properties) { sort(new Order(direction, property)); } } return this; } public Pageable sort(Order... orders) { return sort(orders == null ? new ArrayList<Order>() : Arrays.asList(orders)); } public Pageable sort(Collection<Order> orders) { if (orders != null && !orders.isEmpty()) { this.orders.addAll(orders); } return this; } public Pageable asc(String... properties) { return sort(Order.Direction.ASC, properties); } public Pageable desc(String... properties) { return sort(Order.Direction.DESC, properties); } // ------------------------------------------------------------------------- // Pageable implementation // ------------------------------------------------------------------------- @Override public int getPageNumber() { return page; } @Override public int getPageSize() { return size; } @Override public int getOffset() { return (page - 1) * size; } @Override public Pageable next() { return new PageRequest(page + 1, size).sort(orders); } @Override public Pageable previousOrFirst() { return hasPrevious() ? new PageRequest(page - 1, size).sort(orders) : this; } @Override public Pageable first() { return new PageRequest(1, size).sort(orders); } @Override public boolean hasPrevious() { return page > 1; } // ------------------------------------------------------------------------- // Sortable implementation // ------------------------------------------------------------------------- @Override public Set<Order> getSortOrders() { return orders; } }