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: Improvement
          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


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.

Reply via email to