package com.zly.app.common.page;
import java.util.List;
import com.zly.app.common.dto.DTO;
import com.zly.app.common.page.policy.CachePolicy;
@SuppressWarnings({ "hiding", "unchecked" })
public abstract class PageImpl<DTO> implements Page {
/**
* 默认每页条数
*/
private static final int DEFAULT_PAGE_CAPACITY = 20;
/**
* 默认缓存页数
*/
private static final int DEFAULT_CACHE_PAGE_NUM = 10;
/**
* 缓存策略
*/
private CachePolicy policy;
/**
* 总记录数
*/
private long total;
/**
* 最大页码
*/
private int maxPageIndex;
/**
* 当前页码
*/
private int curr;
/**
* 缓存集
*/
private List<DTO> cache;
/**
* 页数
*/
private int pageCapacity;
/**
* 总共缓存页数
*/
private int cachePageNum;
/**
* 缓存启始页
*/
private int cachePageStartIndex;
/**
* 缓存结果页
*/
private int cachePageEndIndex;
/**
* 获取接口对象
*/
public Page getPageInstance() {
return this;
}
/**
* 初始化
*/
public void init() {
if (pageCapacity == 0) {
pageCapacity = DEFAULT_PAGE_CAPACITY;
}
if (cachePageNum == 0) {
cachePageNum = DEFAULT_CACHE_PAGE_NUM;
}
total = getTotal();
maxPageIndex = (int)(Math.round(Math.ceil(total*1.0/pageCapacity))-1);
rebuildCache(0);
curr = -1;
}
/**
* 获取总记录,数据来源数据库.
* @return
*/
public abstract int getTotal();
/**
* 获取区间数据,数据来源数据库<或FILE与XML>
* @param startOffset
* @param endOffset
* @return
*/
public abstract List<DTO> getRecord(int startOffset, int endOffset);
/**
* 获取当前页数据
* @return 当前数据集
*/
public List<DTO> getCurrentPage() {
return getPage(curr);
}
/**
* 获取当前页编号
* @return 当前编号
*/
public int getCurrentPageIndex() {
return curr;
}
/**
* 获取下一页数据集
* @return 下一页数据集
*/
public List<DTO> getNextPage() {
if (curr+1 <= maxPageIndex) {
return getPage(curr+1);
}
return getPage(curr);
}
/**
* 获取上一页数据集
* @return 上一页数据集
*/
public List<DTO> getPerviousPage() {
if (curr-1 >= 0) {
return getPage(curr-1);
}
return getPage(curr);
}
/**
* 是否有下一页
* @return 返回true有下一页,则false没有下一页.
*/
public boolean hasNextPage() {
return curr < maxPageIndex;
}
/**
* 是否有下上页
* @return 返回true有下上页,则false没有下上页.
*/
public boolean hasPerviousPage() {
return curr > 0;
}
@Override
public int moveToPage(int pageIndex) {
if (pageIndex > maxPageIndex) {
curr = maxPageIndex;
} else if (pageIndex < 0) {
curr = 0;
} else {
curr = pageIndex;
}
return curr;
}
/**
* 设置页数
*/
public int getPageCapacity() {
return pageCapacity;
}
public void setPageCapacity(int pageCapacity) {
this.pageCapacity = pageCapacity;
}
/**
* 设置总共缓存页数
*/
public int getCachePageNum() {
return cachePageNum;
}
public void setCachePageNum(int cachePageNum) {
this.cachePageNum = cachePageNum;
}
/**
* 设置缓存策略
*/
public CachePolicy getPolicy() {
return policy;
}
public void setPolicy(CachePolicy policy) {
this.policy = policy;
}
/**
* 设置最大页码
*/
public int getMaxPageIndex() {
return maxPageIndex;
}
public void setMaxPageIndex(int maxPageIndex) {
this.maxPageIndex = maxPageIndex;
}
private List<DTO> getPage(int pageIndex) {
int index = policy.getRebuildIndex(
total,
cachePageStartIndex,
cachePageEndIndex,
cachePageNum,
pageCapacity,
pageIndex);
if (index != -1) {
rebuildCache(index);
}
int tmpStartIndex;
int tmpEndIndex;
tmpStartIndex = (pageIndex-cachePageStartIndex) * pageCapacity;
tmpEndIndex = tmpStartIndex + pageCapacity;
if (tmpEndIndex > cache.size()) {
tmpEndIndex = cache.size();
}
List<DTO> tmpList = cache.subList(
tmpStartIndex,
tmpEndIndex
);
curr = pageIndex;
return tmpList;
}
private void rebuildCache(int pageIndex) {
int tmpStartIndex;
int tmpEndIndex;
tmpStartIndex = pageIndex * pageCapacity;
tmpEndIndex = (pageIndex + cachePageNum) * pageCapacity;
cache = getRecord(tmpStartIndex, tmpEndIndex);
cachePageStartIndex = pageIndex;
cachePageEndIndex = pageIndex + (int)Math.round(Math.ceil(cache.size()*1.0 / pageCapacity))-1;
}
}
评论0
最新资源