Revision: 8484
Author: [email protected]
Date: Wed Aug  4 22:08:44 2010
Log: Fix support for null fields and Boolean type types in RequestFactory.
Null fix patch by icsy

Review at http://gwt-code-reviews.appspot.com/739801

Review by: [email protected]
http://code.google.com/p/google-web-toolkit/source/detail?r=8484

Added:
/trunk/user/src/com/google/gwt/requestfactory/client/impl/AbstractBooleanRequest.java
Modified:
/trunk/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java /trunk/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java
 /trunk/user/src/com/google/gwt/valuestore/shared/impl/RecordJsoImpl.java
/trunk/user/test/com/google/gwt/requestfactory/server/JsonRequestProcessorTest.java
 /trunk/user/test/com/google/gwt/valuestore/server/SimpleFoo.java
 /trunk/user/test/com/google/gwt/valuestore/shared/SimpleFooRecord.java
/trunk/user/test/com/google/gwt/valuestore/shared/impl/SimpleFooRecordImpl.java

=======================================
--- /dev/null
+++ /trunk/user/src/com/google/gwt/requestfactory/client/impl/AbstractBooleanRequest.java Wed Aug 4 22:08:44 2010
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.requestfactory.client.impl;
+
+import com.google.gwt.valuestore.shared.SyncResult;
+
+import java.util.Collections;
+
+/**
+ * <p>
+ * <span style="color:red">Experimental API: This class is still under rapid
+ * development, and is very likely to be deleted. Use it at your own risk.
+ * </span>
+ * </p>
+ * Abstract implementation of
+ * {...@link com.google.gwt.requestfactory.shared.RequestFactory.RequestObject
+ * RequestFactory.RequestObject} for requests that return Boolean.
+ */
+public abstract class AbstractBooleanRequest extends
+    AbstractRequest<Boolean, AbstractBooleanRequest> {
+
+  public AbstractBooleanRequest(RequestFactoryJsonImpl requestFactory) {
+    super(requestFactory);
+  }
+
+  public void handleResponseText(String responseText) {
+    receiver.onSuccess(Boolean.valueOf(responseText),
+        Collections.<SyncResult> emptySet());
+  }
+
+  @Override
+  protected AbstractBooleanRequest getThis() {
+    return this;
+  }
+}
=======================================
--- /trunk/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java Mon Aug 2 15:57:18 2010 +++ /trunk/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java Wed Aug 4 22:08:44 2010
@@ -28,6 +28,7 @@
 import com.google.gwt.core.ext.typeinfo.NotFoundException;
 import com.google.gwt.core.ext.typeinfo.TypeOracle;
 import com.google.gwt.event.shared.HandlerManager;
+import com.google.gwt.requestfactory.client.impl.AbstractBooleanRequest;
 import com.google.gwt.requestfactory.client.impl.AbstractBigDecimalRequest;
 import com.google.gwt.requestfactory.client.impl.AbstractBigIntegerRequest;
 import com.google.gwt.requestfactory.client.impl.AbstractByteRequest;
@@ -445,6 +446,8 @@
         requestClassName = AbstractDoubleRequest.class.getName();
       } else if (isByteRequest(typeOracle, requestType)) {
         requestClassName = AbstractByteRequest.class.getName();
+      } else if (isBooleanRequest(typeOracle, requestType)) {
+        requestClassName = AbstractBooleanRequest.class.getName();
       } else if (isShortRequest(typeOracle, requestType)) {
         requestClassName = AbstractShortRequest.class.getName();
       } else if (isFloatRequest(typeOracle, requestType)) {
@@ -551,6 +554,10 @@
       JClassType requestType) {
return requestType.isParameterized().getTypeArgs()[0].isAssignableTo(typeOracle.findType(BigInteger.class.getName()));
   }
+
+ private boolean isBooleanRequest(TypeOracle typeOracle, JClassType requestType) { + return requestType.isParameterized().getTypeArgs()[0].isAssignableTo(typeOracle.findType(Boolean.class.getName()));
+  }

private boolean isByteRequest(TypeOracle typeOracle, JClassType requestType) { return requestType.isParameterized().getTypeArgs()[0].isAssignableTo(typeOracle.findType(Byte.class.getName()));
=======================================
--- /trunk/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java Mon Aug 2 10:40:29 2010 +++ /trunk/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java Wed Aug 4 22:08:44 2010
@@ -123,6 +123,9 @@
     if (String.class == parameterType) {
       return parameterValue;
     }
+    if (Boolean.class == parameterType || boolean.class == parameterType) {
+      return Boolean.valueOf(parameterValue);
+    }
     if (Integer.class == parameterType || int.class == parameterType) {
       return new Integer(parameterValue);
     }
@@ -191,6 +194,9 @@
       return value;
     }
     Class<?> type = value.getClass();
