You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by jd...@apache.org on 2011/04/23 11:19:46 UTC
svn commit: r1096125 - in /wicket/trunk:
wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/
wicket-core/src/main/java/org/apache/wicket/settings/
wicket-core/src/main/java/org/apache/wicket/settings/def/
wicket-examples/src/main/java/or...
Author: jdonnerstag
Date: Sat Apr 23 09:19:45 2011
New Revision: 1096125
URL: http://svn.apache.org/viewvc?rev=1096125&view=rev
Log:
applied: merge upload progress monitoring functionality into wicket-core
Issue: WICKET-3524
Added:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/UploadInfo.java
Removed:
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/MultipartRequest.java
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadInfo.java
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadWebRequest.java
Modified:
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/settings/IApplicationSettings.java
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/settings/def/ApplicationSettings.java
wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/upload/UploadApplication.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
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=1096125&r1=1096124&r2=1096125&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 Sat Apr 23 09:19:45 2011
@@ -28,6 +28,8 @@ import javax.servlet.http.HttpServletReq
import org.apache.wicket.Application;
import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.settings.IApplicationSettings;
+import org.apache.wicket.util.lang.Args;
import org.apache.wicket.util.lang.Bytes;
import org.apache.wicket.util.string.StringValue;
import org.apache.wicket.util.upload.DiskFileItemFactory;
@@ -280,13 +282,14 @@ public class MultipartServletWebRequestI
}
/**
- * Subclasses that want to receive upload notifications should return true
+ * Subclasses that want to receive upload notifications should return true. By default it takes
+ * the value from {@link IApplicationSettings#isUploadProgressUpdatesEnabled()}.
*
* @return true if upload status update event should be invoked
*/
protected boolean wantUploadProgressUpdates()
{
- return false;
+ return Application.get().getApplicationSettings().isUploadProgressUpdatesEnabled();
}
/**
@@ -296,7 +299,9 @@ public class MultipartServletWebRequestI
*/
protected void onUploadStarted(int totalBytes)
{
+ UploadInfo info = new UploadInfo(totalBytes);
+ setUploadInfo(getContainerRequest(), info);
}
/**
@@ -307,7 +312,16 @@ public class MultipartServletWebRequestI
*/
protected void onUploadUpdate(int bytesUploaded, int total)
{
+ HttpServletRequest request = getContainerRequest();
+ UploadInfo info = getUploadInfo(request);
+ if (info == null)
+ {
+ throw new IllegalStateException(
+ "could not find UploadInfo object in session which should have been set when uploaded started");
+ }
+ info.setBytesUploaded(bytesUploaded);
+ setUploadInfo(request, info);
}
/**
@@ -315,7 +329,7 @@ public class MultipartServletWebRequestI
*/
protected void onUploadCompleted()
{
-
+ clearUploadInfo(getContainerRequest());
}
/**
@@ -390,4 +404,46 @@ public class MultipartServletWebRequestI
{
return this;
}
+
+ private static final String SESSION_KEY = MultipartServletWebRequestImpl.class.getName();
+
+ /**
+ * Retrieves {@link UploadInfo} from session, null if not found.
+ *
+ * @param req
+ * http servlet request, not null
+ * @return {@link UploadInfo} object from session, or null if not found
+ */
+ public static UploadInfo getUploadInfo(final HttpServletRequest req)
+ {
+ Args.notNull(req, "req");
+ return (UploadInfo)req.getSession().getAttribute(SESSION_KEY);
+ }
+
+ /**
+ * Sets the {@link UploadInfo} object into session.
+ *
+ * @param req
+ * http servlet request, not null
+ * @param uploadInfo
+ * {@link UploadInfo} object to be put into session, not null
+ */
+ public static void setUploadInfo(final HttpServletRequest req, final UploadInfo uploadInfo)
+ {
+ Args.notNull(req, "req");
+ Args.notNull(uploadInfo, "uploadInfo");
+ req.getSession().setAttribute(SESSION_KEY, uploadInfo);
+ }
+
+ /**
+ * Clears the {@link UploadInfo} object from session if one exists.
+ *
+ * @param req
+ * http servlet request, not null
+ */
+ public static void clearUploadInfo(final HttpServletRequest req)
+ {
+ Args.notNull(req, "req");
+ req.getSession().removeAttribute(SESSION_KEY);
+ }
}
\ No newline at end of file
Added: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/UploadInfo.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/UploadInfo.java?rev=1096125&view=auto
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/UploadInfo.java (added)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/UploadInfo.java Sat Apr 23 09:19:45 2011
@@ -0,0 +1,158 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.protocol.http.servlet;
+
+import org.apache.wicket.IClusterable;
+import org.apache.wicket.util.lang.Bytes;
+import org.apache.wicket.util.time.Duration;
+
+
+/**
+ * Holds information about an upload, also has useful querying methods.
+ *
+ * @author Igor Vaynberg (ivaynberg)
+ *
+ */
+public class UploadInfo implements IClusterable
+{
+ private static final long serialVersionUID = 1L;
+
+ private transient long timeStarted;
+ private transient long totalBytes;
+ private transient long bytesUploaded;
+
+ /**
+ * @param totalBytes
+ */
+ public UploadInfo(final int totalBytes)
+ {
+ timeStarted = System.currentTimeMillis();
+ this.totalBytes = totalBytes;
+ }
+
+ /**
+ * @return bytes uploaded so far
+ */
+ public long getBytesUploaded()
+ {
+ return bytesUploaded;
+ }
+
+ /**
+ * Sets bytes uploaded so far
+ *
+ * @param bytesUploaded
+ */
+ public void setBytesUploaded(final long bytesUploaded)
+ {
+ this.bytesUploaded = bytesUploaded;
+ }
+
+ /**
+ * @return human readable string of bytes uploaded so far
+ */
+ public String getBytesUploadedString()
+ {
+ return Bytes.bytes(bytesUploaded).toString();
+ }
+
+ /**
+ * @return human readable string of total number of bytes
+ */
+ public String getTotalBytesString()
+ {
+ return Bytes.bytes(totalBytes).toString();
+ }
+
+ /**
+ * @return total bytes in the upload
+ */
+ public long getTotalBytes()
+ {
+ return totalBytes;
+ }
+
+ /**
+ * @return milliseconds elapsed since upload started
+ */
+ public long getElapsedMilliseconds()
+ {
+ return System.currentTimeMillis() - timeStarted;
+ }
+
+ /**
+ * @return seconds elapsed since upload started
+ */
+ public long getElapsedSeconds()
+ {
+ return getElapsedMilliseconds() / 1000L;
+ }
+
+
+ /**
+ * @return transfer rate in bits per second
+ */
+ public long getTransferRateBPS()
+ {
+ return bytesUploaded / Math.max(getElapsedSeconds(), 1);
+ }
+
+ /**
+ * @return transfer rate in a human readable string
+ */
+ public String getTransferRateString()
+ {
+ return Bytes.bytes(getTransferRateBPS()).toString() + "/s";
+ }
+
+ /**
+ * @return percent of the upload completed
+ */
+ public int getPercentageComplete()
+ {
+ if (totalBytes == 0)
+ {
+ return 100;
+ }
+ return (int)(((double)bytesUploaded / (double)totalBytes) * 100);
+
+ }
+
+ /**
+ * @return estimate of the remaining number of milliseconds
+ */
+ public long getRemainingMilliseconds()
+ {
+ int percentageComplete = getPercentageComplete();
+
+
+ long totalTime = ((getElapsedSeconds() * 100) / Math.max(percentageComplete, 1));
+ long remainingTime = (totalTime - getElapsedSeconds());
+
+ return remainingTime * 1000; // convert seconds to milliseconds and return
+ }
+
+ /**
+ * @return estimate of the remaining time in a human readable string
+ */
+ public String getRemainingTimeString()
+ {
+ return Duration.milliseconds(getRemainingMilliseconds()).toString();
+ }
+
+
+}
Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/settings/IApplicationSettings.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/settings/IApplicationSettings.java?rev=1096125&r1=1096124&r2=1096125&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/settings/IApplicationSettings.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/settings/IApplicationSettings.java Sat Apr 23 09:19:45 2011
@@ -47,7 +47,7 @@ public interface IApplicationSettings
Class<? extends Page> getAccessDeniedPage();
/**
- * Gets the default resolver to use when finding classes and resources
+ * Gets the default resolver to use when finding classes and resources.
*
* @return Default class resolver
*/
@@ -78,6 +78,13 @@ public interface IApplicationSettings
Class<? extends Page> getPageExpiredErrorPage();
/**
+ * Gets whether wicket is providing updates about the upload progress or not.
+ *
+ * @return if true upload progress monitoring is enabled
+ */
+ boolean isUploadProgressUpdatesEnabled();
+
+ /**
* Sets the access denied page class. The class must be bookmarkable and must extend Page.
*
* @param accessDeniedPage
@@ -86,7 +93,7 @@ public interface IApplicationSettings
void setAccessDeniedPage(final Class<? extends Page> accessDeniedPage);
/**
- * Sets the default class resolver to use when finding classes and resources
+ * Sets the default class resolver to use when finding classes and resources.
*
* @param defaultClassResolver
* The default class resolver
@@ -117,4 +124,12 @@ public interface IApplicationSettings
* The pageExpiredErrorPage to set.
*/
void setPageExpiredErrorPage(final Class<? extends Page> pageExpiredErrorPage);
+
+ /**
+ * Sets whether wicket should provide updates about the upload progress or not.
+ *
+ * @param uploadProgressUpdatesEnabled
+ * if true upload progress monitoring is enabled
+ */
+ void setUploadProgressUpdatesEnabled(boolean uploadProgressUpdatesEnabled);
}
Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/settings/def/ApplicationSettings.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/settings/def/ApplicationSettings.java?rev=1096125&r1=1096124&r2=1096125&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/settings/def/ApplicationSettings.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/settings/def/ApplicationSettings.java Sat Apr 23 09:19:45 2011
@@ -47,6 +47,8 @@ public class ApplicationSettings impleme
private Bytes defaultMaximumUploadSize = Bytes.MAX;
+ private boolean uploadProgressUpdatesEnabled = false;
+
/**
* @see org.apache.wicket.settings.IApplicationSettings#getAccessDeniedPage()
*/
@@ -85,6 +87,14 @@ public class ApplicationSettings impleme
}
/**
+ * @see org.apache.wicket.settings.IApplicationSettings#isUploadProgressUpdatesEnabled()
+ */
+ public boolean isUploadProgressUpdatesEnabled()
+ {
+ return uploadProgressUpdatesEnabled;
+ }
+
+ /**
* @see org.apache.wicket.settings.IApplicationSettings#setAccessDeniedPage(java.lang.Class)
*/
public void setAccessDeniedPage(Class<? extends Page> accessDeniedPage)
@@ -143,6 +153,14 @@ public class ApplicationSettings impleme
}
/**
+ * @see org.apache.wicket.settings.IApplicationSettings#setUploadProgressUpdatesEnabled(boolean)
+ */
+ public void setUploadProgressUpdatesEnabled(boolean uploadProgressUpdatesEnabled)
+ {
+ this.uploadProgressUpdatesEnabled = uploadProgressUpdatesEnabled;
+ }
+
+ /**
* Throws an IllegalArgumentException if the given class is not a subclass of Page.
*
* @param <C>
Modified: wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/upload/UploadApplication.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/upload/UploadApplication.java?rev=1096125&r1=1096124&r2=1096125&view=diff
==============================================================================
--- wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/upload/UploadApplication.java (original)
+++ wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/upload/UploadApplication.java Sat Apr 23 09:19:45 2011
@@ -16,12 +16,8 @@
*/
package org.apache.wicket.examples.upload;
-import javax.servlet.http.HttpServletRequest;
-
import org.apache.wicket.Page;
import org.apache.wicket.examples.WicketExampleApplication;
-import org.apache.wicket.extensions.ajax.markup.html.form.upload.UploadWebRequest;
-import org.apache.wicket.request.http.WebRequest;
import org.apache.wicket.request.mapper.MountedMapper;
import org.apache.wicket.util.file.Folder;
@@ -77,15 +73,6 @@ public class UploadApplication extends W
getRootRequestMapperAsCompound().add(new MountedMapper("/multi", MultiUploadPage.class));
getRootRequestMapperAsCompound().add(new MountedMapper("/single", UploadPage.class));
- }
-
- /**
- * @see org.apache.wicket.protocol.http.WebApplication#newWebRequest(javax.servlet.http.HttpServletRequest,
- * String)
- */
- @Override
- protected WebRequest newWebRequest(HttpServletRequest servletRequest, String filterPath)
- {
- return new UploadWebRequest(servletRequest, filterPath);
+ getApplicationSettings().setUploadProgressUpdatesEnabled(true);
}
}
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=1096125&r1=1096124&r2=1096125&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 Sat Apr 23 09:19:45 2011
@@ -30,7 +30,6 @@ import org.apache.wicket.markup.html.Wic
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.upload.FileUploadField;
import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.resource.PackageResourceReference;
import org.apache.wicket.request.resource.ResourceReference;
import org.apache.wicket.request.resource.SharedResourceReference;
@@ -42,8 +41,22 @@ import org.slf4j.LoggerFactory;
/**
* A panel to show the progress of an HTTP upload.
* <p>
- * NB: For this to work, you *must* use an {@link UploadWebRequest}. See the javadoc in that class
- * for details.
+ * Note: For this to work upload progress monitoring must be enabled in the wicket application.
+ * Example:
+ *
+ * <pre>
+ * <code>
+ * public class App extends WebApplication {
+ *
+ * @Override
+ * protected void init() {
+ * super.init();
+ *
+ * <b>getApplicationSettings().setUploadProgressUpdatesEnabled(true);</b> // <--
+ * }
+ * }
+ * </code>
+ * </pre>
*
* @author Andrew Lombardi
*/
@@ -144,12 +157,6 @@ public class UploadProgressBar extends P
statusDiv = new WebMarkupContainer("status");
statusDiv.setOutputMarkupId(true);
add(statusDiv);
-
- if (!(RequestCycle.get().getRequest() instanceof UploadWebRequest) &&
- !(RequestCycle.get().getRequest() instanceof MultipartRequest))
- {
- log.warn("UploadProgressBar will not work without an UploadWebRequest. See the javadoc for details.");
- }
}
/**
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=1096125&r1=1096124&r2=1096125&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 Sat Apr 23 09:19:45 2011
@@ -18,6 +18,8 @@ package org.apache.wicket.extensions.aja
import javax.servlet.http.HttpServletRequest;
+import org.apache.wicket.protocol.http.servlet.MultipartServletWebRequestImpl;
+import org.apache.wicket.protocol.http.servlet.UploadInfo;
import org.apache.wicket.request.resource.AbstractResource;
@@ -65,7 +67,7 @@ class UploadStatusResource extends Abstr
private String getStatus(final Attributes attributes)
{
HttpServletRequest req = (HttpServletRequest)attributes.getRequest().getContainerRequest();
- UploadInfo info = UploadWebRequest.getUploadInfo(req);
+ UploadInfo info = MultipartServletWebRequestImpl.getUploadInfo(req);
String status = null;
if ((info == null) || (info.getTotalBytes() < 1))