You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "Anton Vodonosov (JIRA)" <ji...@apache.org> on 2010/03/30 23:18:27 UTC
[jira] Created: (WICKET-2811) ListMultipleChoice: updateModel
method looses the value submitted from the select control
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
ListMultipleChoice looses the value submitted from client in certain conditions.
This is because the collection returned by convertInput() 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 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 returns 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.
[jira] Updated: (WICKET-2811) ListMultipleChoice: updateModel
method looses the value submitted from the select control
Posted by "Anton Vodonosov (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/jira/browse/WICKET-2811?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Anton Vodonosov updated WICKET-2811:
------------------------------------
Description:
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 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);
was:
ListMultipleChoice looses the value submitted from client in certain conditions.
This is because the collection returned by convertInput() 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 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 returns 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);
> 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
> 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 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.
[jira] Updated: (WICKET-2811) ListMultipleChoice: updateModel
method looses the value submitted from the select control
Posted by "Anton Vodonosov (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/jira/browse/WICKET-2811?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Anton Vodonosov updated WICKET-2811:
------------------------------------
Description:
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 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);
was:
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 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);
> 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
> 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 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.
[jira] Commented: (WICKET-2811) ListMultipleChoice: updateModel
method looses the value submitted from the select control
Posted by "Mike Hefner (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/jira/browse/WICKET-2811?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12902676#action_12902676 ]
Mike Hefner commented on WICKET-2811:
-------------------------------------
Bug was fixed on 4/2/10 in ListMultipleChoice.java revision # 930432
> 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
> 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.
[jira] Updated: (WICKET-2811) ListMultipleChoice: updateModel
method looses the value submitted from the select control
Posted by "Anton Vodonosov (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/jira/browse/WICKET-2811?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Anton Vodonosov updated WICKET-2811:
------------------------------------
Description:
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);
was:
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 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);
> 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
> 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.
[jira] Resolved: (WICKET-2811) ListMultipleChoice: updateModel
method looses the value submitted from the select control
Posted by "Igor Vaynberg (JIRA)" <ji...@apache.org>.
[ 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.
[jira] Updated: (WICKET-2811) ListMultipleChoice: updateModel
method looses the value submitted from the select control
Posted by "Anton Vodonosov (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/jira/browse/WICKET-2811?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Anton Vodonosov updated WICKET-2811:
------------------------------------
Attachment: ListMultiBugPage.html
ListMultiBugPage.java
> 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
> 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 convertInput() 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 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 returns 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.