ExtendedDataModel getRowKey() always returns null
jland10 Jan 19, 2016 9:19 AMCurrently working on an upgrade from richfaces 3.3 to 4.5. I am trying to migrate a class that was previously a SerializableDataModel and working to an ExtendedDataModel. The it seems to display correctly but when I do an ajax call on the row click event the rowKey is being set to null.
xhtml code:
<rich:dataTable id="trans" value="#{modelMonitorAction}"
width="100%" var="md" rowClasses="odd-row,even-row" styleClass="gfits-table"
rendered="#{modelMonitorAction.rowDetailsCount > 0}" >
<a4j:ajax event="rowclick" execute="@this"
listener="#{mdDetailsAction.modelDetails(1, '',modelMonitorAction.selectedModel)}"
render="mdDetails" >
ModelMonitorAction extends PageanatingDataModel.java:
public class PaginatingDataModel<Model, Integer> extends
ExtendedDataModel<Model>{
/** */
private static final long serialVersionUID = 2954923950179861809L;
/** */
protected Integer currentPk;
/** */
protected boolean descending = true;
/** */
protected String sortField = getDefaultSortField();
/** */
protected boolean detached = false;
/** */
protected List<Integer> wrappedKeys = new ArrayList<Integer>();
/** */
private int rowCount = 0;
/** */
private int rowIndex;
/** */
protected Map<Integer, Model> wrappedData = new HashMap<Integer, Model>();
/**
* @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(Object key) {
this.currentPk = (Integer) key;
}
/**
* @see org.ajax4jsf.model.SerializableDataModel#update()
*/
//Looks like this is doing sorting of some sort will fix once application deploys
// @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;
}
public void updateSortField(){
if (getSortFieldObject() != null) {
final String newSortField = getSortFieldObject().toString();
if (newSortField.equals(sortField)) {
descending = !descending;
}
sortField = newSortField;
}
detached = false;
}
/**
* @see javax.faces.model.DataModel#setRowIndex(int)
*/
@Override
public void setRowIndex(int arg0) {
// TODO Auto-generated method stub
//throw new UnsupportedOperationException();
rowIndex = arg0;
return;
}
/**
* @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() {
// TODO Auto-generated method stub
//throw new UnsupportedOperationException();
return rowIndex;
}
/**
* @see javax.faces.model.DataModel#getWrappedData()
*/
@Override
public Object getWrappedData() {
throw new UnsupportedOperationException();
}
public void wrap(FacesContext context, DataVisitor visitor, Range range, Object argument, List<Model> list) throws IOException
{
wrappedKeys = new ArrayList<Integer>();
wrappedData = new HashMap<Integer, Model>();
for (Model row : list)
{
Integer id = getId(row);
setRowKey(id);
wrappedKeys.add(id);
wrappedData.put(id, row);
visitor.process(context, id, argument);
}
}
@Override
public void walk(FacesContext context, DataVisitor visitor, Range range, Object argument)
{
if(validate()) {
setRowCount(0);
return;
}
int firstRow = ((SequenceRange) range).getFirstRow();
int maxResults = ((SequenceRange) range).getRows();
if (detached && getSortFieldObject() != null) {
for (final Integer key : wrappedKeys) {
setRowKey(key);
visitor.process(context, key, argument);
}
} else {
String sortField = getSortField();
try {
wrap(context, visitor, range, argument, findObjects(firstRow, maxResults, sortField, descending));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* @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 Model getRowData() {
if (currentPk == null) {
return null;
} else {
Model ret = wrappedData.get(currentPk);
if (ret == null) {
ret = this.getObjectById(currentPk);
wrappedData.put(currentPk, ret);
return ret;
} else {
return ret;
}
}
}
/**
* @see javax.faces.model.DataModel#getRowCount()
*/
@Override
public int getRowCount() {
if (rowCount == 0) {
rowCount = getNumRecords();
}
return rowCount;
}
/**
* @param rowCount
*/
public void setRowCount(int rowCount) {
this.rowCount = rowCount;
}
/**
*
* @param object
* @return U
*/
public Integer getId(Model object) {
return null;
}
public boolean validate(){
return false;
}
/**
* @param firstRow
* @param numberOfRows
* @param sortField
* @param descending
* @return List<T>
*/
public List<Model> findObjects(int firstRow,
int numberOfRows, String sortField, boolean descending){
return null;
}
/**
* @param id
* @return T
*/
public Model getObjectById(Integer id){
return null;
}
/**
* @return String
*/
public String getDefaultSortField(){
return null;
}
/**
* @return int
*/
public int getNumRecords(){
return 0;
}
}
Can anyone see anything obvious I am doing wrong or forgetting? This is my first experience using the ExtendedDataModel. Also if anybody could just point me to a good tutorial on how to use it that would be much appreciated.