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