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 -~----------~----~----~----~------~----~------~--~---
