package org.jblooming.page;
import org.apache.log4j.Logger;
import org.jblooming.tracer.Tracer;
import java.util.List;
/**
* @author Pietro Polsinelli ppolsinelli@open-lab.com
*/
public class ListPage implements Page {
private List elements;
private int pageSize;
private int pageNumber;
/**
* Construct a new ListPage. ListPage numbers are zero-based, so the
* first page is page 0.
*
* @param pageNumber the page number (zero-based);
* if Integer.MAX_VALUE will return the last page for the query
* @param pageSize the number of results to display on the page
*/
public ListPage(List elements, int pageNumber, int pageSize) {
this.elements = elements;
this.pageSize = pageSize;
this.pageNumber = pageNumber;
if (Integer.MAX_VALUE == this.pageNumber)
this.pageNumber = ((getTotalNumberOfElements()-1) / this.pageSize);
else if (this.pageNumber > ( (getTotalNumberOfElements()-1) / this.pageSize))
this.pageNumber = (elements.size()-1) / this.pageSize;
}
public boolean isFirstPage() {
return getPageNumber() == 0;
}
public boolean isLastPage() {
return getPageNumber() >= getLastPageNumber();
}
public boolean hasNextPage() {
return !isLastPage();
}
public boolean hasPreviousPage() {
return getPageNumber() > 0;
}
public int getLastPageNumber() {
/*
* We use the Math.floor() method because page numbers are zero-based
* (i.e. the first page is page 0).
*/
double totalResults = new Integer( (getTotalNumberOfElements()-1)).doubleValue();
return new Double(Math.floor(totalResults / getPageSize())).intValue();
}
public List getThisPageElements() {
/*
* Since we retrieved one more than the specified pageSize when the
* class was constructed, we now trim it down to the pageSize if a next
* page exists.
*/
final int start = getPageNumber() * getPageSize();
if(start != -1)
return elements.subList(Math.min(start, getTotalNumberOfElements()),
Math.min(start + getPageSize(), getTotalNumberOfElements()));
return elements;
}
public Logger getLogger() {
return Tracer.hibernateLogger;
}
/**
* this is 0-based, differently from list.size();
*/
public int getTotalNumberOfElements() {
return elements.size();
}
public int getThisPageFirstElementNumber() {
return getPageNumber() * getPageSize() + 1;
}
public int getThisPageLastElementNumber() {
int fullPage = getThisPageFirstElementNumber() + getPageSize() - 1;
return (getTotalNumberOfElements()-1) < fullPage ?
(getTotalNumberOfElements()-1) :
fullPage;
}
public int getNextPageNumber() {
return getPageNumber() + 1;
}
public int getPreviousPageNumber() {
return getPageNumber() - 1;
}
public int getPageSize() {
return pageSize;
}
public int getPageNumber() {
return pageNumber;
}
public List getAllElements() {
return elements;
}
}