Page.java

package com.tradecloud.domain.helper;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.ArrayList;
import java.util.List;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Page")
public class Page<T> {

    @XmlElement(name = "Result")
    private List<T> results = new ArrayList<T>();

    @XmlElement(name = "PageSize")
    private int pageSize = 0;

    @XmlElement(name = "PageNumber")
    private int pageNumber = 0;

    @XmlElement(name = "LastPageNumber")
    private int lastPageNumber = 0;

    @XmlElement(name = "TotalPages")
    private int totalPages = 0;

    public Page() {

    }

    /**
     * The List is meant to be the page of a larger set. So results.size ==
     * pageSize.
     */
    public Page(List<T> results, int pageNumber, int pageSize, int totalPages) {
        this.results = results;
        this.pageNumber = pageNumber;
        this.pageSize = pageSize;

    }

    /**
     * @deprecated This Constructor is a Does bad Paging its more like a
     * Splitter than a page. Useful where you want to page a list!.
     * Rather use @link #Page(Criteria query, int pageNumber, int
     * pageSize)
     * <p>
     * This call is a bit bad because the list is kept in tact, and
     * totalPages is calced from it's size .. list of size 25,
     * pageSize 10, will give totalPages 3
     */
    @Deprecated
    public Page(List<T> results, int pageNumber, int pageSize) {
        this.results = results;
        this.pageNumber = pageNumber;
        this.pageSize = pageSize;
        lastPageNumber = new Double(Math.floor(results.size() / this.pageSize)).intValue();
        totalPages = new Double(Math.ceil(new Double(results.size()) / new Double(this.pageSize))).intValue();

        if (pageNumber == -1 || pageNumber > lastPageNumber) {
            this.pageNumber = lastPageNumber;
        }

        if (results.size() > 0) {
            int startIndex = this.pageNumber * this.pageSize;
            int endIndex = (startIndex + pageSize);
            endIndex = endIndex > results.size() ? results.size() : endIndex;
            this.results = results.subList(startIndex, endIndex);
        }
    }

    public boolean isNextPage() {
        return results.size() > pageSize;
    }

    public boolean isPreviousPage() {
        return pageNumber > 0;
    }

    public List<T> getList() {
        return isNextPage() ? results.subList(0, pageSize) : results;
    }

    public int getPageNumber() {
        return pageNumber;
    }

    public int getLastPageNumber() {
        return lastPageNumber;
    }

    public int getTotalPages() {
        return totalPages;
    }

    public int getPageSize() {
        return pageSize;
    }

}