Integrate fix for issue 5752 into GWT 2.2 branch.
Don't flush RequestFactoryEditorDelegate when its associated request is locked.
git-svn-id: https://google-web-toolkit.googlecode.com/svn/releases/2.2@9546 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryEditorDelegate.java b/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryEditorDelegate.java
index 26fc76c..55b1ae3 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryEditorDelegate.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryEditorDelegate.java
@@ -28,6 +28,7 @@
import com.google.gwt.requestfactory.shared.RequestContext;
import com.google.gwt.requestfactory.shared.RequestFactory;
import com.google.gwt.requestfactory.shared.WriteOperation;
+import com.google.gwt.requestfactory.shared.impl.AbstractRequestContext;
import java.util.ArrayList;
import java.util.List;
@@ -93,7 +94,7 @@
*/
return null;
}
-
+
if (!(getObject() instanceof EntityProxy)) {
/*
* This is kind of weird. The user is asking for notifications on a
@@ -136,6 +137,12 @@
@Override
protected boolean shouldFlush() {
- return request != null;
+ if (request == null) {
+ return false;
+ }
+ if (request instanceof AbstractRequestContext) {
+ return !((AbstractRequestContext) request).isLocked();
+ }
+ return true;
}
}
diff --git a/user/test/com/google/gwt/requestfactory/client/ui/EditorTest.java b/user/test/com/google/gwt/requestfactory/client/ui/EditorTest.java
index d9b71ae..e2b7ecd 100644
--- a/user/test/com/google/gwt/requestfactory/client/ui/EditorTest.java
+++ b/user/test/com/google/gwt/requestfactory/client/ui/EditorTest.java
@@ -53,14 +53,14 @@
protected final SimpleEditor<String> userName = SimpleEditor.of();
}
- interface SimpleFooDriver extends
- RequestFactoryEditorDriver<SimpleFooProxy, SimpleFooEditor> {
- }
-
static class SimpleFooBarOnlyEditor implements Editor<SimpleFooProxy> {
SimpleBarEditor barField = new SimpleBarEditor();
}
+ interface SimpleFooDriver extends
+ RequestFactoryEditorDriver<SimpleFooProxy, SimpleFooEditor> {
+ }
+
static class SimpleFooEditor implements HasEditorErrors<SimpleFooProxy> {
/**
* Test field-based access.
@@ -163,6 +163,45 @@
assertNull(editor.delegate.subscribe());
}
+ /**
+ * Tests the editor can be re-used while the initial context is locked and
+ * therefore its attached proxies are frozen..
+ *
+ * @see http://code.google.com/p/google-web-toolkit/issues/detail?id=5752
+ */
+ public void testReuse() {
+ delayTestFinish(TEST_TIMEOUT);
+ final SimpleFooEditor editor = new SimpleFooEditor();
+
+ final SimpleFooDriver driver = GWT.create(SimpleFooDriver.class);
+ driver.initialize(req, editor);
+
+ req.simpleFooRequest().findSimpleFooById(1L).with(driver.getPaths()).fire(
+ new Receiver<SimpleFooProxy>() {
+ @Override
+ public void onSuccess(SimpleFooProxy response) {
+
+ SimpleFooRequest context = req.simpleFooRequest();
+ driver.edit(response, context);
+ editor.userName.setValue("One");
+ context.persistAndReturnSelf().using(response).with(
+ driver.getPaths()).to(new Receiver<SimpleFooProxy>() {
+ @Override
+ public void onSuccess(SimpleFooProxy response) {
+ assertEquals("One", response.getUserName());
+ // just testing that it doesn't throw (see issue 5752)
+ driver.edit(response, req.simpleFooRequest());
+ editor.userName.setValue("Two");
+ driver.flush();
+ finishTestAndReset();
+ }
+ });
+ // The fire() will freeze the proxies and lock the context
+ driver.flush().fire();
+ }
+ });
+ }
+
public void testSubscription() {
delayTestFinish(TEST_TIMEOUT);
final SimpleFooEditorWithDelegate editor = new SimpleFooEditorWithDelegate();
@@ -171,7 +210,7 @@
driver.initialize(req, editor);
String[] paths = driver.getPaths();
- assertEquals(Arrays.asList("barField.userName", "selfOneToManyField",
+ assertEquals(Arrays.asList("barField.userName", "selfOneToManyField",
"selfOneToManyField.barField", "barField"), Arrays.asList(paths));
req.simpleFooRequest().findSimpleFooById(1L).with(paths).fire(