Author: svenmeier
Date: Sun Jul 17 10:32:05 2011
New Revision: 1147575

URL: http://svn.apache.org/viewvc?rev=1147575&view=rev
Log:
WICKET-2762 multiple fileuploads in one http-session

Modified:
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/MultipartServletWebRequestImpl.java
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
    
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java
    
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadStatusResource.java
    
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java?rev=1147575&r1=1147574&r2=1147575&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
 Sun Jul 17 10:32:05 2011
@@ -54,8 +54,8 @@ import org.apache.wicket.util.string.App
 import org.apache.wicket.util.string.PrependingStringBuffer;
 import org.apache.wicket.util.string.Strings;
 import org.apache.wicket.util.string.interpolator.MapVariableInterpolator;
-import org.apache.wicket.util.upload.FileUploadBase.SizeLimitExceededException;
 import org.apache.wicket.util.upload.FileUploadException;
+import org.apache.wicket.util.upload.FileUploadBase.SizeLimitExceededException;
 import org.apache.wicket.util.value.LongValue;
 import org.apache.wicket.util.visit.ClassVisitFilter;
 import org.apache.wicket.util.visit.IVisit;
@@ -536,12 +536,8 @@ public class Form<T> extends WebMarkupCo
 
                Form<?> root = getRootForm();
                return new 
AppendingStringBuffer("document.getElementById('").append(
-                       root.getHiddenFieldId())
-                       .append("').value='")
-                       .append(url)
-                       .append("';document.getElementById('")
-                       .append(root.getMarkupId())
-                       .append("').submit();");
+                       
root.getHiddenFieldId()).append("').value='").append(url).append(
+                       
"';document.getElementById('").append(root.getMarkupId()).append("').submit();");
        }
 
        /**
@@ -1279,7 +1275,8 @@ public class Form<T> extends WebMarkupCo
                        try
                        {
                                ServletWebRequest request = 
(ServletWebRequest)getRequest();
-                               final WebRequest multipartWebRequest = 
request.newMultipartWebRequest(getMaxSize());
+                               final WebRequest multipartWebRequest = 
request.newMultipartWebRequest(getMaxSize(),
+                                       getPage().getId());
                                // TODO: Can't this be detected from header?
                                
getRequestCycle().setRequest(multipartWebRequest);
                        }
@@ -1554,11 +1551,8 @@ public class Form<T> extends WebMarkupCo
 
                        // render the hidden field
                        AppendingStringBuffer buffer = new 
AppendingStringBuffer(HIDDEN_DIV_START).append(
-                               "<input type=\"hidden\" name=\"")
-                               .append(nameAndId)
-                               .append("\" id=\"")
-                               .append(nameAndId)
-                               .append("\" />");
+                               "<input type=\"hidden\" 
name=\"").append(nameAndId).append("\" id=\"").append(
+                               nameAndId).append("\" />");
 
                        // if it's a get, did put the parameters in the action 
attribute,
                        // and have to write the url parameters as hidden fields
@@ -1600,11 +1594,8 @@ public class Form<T> extends WebMarkupCo
                {
                        String[] pair = Strings.split(param, '=');
 
-                       buffer.append("<input type=\"hidden\" name=\"")
-                               .append(recode(pair[0]))
-                               .append("\" value=\"")
-                               .append(pair.length > 1 ? recode(pair[1]) : "")
-                               .append("\" />");
+                       buffer.append("<input type=\"hidden\" 
name=\"").append(recode(pair[0])).append(
+                               "\" value=\"").append(pair.length > 1 ? 
recode(pair[1]) : "").append("\" />");
                }
        }
 

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/MultipartServletWebRequestImpl.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/MultipartServletWebRequestImpl.java?rev=1147575&r1=1147574&r2=1147575&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/MultipartServletWebRequestImpl.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/MultipartServletWebRequestImpl.java
 Sun Jul 17 10:32:05 2011
@@ -58,6 +58,7 @@ public class MultipartServletWebRequestI
        /** Map of parameters. */
        private final ValueMap parameters = new ValueMap();
 
+       private String upload;
 
        /**
         * total bytes uploaded (downloaded from server's pov) so far. used for 
upload notifications
@@ -67,7 +68,6 @@ public class MultipartServletWebRequestI
        /** content length cache, used for upload notifications */
        private int totalBytes;
 
