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.