You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "Igor Vaynberg (JIRA)" <ji...@apache.org> on 2010/08/26 02:29:18 UTC

[jira] Resolved: (WICKET-2811) ListMultipleChoice: updateModel method looses the value submitted from the select control

     [ https://issues.apache.org/jira/browse/WICKET-2811?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Igor Vaynberg resolved WICKET-2811.
-----------------------------------

      Assignee: Igor Vaynberg
    Resolution: Fixed

thanks for the heads up

> ListMultipleChoice: updateModel method looses the value submitted from the select control 
> ------------------------------------------------------------------------------------------
>
>                 Key: WICKET-2811
>                 URL: https://issues.apache.org/jira/browse/WICKET-2811
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket
>    Affects Versions: 1.4.6
>            Reporter: Anton Vodonosov
>            Assignee: Igor Vaynberg
>         Attachments: ListMultiBugPage.html, ListMultiBugPage.java
>
>   Original Estimate: 1h
>  Remaining Estimate: 1h
>
> ListMultipleChoice looses the value submitted from client in certain conditions. 
> This is because the collection returned by getConvertedInput() is passed to model.setObject(); and later, when the model is modified, converted input is affected too. (see ListMultipleChoice.java, line 344 in svn revision 929271).
> Simple page reproducing this bug under wicket 1.4.6 is attached.
> Key points in the code, required to reproduce the problem:
> 1. The Form component is wrapped by a Border component
> 2. The model used flor ListMultipleChoice initially returns null from the getObject() method. 
> To see the error open the attached page in browser, select something in the list, press Submit.
> Resulting message in the feedback panel will be: "submitted values: []", i.e. the  the submit handler sees empty list in the model.
> Expected: submit handler must see list of the values selected in the list by user.
> The reason of the error:
> 1. Method Form.internalUpdateFormComponentModels() in Wicket 1.4.6 calls 
>     ListMultipleChoice.updateModel() two times when the form is wrapped by a border:
>     private void internalUpdateFormComponentModels()
>     {
>         FormComponent.visitComponentsPostOrder(this, new FormModelUpdateVisitor(this));
>         MarkupContainer border = findParent(Border.class);
>         if (border != null)
>         {
>             FormComponent.visitComponentsPostOrder(border, new FormModelUpdateVisitor(this));
>         }
>     }
> 2. On the first call of the ListMultipleChoice.updateModel the result of getConvertedInput() 
>     is stored in the model (line 344).
>     Now model and getConvertedInput() share the same collection.
>     On the second call, the collection retrieved from model is cleared (line 326), and 
>     then getConvertedInput() is used again (but now it returns the empty collection) 
> 314 public void updateModel()
> 315 {
> 316     Collection<T> selectedValues = getModelObject();
> 317     if (selectedValues != null)
> 318     {
> ...
> 326         selectedValues.clear();
> 327         selectedValues.addAll(getConvertedInput());
> ...
> 340     }
> 341     else
> 342     {
> 343         selectedValues = getConvertedInput();
> 344         setDefaultModelObject(selectedValues);
> 345     }
> 346 }
> I would suggest to not share the collection between getConvertedInput() and the model:
> 343     selectedValues = getConvertedInput();
>         selectedValues = new ArrayList<T>(selectedValues);
> 344     setDefaultModelObject(selectedValues);

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.