problem using ExtendedDataModel for dataTable
mario.balaban Sep 18, 2008 10:29 AMI need to display a table with data coming from a db query with many records (~1000) so it seemed obvious to me that ExtendedDataModel should be used. As starting point I used example classes that could be found at :
http://viewvc.jboss.org/cgi-bin/viewvc.cgi/richfaces/branches/3.1.x/samples/richfaces-demo/src/main/java/org/richfaces/demo/extendeddatamodel/
I changed the AuctionDataProvider method in this way:
public List getItemsByrange(Integer startPk, int numberOfRows, String sortField, boolean ascending) { return dataAccessObject.getSubSetOfItems(startPk, startPk+numberOfRows); }
this method is invoked by the walk method in AuctionDataModel
public void walk(FacesContext context, DataVisitor visitor, Range range, Object argument) throws IOException { int firstRow = ((SequenceRange)range).getFirstRow(); int numberOfRows = ((SequenceRange)range).getRows(); if (detached) { // Is this serialized model // Here we just ignore current Rage and use whatever data was saved in serialized model. // Such approach uses much more getByPk() operations, instead of just one request by range. // Concrete case may be different from that, so you can just load data from data provider by range. // We are using wrappedKeys list only to preserve actual order of items. for (Iterator iterator = wrappedKeys.iterator(); iterator.hasNext();) { Integer key = (Integer) iterator.next(); setRowKey(key); visitor.process(context, key, argument); } } else { // if not serialized, than we request data from data provider wrappedKeys = new ArrayList(); for (Iterator iterator = dataProvider.getItemsByrange(new Integer(firstRow), numberOfRows, null, true).iterator(); iterator.hasNext();) { AuctionItem item = (AuctionItem) iterator.next(); wrappedKeys.add(item.getPk()); wrappedData.put(item.getPk(), item); visitor.process(context, item.getPk(), argument); } } }
I imagine that the assignments made at the begging of the walk method
int firstRow = ((SequenceRange)range).getFirstRow(); int numberOfRows = ((SequenceRange)range).getRows();
should change during navigation from one page of data to another, but debugging I see that firstRow always is set to 0 (zero) and numberOfRows to -1, no mater what is the value of rows attribute in the dataTable tag:
<rich:dataTable cellpadding="0" cellspacing="0" width="100%" border="0" var="recordElenco" rows="10" value="#{auctionDataModel}".....
so I cannot get the paged data from the db.
I experienced the problem with 3.2.2 and 3.2.1 releases. My application server is jboss.4.2.2GA.