-
1. Re: Getting row number in rich:dataTable
zabin7 Sep 12, 2009 6:11 AM (in response to zabin7)Hello All
Just adding some code which I am using.
I am using PaginatingDataModel.
@Name("businessDataModel")
@Scope(ScopeType.EVENT)
public class BusinessesDataModel extends PaginatingDataModel<IcBusiness, Long> {
....
}
In the jsp I am calling the data table like this:
<rich:dataTable id="businesseslist" value="#{businessDataModel}" rows="10" width="100%" var="business" rowKeyVar="rowkey" >
..........
</rich:dataTable>
The rowKey is giving me the object Id. But I want the row index.
I have overrided getRowIndex and setRowIndex along with getter and setter of wrappedData in BusinessesDataModel, but of no use.
From some forums, I got to know about binding option. I tried with that too but of no use, might be i am using it in wrong direction.
Please help. -
2. Re: Getting row number in rich:dataTable
nbelaevski Sep 12, 2009 5:12 PM (in response to zabin7)Hi,
Have you tried #{businessDataModel.rowIndex} ? -
3. Re: Getting row number in rich:dataTable
zabin7 Sep 14, 2009 12:50 AM (in response to zabin7)Yes, I tried with #{businessDataModel.rowIndex} and I have overrided getRowIndex() and setRowIndex(). but I am getting null pointer exception.
I have overrided like this:
@Override
public int getRowIndex(){
return this.rowIndex;
}
@Override
public void setRowIndex(int rowIndex){
this.rowIndex = rowIndex;
}
I know that this method will give nullpointer exception because nowhere we are setting the rowIndex. Can you tell me where can I call this setter method so that I can set the rowIndex.
Thanks -
4. Re: Getting row number in rich:dataTable
nbelaevski Sep 14, 2009 6:40 AM (in response to zabin7)What is PaginatingDataModel class - I cannot find such class in RF?
-
5. Re: Getting row number in rich:dataTable
zabin7 Sep 14, 2009 6:52 AM (in response to zabin7)PaginatingDataModel is an abstract class of SerializableDataModel
package com.sec.portal.data;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.faces.context.FacesContext;
import org.ajax4jsf.model.DataVisitor;
import org.ajax4jsf.model.Range;
import org.ajax4jsf.model.SequenceRange;
import org.ajax4jsf.model.SerializableDataModel;
/**
* @param
* @param
*/
public abstract class PaginatingDataModel<T, U> extends SerializableDataModel {
/** */
private static final long serialVersionUID = 2954923950179861809L;
/** */
protected U currentPk;
/** */
protected boolean descending = true;
/** */
protected String sortField = getDefaultSortField();
/** */
protected boolean detached = false;
/** */
protected List wrappedKeys = new ArrayList();
/** */
protected Integer rowCount;
/** */
protected Map<U, T> wrappedData = new HashMap<U, T>();
/**
* @see org.ajax4jsf.model.ExtendedDataModel#getRowKey()
*/
@Override
public Object getRowKey()
{
return currentPk;
}
/**
* @see org.ajax4jsf.model.ExtendedDataModel#setRowKey(java.lang.Object)
*/
@SuppressWarnings("unchecked")
@Override
public void setRowKey(final Object key)
{
this.currentPk = (U) key;
}
/**
* @see org.ajax4jsf.model.SerializableDataModel#update()
*/
@Override
public void update()
{
if (getSortFieldObject() != null)
{
final String newSortField = getSortFieldObject().toString();
if (newSortField.equals(sortField))
{
descending = !descending;
}
sortField = newSortField;
}
detached = false;
}
/**
* @return Object
*/
protected Object getSortFieldObject()
{
final FacesContext context = FacesContext.getCurrentInstance();
final Object sortFieldObject = context.getExternalContext().getRequestParameterMap().get("sortField");
return sortFieldObject;
}
/**
* @param sortField
*/
public void setSortField(final String sortField)
{
if (this.sortField.equals(sortField))
{
descending = !descending;
} else
{
this.sortField = sortField;
}
}
/**
* @return String
*/
public String getSortField()
{
return sortField;
}
/**
* @see org.ajax4jsf.model.ExtendedDataModel#getSerializableModel(org.ajax4jsf.model.Range)
*/
@Override
public SerializableDataModel getSerializableModel(final Range range)
{
if (wrappedKeys != null)
{
detached = true;
return this;
}
return null;
}
/**
* @see javax.faces.model.DataModel#setRowIndex(int)
*/
@Override
public void setRowIndex(final int rowIndex)
{
throw new UnsupportedOperationException();
}
/**
* @see javax.faces.model.DataModel#setWrappedData(java.lang.Object)
*/
@Override
public void setWrappedData(final Object data)
{
throw new UnsupportedOperationException();
}
/**
* @see javax.faces.model.DataModel#getRowIndex()
*/
@Override
public int getRowIndex()
{
throw new UnsupportedOperationException();
}
/**
* @see javax.faces.model.DataModel#getWrappedData()
*/
@Override
public Object getWrappedData()
{
throw new UnsupportedOperationException();
}
/**
* @see org.ajax4jsf.model.ExtendedDataModel#walk(javax.faces.context.FacesContext,
* org.ajax4jsf.model.DataVisitor, org.ajax4jsf.model.Range,
* java.lang.Object)
*/
@Override
public void walk(final FacesContext context, final DataVisitor visitor, final Range range, final Object argument)
throws IOException
{
final int firstRow = ((SequenceRange) range).getFirstRow();
final int numberOfRows = ((SequenceRange) range).getRows();
if (detached && getSortFieldObject() != null)
{
for (final U key : wrappedKeys)
{
setRowKey(key);
visitor.process(context, key, argument);
}
} else
{ // if not serialized, than we request data from data
// provider
wrappedKeys = new ArrayList();
for (final T object : findObjects(firstRow, numberOfRows, sortField, descending))
{
wrappedKeys.add(getId(object));
wrappedData.put(getId(object), object);
visitor.process(context, getId(object), argument);
}
}
}
/**
* @see javax.faces.model.DataModel#isRowAvailable()
*/
@Override
public boolean isRowAvailable()
{
if (currentPk == null)
{
return false;
}
if (wrappedKeys.contains(currentPk))
{
return true;
}
if (wrappedData.entrySet().contains(currentPk))
{
return true;
}
try
{
if (getObjectById(currentPk) != null)
{
return true;
}
} catch (final Exception e)
{
}
return false;
}
/**
* @see javax.faces.model.DataModel#getRowData()
*/
@Override
public Object getRowData()
{
if (currentPk == null)
{
return null;
}
T object = wrappedData.get(currentPk);
if (object == null)
{
object = getObjectById(currentPk);
wrappedData.put(currentPk, object);
}
return object;
}
/**
* @see javax.faces.model.DataModel#getRowCount()
*/
@Override
public int getRowCount()
{
if (rowCount == null)
{
rowCount = getNumRecords();
}
return rowCount;
}
/**
*
* @param object
* @return U
*/
public abstract U getId(T object);
/**
* @param firstRow
* @param numberOfRows
* @param sortField
* @param descending
* @return List
*/
public abstract List findObjects(int firstRow, int numberOfRows, String sortField, boolean descending);
/**
* @param id
* @return T
*/
public abstract T getObjectById(U id);
/**
* @return String
*/
public abstract String getDefaultSortField();
/**
* @return int
*/
public abstract int getNumRecords();
}
So in my class I am using it like this:
package com.sec.ezeestay.datamodels;
import java.util.List;
import javax.persistence.EntityManager;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import com.sec.portal.data.PaginatingDataModel;
import com.sec.portal.persistence.instanceconfig.IcBusiness;
import com.sec.portal.services.reservation.BusinessSearchService;
import com.sec.portal.structures.search.BusinessSearch;
@Name("businessDataModel")
@Scope(ScopeType.EVENT)
public class BusinessesDataModel extends PaginatingDataModel<IcBusiness, Long> {
private static final long serialVersionUID = 561019436789160412L;
@In
EntityManager em;
@In(required=false)
BusinessSearch businessSearchData;
private Integer cachedResultCount;
private Integer rowIndex;
@Override
public List findObjects(int firstRow, int numberOfRows, String sortField, boolean descending) {
BusinessSearchService bss = new BusinessSearchService(em);
businessSearchData.setProduct("ezeeStay");
List result = bss.list(businessSearchData, firstRow, numberOfRows);
return result;
}
@Override
public String getDefaultSortField() {
return "name";
}
@Override
public Long getId(IcBusiness object) {
return object.getId();
}
@Override
public int getNumRecords() {
if(cachedResultCount == null) {
BusinessSearchService bss = new BusinessSearchService(em);
businessSearchData.setProduct("ezeeStay");
cachedResultCount = bss.count(businessSearchData);
}
return cachedResultCount;
}
@Override
public IcBusiness getObjectById(Long id) {
BusinessSearchService bss = new BusinessSearchService(em);
return bss.getBusiness(id);
}
@Override
public int getRowIndex(){
return this.rowIndex;
}
@Override
public void setRowIndex(int rowIndex){
this.rowIndex = rowIndex;
}
} -
6. Re: Getting row number in rich:dataTable
nbelaevski Sep 14, 2009 8:33 AM (in response to zabin7)Method walk() generates keys, so you'll have to put there something that will allow to link row index with the row key, e.g. Map.