[ 
https://issues.apache.org/jira/browse/WICKET-1331?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12567856#action_12567856
 ] 

Matej Knopp commented on WICKET-1331:
-------------------------------------

What you do is just wrong. There is a contract specified on the equals method 
and you just violate it.

# public boolean equals(Object obj)  
#         {  
#             if (obj instanceof Long)  
#                 return id.equals(obj);  
#               

Your equals method is not symmetric. I really don't see why we should clutter 
wicket code with something like that just because you can't be bothered to 
write a proper choice renderer.


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

Reply via email to