Revision: 8137
Author: [email protected]
Date: Thu May 13 15:53:04 2010
Log: Try to handle exceptions during the write operation more gracefully.

Patch by: amitmanjhi
Review by: rjrjr (tbr)

http://code.google.com/p/google-web-toolkit/source/detail?r=8137

Modified:
/branches/2.1/bikeshed/src/com/google/gwt/requestfactory/server/RequestFactoryServlet.java

=======================================
--- /branches/2.1/bikeshed/src/com/google/gwt/requestfactory/server/RequestFactoryServlet.java Wed May 12 20:20:59 2010 +++ /branches/2.1/bikeshed/src/com/google/gwt/requestfactory/server/RequestFactoryServlet.java Thu May 13 15:53:04 2010
@@ -188,53 +188,55 @@
    * </ol>
    */
   JSONObject updateRecordInDataStore(String recordToken,
-      JSONObject recordObject, WriteOperation writeOperation)
- throws SecurityException, NoSuchMethodException, IllegalAccessException,
-      InvocationTargetException, JSONException, InstantiationException {
-
-    Class<?> entity = tokenToEntityRecord.get(recordToken).entity;
- Class<? extends Record> record = tokenToEntityRecord.get(recordToken).record; - Map<String, Class<?>> propertiesInRecord = getPropertiesFromRecord(record);
-    validateKeys(recordObject, propertiesInRecord.keySet());
-    updatePropertyTypes(propertiesInRecord, entity);
-
-    // get entityInstance
-    Object entityInstance = getEntityInstance(writeOperation, entity,
-        recordObject.get("id"), propertiesInRecord.get("id"));
-
-    // persist
-    Set<ConstraintViolation<Object>> violations = null;
-    if (writeOperation == WriteOperation.DELETE) {
-      entity.getMethod("remove").invoke(entityInstance);
-    } else {
-      Iterator<?> keys = recordObject.keys();
-      while (keys.hasNext()) {
-        String key = (String) keys.next();
-        Class<?> propertyType = propertiesInRecord.get(key);
- if (writeOperation == WriteOperation.CREATE && ("id".equals(key))) {
-          // ignored. id is assigned by default.
-        } else {
- Object propertyValue = getPropertyValueFromRequest(recordObject, key,
-              propertyType);
-          propertyValue = getSwizzledObject(propertyValue, propertyType);
-          entity.getMethod(getMethodNameFromPropertyName(key, "set"),
-              propertyType).invoke(entityInstance, propertyValue);
-        }
-      }
-
-      // validations check..
- ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
-      Validator validator = validatorFactory.getValidator();
-
-      violations = validator.validate(entityInstance);
-      if (violations.isEmpty()) {
-        entity.getMethod("persist").invoke(entityInstance);
-      }
-    }
-
-    // return data back.
-    return getReturnRecord(writeOperation, entityInstance, recordObject,
-        violations);
+      JSONObject recordObject, WriteOperation writeOperation) {
+
+    try {
+      Class<?> entity = tokenToEntityRecord.get(recordToken).entity;
+ Class<? extends Record> record = tokenToEntityRecord.get(recordToken).record; + Map<String, Class<?>> propertiesInRecord = getPropertiesFromRecord(record);
+      validateKeys(recordObject, propertiesInRecord.keySet());
+      updatePropertyTypes(propertiesInRecord, entity);
+
+      // get entityInstance
+      Object entityInstance = getEntityInstance(writeOperation, entity,
+          recordObject.get("id"), propertiesInRecord.get("id"));
+
+      // persist
+      Set<ConstraintViolation<Object>> violations = null;
+      if (writeOperation == WriteOperation.DELETE) {
+        entity.getMethod("remove").invoke(entityInstance);
+      } else {
+        Iterator<?> keys = recordObject.keys();
+        while (keys.hasNext()) {
+          String key = (String) keys.next();
+          Class<?> propertyType = propertiesInRecord.get(key);
+ if (writeOperation == WriteOperation.CREATE && ("id".equals(key))) {
+            // ignored. id is assigned by default.
+          } else {
+ Object propertyValue = getPropertyValueFromRequest(recordObject,
+                key, propertyType);
+            propertyValue = getSwizzledObject(propertyValue, propertyType);
+            entity.getMethod(getMethodNameFromPropertyName(key, "set"),
+                propertyType).invoke(entityInstance, propertyValue);
+          }
+        }
+
+        // validations check..
+ ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
+        Validator validator = validatorFactory.getValidator();
+
+        violations = validator.validate(entityInstance);
+        if (violations.isEmpty()) {
+          entity.getMethod("persist").invoke(entityInstance);
+        }
+      }
+
+      // return data back.
+      return getReturnRecord(writeOperation, entityInstance, recordObject,
+          violations);
+    } catch (Exception ex) {
+      return getReturnRecordForException(writeOperation, recordObject, ex);
+    }
   }

private Collection<Property<?>> allProperties(Class<? extends Record> clazz) {
@@ -529,6 +531,31 @@
     }
     return returnObject;
   }
+
+ private JSONObject getReturnRecordForException(WriteOperation writeOperation,
+      JSONObject recordObject, Exception ex) {
+    JSONObject returnObject = new JSONObject();
+    try {
+      if (writeOperation == WriteOperation.DELETE
+          || writeOperation == WriteOperation.UPDATE) {
+        returnObject.put("id", recordObject.getString("id"));
+      } else {
+        returnObject.put("futureId", recordObject.getString("id"));
+      }
+      // expecting violations to be a JSON object.
+      JSONObject violations = new JSONObject();
+      if (ex instanceof NumberFormatException) {
+ violations.put("Expected a number instead of String", ex.getMessage());
+      } else {
+        violations.put(ex.toString(), ex.getMessage());
+      }
+      returnObject.put("violations", violations);
+    } catch (JSONException e) {
+      // ignore.
+      e.printStackTrace();
+    }
+    return returnObject;
+  }

   /**
* Swizzle an idValue received from the client to the type expected by the

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

Reply via email to