ExtendedDataModel firstRow is always 0
mladen.babic Jun 22, 2008 5:34 PMHi,
I have problem with showing data in rich datatable. Problem si that values in firstRow and numberOfRows in extendedDataModel are always 0. When I set any number in this variable, my dataProvider shows data as I've expected. This is snippet of my code :
public class OrderDataModel extends SerializableDataModel {
private PersistableDataProvider dataProvider;
private Integer currentPk;
private Integer rowsPerPage;
private Map<Integer, PersistableObject> wrappedData = new HashMap<Integer, PersistableObject>();
private List<Integer> wrappedKeys = null;
private boolean detached = false;
public OrderDataModel(PersistableDataProvider persistableDataProvider,Integer rows){
dataProvider=persistableDataProvider;
rowCount=rows;
}
private static final long serialVersionUID = -1956179896877538628L;
@Override
public Object getRowKey() {
return currentPk;
}
@Override
public void setRowKey(Object key) {
this.currentPk = (Integer) key;
}
@Override
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
for (Integer key : wrappedKeys) {
setRowKey(key);
visitor.process(context, key, argument);
}
} else { // if not serialized, than we request data from data provider
wrappedKeys = new ArrayList<Integer>();
System.out.println("FIRST ROW "+firstRow);
System.out.println("MAX ROWS"+numberOfRows);
for (PersistableObject item : dataProvider.getItemsByRange(new Integer(firstRow), numberOfRows, null, true)) {
wrappedKeys.add(item.getId());
wrappedData.put(item.getId(), item);
visitor.process(context, item.getId(), argument);
}
}
}
private Integer rowCount; // better to buffer row count locally
@Override
public int getRowCount() {
if (rowCount == null) {
rowCount = new Integer(dataProvider.getRowCount());
return rowCount.intValue();
} else {
return rowCount.intValue();
}
}
@Override
public Object getRowData() {
if (currentPk == null) {
return null;
} else {
PersistableObject ret = wrappedData.get(currentPk);
if (ret == null) {
ret = dataProvider.getPersistableObjectById(currentPk);
wrappedData.put(currentPk, ret);
return ret;
} else {
return ret;
}
}
}
/**
* Unused rudiment from old JSF staff.
*/
@Override
public int getRowIndex() {
throw new UnsupportedOperationException();
}
@Override
public Object getWrappedData() {
throw new UnsupportedOperationException();
}
/**
* Never called by framework.
*/
@Override
public boolean isRowAvailable() {
if (currentPk == null) {
return false;
} else {
return dataProvider.hasPersistableObject(currentPk);
}
}
/**
* Unused rudiment from old JSF staff.
*/
@Override
public void setRowIndex(int rowIndex) {
throw new UnsupportedOperationException();
}
@Override
public void setWrappedData(Object data) {
throw new UnsupportedOperationException();
}
public PersistableDataProvider getdataProvider() {
return dataProvider;
}
public void setDataProvider(PersistableDataProvider dataProvider) {
this.dataProvider = dataProvider;
}
@Override
public void update() {
// TODO Auto-generated method stub
}
}
And this is DataProvider
@Name("orderDataProvider")
public class OrderDataProvider extends AbstractPersistableDataProvider implements PersistableDataProvider{
private OrderEntity order;
public boolean hasPersistableObject(Integer id) {
return getPersistableList().contains(getPersistableObjectById(id));
}
public List<PersistableObject> getItemsByRange(Integer firstResult,
Integer maxResult, String orderBy, boolean asc) {
return getPersistableList(firstResult,maxResult, orderBy,asc);
}
}
and test page for datamodel
<h:form id="myform">
<rich:dataTable id="modeltable" var="ord" value="#{orderDataModel}" >
<rich:column>
<f:facet name="header">
Order id
</f:facet>
<h:outputText value="#{ord.id}"></h:outputText>
</rich:column>
</rich:dataTable>
</h:form>