package com.mossle.core.page; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Locale; /** * 分页参数与分页结果. * * @author Lingo */ public class Page { // ========================================== // static fields... /** 正序. */ public static final String ASC = "ASC"; /** 倒序. */ public static final String DESC = "DESC"; /** 默认每页显示10条数据. */ public static final int DEFAULT_PAGE_SIZE = 10; // ========================================== // fields... /** 当前第几页,默认值为1,既第一页. */ private int pageNo = 1; /** 每页最大记录数,默认值为10. */ private int pageSize = DEFAULT_PAGE_SIZE; /** 排序字段名. */ private List<String> orderBys = new ArrayList<String>(); /** 使用正序还是倒序. */ private List<String> orders = new ArrayList<String>(); /** 查询结果. */ private Object result; /** 总记录数,默认值为-1,表示totalCount不可用. */ private long totalCount = -1L; /** 是否计算数据库中的记录总数. */ private boolean autoCount; /** 当前页第一条记录的索引,默认值为0,既第一页第一条记录. */ private long start; /** 总页数,默认值为-1,表示pageCount不可用. */ private long pageCount = -1; // ========================================== // constructor... /** 构造方法. */ public Page() { totalCount = 0; result = new ArrayList(); } /** * 构造方法. * * @param result * Object * @param totalCount * int */ public Page(Object result, int totalCount) { this.result = result; this.totalCount = totalCount; } /** * 构造方法. * * @param pageNo * int * @param pageSize * int * @param orderBy * String * @param order * String */ public Page(int pageNo, int pageSize, String orderBy, String order) { this.pageNo = pageNo; this.pageSize = pageSize; this.setOrderBy(orderBy); this.checkAndSetOrder(order); this.calculateStart(); } // ========================================== // 工具方法 /** * 是否为正序排序. * * @return boolean */ public boolean isAsc() { return !DESC.equalsIgnoreCase(this.getOrder()); } /** * 取得倒转的排序方向. * * @return 如果dir=='ASC'就返回'DESC',如果dir='DESC'就返回'ASC' */ public String getInverseOrder() { if (DESC.equalsIgnoreCase(this.getOrder())) { return ASC; } else { return DESC; } } /** * 页面显示最大记录数是否可用. * * @return pageSize > 0 */ public boolean isPageSizeEnabled() { return pageSize > 0; } /** * 页面第一条记录的索引是否可用. * * @return start */ public boolean isStartEnabled() { return start >= 0; } /** * 排序是否可用. * * @return orderBy是否非空 */ public boolean isOrderEnabled() { return ((!orderBys.isEmpty()) && (!orders.isEmpty())); } /** * 是否有前一页. * * @return boolean */ public boolean isPreviousEnabled() { return pageNo > 1; } /** * 是否有后一页. * * @return boolean */ public boolean isNextEnabled() { return pageNo < pageCount; } /** * 总页数是否可用. * * @return boolean */ public boolean isPageCountEnabled() { return pageCount >= 0; } /** 计算本页第一条记录的索引. */ private void calculateStart() { if ((pageNo < 1) || (pageSize < 1)) { start = -1; } else { start = (pageNo - 1) * pageSize; } } /** 计算最大页数. */ private void calculatePageCount() { if ((totalCount < 0) || (pageSize < 1)) { pageCount = -1; } else { pageCount = ((totalCount - 1) / pageSize) + 1; } } // ========================================== // getter and setter method... /** @return pageNo. */ public int getPageNo() { return pageNo; } /** * @param pageNo * int. */ public void setPageNo(int pageNo) { this.pageNo = pageNo; this.calculateStart(); } /** @return pageSize. */ public int getPageSize() { return pageSize; } /** * @param pageSize * int. */ public void setPageSize(int pageSize) { this.pageSize = pageSize; this.calculateStart(); this.calculatePageCount(); } /** @return orderBy. */ public String getOrderBy() { if (!this.orderBys.isEmpty()) { return this.orderBys.get(0); } return null; } /** * @param orderBy * String. */ public void setOrderBy(String orderBy) { if ((orderBy == null) || (orderBy.trim().length() == 0)) { throw new IllegalArgumentException("orderBy should be blank"); } this.orderBys.clear(); this.orderBys.add(orderBy); if (this.getOrders().size() != 1) { this.setOrder(ASC); } } /** @return order. */ public String getOrder() { if (!this.orders.isEmpty()) { return this.orders.get(0); } return ASC; } /** * @param order * String. */ public void setOrder(String order) { this.checkAndSetOrder(order); } /** @return result. */ public Object getResult() { return result; } /** * @param result * Object. */ public void setResult(Object result) { this.result = result; } /** @return totalCount. */ public long getTotalCount() { return totalCount; } /** * @param totalCount * int. */ public void setTotalCount(long totalCount) { this.totalCount = totalCount; this.calculatePageCount(); } /** @return autoCount. */ public boolean isAutoCount() { return autoCount; } /** * @param autoCount * boolean. */ public void setAutoCount(boolean autoCount) { this.autoCount = autoCount; } /** @return start. */ public long getStart() { return start; } /** @return pageCount. */ public long getPageCount() { return pageCount; } /** @return result size. */ public int getResultSize() { if (result instanceof Collection) { return ((Collection) result).size(); } else { return 0; } } /** * chck and set order. * * @param text * String */ private void checkAndSetOrder(String text) { if (ASC.equalsIgnoreCase(text) || DESC.equalsIgnoreCase(text)) { text = text.toUpperCase(Locale.CHINA); this.orders.clear(); this.orders.add(text); } else { throw new IllegalArgumentException( "order should be 'DESC' or 'ASC'"); } } public void setDefaultOrder(String orderBy, String order) { if (!this.isOrderEnabled()) { this.setOrderBy(orderBy); this.setOrder(order); } } public void addOrder(String orderBy, String order) { if (this.orderBys.size() != this.orders.size()) { this.orderBys.clear(); this.orders.clear(); } this.orderBys.add(orderBy); if (ASC.equalsIgnoreCase(order) || DESC.equalsIgnoreCase(order)) { order = order.toUpperCase(Locale.CHINA); this.orders.add(order); } else { throw new IllegalArgumentException( "order should be 'DESC' or 'ASC'"); } } public List<String> getOrderBys() { return this.orderBys; } public void setOrderBys(List<String> orderBys) { this.orderBys = orderBys; } public List<String> getOrders() { return this.orders; } public void setOrders(List<String> orders) { this.orders = orders; } }