I'm not having much luck with this patch either. The problem I have
is with enums.
If I have a record with:
Property<PhoneType> phoneType = new
EnumProperty<PhoneType>("phoneType", PhoneType.class,
PhoneType.values());
This works well if the row is created on the server and sent to the
client. The use case is simple:
final Column<PhoneHandle, String> phoneTypeColumn = new
Column<PhoneHandle, String>(new
SelectionCell(translator.allValuesAsStrings())) {
@Override
public String getValue(final PhoneHandle object) {
return
translator.getPhoneTypeToString(object.get(object.phoneType));
}
};
And if the row is generated on the server, again this works well, but
if the row was created using request factory (r8495), it just blows
up:
In RecordJsoImpl.get(), this eventually leads to:
if (property instanceof EnumProperty) {
EnumProperty<V> eProperty = (EnumProperty<V>) property;
Enum[] values = (Enum[]) eProperty.getValues();
int ordinal = getInt(property.getName());
And here this blows up in hosted mode saying
Caused by: com.google.gwt.dev.shell.HostedModeException: Something
other than
an int was returned from JSNI method
'@com.google.gwt.valuestore.shared.impl.RecordJsoImpl::getInt(Ljava/
lang/String;)':
JS value of type undefined, expected int
but if the row was created on the server, than it just returns a
proper integer
On Aug 6, 12:48 am, [email protected] wrote:
> 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 athttp://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/AbstractBooleanRe
> quest.java
> Modified:
>
> /trunk/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerato
> r.java
>
> /trunk/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.j
> ava
> /trunk/user/src/com/google/gwt/valuestore/shared/impl/RecordJsoImpl.java
>
> /trunk/user/test/com/google/gwt/requestfactory/server/JsonRequestProcessorT
> est.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/AbstractBooleanRe
> quest.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/RequestFactoryGenerato
> r.java
> Mon Aug 2 15:57:18 2010
> +++
> /trunk/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerato
> r.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.fi
> ndType(BigInteger.class.getName()));
> }
> +
> + private boolean isBooleanRequest(TypeOracle typeOracle, JClassType
> requestType) {
> + return
> requestType.isParameterized().getTypeArgs()[0].isAssignableTo(typeOracle.fi
> ndType(Boolean.class.getName()));
> + }
>
> private boolean isByteRequest(TypeOracle typeOracle, JClassType
> requestType) {
> return
> requestType.isParameterized().getTypeArgs()[0].isAssignableTo(typeOracle.fi
> ndType(Byte.class.getName()));
> =======================================
> ---
> /trunk/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.j
> ava
> Mon Aug 2 10:40:29 2010
> +++
> /trunk/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.j
> ava
> 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();
> =======================================
> ---
> ...
>
> read more »
--
http://groups.google.com/group/Google-Web-Toolkit-Contributors