001 package org.trails.component;
002
003 import org.apache.commons.lang.SerializationUtils;
004 import org.apache.hivemind.util.Defense;
005 import org.apache.tapestry.contrib.table.model.IBasicTableModel;
006 import org.apache.tapestry.contrib.table.model.ITableColumn;
007 import org.hibernate.criterion.DetachedCriteria;
008 import org.hibernate.criterion.Order;
009 import org.trails.persistence.HibernatePersistenceService;
010
011 import java.util.Iterator;
012
013 public class HibernateTableModel implements IBasicTableModel
014 {
015
016 private HibernatePersistenceService persistenceService;
017
018 private Class entityType;
019 private DetachedCriteria criteria;
020
021 public HibernateTableModel(Class entityType, HibernatePersistenceService persistenceService, DetachedCriteria criteria)
022 {
023 super();
024 this.entityType = entityType;
025 this.persistenceService = persistenceService;
026 this.criteria = criteria;
027 }
028
029 public void setPersistenceService(HibernatePersistenceService persistenceService)
030 {
031 this.persistenceService = persistenceService;
032 }
033
034 public void setCriteria(DetachedCriteria criteria)
035 {
036 this.criteria = criteria;
037 }
038
039 public void setEntityType(Class entityType)
040 {
041 this.entityType = entityType;
042 }
043
044 public Iterator getCurrentPageRows(int startIndex, int maxResults, ITableColumn column, boolean asc)
045 {
046 DetachedCriteria clonedCriteria = (DetachedCriteria) SerializationUtils.clone(criteria);
047 if (column != null && column instanceof TrailsTableColumn)
048 {
049 TrailsTableColumn trailsTableColumn = (TrailsTableColumn) column;
050 String sortProperty = trailsTableColumn.getPropertyDescriptor().getName();
051 clonedCriteria.addOrder(asc ? Order.asc(sortProperty) : Order.desc(sortProperty));
052 }
053 return persistenceService.getInstances(entityType, clonedCriteria, startIndex, maxResults).iterator();
054 }
055
056 public int getRowCount()
057 {
058 // doing a count alters the criteria
059 DetachedCriteria clonedCriteria = (DetachedCriteria) SerializationUtils.clone(criteria);
060 return persistenceService.count(entityType, clonedCriteria);
061 }
062 }