[ 
https://issues.apache.org/jira/browse/WICKET-2733?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Sebastien Briquet closed WICKET-2733.
-------------------------------------


Hi Igor, 
So, sorry to have reported this non-bug. Also thanks for your quick answer and 
your comments.


> Overriding ChoiceRenderer#getIdValue throws a ClassCastException
> ----------------------------------------------------------------
>
>                 Key: WICKET-2733
>                 URL: https://issues.apache.org/jira/browse/WICKET-2733
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket-extensions
>    Affects Versions: 1.4.2
>         Environment: winxp pro, jdk1.6.0_16, tomcat 6.0.24
>            Reporter: Sebastien Briquet
>            Assignee: Igor Vaynberg
>
> Dear Wicket Team, dear Igor,
> There is a strange behaviour while setting a ChoiceRenderer (with a custom 
> bean) to a ChoiceFilteredPropertyColumn.
> I provide you a simple sample :
> Consider a User (id, name, roleId) and Role (id, name). The goal is to 
> display the User(s) in a DefaultDataTable, allowing to filter by their Role 
> name. Except if I miss something, it appears logical to me to provide a new 
> ChoiceRenderer<Role>("name", "id") to the ChoiceFilteredPropertyColumn. But 
> the parameter "id" cause an issue when retrieved by getIdValue() (overrided 
> or not, but it's most explicit when overrided). Please find the whole example 
> and the stack strace bellow:
> ----- Java File -----
> import java.util.ArrayList;
> import java.util.Iterator;
> import java.util.List;
> import org.apache.wicket.IClusterable;
> import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
> import 
> org.apache.wicket.extensions.markup.html.repeater.data.table.DefaultDataTable;
> import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
> import 
> org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
> import 
> org.apache.wicket.extensions.markup.html.repeater.data.table.filter.ChoiceFilteredPropertyColumn;
> import 
> org.apache.wicket.extensions.markup.html.repeater.data.table.filter.FilterForm;
> import 
> org.apache.wicket.extensions.markup.html.repeater.data.table.filter.FilterToolbar;
> import 
> org.apache.wicket.extensions.markup.html.repeater.data.table.filter.IFilterStateLocator;
> import 
> org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
> import org.apache.wicket.markup.html.WebPage;
> import org.apache.wicket.markup.html.form.ChoiceRenderer;
> import org.apache.wicket.markup.html.form.IChoiceRenderer;
> import org.apache.wicket.model.IModel;
> import org.apache.wicket.model.LoadableDetachableModel;
> import org.apache.wicket.model.Model;
> public class TestDropDown extends WebPage
> {
>       private ArrayList<User> users;
>       
>       public TestDropDown()
>       {
>               users = new ArrayList<User>();
>               users.add(new User(10, "Sebastien Briquet", 1));
>               users.add(new User(20, "Igor Vaynberg", 2));
>               
>               List<IColumn<User>> columns = new ArrayList<IColumn<User>>();
>               columns.add(new PropertyColumn<User>(new Model<String>("Id"), 
> "id"));
>               columns.add(new PropertyColumn<User>(new Model<String>("Name"), 
> "name"));
>               columns.add(new ChoiceFilteredPropertyColumn<User, Role>(new 
> Model<String>("Role"), "roleId", new RoleChoiceModel())
>               {
>                       private static final long serialVersionUID = 1L;
>                       
>                       @Override
>                       protected IChoiceRenderer<Role> getChoiceRenderer()
>                       {
> //                            return new ChoiceRenderer<Role>("name"); // 
> this "works", because of the Role#toString, but the selection isn't memorized
>                               return new ChoiceRenderer<Role>("name", "id") {
>                                       private static final long 
> serialVersionUID = 1L;
>                                       
>                                       @Override
>                                       public String getIdValue(Role object, 
> int index) // FIXME java.lang.ClassCastException: java.lang.Integer cannot be 
> cast to Role
>                                       {
>                                               return super.getIdValue(object, 
> index);
>                                       }
>                               };
>                       }
>               });
>               
>               UserDataProvider dataProvider = new UserDataProvider(users);
>               
>               FilterForm form = new FilterForm("filter-form", dataProvider);
>               this.add(form);
>               DataTable<User> table = new DefaultDataTable<User>("table", 
> columns, dataProvider, 5);
>               table.addTopToolbar(new FilterToolbar(table, form, 
> dataProvider));
>               form.add(table);
>       }       
> }
> class RoleChoiceModel extends LoadableDetachableModel<List<? extends Role>>
> {
>       private static final long serialVersionUID = 1L;
>       private ArrayList<Role> roles;
>       @Override
>       protected List<? extends Role> load()
>       {
>               if(roles == null)
>               {
>                       roles = new ArrayList<Role>();
>                       roles.add(new Role(1, "User"));
>                       roles.add(new Role(2, "Master"));
>               }
>               return roles;
>       }
> }
> class UserDataProvider extends SortableDataProvider<User> implements 
> IFilterStateLocator
> {
>       private static final long serialVersionUID = 1L;
>       private ArrayList<User> users;
>       private User filter = new User();
>       
>       public UserDataProvider(ArrayList<User> users)
>       {
>               this.users = users;
>       }
>       public Iterator<? extends User> iterator(int first, int count)
>       {
>               ArrayList<User> list = new ArrayList<User>();
>               
>               for(User user : users)
>               {
>                       if(filter.getRoleId() == 0 || filter.getRoleId() == 
> user.getRoleId())
>                               list.add(user);
>               }
>               
>               return list.iterator();
>       }
>       public IModel<User> model(User object)
>       {
>               return new Model<User>(object);
>       }
>       public int size()
>       {
>               return users.size();
>       }
>       public Object getFilterState()
>       {
>               return filter;
>       }
>       public void setFilterState(Object state)
>       {
>               filter = (User) state;
>       }
> }
> class User implements IClusterable
> {
>       private static final long serialVersionUID = 1L;
>       
>       private int id;
>       private String name;
>       private int roleId;
>       
>       public User()
>       {
>               this(0, null, 0);
>       }
>       public User(int id, String name, int roleId)
>       {
>               this.id = id;
>               this.name = name;
>               this.roleId = roleId;
>       }
>       public int getId()
>       {
>               return id;
>       }
>       public String getName()
>       {
>               return name;
>       }
>       public int getRoleId()
>       {
>               return roleId;
>       }
> }
> class Role implements IClusterable
> {
>       private static final long serialVersionUID = 1L;
>       
>       private int id;
>       private String name;
>       
>       public Role(int id, String name)
>       {
>               this.id = id;
>               this.name = name;
>       }
>       public int getId()
>       {
>               return id;
>       }
>       public String getName()
>       {
>               return name;
>       }
>       @Override
>       public String toString()
>       {
>               return Integer.toString(this.id);
>       }
> }
> ----- HTML Markup -----
> <html 
> xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"; >
> <head>
> </head>
> <body>
>       <form wicket:id="filter-form">
>               <input wicket:id="focus-tracker" type="hidden" name="tracker" />
>               <span wicket:id="focus-restore"></span>
>               <table wicket:id="table" width="300" border="1" />
>       </form>
> </body>
> </html>
> ----- Stack Trace -----
> ava.lang.ClassCastException: java.lang.Integer cannot be cast to 
> com.amadeus.ppl.intranet.samples.Role
>      at 
> com.amadeus.ppl.intranet.samples.TestDropDown$1$1.getIdValue(TestDropDown.java:1)
>      at 
> org.apache.wicket.markup.html.form.AbstractSingleSelectChoice.getModelValue(AbstractSingleSelectChoice.java:166)
>      at 
> org.apache.wicket.markup.html.form.FormComponent.getValue(FormComponent.java:896)
>      at 
> org.apache.wicket.markup.html.form.AbstractChoice.onComponentTagBody(AbstractChoice.java:352)
>      at org.apache.wicket.Component.renderComponent(Component.java:2626)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to