Reviewers: rjrjr,

Description:
Ensure that EntityProxy instances returned from Collections returned
from an editable EntityProxy are editable.
Patch by: bobv
Review by: rjrjr
Found by: pjulien


Please review this at http://gwt-code-reviews.appspot.com/976801/show

Affected files:
M user/src/com/google/gwt/requestfactory/client/impl/EntityProxyCategory.java
  M user/test/com/google/gwt/requestfactory/client/RequestFactoryTest.java


Index: user/src/com/google/gwt/requestfactory/client/impl/EntityProxyCategory.java
===================================================================
--- user/src/com/google/gwt/requestfactory/client/impl/EntityProxyCategory.java (revision 8983) +++ user/src/com/google/gwt/requestfactory/client/impl/EntityProxyCategory.java (working copy)
@@ -49,8 +49,7 @@
     return stableId(bean).hashCode();
   }

-  public static AbstractRequestContext requestContext(
-      AutoBean<? extends EntityProxy> bean) {
+  public static AbstractRequestContext requestContext(AutoBean<?> bean) {
     return (AbstractRequestContext) bean.getTag(REQUEST_CONTEXT);
   }

@@ -70,13 +69,11 @@
    * EntityProxy, that its return values are mutable.
    */
   // CHECKSTYLE_OFF
-  public static <T> T __intercept(AutoBean<? extends EntityProxy> bean,
-      T returnValue) {
+  public static <T> T __intercept(AutoBean<?> bean, T returnValue) {
     // CHECKSTYLE_ON
-    if (!(returnValue instanceof EntityProxy)) {
-      return returnValue;
-    }
+
     AbstractRequestContext context = requestContext(bean);
+
     /*
      * The context will be null if the bean is immutable. If the context is
      * locked, don't try to edit.
@@ -85,8 +82,26 @@
       return returnValue;
     }

-    @SuppressWarnings("unchecked")
-    T toReturn = (T) context.edit((EntityProxy) returnValue);
-    return toReturn;
+    /*
+ * EntityProxies need to be recorded specially by the RequestContext, so
+     * delegate to the edit() method for wiring up the context.
+     */
+    if (returnValue instanceof EntityProxy) {
+      @SuppressWarnings("unchecked")
+      T toReturn = (T) context.edit((EntityProxy) returnValue);
+      return toReturn;
+    }
+
+    /*
+     * We're returning some object that's not an EntityProxy, most likely a
+ * Collection type. At the very least, propagate the current RequestContext
+     * so that editable chains can be constructed.
+     */
+    AutoBean<T> otherBean = AutoBeanUtils.getAutoBean(returnValue);
+    if (otherBean != null) {
+      otherBean.setTag(EntityProxyCategory.REQUEST_CONTEXT,
+          bean.getTag(EntityProxyCategory.REQUEST_CONTEXT));
+    }
+    return returnValue;
   }
 }
Index: user/test/com/google/gwt/requestfactory/client/RequestFactoryTest.java
===================================================================
--- user/test/com/google/gwt/requestfactory/client/RequestFactoryTest.java (revision 8983) +++ user/test/com/google/gwt/requestfactory/client/RequestFactoryTest.java (working copy)
@@ -1762,6 +1762,10 @@
       @Override
       public void onSuccess(SimpleFooProxy response) {
         assertEquals(2, response.getOneToManyField().size());
+
+ // Check lists of proxies returned from an mutable object are mutable
+        response = simpleFooRequest().edit(response);
+        response.getOneToManyField().get(0).setUserName("canMutate");
         finishTestAndReset();
       }
     });


--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to