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    }