The read-only link starts with http, but there may be an error in the URL:

http://gwt-google-apis.googlecode.com/svn/trunk/ajaxloader/ajaxloader/src/

(2 instances of the string ajaxloader in the path)

-Eric.

On Mon, May 25, 2009 at 11:32 PM, Bobby <[email protected]> wrote:
>
> Eric, what is the svn:externals read-only path for the AjaxLoader
> source? I tried the following with no success (probably because the
> link is not read-only and i don't have checkout access):
>
> ajaxloader http://gwt-google-apis.googlecode.com/svn/trunk/ajaxloader/src/
>
> Bobby
>
>
> On May 20, 5:21 pm, Bobby <[email protected]> wrote:
>> Thanks for the tips Eric.
>>
>> - I noticed that newInstance was used in Google Maps so i'm adopted
>> the same convention.
>>
>> - I see what you mean about exception handling. I'll make use of your
>> ExceptionHelper for Runnables. For the AsyncCallbacks, i'll try to
>> mirror your ExceptionHelper implementation.
>>
>> - When generating the overloads i plug "undefined" in place of omitted
>> optional parameters. Methods with only one parameter were causing the
>> single "undefined" parameter you pointed out, this will be gone after
>> polishing.
>>
>> I have another batch of questions/comments coming up - there's one
>> class in GData, the base class for all service classes, which requires
>> some thought since it has methods that may receive constructors (for
>> example GetFeed, which receives the constructor of the feed to be
>> returned). How this class is implemented has some implications on the
>> classes that extend it. I'll have the auto-generated GWT library up
>> sometime next week, this way i'll be able to link to the GWT and JS
>> classes and hopefully get some more feedback on the implementation -
>> not so much on the JSNI code but on the architecture/structure of the
>> library.
>>
>> I'm also attempting to auto-generating base Unit tests for each class
>> - most classes are data classes, so Unit tests are straightforward
>> enough (e.g. call each setter, call the corresponding getter, check
>> that the gotten value is the set value). The service classes
>> themselves, which retrieve and update data in the various systems are
>> more difficult, i don't have a plan for those, there will probably be
>> some manual labor but it's not the end of the world if it comes to
>> that.
>>
>> Bobby
>>
>> On May 18, 3:30 pm, Eric Ayers <[email protected]> wrote:
>>
>>
>>
>> > 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/visua......
>>
>> > 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) /*-
>> > > {
>>
>> ...
>>
>> read more »- 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