[ 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.