<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<body link="#355491" alink="#4262a1" vlink="#355491" style="background: #e2e2e2; margin: 0; padding: 20px;">
<div>
        <table cellpadding="0" bgcolor="#FFFFFF" border="0" cellspacing="0" style="border: 1px solid #dadada; margin-bottom: 30px; width: 100%; -moz-border-radius: 6px; -webkit-border-radius: 6px;">
                <tbody>
                        <tr>
                                <td>
                                        <table border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" style="border: solid 2px #ccc; background: #dadada; width: 100%; -moz-border-radius: 6px; -webkit-border-radius: 6px;">
                                                <tbody>
                                                        <tr>
                                                                <td bgcolor="#000000" valign="middle" height="58px" style="border-bottom: 1px solid #ccc; padding: 20px; -moz-border-radius-topleft: 3px; -moz-border-radius-topright: 3px; -webkit-border-top-right-radius: 5px; -webkit-border-top-left-radius: 5px;">
                                                                        <h1 style="color: #333333; font: bold 22px Arial, Helvetica, sans-serif; margin: 0; display: block !important;">
                                                                        <!-- To have a header image/logo replace the name below with your img tag -->
                                                                        <!-- Email clients will render the images when the message is read so any image -->
                                                                        <!-- must be made available on a public server, so that all recipients can load the image. -->
                                                                        <a href="http://community.jboss.org/index.jspa" style="text-decoration: none; color: #E1E1E1">JBoss Community</a></h1>
                                                                </td>
                                                        </tr>
                                                        <tr>
                                                                <td bgcolor="#FFFFFF" style="font: normal 12px Arial, Helvetica, sans-serif; color:#333333; padding: 20px; -moz-border-radius-bottomleft: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 5px; -webkit-border-bottom-left-radius: 5px;"><h3 style="margin: 10px 0 5px; font-size: 17px; font-weight: normal;">
