public Object getRowData() {
if (this.currentRowIndex < 0) {
throw new IllegalArgumentException("Invalid rowIndex for PagedListDataModel; not within page");
}
PageControl pageControl = getPageControl();
int startRow = pageControl.getStartRow();
int endRow;
if (pageControl.getPageSize() == PageControl.SIZE_UNLIMITED) {
endRow = Integer.MAX_VALUE;
} else {
int nRows = pageControl.getPageSize();
endRow = startRow + nRows - 1;
}
if (log.isTraceEnabled()) {
log.trace("getRowData(" + currentRowIndex + "): startRow=" + startRow + ", endRow=" + endRow);
}
// paging backwards - will we ever get in this if-statement if pageControl.getPageSize == SIZE_UNLIMITED?
if (currentRowIndex < startRow) {
int rowsBack = startRow - currentRowIndex;
int pagesBack = (int) Math.ceil(rowsBack / (double) pageControl.getPageSize());
int newPage = pageControl.getPageNumber() - pagesBack;
if (log.isTraceEnabled()) {
log.trace("paging down by " + rowsBack + " rows / " + pagesBack + " pages, new page is " + newPage);
}
if (newPage < 0) {
newPage = 0;
log.trace("newPage was negative, setting page to 0");
}
pageControl.setPageNumber(newPage);
pageList = getDataPage(pageControl);
startRow = pageControl.getStartRow();
}
// paging forwards
else if (currentRowIndex > endRow) {
int rowsForward = currentRowIndex - endRow;
int pagesForward = (int) Math.ceil(rowsForward / (double) pageControl.getPageSize());
int newPage = pageControl.getPageNumber() + pagesForward;
if (log.isTraceEnabled()) {
log.trace("paging up by " + rowsForward + " rows / " + pagesForward + " pages, new page is " + newPage);
}
pageControl.setPageNumber(newPage);
pageList = getDataPage(pageControl);
startRow = pageControl.getStartRow();
}
/*
* March 11, 2009 - the only currently known way this can fail is if the countQuery returned 0 but the
* actual data query returned nothing; generally, this is a programming error, but it's possible that