You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "Torsten Krah (JIRA)" <ji...@apache.org> on 2016/09/29 16:03:20 UTC

[jira] [Created] (WICKET-6250) FileUploadField does not deteach models and fails to null the reference to the transient fileUploads field if forceCloseStreamsOnDetach is false

Torsten Krah created WICKET-6250:
------------------------------------

             Summary: FileUploadField does not deteach models and fails to null the reference to the transient fileUploads field if forceCloseStreamsOnDetach is false
                 Key: WICKET-6250
                 URL: https://issues.apache.org/jira/browse/WICKET-6250
             Project: Wicket
          Issue Type: Bug
          Components: wicket
    Affects Versions: 6.24.0
            Reporter: Torsten Krah


FileUpload does not clear our references and its model when the forceCloseStreamsOnDetach is false - which does not match the expectation from the javadoc:

{code}
  /**                                                                 
   * The FileUploadField will close any input streams you have opened in its FileUpload by
   * default. If you wish to manage the stream yourself (e.g. you want to use it in another
   * thread) then you can override this method to prevent this behavior.
   *                                                                  
   * @return <code>true</code> if stream should be closed at the end of request
   */   
{code}

So it just is about not closing the streams.
However the fileupload component does not only *not* close the streams - it also *fails* (if you return false from the *forceCloseStreamsOnDetach* method) to reset the model and forget about the current file uploads cached in the transient fileUploads variable.

{code}
  protected void onDetach()                                           
  {                                                                   
    if ((fileUploads != null) && forceCloseStreamsOnDetach())         
    {                                                                 
      for (FileUpload fu : fileUploads)                               
      {                                                               
        fu.closeStreams();                                            
      }                                                               
      fileUploads = null;                                             
                                                                      
      if (getModel() != null)                                         
      {                                                               
        getModel().setObject(null);                                   
      }                                                               
    }                                                                 
    super.onDetach();                                                 
  }  
{code}

Shouldn't that read more like this:

{code}
  protected void onDetach()                                           
  {                                                                   
    if ((fileUploads != null))         
    { 
      if(forceCloseStreamsOnDetach() {
	 for (FileUpload fu : fileUploads)                               
	 {                                                               
	  fu.closeStreams();                                            
	 }                                                               
      }
      fileUploads = null;                                             
                                                                      
      if (getModel() != null)                                         
      {                                                               
        getModel().setObject(null);                                   
      }                                                               
    }                                                                 
    super.onDetach();                                                 
  }  
{code}

In this case my streams wouldn't be closed but you could provide new streams in the next request.

As the variable is private and i don't want to close the stream i have to use reflection at the moment to reset the field to null in an overridden onDeteach().




--
This message was sent by Atlassian JIRA
(v6.3.4#6332)