RichFaces ExtendedDataTable not setting the Selection attribute
</h3>
<span style="margin-bottom: 10px;">
created by <a href="http://community.jboss.org/people/david-brighton">david hickman</a> in <i>JBoss Web Services</i> - <a href="http://community.jboss.org/message/574386#574386">View the full discussion</a>
</span>
<hr style="margin: 20px 0; border: none; background-color: #dadada; height: 1px;">
<div class="jive-rendered-content"><p>Hi</p><p>I am using Richfaces  richfaces-ui-3.3.3.Final with jojarra-2.0.3 Core JSF and Jave 1.6 running in tomcat 6.0.29.</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>I am populating the extendedDataTable using the data model shown below but when I select an entry, the backing bean method is being called but the selection variable is being set but with no keys, any help would be appreciated:</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>// snippet from jsp</p><p>             <r:simpleTogglePanel>    <br/>                <br/>                    <f:facet name="header"><br/>                        <h:outputText value="User Search Results"/><br/>                    </f:facet><br/>                    <br/>                    <a:outputPanel id="userSearchResultsPanel" ></p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>                        <r:extendedDataTable id="userTable"<br/>                                     height="200px"<br/>                                       value="#{userBean.dataModel}"<br/>                                       var="user"<br/>                                       selectionMode="single" <br/>                                       selection="#{userBean.searchSelection}"><br/>                                  <r:column sortOrder="ASCENDING"  ><br/>                                      <f:facet name="header"><br/>                                          <h:outputText value="User Name" /><br/>                                      </f:facet><br/>                                      <h:outputText value="#{user.userName}" /><br/>                                  </r:column><br/>                                  <r:column sortOrder="ASCENDING"   ><br/>                                      <f:facet name="header"><br/>                                          <h:outputText value="First Name" /><br/>                                      </f:facet><br/>                                      <h:outputText value="#{user.firstName}" /><br/>                                  </r:column><br/>                                  <r:column sortOrder="ASCENDING"  ><br/>                                      <f:facet name="header"><br/>                                          <h:outputText value="Surname" /><br/>                                      </f:facet><br/>                                      <h:outputText value="#{user.surName}" /><br/>                                  </r:column><br/>                                  <r:column sortOrder="ASCENDING"><br/>                                      <f:facet name="header"><br/>                                          <h:outputText value="Cost Center" /><br/>                                      </f:facet><br/>                                      <h:outputText value="#{user.costCenter}" /><br/>                                  </r:column><br/>                                  <br/>                                  <a:support event="onselectionchange"<br/>                                             reRender="userDetailPanel" <br/>                                             action="#{userBean.identifySelectedUser}" /><br/>                          </r:extendedDataTable></p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>                          <r:spacer height="10px" />                      <br/>                          <br/>                    </a:outputPanel><br/>                </r:simpleTogglePanel></p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>// Data Provider</p><p>package util;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>import java.util.*;<br/>import vo.User;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>import org.apache.log4j.Logger;<br/>import org.richfaces.model.DataProvider;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>public class UserTableDataProvider implements DataProvider{<br/>    <br/>    private Logger log = Logger.getLogger( "UserTableDataProvider: " );<br/>    <br/>    private Map<UUID, UIUser>        dataTable;<br/>    private List<UIUser>            dataList;<br/>    <br/>    public UserTableDataProvider( List<User> users ) {<br/>        <br/>        dataTable = new HashMap<UUID,UIUser>();<br/>        dataList  = new ArrayList<UIUser>( users.size());<br/>        for ( User user : users ) {<br/>            UIUser uiUser = new UIUser( user );<br/>            dataTable.put( uiUser.getId(), uiUser);<br/>            dataList.add( uiUser );<br/>        }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>    }<br/>    /**<br/>     * <br/>     */<br/>    public Object getItemByKey( Object key ) {<br/>        return dataTable.get(( String)key );<br/>    }<br/>    /**<br/>     * <br/>     */<br/>    public List getItemsByRange( int start, int end ) {<br/>        return dataList.subList( start, end );<br/>    }<br/>    /**<br/>     * <br/>     */<br/>    public Object getKey( Object user ) {<br/>        return ((UIUser)user).getId();<br/>    }<br/>    /**<br/>     * <br/>     */<br/>    public int getRowCount() {<br/>        return dataList.size();<br/>    }<br/>}</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>// Backing Bean</p><p>package beans;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>import org.apache.log4j.*;<br/>import org.richfaces.model.selection.SimpleSelection;<br/>import org.richfaces.model.ExtendedTableDataModel;<br/>import util.UserTableDataProvider;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>import java.util.HashMap;<br/>import java.util.ArrayList;<br/>import java.util.List;<br/>import java.util.Iterator;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p><br/>import exception.UserException;<br/>import exception.BaseRuntimeException;<br/>import vo.User;<br/>import service.UserService;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>public class UserBean extends BaseBean {</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>    private Logger log = Logger.getLogger( "UserBean: " );<br/>    <br/>    //////////////////////////////////////////////////////////<br/>    // Injected properties<br/>    //////////////////////////////////////////////////////////<br/>    private UserService userService;<br/>    <br/>    //////////////////////////////////////////////////////////<br/>    // Private static data<br/>    //////////////////////////////////////////////////////////<br/>    private final static String COST_CENTER     = "CC";<br/>    private final static String SURNAME         = "SN";<br/>    private final static String USERNAME        = "UN";<br/>    <br/>    //////////////////////////////////////////////////////////<br/>    // Private member variables<br/>    //////////////////////////////////////////////////////////<br/>    // basic attributes<br/>    private String                  userName;<br/>    private String                  password;<br/>    private String                  userType;    <br/>    private String                    email;<br/>    private String                    firstName;<br/>    private String                    surname;<br/>    private String                  costCenter;<br/>    private HashMap                 userTypes;<br/>    private String                    active;<br/>    private List<User>               users;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>    // search attributes<br/>    private String                    searchType;<br/>    private String                    searchCriteria;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>    <br/>    private SimpleSelection        searchSelection;<br/>    private ExtendedTableDataModel dataModel;<br/>    <br/>    <br/>    // default bean constructor<br/>    public UserBean() {<br/>        users = new ArrayList<User>();<br/>    }<br/>    <br/>    <br/>    //////////////////////////////////////////////<br/>    // Bean property accessor methods<br/>    //////////////////////////////////////////////<br/>    public String getUserName() {<br/>        return userName;<br/>    }<br/>    <br/>    public void setUserName(String userName) {<br/>        this.userName = userName;<br/>    }<br/>    <br/>    public String getPassword() {<br/>        return password;<br/>    }<br/>    <br/>    public void setPassword(String password) {<br/>        this.password = password;<br/>    }<br/>    public String getUserType() {<br/>        return userType;<br/>    }<br/>    public void setUserType(String userType) {<br/>        this.userType = userType;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>    public String getEmail() {<br/>        return email;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>    public void setEmail(String email) {<br/>        this.email = email;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p><br/>    public String getFirstName() {<br/>        return firstName;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>    public void setFirstName(String firstName) {<br/>        this.firstName = firstName;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>    public String getSurname() {<br/>        return surname;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>    public void setSurname(String surname) {<br/>        this.surname = surname;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>    public String getCostCenter() {<br/>        return costCenter;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>    public void setCostCenter(String costCenter) {<br/>        this.costCenter = costCenter;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>    public HashMap getUserTypes() {<br/>        return userTypes;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p><br/>    public void setUserTypes(HashMap userTypes) {<br/>        this.userTypes = userTypes;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p><br/>    public String getActive() {<br/>        return active;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p><br/>    public void setActive(String active) {<br/>        this.active = active;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p><br/>    public String getSearchType() {<br/>        return searchType;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p><br/>    public void setSearchType(String searchType) {<br/>        this.searchType = searchType;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p><br/>    public String getSearchCriteria() {<br/>        return searchCriteria;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p><br/>    public void setSearchCriteria(String searchCriteria) {<br/>        this.searchCriteria = searchCriteria;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>    public SimpleSelection getSearchSelection() {<br/>        return searchSelection;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p><br/>    public void setSearchSelection(SimpleSelection searchSelection) {<br/>        log.info("UserBean.setSearchSelection");<br/>        this.searchSelection = searchSelection;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>    public ExtendedTableDataModel getDataModel() {</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>        dataModel = new ExtendedTableDataModel( new UserTableDataProvider( users ));<br/>        <br/>        return dataModel;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p><br/>    public void setDataModel(ExtendedTableDataModel dataModel) {<br/>        this.dataModel = dataModel;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p><br/>    //////////////////////////////////////////////////////////<br/>    // User Service methods<br/>    //////////////////////////////////////////////////////////<br/>    public void userSearch() {</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>        <br/>        String status = validateSearchCriteria();<br/>        <br/>        users = new ArrayList();<br/>        try {<br/>            if ( searchType.equals(COST_CENTER )) {<br/>                <br/>                users = userService.getUsersByCostCenter( searchCriteria);<br/>            }<br/>            else if ( searchType.equals(SURNAME )) {<br/>                <br/>                users = userService.getUsersBySurname( searchCriteria );<br/>            }<br/>            else if ( searchType.equals(USERNAME)) {<br/>                <br/>                users.add( userService.getUser( searchCriteria ));<br/>            }<br/>        }<br/>        catch ( UserException ue ) {<br/>            if ( searchType.equals(COST_CENTER )) {<br/>                addErrorMessage("userSearch", "Failed to retrieve users for Cost Center " + searchCriteria );<br/>            }<br/>            else if ( searchType.equals(SURNAME )) {<br/>                addErrorMessage("userSearch", "Failed to retrieve users for Surname " + searchCriteria );<br/>            }<br/>            else if ( searchType.equals(USERNAME)) {<br/>                addErrorMessage("userSearch", "Failed to retrieve users for Username " + searchCriteria );<br/>            }            <br/>            <br/>        }<br/>    }<br/>    <br/>    // identify selected user<br/>    public void identifySelectedUser() {<br/>        <br/>        if ( searchSelection != null ) {<br/>            log.info("Selection: " + searchSelection.size() );<br/>            Iterator iterator = searchSelection.getKeys();<br/>            while ( iterator.hasNext() ) {<br/>                Object key = iterator.next();<br/>            }<br/>        }<br/>    }<br/>    <br/>    // User Detail<br/>    public void userDetail() {<br/>        <br/>    }<br/>    //////////////////////////////////////////////////////////<br/>    // IOC methods<br/>    //////////////////////////////////////////////////////////<br/>    public void setUserService( UserService userService ) {<br/>        this.userService = userService;<br/>    }<br/>    //////////////////////////////////////////////////////////<br/>    // Private methods<br/>    //////////////////////////////////////////////////////////<br/>    // searchCriteria<br/>    private String validateSearchCriteria() {<br/>        String status = "ok";<br/>        <br/>        if ( !validString(searchType) ) {<br/>            addErrorMessage("userSearch","Search Type is required");<br/>            status = "error";<br/>        }<br/>        if ( !validString(searchCriteria) ) {<br/>            addErrorMessage("userSearch","Search Criteria is required");<br/>            status = "error";<br/>        }<br/>        <br/>        return status;<br/>    }<br/>    // Bean data<br/>    private String validateData( ) {<br/>        <br/>        String status = "ok";</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>        if ( userName == null || userName.equals("")) {<br/>            addErrorMessage("userSearch", "User Name is required");<br/>            status = "error";<br/>        }<br/>        if ( !validString(password) ) {<br/>            addErrorMessage("userSearch", "Password is required");<br/>            status = "error";<br/>        }<br/>        if ( !validString(firstName) ) {<br/>            addErrorMessage("userSearch", "First Name is required");<br/>            status = "error";<br/>        }        <br/>        if ( !validString(surname) ) {<br/>            addErrorMessage("userSearch", "Surname is required");<br/>            status = "error";<br/>        }        <br/>        if ( !validString(email)) {<br/>            addErrorMessage("userSearch", "Email is required");<br/>            status = "error";<br/>        }        <br/>        if ( !validString(costCenter )) {<br/>            addErrorMessage("userSearch", "Cost Center is required");<br/>            status = "error";<br/>        }        <br/>        return status;    <br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>    // validString<br/>    private boolean validString( String str ) {<br/>        if ( str == null || str.equals("" ))<br/>            return false;<br/>        return true;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>}</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>// UI User class</p><p>package util;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>import vo.User;<br/>import java.util.UUID;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>/**<br/> * <br/> * This class encapsulates a standard USER object but<br/> * also includes a UUID for use by UI objects ed.ExtendedDataTable<br/> * <br/> * @author davidhickman<br/> *<br/> */<br/>public class UIUser extends User {</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>    /////////////////////////////////////////////////////<br/>    // Private data<br/>    /////////////////////////////////////////////////////<br/>    private UUID    id;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>    <br/>    public  UIUser( User user ) {<br/>        <br/>        this.setUserName(user.getUserName());<br/>        this.setPassword(user.getPassword());<br/>        this.setUserType(user.getUserType());<br/>        this.setEmail(user.getEmail());<br/>        this.setFirstName(user.getFirstName());<br/>        this.setSurName(user.getSurName());<br/>        this.setCostCenter(user.getCostCenter());<br/>        this.setActive(user.getActive());<br/>        this.id = UUID.randomUUID();<br/>        <br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>    public UUID getId() {<br/>        return id;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>    public void setId(UUID id) {<br/>        this.id = id;<br/>    }</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>    <br/>}</p></div>
<div style="background-color: #f4f4f4; padding: 10px; margin-top: 20px;">
<p style="margin: 0;">Reply to this message by <a href="http://community.jboss.org/message/574386#574386">going to Community</a></p>
        <p style="margin: 0;">Start a new discussion in JBoss Web Services at <a href="http://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2044">Community</a></p>
</div></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div>
</body>
</html>