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