package com.googlecode.tawus;
import java.util.ArrayList;
import java.util.List;
import org.apache.tapestry5.grid.GridDataSource;
import org.apache.tapestry5.grid.SortConstraint;
import com.googlecode.tawus.services.EntityDAO;
/**
* GridDataSource for entity. It delegates the functionality to corresponding
* GenericDAO. In order to configure the search results,
* {@link com.googlecode.tawus.SearchCriteria} is to be configured
*
* @param <E>
*/
public class EntityGridDataSource<E> implements GridDataSource
{
private EntityDAO<E> entityDAO;
private SearchCriteria<E> criteria;
private List<E> storage;
private int startIndex;
/**
* Constructor
*
* @param entityDAO
* GenericDAO for type T
* @param criteria
* search criteria to be used for filtering search results
*/
public EntityGridDataSource(EntityDAO<E> entityDAO, SearchCriteria<E> criteria)
{
this.entityDAO = entityDAO;
this.criteria = criteria;
}
/**
* Get avaliable rows
*
* @return available rows
*/
public int getAvailableRows()
{
if(!criteria.getEnabled())
{
return 0;
}
int count = entityDAO.count(criteria);
return count;
}
/**
* Get entity type
*
* @return entity type
*/
public Class<E> getRowType()
{
return criteria.getType();
}
/**
* Prepare the results
*
* @param startIndex
* starting index of search results
* @param endIndex
* last index of search results
* @param sortConstraints
* list of sort constraints to be applied
*/
public void prepare(int startIndex, int endIndex, final List<SortConstraint> sortConstraints)
{
if(!criteria.getEnabled())
{
storage = new ArrayList<E>();
return;
}
// Set the select range
criteria.setFirstResult(startIndex);
criteria.setMaxResults(endIndex - startIndex + 1);
// Add constraints
for(final SortConstraint constraint : sortConstraints)
{
Boolean sort = null;
switch(constraint.getColumnSort())
{
case ASCENDING:
sort = true;
break;
case DESCENDING:
sort = false;
break;
}
criteria.getOrder().clear();
criteria.addOrder(constraint.getPropertyModel().getPropertyName(), sort);
}
// Fetch the results
storage = entityDAO.list(criteria);
// Save start index
this.startIndex = startIndex;
}
/**
* Get row value at a particular index
*
* @param index
* index of entity to be retrieved.
*/
public Object getRowValue(int index)
{
return storage.get(index - startIndex);
}
}