You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "Sergiy Yevtushenko (JIRA)" <ji...@apache.org> on 2008/02/11 13:04:08 UTC
[jira] Commented: (WICKET-1331) getModelValue() in
AbstractSingleSelectChoice and ListMultipleChoice can't handle complex list
items type correctly
[ https://issues.apache.org/jira/browse/WICKET-1331?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12567597#action_12567597 ]
Sergiy Yevtushenko commented on WICKET-1331:
--------------------------------------------
I've attached test project based on quickstart which exposes the issue - attempt to access home page fails with following exception (relevant part):
org.apache.wicket.WicketRuntimeException: No get method defined for class: class java.lang.Long expression: id
at org.apache.wicket.util.lang.PropertyResolver.getGetAndSetter(PropertyResolver.java:433)
at org.apache.wicket.util.lang.PropertyResolver.getObjectAndGetSetter(PropertyResolver.java:275)
at org.apache.wicket.util.lang.PropertyResolver.getValue(PropertyResolver.java:84)
at org.apache.wicket.markup.html.form.ChoiceRenderer.getIdValue(ChoiceRenderer.java:140)
at org.apache.wicket.markup.html.form.AbstractSingleSelectChoice.getModelValue(AbstractSingleSelectChoice.java:144)
at org.apache.wicket.markup.html.form.FormComponent.getValue(FormComponent.java:744)
at org.apache.wicket.markup.html.form.AbstractChoice.onComponentTagBody(AbstractChoice.java:344)
...
If in HomePage.java make following changes:
...
// default AbstractSingleSelectChoice.getModelValue():
//form.add(new DropDownChoice("option", getList(), new ChoiceRenderer("name", "id"))); <-----
// Overridden AbstractSingleSelectChoice.getModelValue();
form.add(new ModifiedDropDownChoice("option", getList(), new ChoiceRenderer("name", "id"))); //<-----
...
then home page is rendered properly. Also, this test application seems expose another issue which I didn't see before - attempt to submit for traps. Debugging shows that in this case entire choice list item is passed without conversion. I've not digged deeper.
> getModelValue() in AbstractSingleSelectChoice and ListMultipleChoice can't handle complex list items type correctly
> -------------------------------------------------------------------------------------------------------------------
>
> Key: WICKET-1331
> URL: https://issues.apache.org/jira/browse/WICKET-1331
> Project: Wicket
> Issue Type: Bug
> Components: wicket
> Affects Versions: 1.3.0-final, 1.3.1
> Environment: Suse 10.3, JRE 1.6 (1.6.0_04-b12), jetty 6.1.7
> Reporter: Sergiy Yevtushenko
> Assignee: Igor Vaynberg
> Original Estimate: 0.5h
> Remaining Estimate: 0.5h
>
> AbstractSingleSelectChoice.getModelValue() implementation uses List.indexOf() to find the key and this causes problems if list of choices contains complex values rather than simple list of String instances. In this case indexOf() returns -1 and this can't be resolved by overriding equals() for list elements. This happens because internally AbstractList.indexOf() invokes equals() method of passed key value passing it list items as a parameter. Also, current implementation may pass key returned by getModelObject() to IChoiceRender, while it expects values from list of items. Correct implementation of this method may look so:
> -------------------------
> public String getModelValue()
> {
> // @@ Modified by SIY
> Object object = getModelObject();
> if (object != null)
> {
> // compare choice items with given keys and pass down
> // to IChoiceRenderer list item rather than key
> Iterator iter = getChoices().iterator();
> int i = 0;
> while (iter.hasNext())
> {
> Object obj = iter.next();
> if (obj != null && obj.equals(object))
> {
> object = obj;
> break;
> }
> i++;
> }
> if (i > getChoices().size())
> i = -1;
> return getChoiceRenderer().getIdValue(object, i);
> }
> return NO_SELECTION_VALUE;
> }
> -----------------------------------
> Similar issues also present in ListMultipleChoice.getModelValue(), but they can't be resolved by overriding this method in subclass because this method declared final.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.