+    if (Boolean.class == type) {
+      return value;
+    }
     if (Date.class == type) {
       return String.valueOf(((Date) value).getTime());
     }
=======================================
--- /trunk/user/src/com/google/gwt/valuestore/shared/impl/RecordJsoImpl.java Fri Jul 30 17:29:09 2010 +++ /trunk/user/src/com/google/gwt/valuestore/shared/impl/RecordJsoImpl.java Wed Aug 4 22:08:44 2010
@@ -83,45 +83,55 @@
     // assert isDefined(property.getName()) :
     // "Cannot ask for a property before setting it: "
     // + property.getName();
-
-    if (Byte.class.equals(property.getType())) {
-      return (V) Byte.valueOf((byte) getInt(property.getName()));
-    }
-    if (Short.class.equals(property.getType())) {
-      return (V) Short.valueOf((short) getInt(property.getName()));
-    }
-    if (Float.class.equals(property.getType())) {
-      return (V) Float.valueOf((float) getDouble(property.getName()));
-    }
-    if (BigInteger.class.equals(property.getType())) {
- return (V) new BigDecimal((String) get(property.getName())).toBigInteger();
-    }
-    if (BigDecimal.class.equals(property.getType())) {
-      return (V) new BigDecimal((String) get(property.getName()));
-    }
-    if (Integer.class.equals(property.getType())) {
-      return (V) Integer.valueOf(getInt(property.getName()));
-    }
-    if (Long.class.equals(property.getType())) {
-      return (V) Long.valueOf((String) get(property.getName()));
-    }
-    if (Double.class.equals(property.getType())) {
-      if (!isDefined(property.getName())) {
-        return (V) new Double(0.0);
-      }
-      return (V) Double.valueOf(getDouble(property.getName()));
-    }
-    if (Date.class.equals(property.getType())) {
-      double millis = new Date().getTime();
-      if (isDefined(property.getName())) {
-        millis = Double.parseDouble((String) get(property.getName()));
-      }
-      if (GWT.isScript()) {
-        return (V) dateForDouble(millis);
-      } else {
-        // In dev mode, we're using real JRE dates
-        return (V) new Date((long) millis);
-      }
+    if (isNull(property.getName())) {
+      return null;
+    }
+    try {
+      if (Boolean.class.equals(property.getType())) {
+      return (V) Boolean.valueOf((String) get(property.getName()));
+      }
+      if (Byte.class.equals(property.getType())) {
+        return (V) Byte.valueOf((byte) getInt(property.getName()));
+      }
+      if (Short.class.equals(property.getType())) {
+        return (V) Short.valueOf((short) getInt(property.getName()));
+      }
+      if (Float.class.equals(property.getType())) {
+        return (V) Float.valueOf((float) getDouble(property.getName()));
+      }
+      if (BigInteger.class.equals(property.getType())) {
+ return (V) new BigDecimal((String) get(property.getName())).toBigInteger();
+      }
+      if (BigDecimal.class.equals(property.getType())) {
+        return (V) new BigDecimal((String) get(property.getName()));
+      }
+      if (Integer.class.equals(property.getType())) {
+        return (V) Integer.valueOf(getInt(property.getName()));
+      }
+      if (Long.class.equals(property.getType())) {
+        return (V) Long.valueOf((String) get(property.getName()));
+      }
+      if (Double.class.equals(property.getType())) {
+        if (!isDefined(property.getName())) {
+          return (V) new Double(0.0);
+        }
+        return (V) Double.valueOf(getDouble(property.getName()));
+      }
+      if (Date.class.equals(property.getType())) {
+        double millis = new Date().getTime();
+        if (isDefined(property.getName())) {
+          millis = Double.parseDouble((String) get(property.getName()));
+        }
+        if (GWT.isScript()) {
+          return (V) dateForDouble(millis);
+        } else {
+          // In dev mode, we're using real JRE dates
+          return (V) new Date((long) millis);
+        }
+      }
+    } catch (final Exception ex) {
+ throw new IllegalStateException("Property " + property.getName() + " has invalid " + + " value " + get(property.getName()) + " for type " + property.getType());
     }

     if (property instanceof EnumProperty) {
@@ -175,6 +185,13 @@
     }
     return true;
   }
