summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtur Signell <artur@vaadin.com>2013-02-08 09:40:25 +0200
committerArtur Signell <artur@vaadin.com>2013-02-08 09:41:58 +0200
commit613d2c044d1c3dfeeb54112e3030dbe62282e1fc (patch)
treeb137000d48536964399543eee74c7629e2918306
parent77aed50851264cf89025fcf0a082e83027d90f68 (diff)
downloadvaadin-framework-613d2c044d1c3dfeeb54112e3030dbe62282e1fc.tar.gz
vaadin-framework-613d2c044d1c3dfeeb54112e3030dbe62282e1fc.zip
Fixed race condition in upload (#10942)
Updated test to show if upload succeeds or fails Change-Id: Ia9c3a3d36a5dd163fbad59e8cc41d53aba3ccb5a
-rw-r--r--client/src/com/vaadin/client/ui/VUpload.java50
-rw-r--r--server/src/com/vaadin/ui/AbstractComponent.java2
-rw-r--r--uitest/src/com/vaadin/tests/components/upload/TestFileUpload.java21
3 files changed, 50 insertions, 23 deletions
diff --git a/client/src/com/vaadin/client/ui/VUpload.java b/client/src/com/vaadin/client/ui/VUpload.java
index f639e8f090..866a6ca4cf 100644
--- a/client/src/com/vaadin/client/ui/VUpload.java
+++ b/client/src/com/vaadin/client/ui/VUpload.java
@@ -18,6 +18,7 @@ package com.vaadin.client.ui;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.dom.client.DivElement;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.FormElement;
@@ -257,6 +258,32 @@ public class VUpload extends SimplePanel {
});
}
+ ScheduledCommand startUploadCmd = new ScheduledCommand() {
+
+ @Override
+ public void execute() {
+ element.submit();
+ submitted = true;
+
+ disableUpload();
+
+ /*
+ * Visit server a moment after upload has started to see possible
+ * changes from UploadStarted event. Will be cleared on complete.
+ */
+ t = new Timer() {
+ @Override
+ public void run() {
+ VConsole.log("Visiting server to see if upload started event changed UI.");
+ client.updateVariable(paintableId, "pollForStart",
+ nextUploadId, true);
+ }
+ };
+ t.schedule(800);
+ }
+
+ };
+
/** For internal use only. May be removed or replaced in the future. */
public void submit() {
if (fu.getFilename().length() == 0 || submitted || !enabled) {
@@ -267,25 +294,10 @@ public class VUpload extends SimplePanel {
// before upload
client.sendPendingVariableChanges();
- element.submit();
- submitted = true;
- VConsole.log("Submitted form");
-
- disableUpload();
-
- /*
- * Visit server a moment after upload has started to see possible
- * changes from UploadStarted event. Will be cleared on complete.
- */
- t = new Timer() {
- @Override
- public void run() {
- VConsole.log("Visiting server to see if upload started event changed UI.");
- client.updateVariable(paintableId, "pollForStart",
- nextUploadId, true);
- }
- };
- t.schedule(800);
+ // This is done as deferred because sendPendingVariableChanges is also
+ // deferred and we want to start the upload only after the changes have
+ // been sent to the server
+ Scheduler.get().scheduleDeferred(startUploadCmd);
}
@Override
diff --git a/server/src/com/vaadin/ui/AbstractComponent.java b/server/src/com/vaadin/ui/AbstractComponent.java
index 85c40e0d39..cdddcb02b0 100644
--- a/server/src/com/vaadin/ui/AbstractComponent.java
+++ b/server/src/com/vaadin/ui/AbstractComponent.java
@@ -532,7 +532,7 @@ public abstract class AbstractComponent extends AbstractClientConnector
*/
@Override
public boolean isReadOnly() {
- return getState().readOnly;
+ return ((AbstractComponentState) getState(false)).readOnly;
}
/*
diff --git a/uitest/src/com/vaadin/tests/components/upload/TestFileUpload.java b/uitest/src/com/vaadin/tests/components/upload/TestFileUpload.java
index ad86d0f593..b57c236b20 100644
--- a/uitest/src/com/vaadin/tests/components/upload/TestFileUpload.java
+++ b/uitest/src/com/vaadin/tests/components/upload/TestFileUpload.java
@@ -8,8 +8,11 @@ import org.apache.commons.codec.digest.DigestUtils;
import com.vaadin.tests.components.TestBase;
import com.vaadin.tests.util.Log;
import com.vaadin.ui.Upload;
-import com.vaadin.ui.Upload.FinishedEvent;
+import com.vaadin.ui.Upload.FailedEvent;
+import com.vaadin.ui.Upload.FailedListener;
import com.vaadin.ui.Upload.Receiver;
+import com.vaadin.ui.Upload.SucceededEvent;
+import com.vaadin.ui.Upload.SucceededListener;
public class TestFileUpload extends TestBase implements Receiver {
@@ -27,10 +30,22 @@ public class TestFileUpload extends TestBase implements Receiver {
}
});
u.setId("UPL");
- u.addListener(new Upload.FinishedListener() {
+ u.addFailedListener(new FailedListener() {
@Override
- public void uploadFinished(FinishedEvent event) {
+ public void uploadFailed(FailedEvent event) {
+ String hash = DigestUtils.md5Hex(baos.toByteArray());
+
+ log.log("<span style=\"color: red;\">Upload failed. Name: "
+ + event.getFilename() + ", Size: " + baos.size()
+ + ", md5: " + hash + "</span>");
+ baos.reset();
+ }
+ });
+ u.addSucceededListener(new SucceededListener() {
+
+ @Override
+ public void uploadSucceeded(SucceededEvent event) {
String hash = DigestUtils.md5Hex(baos.toByteArray());
log.log("Upload finished. Name: " + event.getFilename()
+ ", Size: " + baos.size() + ", md5: " + hash);