- 
        1. Methods walk, totalRow in rich:dataTable executed several times after one actionboy18nj Mar 3, 2011 5:25 PM (in response to v_panasyuk)make your rich:dataTable component as Factory component if you are using Seam. 
- 
        2. Methods walk, totalRow in rich:dataTable executed several times after one actionilya40umov Mar 4, 2011 5:18 AM (in response to boy18nj)Method walk is executed several times during one request. It's ok. It's a part of JSF implementation. You can write your own implementation of ExtendedDataModel in order to limit count of select queries during one request(I've done it in my app because I didn't want it to perform unnecessary queries). 
- 
        3. Re: Methods walk, totalRow in rich:dataTable executed several times after one actionv_panasyuk Mar 4, 2011 12:08 PM (in response to ilya40umov)Why RichFaces team don't create this implementation. Please post your implementation, or ssend to v_panasyuk@i.ua. It save my time. Thanks 
- 
        4. Re: Methods walk, totalRow in rich:dataTable executed several times after one actionilya40umov Mar 4, 2011 12:12 PM (in response to v_panasyuk)Here you are(You can also find an interesting discussion here http://community.jboss.org/message/577751?tstart=0): package ccgproj.web.faces.lazy; import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import javax.el.ELException; import javax.el.Expression; import javax.el.ValueExpression; import javax.faces.FacesException; import javax.faces.context.FacesContext; import javax.swing.SortOrder; import org.ajax4jsf.model.DataVisitor; import org.ajax4jsf.model.ExtendedDataModel; import org.ajax4jsf.model.Range; import org.ajax4jsf.model.SequenceRange; import org.hibernate.criterion.Order; import org.richfaces.model.FilterField; import org.richfaces.model.Modifiable; import org.richfaces.model.Ordering; import org.richfaces.model.SortField2; /** * @author sorokoumov */ public abstract class ModifiableDataModel<T> extends ExtendedDataModel implements Modifiable, Serializable { private final String dataModelID = UUID.randomUUID().toString(); private T dataItem; private SequenceRange cachedRange; private List<T> cachedItems; private List<SortField2> sortFields; private Map<String, SortOrder> sortOrders = new HashMap<String, SortOrder>(); private Integer rowCount; public Map<String, SortOrder> getSortOrders() { return sortOrders; } public void setSortOrders(Map<String, SortOrder> sortOrders) { this.sortOrders = sortOrders; } public ModifiableDataModel() { super(); } private static boolean areEqualRanges(SequenceRange range1, SequenceRange range2) { if (range1 == null || range2 == null) { return range1 == null && range2 == null; } else { return range1.getFirstRow() == range2.getFirstRow() && range1.getRows() == range2.getRows(); } } protected List<Order> getOrder(FacesContext context) { List<Order> orders = new ArrayList<Order>(); if (sortFields != null) { for (SortField2 sortField : sortFields) { Ordering ordering = sortField.getOrdering(); if (Ordering.ASCENDING.equals(ordering) || Ordering.DESCENDING.equals(ordering)) { String propertyName = getPropertyName(context, sortField.getExpression()); Order order = Ordering.ASCENDING.equals(ordering) ? Order.asc(propertyName) : Order.desc(propertyName); orders.add(order); } } } return orders; } private String getPropertyName(FacesContext facesContext, Expression expression) { try { return (String) ((ValueExpression) expression).getValue(facesContext.getELContext()); } catch (ELException e) { throw new FacesException(e.getMessage(), e); } } @Override public Object getRowKey() { return dataItem; } @Override public void setRowKey(Object key) { this.dataItem = (T)key; } @SuppressWarnings("unchecked") @Override public void walk(FacesContext facesContext, DataVisitor visitor, Range range, Object argument) throws IOException { SequenceRange sequenceRange = (SequenceRange) range; if (this.cachedItems == null || !areEqualRanges(this.cachedRange, sequenceRange)) { int first = sequenceRange.getFirstRow(); int rows = sequenceRange.getRows(); this.cachedRange = sequenceRange; this.cachedItems = findItemsByRange(first, first + rows); } for (T item : this.cachedItems) { visitor.process(facesContext, item, argument); } } @Override public int getRowCount() { Map<String, Object> map = FacesContext.getCurrentInstance().getExternalContext().getRequestMap(); if (rowCount == null || map.get(dataModelID + "_asked") == null) { rowCount = new Integer(findRowCount()); map.put(dataModelID + "_asked", ""); } return rowCount.intValue(); } @Override public Object getRowData() { return this.dataItem; } @Override public int getRowIndex() { return -1; } @Override public Object getWrappedData() { return null; } @Override public boolean isRowAvailable() { return (this.dataItem != null); } @Override public void setRowIndex(int rowIndex) { } @Override public void setWrappedData(Object data) { } @Override public void modify(List<FilterField> filterFields, List<SortField2> sortFields) { //ignore filterFields //save sortFields this.sortFields = sortFields; this.cachedItems = null; this.cachedRange = null; } public abstract int findRowCount(); public abstract List<T> findItemsByRange(int firstRow, int endRow); public abstract Object getKey(T obj); } 
 
     
    