-
        /**
         * Constructor.
         * 
@@ -75,6 +75,8 @@ public class MultipartServletWebRequestI
         * 
         * @param maxSize
         *            the maximum size allowed for this request
+        * @param upload
+        *            upload identifier for {@link UploadInfo}
         * @param request
         *            the servlet request
         * @param filterPrefix
@@ -83,9 +85,9 @@ public class MultipartServletWebRequestI
         *             Thrown if something goes wrong with upload
         */
        public MultipartServletWebRequestImpl(HttpServletRequest request, 
String filterPrefix,
-               Bytes maxSize) throws FileUploadException
+               Bytes maxSize, String upload) throws FileUploadException
        {
-               this(request, filterPrefix, maxSize, new 
DiskFileItemFactory(Application.get()
+               this(request, filterPrefix, maxSize, upload, new 
DiskFileItemFactory(Application.get()
                        .getResourceSettings()
                        .getFileCleaner()));
        }
@@ -95,6 +97,8 @@ public class MultipartServletWebRequestI
         * 
         * @param maxSize
         *            the maximum size allowed for this request
+        * @param upload
+        *            upload identifier for {@link UploadInfo}
         * @param request
         *            the servlet request
         * @param filterPrefix
@@ -106,14 +110,13 @@ public class MultipartServletWebRequestI
         *             Thrown if something goes wrong with upload
         */
        public MultipartServletWebRequestImpl(HttpServletRequest request, 
String filterPrefix,
-               Bytes maxSize, FileItemFactory factory) throws 
FileUploadException
+               Bytes maxSize, String upload, FileItemFactory factory) throws 
FileUploadException
        {
                super(request, filterPrefix);
 
-               if (maxSize == null)
-               {
-                       throw new IllegalArgumentException("argument maxSize 
must be not null");
-               }
+               Args.notNull(maxSize, "maxSize");
+               Args.notNull(upload, "upload");
+               this.upload = upload;
 
                // Check that request is multipart
                final boolean isMultipart = 
ServletFileUpload.isMultipartContent(request);
@@ -124,7 +127,7 @@ public class MultipartServletWebRequestI
                }
 
                // Configure the factory here, if desired.
-               ServletFileUpload upload = new ServletFileUpload(factory);
+               ServletFileUpload fileUpload = new ServletFileUpload(factory);
 
                // The encoding that will be used to decode the string 
parameters
                // It should NOT be null at this point, but it may be
@@ -142,10 +145,10 @@ public class MultipartServletWebRequestI
                // set encoding specifically when we found it
                if (encoding != null)
                {
-                       upload.setHeaderEncoding(encoding);
+                       fileUpload.setHeaderEncoding(encoding);
                }
 
-               upload.setSizeMax(maxSize.bytes());
+               fileUpload.setSizeMax(maxSize.bytes());
 
                final List<FileItem> items;
 
@@ -162,13 +165,13 @@ public class MultipartServletWebRequestI
                        totalBytes = request.getContentLength();
 
                        onUploadStarted(totalBytes);
-                       items = upload.parseRequest(ctx);
+                       items = fileUpload.parseRequest(ctx);
                        onUploadCompleted();
 
                }
                else
                {
-                       items = upload.parseRequest(request);
+                       items = fileUpload.parseRequest(request);
                }
 
                // Loop through items
@@ -301,7 +304,7 @@ public class MultipartServletWebRequestI
        {
                UploadInfo info = new UploadInfo(totalBytes);
 
-               setUploadInfo(getContainerRequest(), info);
+               setUploadInfo(getContainerRequest(), upload, info);
        }
 
        /**
@@ -313,7 +316,7 @@ public class MultipartServletWebRequestI
        protected void onUploadUpdate(int bytesUploaded, int total)
        {
                HttpServletRequest request = getContainerRequest();
-               UploadInfo info = getUploadInfo(request);
+               UploadInfo info = getUploadInfo(request, upload);
                if (info == null)
                {
                        throw new IllegalStateException(
@@ -321,7 +324,7 @@ public class MultipartServletWebRequestI
                }
                info.setBytesUploaded(bytesUploaded);
 
-               setUploadInfo(request, info);
+               setUploadInfo(request, upload, info);
        }
 
        /**
@@ -329,7 +332,7 @@ public class MultipartServletWebRequestI
         */
        protected void onUploadCompleted()
        {
-               clearUploadInfo(getContainerRequest());
+               clearUploadInfo(getContainerRequest(), upload);
        }
 
        /**
@@ -392,32 +395,39 @@ public class MultipartServletWebRequestI
        }
 
        @Override
-       public MultipartServletWebRequest newMultipartWebRequest(Bytes maxSize)
+       public MultipartServletWebRequest newMultipartWebRequest(Bytes maxSize, 
String upload)
                throws FileUploadException
        {
                return this;
        }
 
        @Override
-       public MultipartServletWebRequest newMultipartWebRequest(Bytes maxSize, 
FileItemFactory factory)
-               throws FileUploadException
+       public MultipartServletWebRequest newMultipartWebRequest(Bytes maxSize, 
String upload,
+               FileItemFactory factory) throws FileUploadException
        {
                return this;
        }
 
        private static final String SESSION_KEY = 
MultipartServletWebRequestImpl.class.getName();
 
+       private static String getSessionKey(String upload)
+       {
+               return SESSION_KEY + ":" + upload;
+       }
+
        /**
         * Retrieves {@link UploadInfo} from session, null if not found.
         * 
         * @param req
         *            http servlet request, not null
+        * @param upload
+        *            upload identifier
         * @return {@link UploadInfo} object from session, or null if not found
         */
-       public static UploadInfo getUploadInfo(final HttpServletRequest req)
+       public static UploadInfo getUploadInfo(final HttpServletRequest req, 
String upload)
        {
                Args.notNull(req, "req");
-               return (UploadInfo)req.getSession().getAttribute(SESSION_KEY);
+               return 
(UploadInfo)req.getSession().getAttribute(getSessionKey(upload));
        }
 
        /**
@@ -425,14 +435,18 @@ public class MultipartServletWebRequestI
         * 
         * @param req
         *            http servlet request, not null
+        * @param upload
+        *            upload identifier
         * @param uploadInfo
         *            {@link UploadInfo} object to be put into session, not null
         */
-       public static void setUploadInfo(final HttpServletRequest req, final 
UploadInfo uploadInfo)
+       public static void setUploadInfo(final HttpServletRequest req, String 
upload,
+               final UploadInfo uploadInfo)
        {
                Args.notNull(req, "req");
+               Args.notNull(upload, "upload");
                Args.notNull(uploadInfo, "uploadInfo");
-               req.getSession().setAttribute(SESSION_KEY, uploadInfo);
+               req.getSession().setAttribute(getSessionKey(upload), 
uploadInfo);
        }
 
        /**
@@ -440,10 +454,13 @@ public class MultipartServletWebRequestI
         * 
         * @param req
         *            http servlet request, not null
+        * @param upload
+        *            upload identifier
         */
-       public static void clearUploadInfo(final HttpServletRequest req)
+       public static void clearUploadInfo(final HttpServletRequest req, String 
upload)
        {
                Args.notNull(req, "req");
-               req.getSession().removeAttribute(SESSION_KEY);
+               Args.notNull(upload, "upload");
+               req.getSession().removeAttribute(getSessionKey(upload));
        }
 }