+
+  /**
+   * @param name
+   */
+  public final native boolean isNull(String name)/*-{
+    return this[name] === null;
+  }-*/;

   public final boolean merge(RecordJsoImpl from) {
     assert getSchema() == from.getSchema();
=======================================
--- /trunk/user/test/com/google/gwt/requestfactory/server/JsonRequestProcessorTest.java Fri Jul 30 17:29:09 2010 +++ /trunk/user/test/com/google/gwt/requestfactory/server/JsonRequestProcessorTest.java Wed Aug 4 22:08:44 2010
@@ -57,6 +57,9 @@
     assertTypeAndValueEquals(Float.class, 1.234f, "1.234");
     assertTypeAndValueEquals(Double.class, 1.234567, "1.234567");
     assertTypeAndValueEquals(Long.class, 1234L, "1234");
+    assertTypeAndValueEquals(Boolean.class, true, "true");
+    assertTypeAndValueEquals(Boolean.class, false, "false");
+
     // dates
     Date now = new Date();
     assertTypeAndValueEquals(Date.class, now, "" + now.getTime());
@@ -83,6 +86,8 @@
     assertEncodedType(String.class, new BigInteger("1"));
     assertEncodedType(String.class, new Date());
     assertEncodedType(Double.class, Foo.BAR);
+    assertEncodedType(Boolean.class, true);
+    assertEncodedType(Boolean.class, false);
   }

   public void testEndToEnd() {
@@ -101,6 +106,7 @@
       assertEquals(foo.getLong("longField"), 8L);
       assertEquals(foo.getInt("enumField"), 0);
       assertEquals(foo.getInt("version"), 1);
+      assertEquals(foo.getBoolean("boolField"), true);
       assertTrue(foo.has("created"));

       // modify fields and sync
@@ -108,6 +114,7 @@
       foo.put("userName", "JSC");
       foo.put("longField", "" + 9L);
       foo.put("enumField", SimpleEnum.BAR.ordinal());
+      foo.put("boolField", false);
       Date now = new Date();
       foo.put("created", "" + now.getTime());
       JSONObject recordWithSchema = new JSONObject();
@@ -131,6 +138,7 @@
       assertEquals(9L, (long) fooResult.getLongField());
       assertEquals(com.google.gwt.valuestore.shared.SimpleEnum.BAR,
           fooResult.getEnumField());
+      assertEquals(false, (boolean)fooResult.getBoolField());
     } catch (Exception e) {
       fail(e.toString());
     }
=======================================
--- /trunk/user/test/com/google/gwt/valuestore/server/SimpleFoo.java Fri Jul 30 17:29:09 2010 +++ /trunk/user/test/com/google/gwt/valuestore/server/SimpleFoo.java Wed Aug 4 22:08:44 2010
@@ -57,6 +57,8 @@
     return 0;
   }
   Integer version = 1;
+
+  private Boolean boolField;
   private Date created;
   private SimpleEnum enumField;
   @Id
@@ -75,6 +77,11 @@
     longField = 8L;
     enumField = SimpleEnum.FOO;
     created = new Date();
+    boolField = true;
+  }
+
+  public Boolean getBoolField() {
+    return boolField;
   }

   public Date getCreated() {
@@ -108,6 +115,10 @@
   public void persist() {
   }

+  public void setBoolField(Boolean bool) {
+    boolField = bool;
+  }
+
   public void setCreated(Date created) {
     this.created = created;
   }
=======================================
--- /trunk/user/test/com/google/gwt/valuestore/shared/SimpleFooRecord.java Fri Jul 30 17:29:09 2010 +++ /trunk/user/test/com/google/gwt/valuestore/shared/SimpleFooRecord.java Wed Aug 4 22:08:44 2010
@@ -31,6 +31,7 @@
       String.class);
   Property<String> password = new Property<String>("password", "Password",
       String.class);
+ Property<Boolean> boolField = new Property<Boolean>("boolField", Boolean.class);
   Property<Integer> intId = new Property<Integer>("intId", Integer.class);
   Property<Date> created = new Property<Date>("created", Date.class);
   Property<Long> longField = new Property<Long>("longField", Long.class);
@@ -39,6 +40,8 @@
com.google.gwt.valuestore.shared.SimpleEnum.class, SimpleEnum.values());


+  Boolean getBoolField();
+
   Date getCreated();

   Integer getIntId();
=======================================
--- /trunk/user/test/com/google/gwt/valuestore/shared/impl/SimpleFooRecordImpl.java Fri Jul 30 17:29:09 2010 +++ /trunk/user/test/com/google/gwt/valuestore/shared/impl/SimpleFooRecordImpl.java Wed Aug 4 22:08:44 2010
@@ -43,6 +43,7 @@
       set.addAll(super.allProperties());
       set.add(userName);
       set.add(password);
+      set.add(boolField);
       set.add(intId);
       set.add(created);
       set.add(longField);
@@ -77,6 +78,10 @@
     super(jso);
   }

+  public Boolean getBoolField() {
+    return get(boolField);
+  }
+
   public java.util.Date getCreated() {
     return get(created);
   }

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

Reply via email to