Hi Bobby,

Thanks for the update, here is some feedback inline.  Sorry for the
delay, I was out last week.

On Mon, May 11, 2009 at 3:17 AM, Bobby <[email protected]> wrote:
>
> I'm very close, i've just compiled a GData JS example via the GData
> GWT library - which retrieves a Calendar feed - and it worked.
>
> Here are some of the implementation choices i've made so far:
> - map all namespaces to be under com.google.gwt.gdata.client.*
> - map all Object parameters to JavaScriptObject (some GData functions
> receive generic JS objects for initialization purposes).
> - implement JS classes as Overlay Types
> - implement class constants as JSNI methods, for example:
>  public static native String REL_MESSAGE_TO() /*-{ return
> $wnd.google.gdata.Who.REL_MESSAGE_TO; }-*/;
> - implement constructors as JSNI methods (since i'm using Overlay
> Types), for example:
>  public static native Who construct() /*-{ return new
> $wnd.google.gdata.Who(undefined); }-*/;

In the gwt-google-apis, I have been naming these factory methods
newInstance() or getInstance() for constructing singletons.  This
comes from convention in the JRE and Joshua Bloch's "Effective Java".

> - generate overloads for methods that have optional parameters or
> multi-type parameters in JS, for example:
>  public final native void setValueString(String valueString) /*-
> { this.setValueString(valueString); }-*/;
>  public final native void setValueString() /*-{ this.setValueString
> (undefined); }-*/;
> - implement continuation callbacks (non success/failure) as Runnable,
> for example:
>  public static final native boolean getInfo(Runnable callback) /*-
> { return $wnd.google.accounts.user.getInfo(function()
> { [email protected]::run()(); }); }-*/;

This is good, but in order to display exceptions in Hosted mode, a
more complex pattern is needed.  Essentially, you need to call a
special handler for exceptions in hosted mode.  A particularly nice
implementation of this is the Handler class in gwt-visualization which
uses the ExceptionHelper class in the ajaxloader package.

http://code.google.com/p/gwt-google-apis/source/browse/releases/visualization/1.0/visualization/src/com/google/gwt/visualization/client/events/Handler.java
http://code.google.com/p/gwt-google-apis/source/browse/releases/ajaxloader/1.0/ajaxloader/src/com/google/gwt/ajaxloader/client/ExceptionHelper.java

I usually pull the ajaxloader class into the other gwt-google-api
projects using an svn:externals property if you haven't done that
already.

> - implement success/failure callbacks as AsyncCallback<T>, for
> example:
>  public final native CalendarAclFeed getAclFeed(String uri,
> AsyncCallback<CalendarAclFeed> callback) /*-{
>       return this.getAclFeed(uri, function(result)
> { @com.google.gwt.gdata.client.impl.Utils::handleSuccessCallback(Lcom/
> google/gwt/user/client/rpc/AsyncCallback;Ljava/lang/Object;)(callback,
> result); }, function(error)
> { @com.google.gwt.gdata.client.impl.Utils::handleFailureCallback(Lcom/
> google/gwt/user/client/rpc/AsyncCallback;Ljava/lang/String;)(callback,
> error); });
> }-*/;

Same comment here - if you don't add the UncaughtExceptionHandler
stuff, hosted mode will miss exceptions that occur in the callback.

> - ignore all instance fields, since GData implements getters and
> setters.
> - use the existing AjaxLoader to loading the JS libraries.
>
> Pending testing. Adding overloads has been interesting, for a given
> method with n optional parameters there are 2^n overloads to be added
> - plus some JS methods have multi-type parameters so those need to be
> defined as well.
>
> Here's a class from the GWT GData library (corresponds to
> http://code.google.com/apis/gdata/jsdoc/1.8/google/gdata/Who.html):
>
> package com.google.gwt.gdata.client;
> import com.google.gwt.gdata.client.EntryLink;
> import com.google.gwt.gdata.client.AttendeeType;
> import com.google.gwt.gdata.client.AttendeeStatus;
> import com.google.gwt.core.client.JavaScriptObject;
>
> public class Who extends com.google.gwt.core.client.JavaScriptObject {
>        public static native String REL_EVENT_ATTENDEE() /*-{ return
> $wnd.google.gdata.Who.REL_EVENT_ATTENDEE; }-*/;
>        public static native String REL_EVENT_ORGANIZER() /*-{ return
> $wnd.google.gdata.Who.REL_EVENT_ORGANIZER; }-*/;
>        public static native String REL_EVENT_PERFORMER() /*-{ return
> $wnd.google.gdata.Who.REL_EVENT_PERFORMER; }-*/;
>        public static native String REL_EVENT_SPEAKER() /*-{ return
> $wnd.google.gdata.Who.REL_EVENT_SPEAKER; }-*/;
>        public static native String REL_MESSAGE_BCC() /*-{ return
> $wnd.google.gdata.Who.REL_MESSAGE_BCC; }-*/;
>        public static native String REL_MESSAGE_CC() /*-{ return
> $wnd.google.gdata.Who.REL_MESSAGE_CC; }-*/;
>        public static native String REL_MESSAGE_FROM() /*-{ return
> $wnd.google.gdata.Who.REL_MESSAGE_FROM; }-*/;
>        public static native String REL_MESSAGE_REPLY_TO() /*-{ return
> $wnd.google.gdata.Who.REL_MESSAGE_REPLY_TO; }-*/;
>        public static native String REL_MESSAGE_TO() /*-{ return
> $wnd.google.gdata.Who.REL_MESSAGE_TO; }-*/;
>        public static native String REL_TASK_ASSIGNED_TO() /*-{ return
> $wnd.google.gdata.Who.REL_TASK_ASSIGNED_TO; }-*/;
>
>        protected Who() { }
>
>        public static native Who construct(JavaScriptObject opt_params) /*-
> { return new $wnd.google.gdata.Who(opt_params); }-*/;
>        public static native Who construct() /*-{ return new
> $wnd.google.gdata.Who(undefined); }-*/;

I believe that passing 'undefined' as a parameter is the same as
passing no parameters at all.  In general, making the JavaScript less
verbose will make the resulting compiled code smaller to download.
Every bit helps!

>
>        public final native AttendeeStatus getAttendeeStatus() /*-{ return
> this.getAttendeeStatus(); }-*/;
>        public final native AttendeeType getAttendeeType() /*-{ return
> this.getAttendeeType(); }-*/;
>        public final native String getEmail() /*-{ return this.getEmail(); }-
> */;
>        public final native EntryLink getEntryLink() /*-{ return
> this.getEntryLink(); }-*/;
>        public final native String getRel() /*-{ return this.getRel(); }-*/;
>        public final native String getValueString() /*-{ return
> this.getValueString(); }-*/;
>        public final native void setAttendeeStatus(JavaScriptObject
> attendeeStatus) /*-{ this.setAttendeeStatus(attendeeStatus); }-*/;
>        public final native void setAttendeeStatus() /*-
> { this.setAttendeeStatus(undefined); }-*/;
>        public final native void setAttendeeStatus(AttendeeStatus
> attendeeStatus) /*-{ this.setAttendeeStatus(attendeeStatus); }-*/;
>        public final native void setAttendeeType(JavaScriptObject
> attendeeType) /*-{ this.setAttendeeType(attendeeType); }-*/;
>        public final native void setAttendeeType() /*-{ this.setAttendeeType
> (undefined); }-*/;
>        public final native void setAttendeeType(AttendeeType attendeeType) /
> *-{ this.setAttendeeType(attendeeType); }-*/;
>        public final native void setEmail(String email) /*-{ this.setEmail
> (email); }-*/;
>        public final native void setEmail() /*-{ this.setEmail(undefined); }-
> */;
>        public final native void setEntryLink(JavaScriptObject entryLink) /*-
> { this.setEntryLink(entryLink); }-*/;
>        public final native void setEntryLink() /*-{ this.setEntryLink
> (undefined); }-*/;
>        public final native void setEntryLink(EntryLink entryLink) /*-
> { this.setEntryLink(entryLink); }-*/;
>        public final native void setRel(String rel) /*-{ this.setRel(rel); }-
> */;
>        public final native void setRel() /*-{ this.setRel(undefined); }-*/;
>        public final native void setValueString(String valueString) /*-
> { this.setValueString(valueString); }-*/;
>        public final native void setValueString() /*-{ this.setValueString
> (undefined); }-*/;
> }
>
> Bobby
>
>
>
>
> On May 3, 9:05 pm, Eric Ayers <[email protected]> wrote:
>> I think you should make it a separate module, but at this point, I think it
>> should remain under gdata for now.  I see other APIs use this namespace, but
>> I will have to coordinate to see if it can truly be shared like AjaxLoader
>> apis.
>>
>>
>>
>>
>>
>> On Sun, May 3, 2009 at 2:51 PM, Bobby <[email protected]> wrote:
>>
>> > Thanks Eric, it works for me. On a related topic, there's a namespace
>> > in the GData API, google.accounts, that i think should be in its own
>> > GWT module as well:
>> >http://code.google.com/apis/gdata/jsdoc/1.8/google/accounts.html
>>
>> > It's used by GData to authenticate via AuthSub, but it's outside
>> > GData.
>>
>> > Bobby
>>
>> > On May 3, 6:38 am, Eric Ayers <[email protected]> wrote:
>> > > Hi guys,
>> > > The AjaxLoader API will be put in public release soon.  I've made a
>> > release
>> > > branch for it under subversion athttp://
>> > gwt-google-apis.googlecode.com/svn/releases/ajaxloader/1.0
>>
>> > > -Eric.
>>
>> > > On Sun, May 3, 2009 at 2:40 AM, Bobby <[email protected]> wrote:
>>
>> > > > I'm going over the following pages carefully:
>>
>> > > >http://code.google.com/docreader/#p=gwt-google-apis&s=gwt-google-apis.
>> > ..
>>
>> > > > Some GWT APIs, such as the Maps API, already have an implementation of
>> > > > the AjaxLoader for loading Google JS libraries, so that's one less
>> > > > thing to do.
>>
>> > > > Bobby
>>
>> > > > On Apr 27, 2:58 am, Bobby <[email protected]> wrote:
>> > > > > I just came across some interesting docs, this one in particular
>> > > > > covers almost all the questions i had in my original post (lots of
>> > > > > TBDs though):
>> > > >http://code.google.com/docreader/#p=gwt-google-apis&s=gwt-google-apis.
>> > ..
>>
>> > > > > Also, check out what's underneath the "large efforts" heading in the
>> > > > > wishlist page:
>> > > >http://code.google.com/docreader/#p=gwt-google-apis&s=gwt-google-apis.
>> > ..
>>
>> > > > > That's right, and here i am going it alone, you ought to be
>> > > > > ashamed. :)
>>
>> > > > > Bobby
>>
>> > > > > On Apr 27, 2:21 am, Bobby <[email protected]> wrote:
>>
>> > > > > > I would prefer having a GWT library for GData, it seems within
>> > reach.
>>
>> > > > > > Bobby
>>
>> > > > > > On Apr 26, 11:55 pm, Vitali Lovich <[email protected]> wrote:
>>
>> > > > > > > Couldn't arbitrary JS support be added using deferred binding?
>> >  Sure,
>> > > > you
>> > > > > > > wouldn't be able to do code completion, but you could call
>> > arbitrary
>> > > > JS
>> > > > > > > functions & variables with 0-overhead.  Might be a cool project
>> > to do
>> > > > (if
>> > > > > > > Ray hasn't already done it :D).
>>
>> > > > > > > On Sun, Apr 26, 2009 at 11:43 PM, Bobby <[email protected]>
>> > > > wrote:
>>
>> > > > > > > > I finally got the GData library to compile inside a GWT 1.6
>> > test
>> > > > app.
>> > > > > > > > Now it's down to testing.
>>
>> > > > > > > > I'm considering auto generating a test app as well, otherwise i
>> > > > won't
>> > > > > > > > be able to find out what's broken, otherwise i have to test
>> > each
>> > > > class
>> > > > > > > > manually.
>>
>> > > > > > > > It looks good at this point but i'm antecipating plenty of
>> > > > headaches
>> > > > > > > > in testing.
>>
>> > > > > > > > Bobby
>>
>> > > > > > > > On Apr 20, 6:51 pm, Bobby <[email protected]> wrote:
>> > > > > > > > > The GData JS API is doing some fancy stuff to be able to POST
>> > > > data
>> > > > > > > > > across domains, etc, it's also fairly large (in number of
>> > > > classes) and
>> > > > > > > > > it's missing some large GData components (for Google Docs and
>> > > > > > > > > Spreadsheets). All of this i'm guessing is why Google doesn't
>> > > > have a
>> > > > > > > > > GWT library out for GData yet. I wouldn't want to code this
>> > > > manually
>> > > > > > > > > but i if i can automate it then it's ok.
>>
>> > > > > > > > > > I'd rather wait to see some code ;-)
>> > > > > > > > > > (and I have so many projects yet that I don't have time to
>> > > > update...)
>>
>> > > > > > > > > Oh right, no chance, it's now or never (or whenever you feel
>> > like
>> > > > up
>> > > > > > > > > to it, just let me know).
>>
>> > > > > > > > > I'm counting on being able to auto-generate a decent wrapper
>> > > > without
>> > > > > > > > > much difficulty, if this becomes complex or beyond my means
>> > i'll
>> > > > just
>> > > > > > > > > let Google worry about it. This is why i want to test a rough
>> > > > version
>> > > > > > > > > of the wrapper ASAP.
>>
>> > > > > > > > > Anyway thanks for all the pointers, i'll post more questions
>> > here
>> > > > as
>> > > > > > > > > they come up.
>>
>> > > > > > > > > Bobby
>>
>> > > > > > > > > On Apr 20, 6:04 pm, Thomas Broyer <[email protected]>
>> > wrote:
>>
>> > > > > > > > > > On Mon, Apr 20, 2009 at 6:38 PM, Bobby wrote:
>>
>> > > > > > > > > > > I realize that your getConstant approach has an
>> > > > initialization
>> > > > > > > > > > > overhead but i'm going to overlook that so that i can get
>> > the
>> > > > > > > > > > > generated library to a point where i can test it and then
>> > > > come back
>> > > > > > > > > > > and revisit this. This will be more complex because the
>> > GData
>> > > > JS
>> > > > > > > > > > > implementation allows "namespaces" to be loaded
>> > dynamically
>> > > > as
>> > > > > > > > needed.
>>
>> > > > > > > > > > Given that the protocol is clearly defined and documented,
>> > I
>> > > > wonder if
>> > > > > > > > > > a "pure GWT" implementation wouldn't be better...
>> > > > > > > > > > Well, eventually, that could be your "v2.0" ;-)
>>
>> > > > > > > > > > > On the return type of the JS methods that receive
>> > callbacks,
>> > > > most
>> > > > > > > > > > > likely these methods return void, i think that's just the
>> > way
>> > > > the
>> > > > > > > > > > > JSDocs display - otherwise they would have to display
>> > that as
>> > > > > > > > > > > void updateEntry(<google.gdata.Entry function(Object)>
>> > > > continuation,
>> > > > > > > > > > > <google.gdata.Entry function(Error)> opt_errorHandler).
>>
>> > > > > > > > > > Er, you probably mean void updateEntry(<void
>> > > > > > > > > > function(google.gdata.Entry)> continuation, <void
>> > > > function(Error)>
>> > > > > > > > > > opt_errorHandler)
>>
>> > > > > > > > > > > This type of ambiguity is why an 100% auto-generate is
>> > not
>> > > > going to
>> > > > > > > > > > > happen - in addition to this there are a couple of
>> > classes
>> > > > missing
>> > > > > > > > > > > from the JS Docs (i'll just fill those in from the GData
>> > Java
>> > > > docs).
>>
>> > > > > > > > > > Well, I don't know what you're generating from, but it
>> > could be
>> > > > as
>> > > > > > > > > > easy as "if the method takes 2 arguments of type function,
>> > the
>> > > > second
>> > > > > > > > > > one taking an Error argument, then convert them to an
>> > > > AsyncCallback<T>
>> > > > > > > > > > where T is the method's documented return type, and make
>> > the
>> > > > method
>> > > > > > > > > > actually have a void return type".
>>
>> > > > > > > > > > > I like the idea of using an intermediate class to handle
>> > the
>> > > > > > > > > > > callbacks, i think you mentioned this in your original
>> > reply
>> > > > and i
>> > > > > > > > > > > missed it.
>>
>> > > > > > > > > > Hmm, not quite sure what you're talking about...
>>
>> > > > > > > > > > > If you're interested, and since you already put some time
>> > > > here i can
>> > > > > > > > > > > add you as a member of this project:
>> > > > > > > > > > >http://code.google.com/p/gdata-gwt-client/
>> > > > > > > > > > > This way you get some credit.
>>
>> > > > > > > > > > I'd rather wait to see some code ;-)
>> > > > > > > > > > (and I have so many projects yet that I don't have time to
>> > > > update...)
>>
>> > > > > > > > > > > This is a key library for GWT in my
>> > > > > > > > > > > opinion and it's missing - Google says they don't have
>> > plans
>> > > > to do
>> > > > > > > > > > > this right now so it's a good opportunity.
>>
>> > > > > > > > > > Probably because they'd rather do it in GWT than as a GWT
>> > > > wrapper
>> > > > > > > > > > around the JS API, which is a bit more work probably...
>> > > > > > > > > > (and they'd have to have time to maintain it, etc.)
>>
>> > > > > > > > > > Anyway, good luck ;-)
>>
>> > > > > > > > > > --
>> > > > > > > > > > Thomas Broyer- Hide quoted text -
>>
>> > > > > > > > > - Show quoted text -- Hide quoted text -
>>
>> > > > > > > - Show quoted text -- Hide quoted text -
>>
>> > > > > > - Show quoted text -- Hide quoted text -
>>
>> > > > > - Show quoted text -
>>
>> > > --
>> > > Eric Z. Ayers - GWT Team - Atlanta, GA USAhttp://
>> > code.google.com/webtoolkit/- Hide quoted text -
>>
>> > > - Show quoted text -
>>
>> --
>> Eric Z. Ayers - GWT Team - Atlanta, GA 
>> USAhttp://code.google.com/webtoolkit/- Hide quoted text -
>>
>> - Show quoted text -
> >
>



-- 
Eric Z. Ayers - GWT Team - Atlanta, GA USA
http://code.google.com/webtoolkit/

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/Google-Web-Toolkit?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to