\ No newline at end of file

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java?rev=1147575&r1=1147574&r2=1147575&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
 Sun Jul 17 10:32:05 2011
@@ -378,28 +378,33 @@ public class ServletWebRequest extends W
         * Creates multipart web request from this request.
         * 
         * @param maxSize
+        * @param upload
+        *            upload identifier for {@link UploadInfo}
         * @return multipart request
         * @throws FileUploadException
         */
-       public MultipartServletWebRequest newMultipartWebRequest(Bytes maxSize)
+       public MultipartServletWebRequest newMultipartWebRequest(Bytes maxSize, 
String upload)
                throws FileUploadException
        {
-               return new 
MultipartServletWebRequestImpl(getContainerRequest(), filterPrefix, maxSize);
+               return new 
MultipartServletWebRequestImpl(getContainerRequest(), filterPrefix, maxSize,
+                       upload);
        }
 
        /**
         * Creates multipart web request from this request.
         * 
         * @param maxSize
+        * @param upload
+        *            upload identifier for {@link UploadInfo}
         * @param factory
         * @return multipart request
         * @throws FileUploadException
         */
-       public MultipartServletWebRequest newMultipartWebRequest(Bytes maxSize, 
FileItemFactory factory)
-               throws FileUploadException
+       public MultipartServletWebRequest newMultipartWebRequest(Bytes maxSize, 
String upload,
+               FileItemFactory factory) throws FileUploadException
        {
                return new 
MultipartServletWebRequestImpl(getContainerRequest(), filterPrefix, maxSize,
-                       factory);
+                       upload, factory);
        }
 
        private static final Logger logger = 
