Please help on rich:scrollableDataTable / ScrollableTableDat
unlud Mar 13, 2009 1:16 AMHi,
I try to have such a component for pagination with a table which has a primary key of type string.
My issue for the moment is that when the setRowKey method of ScrollableTableDataModel extended class is called, I get such an exception:
java.lang.ClassCastException: org.richfaces.model.ScrollableTableDataModel$SimpleRowKey cannot be cast to java.lang.String at org.unludo.iknow.jsf.beans.ObjectObjectDataModel.setRowKey(ObjectObjectDataModel.java:72) at org.richfaces.model.DataModelCache.setRowKey(DataModelCache.java:185) at org.ajax4jsf.component.UIDataAdaptor.setRowKey(UIDataAdaptor.java:351)
I searched but don't knw what to try next.
I post the code:
1/ the xhtml piece:
 <rich:scrollableDataTable
 height="400px" width="700px" rows="10"
 value="#{objectObjectDataModel}" columnClasses="col1" var="objectObjectVO">
 <rich:column id="object">
 <f:facet name="header">Object</f:facet>
 <h:outputText value="#{objectObjectVO.id}" />
 </rich:column>
 </rich:scrollableDataTable>
2/ The model:
public class ObjectObjectDataModel extends ScrollableTableDataModel {
 private String currentPk;
 private Map<String,ObjectObjectVO> wrappedData = new HashMap<String,ObjectObjectVO>();
 private List<String> wrappedKeys = null;
 private ObjectObjectDataProvider dataProvider;
 private static Logger logger = Logger.getLogger(ObjectObjectDataModel.class);
 /**
 *
 */
 private static final long serialVersionUID = -1956179896875438628L;
 public ObjectObjectDataModel()
 {
 logger.info("creation of data provider") ;
 dataProvider = new ObjectObjectDataProvider();
 }
 /**
 * This method never called from framework.
 * (non-Javadoc)
 * @see org.ajax4jsf.model.ExtendedDataModel#getRowKey()
 */
 @Override
 public Object getRowKey() {
 return currentPk;
 }
 /**
 * This method normally called by Visitor before request Data Row.
 */
 @Override
 public void setRowKey(Object key) {
 logger.info("setRowKey " + key + key != null ? key.getClass() : "") ;
 this.currentPk = (String) key;
 }
 /**
 * This is main part of Visitor pattern. Method called by framework many times during request processing.
 */
 @Override
 public void walk(FacesContext context, DataVisitor visitor, Range range, Object argument) throws IOException {
 logger.info("walk visitor " + visitor) ;
 int firstRow = ((SequenceRange)range).getFirstRow();
 int numberOfRows = ((SequenceRange)range).getRows();
 wrappedKeys = new ArrayList<String>();
 for (ObjectObjectVO item:getDataProvider().getItemsByrange(firstRow, numberOfRows))
 {
 wrappedKeys.add(item.getId());
 wrappedData.put(item.getId(), item);
 visitor.process(context, item.getId(), argument);
 }
 }
 /**
 * This method must return actual data rows count from the Data Provider. It is used by pagination control
 * to determine total number of data items.
 */
 private Integer rowCount; // better to buffer row count locally
 @Override
 public int getRowCount() {
 if (rowCount==null) {
 rowCount = new Integer(getDataProvider().getRowCount());
 return rowCount.intValue();
 } else {
 return rowCount.intValue();
 }
 }
 /**
 * This is main way to obtain data row. It is intensively used by framework.
 * We strongly recommend use of local cache in that method.
 */
 @Override
 public Object getRowData() {
 if (currentPk==null) {
 return null;
 } else {
 ObjectObjectVO ret = wrappedData.get(currentPk);
 if (ret==null)
 {
 ret = (ObjectObjectVO) getDataProvider().getItemByKey(currentPk);
 wrappedData.put(currentPk, ret);
 return ret;
 }
 else
 {
 return ret;
 }
 }
 }
 /**
 * Unused rudiment from old JSF staff.
 */
 @Override
 public int getRowIndex() {
 throw new UnsupportedOperationException();
 }
 /**
 * Unused rudiment from old JSF staff.
 */
 @Override
 public Object getWrappedData() {
 throw new UnsupportedOperationException();
 }
 /**
 * Never called by framework.
 */
 @Override
 public boolean isRowAvailable() {
 if (currentPk==null) {
 return false;
 } else {
 return getDataProvider().hasObjectObjectVOByPk(currentPk);
 }
 }
 /**
 * Unused rudiment from old JSF staff.
 */
 @Override
 public void setRowIndex(int rowIndex) {
 throw new UnsupportedOperationException();
 }
 /**
 * Unused rudiment from old JSF staff.
 */
 @Override
 public void setWrappedData(Object data) {
 throw new UnsupportedOperationException();
 }
 public ObjectObjectDataProvider getDataProvider()
 {
 logger.info("data provider has been accessed") ;
 return dataProvider;
 }
 public void setDataProvider(ObjectObjectDataProvider p_o)
 {
 logger.info("data provider has been set") ;
 dataProvider = p_o;
 }
 @Override
 public
 List loadData(int arg0, int arg1, SortOrder arg2)
 {
 Iterable<ObjectObjectVO> it;
 it = getDataProvider().getItemsByrange(arg0, arg1);
 if(it == null)
 {
 logger.error("loadData returned null") ;
 return null;
 }
 return (List) it;
 }
}3/the data provider
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.unludo.iknow.jsf.beans.ObjectObject;
import java.util.List;
import javax.ejb.EJB;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.apache.log4j.Logger;
import org.richfaces.model.DataProvider;
import org.unludo.iKnow.ejb.session.ObjectObjectFacadeLocal;
import org.unludo.iKnow.vo.ObjectObjectVO;
/**
*
* @author Ludovic
*/
@EJB(name="objectobjectfacaderef", beanInterface=ObjectObjectFacadeLocal.class)
public class ObjectObjectDataProvider implements DataProvider
{
private static Logger logger = Logger.getLogger(ObjectObjectDataProvider.class);
ObjectObjectFacadeLocal oObjectObjectFacade;
public ObjectObjectDataProvider()
{
try
{
InitialContext ic = new InitialContext();
oObjectObjectFacade = (ObjectObjectFacadeLocal) ic.lookup("java:comp/env/objectobjectfacaderef");
logger.info("getRowCount oObjectObjectFacade constructor" + oObjectObjectFacade) ;
}
catch (NamingException ex)
{
logger.error("getRowCount oObjectObjectFacade null " + ex) ;
}
}
public
Iterable<ObjectObjectVO> getItemsByrange(int firstRow, int numberOfRows)
{
List<ObjectObjectVO> lvo =oObjectObjectFacade.getList(firstRow, numberOfRows);
logger.info("getItemsByrange first row "+ firstRow + "nb rows " + numberOfRows + " -> " + lvo) ;
return lvo;
}
@Override
public
int getRowCount()
{
Long nbObject = oObjectObjectFacade.count();
logger.info("getRowCount nb objects" + nbObject);
return nbObject.intValue();
}
public
int count()
{
Long nbObject = oObjectObjectFacade.count();
return nbObject.intValue();
}
@Override
public
List getItemsByRange(int arg0, int arg1)
{
return oObjectObjectFacade.getList(arg0, arg1);
}
@Override
public
Object getItemByKey(Object arg0)
{
return oObjectObjectFacade.find((String)arg0);
}
@Override
public
Object getKey(Object arg0)
{
return ((ObjectObjectVO)arg0).getId();
}
public boolean hasObjectObjectVOByPk(String p_sId)
{
return (getItemByKey(p_sId) != null);
}
}
Any help would be greatly appreciated.
Also if some one knows about a consistent example of this component, I would be interested. If not, I will post something if I find a solution.
Thank you
Ludo
 
     
     
    