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 19:04:10 UTC

[jira] Issue Comment Edited: (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=12567729#action_12567729 ] 

evsi edited comment on WICKET-1331 at 2/11/08 10:03 AM:
----------------------------------------------------------------------

Initially I met the same issue with POJO which had two string members and symptoms were the same - attempt to resolve property for simple type (that time is was String). Also, I've tried to replace ChoiceRenderer with custom one. This approach resolves a trap, but does not resolve two other issues: 
1. under some circumstances IChoiceRenderer.getDisplayValue() can be invoked with key (field model value) rather than choice list item (this happens when key can't be found in choice list).
2. Initial value set incorrectly (for the same reason - selected item can't be determined).

Proposed version of getModelValue() resolves these issue if choice list item has proper equals() method.

      was (Author: evsi):
    Initially I met the same issue with POJO which has two string members and symptoms were the same - attempt to resolve property for simple type (that time is was String). Also, I've tried to replace ChoiceRenderer with custom one. This approach resolves a trap, but does not resolve two other issues: 
1. under some circumstances IChoiceRenderer.getDisplayValue() can be invoked with key (field model value) rather than choice list item (this happens when key can't be found in choice list).
2. Initial value set incorrectly (for the same reason - selected item can't be determined).

Proposed version of getModelValue() resolves these issue if choice list item has proper equals() method.
  
> 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
>         Attachments: testproject.zip
>
>   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.