LoggerFactory.getLogger(ServletWebRequest.class);

Modified: 
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java?rev=1147575&r1=1147574&r2=1147575&view=diff
==============================================================================
--- 
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java
 (original)
+++ 
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java
 Sun Jul 17 10:32:05 2011
@@ -218,7 +218,7 @@ public class UploadProgressBar extends P
                final String status = new 
StringResourceModel("UploadProgressBar.starting", this,
                        (IModel<?>)null, "Upload starting...").getString();
 
-               CharSequence url = urlFor(ref, null);
+               CharSequence url = urlFor(ref, 
UploadStatusResource.newParameter(getPage().getId()));
 
                StringBuilder builder = new StringBuilder(128);
                Formatter formatter = new Formatter(builder);

Modified: 
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadStatusResource.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadStatusResource.java?rev=1147575&r1=1147574&r2=1147575&view=diff
==============================================================================
--- 
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadStatusResource.java
 (original)
+++ 
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadStatusResource.java
 Sun Jul 17 10:32:05 2011
@@ -24,6 +24,7 @@ import org.apache.wicket.model.Model;
 import org.apache.wicket.model.StringResourceModel;
 import org.apache.wicket.protocol.http.servlet.MultipartServletWebRequestImpl;
 import org.apache.wicket.protocol.http.servlet.UploadInfo;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.AbstractResource;
 
 /**
@@ -41,6 +42,8 @@ class UploadStatusResource extends Abstr
 
        private static final long serialVersionUID = 1L;
 
+       private static final String UPLOAD_PARAMETER = "upload";
+
        /**
         * Resource key used to retrieve status message for.
         * 
@@ -77,7 +80,7 @@ class UploadStatusResource extends Abstr
 
        /**
         * @param attributes
-        * @return Status string with progress data that will feed the 
progressbar.js variables on
+        * @return status string with progress data that will feed the 
progressbar.js variables on
         *         browser to update the progress bar
         */
        private String getStatus(final Attributes attributes)
@@ -85,7 +88,9 @@ class UploadStatusResource extends Abstr
                final HttpServletRequest req = 
(HttpServletRequest)attributes.getRequest()
                        .getContainerRequest();
 
-               UploadInfo info = 
MultipartServletWebRequestImpl.getUploadInfo(req);
+               final String upload = req.getParameter(UPLOAD_PARAMETER);
+
+               UploadInfo info = 
MultipartServletWebRequestImpl.getUploadInfo(req, upload);
 
                String status = null;
                if ((info == null) || (info.getTotalBytes() < 1))
@@ -104,4 +109,16 @@ class UploadStatusResource extends Abstr
                }
                return status;
        }
-}
+
+       /**
+        * Create a new parameter for the given identifier of a {@link 
UploadInfo}.
+        * 
+        * @param upload
+        *            identifier
+        * @return page parameter suitable for URLs to this resource
+        */
+       public static PageParameters newParameter(String upload)
+       {
+               return new PageParameters().add(UPLOAD_PARAMETER, upload);
+       }
+}
\ No newline at end of file

Modified: 
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js?rev=1147575&r1=1147574&r2=1147575&view=diff
==============================================================================
--- 
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js
 (original)
+++ 
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js
 Sun Jul 17 10:32:05 2011
@@ -77,7 +77,7 @@ Wicket.WUPB.prototype = {
        },
 
        load : function() {
-               var URL = this.url + '?anticache=' + Math.random();
+               var URL = this.url + '&anticache=' + Math.random();
                
        this.iframe = Wicket._createIFrame(""+Math.random());
                


Reply via email to