All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jdal.dao.Page Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2002-2010 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.jdal.dao;



import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 *  A Page of Objects as result of query on PaginableDataSource
 *  Holds results for a page and info of Page definition page size and order.
 *  
 *  @author Jose Luis Martin - ([email protected])
 */
@SuppressWarnings("unchecked")
public class Page implements Paginator, Cloneable, Serializable {

	private static final Log log = LogFactory.getLog(Page.class);
	public static enum Order { ASC, DESC };
	/** List of results */
	private List data = new ArrayList();
	/** Result count, Not the page size, the count of all result if not paginated */
	private int count;
	/** the page size */
	private int pageSize;
	/** sort by this property name */
	private String sortName;
	/** sort order */
	private Order order;
	/** a Object used as filter */
	private Object filter;
	/** page number  */
	private int page = 1;
	/** PageableDataSource that loads the page */
	private transient PageableDataSource pageableDataSource;
	/** Paginator Listeners */
	private ArrayList listeners = new ArrayList();

	public Page(int pageSize, int page, String sortName, Order order) {
	
		this.pageSize = pageSize;
		if (page > 0) 
			this.page = page;
		this.sortName = sortName;
		this.order = order;
	}
	
	public Page(int pageSize, int page, String sortName) {
		this(pageSize, page, sortName, Order.ASC);
		
	}
	
	public Page(int pageSize, int page) {
		this(pageSize, page, null);
	}
	
	public Page(int pageSize) {
		this (pageSize, 1);
	}
	
	public Page() {
		this (10);
	}
	
	/**
	 * @return list of data objects
	 */
	public List getData() {
		return data;
	}
	
	/**
	 * @return the count
	 */
	public int getCount() {
		return count;
	}

	/**
	 * @param count the count to set
	 */
	public void setCount(int count) {
		this.count = count;
	}


	/**
	 * @return the sortName
	 */
	public String getSortName() {
		return sortName;
	}

	/**
	 * @param sortName the sortName to set
	 */
	public void setSortName(String sortName) {
		this.sortName = sortName;
	}

	/**
	 * @return the order
	 */
	public Order getOrder() {
		return order;
	}

	/**
	 * @param order the order to set
	 */
	public void setOrder(Order order) {
		this.order = order;
	}

	/**
	 * @param data the data to set
	 */
	public void setData(List data) {
		this.data = data;
	}
	
	public void setOrderAsc() {
		setOrder(Order.ASC);
	}
	
	public void setOrderDesc() {
		setOrder(Order.DESC);
	}

	/**
	 * @return the filter
	 */
	public Object getFilter() {
		return filter;
	}

	/**
	 * @param filter the filter to set
	 */
	public void setFilter(Object filter) {
		this.filter = filter;
	}

	
	public Page clone() {
		try {
			return (Page) super.clone();
		} catch (CloneNotSupportedException e) {
			log.error(e);
			return null;
		}
	}

	/**
	 * @return the pageableDataSource
	 */
	public PageableDataSource getPageableDataSource() {
		return pageableDataSource;
	}

	/**
	 * {@inheritDoc}
	 * @see org.jdal.dao.Paginator#hasNext()
	 */
	public boolean hasNext() {
		return page < getTotalPages();
	}

	/**
	 * {@inheritDoc}
	 * @see org.jdal.dao.Paginator#hasPage(int)
	 */
	public boolean hasPage(int indexPage) {
		return indexPage <= getTotalPages() &&  indexPage > 0;
	}

	/**
	 * {@inheritDoc}
	 */
	public boolean hasPrevious() {
		return page > 1;
	}

	/**
	 *  {@inheritDoc}
	 * @see org.jdal.dao.Paginator#setPage(int)
	 */
	public void setPage(int indexPage) {
		if (indexPage > 0)  {
			page = indexPage;
			load();
			firePageChangedEvent();
		}
		else {
			log.warn("Try to set a page < 1");
		}
	}

	/**
	 * {@inheritDoc}
	 */
	public int getStartIndex() {
		return (page - 1) * pageSize;
	}

	/**
	 * {@inheritDoc}
	 * @see org.jdal.dao.Paginator#getTotalPages()
	 */
	public int getTotalPages() {
		if (pageSize > 0)
			return (int) Math.ceil(count/pageSize) + (count % pageSize == 0 ? 0 : 1);
		
		return 1;
	}
	
	/**
	 * {@inheritDoc}
	 */
	public void addPaginatorListener(PaginatorListener listener) {
		if (!listeners.contains(listener))
			listeners.add(listener);
	}

	/**
	 * {@inheritDoc}
	 */
	public void removePaginatorListener(PaginatorListener listener) {
		listeners.remove(listener);
	}
	
	/**
	 * @return the pageSize
	 */
	public int getPageSize() {
		return pageSize;
	}

	/**
	 * @param pageSize the pageSize to set
	 */
	public void setPageSize(int pageSize) {
		if (pageSize > 0) {
			// need to recalculate current page
			page = (int) Math.ceil(getStartIndex()/pageSize) + 1;
			this.pageSize = pageSize;
			load();
			firePageChangedEvent();
		}
	}

	/**
	 * @return the page
	 */
	public int getPage() {
		return page;
	}

	/**
	 * {@inheritDoc}
	 * @see org.jdal.dao.Paginator#firstPage()
	 */
	public void firstPage() {
		setPage(1);
		
	}

	/**
	 * {@inheritDoc}
	 * @see org.jdal.dao.Paginator#lastPage()
	 */
	public void lastPage() {
		setPage(getTotalPages());
	}

	/**
	 * {@inheritDoc}
	 * @see org.jdal.dao.Paginator#nextPage()
	 */
	public void nextPage() {
			setPage(page + 1);
		
	}

	/**
	 * {@inheritDoc}
	 * @see org.jdal.dao.Paginator#previousPage()
	 */
	public void previousPage() {
			setPage(page - 1);
	}
	
	/**
	 * Notify Listener that current page changed
	 */
	private void firePageChangedEvent() {
		for (PaginatorListener listener : listeners) {
			listener.pageChanged(new PageChangedEvent(this, page, getStartIndex(), getTotalPages(), pageSize));
		}
	}

	
	public void load() {
		if (pageableDataSource != null) {
			Page newPage = pageableDataSource.getPage(this);
			this.data = newPage.data;
		}
	}

	/**
	 * @param pageableDataSource the pageableDataSource to set
	 */
	public void setPageableDataSource(PageableDataSource pageableDataSource) {
		this.pageableDataSource = pageableDataSource;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy