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.