Thanks for finding this, you just saved me a lot of trouble tracking it
down. I will fix it shortly.

-Ray


On Fri, Aug 6, 2010 at 2:31 PM, pjulien <[email protected]> wrote:

> 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]://
> 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
>

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

Reply via email to