package net.dev123.commons;
import java.util.HashMap;
import java.util.Map;
/**
* <tt>Paging</tt> 分页工具类<br />
* <p>
* <strong>使用说明:</strong><br />
* <tt>Paging</tt>类,用于封装微博接口分页相关参数;Since和Max值分全局和单页两种,
* 单页的Since和Max参数值优先级高于全局Since和Max值, 即如果对某页设置了页Since或者Max,
* 那么设置的全局Since或者Max就会失效;在当前页数据获取完成后,可通过方法 {@link #setNextPageMax(Object)}、
* {@link #setNextPageMax(Object)}、 {@link #setNextPageCursor(long)}、
* {@link #setNextPageCursor(String)} 设置下一页所需的Since、Max和Cursor值。
* </p>
* <p>
* 如果需要设置自定义分页参数,可使用 {@link #setAttribution(String, Object)}方法。
* </p>
* <p>
* <strong>分页控制参数Since、Max约定组合如下:</strong><br />
* <table border="1" borderColor="#000000" cellSpacing="0" cellPadding="1">
* <tr>
* <th>组合方式</th>
* <th>功能说明</th>
* </tr>
* <tr>
* <td><code>Since = null, Max = null</code></td>
* <td>获取接口中最新N条数据,N的数量由<code>PageSize</code>参数确定</td>
* </tr>
* <tr>
* <td><code>Since != null, Max = null</code></td>
* <td>获取接口中自<code>Since</code>之后的N条数据(不包含<code>Since</code>),N的数量由<code>PageSize</code>参数确定</td>
* </tr>
* <tr>
* <td><code>Since = null, Max != null</code></td>
* <td>获取接口中<code>Max</code>之前的N条数据(不包含<code>Max</code>),N的数量由<code>PageSize</code>参数确定</td>
* </tr>
* <tr>
* <td><code>Since != null, Max != null</code></td>
* <td>获取接口中<code>Since</code>之后,<code>Max</code>之前的N条数据(不包含<code>Since, Max</code>),N的数量由<code>PageSize</code>参数确定</td>
* </tr>
* </table>
* </p>
*
* @version 1.0
* @author 马庆升
* @time 2010-9-26 下午04:59:03
*/
public class Paging<T> implements java.io.Serializable {
private static final long serialVersionUID = -3285857427993796670L;
/** 页Since值Key前缀 */
private static final String PAGE_SINCE_PREFIX = "SINCE_";
/** 页Max值Key前缀 */
private static final String PAGE_MAX_PREFIX = "MAX_";
/** 页Cursor值Key前缀 */
private static final String PAGE_CURSOR_PREFIX = "CURSOR_";
/** 游标分页初始游标值 */
public static final long CURSOR_START = -1;
/** 游标分页结束游标值 */
public static final long CURSOR_END = 0;
/** 默认每页记录条数 */
public static final int DEFAULT_PAGE_SIZE = 20;
/** 最大每页记录条数 */
public static final int MAX_PAGE_SIZE = 200;
/** 当前页码 */
private int pageIndex; // 页索引
/** 页内所含记录条数 */
private int pageSize; // 页大小
/** 当前分页的全局Since,优先级低于单页的Since */
private T globalSince;
/** 当前分页的全局Max,优先级低于单页的Max */
private T globalMax;
/** 存储分页数据的Map */
private Map<String, Object> pageSession = new HashMap<String, Object>();
/** 是否是游标分页 */
private boolean isCursorPaging;
/** 是否是最后一页 */
private boolean isLastPage;
/**
* 无参构造函数,初始化后当前页为第0页
*/
public Paging() {
this.pageIndex = 0;
this.isLastPage = false;
this.globalSince = null;
this.globalMax = null;
}
/**
* 使用全局Since和Max的构造函数,初始化后当前页为第0页
*
* @param globalSince
* 全局Since
* @param globalMax
* 全局Max
*/
public Paging(T globalSince, T globalMax) {
this.pageIndex = 0;
this.isLastPage = false;
this.globalSince = globalSince;
this.globalMax = globalMax;
}
public void setGlobalSince(T globalSince) {
this.globalSince = globalSince;
pageSession.clear();
}
public void setGlobalMax(T globalMax) {
this.globalMax = globalMax;
pageSession.clear();
}
/**
* @return 当前分页是否是Cursor分页
*/
public boolean isCursorPaging() {
return isCursorPaging;
}
public boolean isPagePaging() {
return !isCursorPaging;
}
/**
* @param isLastPage
* 是否最后一页
*/
public void setLastPage(boolean isLastPage) {
this.isLastPage = isLastPage;
}
/**
* @param cursor
* 设置下一页Cursor值,仅在Cursor分页时有效
*/
protected void setNextPageCursor(String cursor) {
if (!isCursorPaging) {
return;
}
pageSession.put(PAGE_CURSOR_PREFIX + getNextPageIndex(), cursor);
}
/**
* @param cursor
* 设置下一页Cursor值,仅在Cursor分页时有效
*/
protected void setNextPageCursor(long cursor) {
if (!isCursorPaging) {
return;
}
pageSession.put(PAGE_CURSOR_PREFIX + getNextPageIndex(), String.valueOf(cursor));
}
/**
* @param entity
* 设置下一页的Since值,页Since值优先级高于全局Since值
*/
protected void setNextPageSince(T since) {
pageSession.put(PAGE_SINCE_PREFIX + getNextPageIndex(), since);
}
/**
* @param entity
* 设置下一页Max值,页Max值优先级高于全局Max值
*/
protected void setNextPageMax(T max) {
pageSession.put(PAGE_MAX_PREFIX + getNextPageIndex(), max);
}
/**
* @return 获取当前页的Max值,若当前页有设置页Max值,则优先返回
*/
@SuppressWarnings("unchecked")
public T getMax() {
if (pageSession.get(PAGE_MAX_PREFIX + getPageIndex()) != null) {
return (T) pageSession.get(PAGE_MAX_PREFIX + getPageIndex());
}
return this.globalMax;
}
/**
* @return 获取当前页的Since值,若当前页有设置页Since值,则优先返回
*/
@SuppressWarnings("unchecked")
public T getSince() {
if (pageSession.get(PAGE_SINCE_PREFIX + getPageIndex()) != null) {
return (T) pageSession.get(PAGE_SINCE_PREFIX + getPageIndex());
}
return this.globalSince;
}
/**
* @return 获取当前页Cursor值
*/
public String getCursor() {
if (pageSession.get(PAGE_CURSOR_PREFIX + getPageIndex()) != null) {
return String.valueOf(pageSession.get(PAGE_CURSOR_PREFIX + getPageIndex()));
}
return null;
}
protected int getNextPageIndex() {
return pageIndex + 1;
}
public int getPageIndex() {
return pageIndex;
}
public void setPageIndex(int pageIndex) {
this.pageIndex = pageIndex;
}
public int getPageSize() {
if (pageSize > 0) {
return pageSize;
}
return DEFAULT_PAGE_SIZE;
}
/**
* 设置页内条目数量,调用此方法将重置当前页为第0页
*
* @param pageSize
* 每页记录条数
*/
public void setPageSize(int pageSize) {
if (pageSize <= 0) {
pageSize = DEFAULT_PAGE_SIZE;
} else if (pageSize > MAX_PAGE_SIZE) {
pageSize = MAX_PAGE_SIZE;
}
this.pageSize = pageSize;
this.reset();
}
public boolean isLastPage() {
return isLastPage;
}
public boolean hasNext() {
return !isLastPage;
}
public boolean hasPrevious() {
return pageIndex > 1;
}
/**
* 初始化Cursor分页相关属性,初始化之后,当前为第0页
*/
protected void initCursorPaging() {
this.reset();
this.isCursorPaging = true;
this.setNextPageCursor(CURSOR_START);
}
protected void initPagePaging() {
this.reset();
}
public void reset() {
this.pageIndex = 0;
this.isCursorPaging = false;
this.isLastPage = false;
this.pageSession.clear();
}
/**
* 移动到下一页
*/
public boolean moveToNext() {
if (hasNext()) {
pageIndex++;
return true;
}
return false;
}
/**
* 移动到前一页
*/
public boolean moveToPrevious() {
if (hasPrevious()) {
pageIndex--;
} else {
pageIndex = 0;
isLastPage = false;
}
return true;
}
/**
* 移动到第一页
*/
public boolean moveToFirst() {
this.pageIndex = 1;
return true;
}
/**
* 设置自定义的分页属性值
*
* @param key
* 属性Key
* @param value
* 属性Value
*/
public void setAttribute(String key, Object value) {
pageSession.put(key, value);
}
/**
* 获取所设置的自定义分页属性值
*
* @param key
* @return
*/
public Object getAttribute(String key) {
return pageSession.get(key);
}
}