<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;A0QHSHo-eCp7ImA9WxNUE0g.&quot;"><id>tag:blogger.com,1999:blog-28098389</id><updated>2009-11-04T10:28:59.450-08:00</updated><title type="text">Google Web Toolkit Blog</title><subtitle type="html">News and note from the Google Web Toolkit Team.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://googlewebtoolkit.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://googlewebtoolkit.blogspot.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>A Googler</name><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>98</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/blogspot/NWLT" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;A0QHSHo9cCp7ImA9WxNUE0g.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-4775442492850243785</id><published>2009-11-04T10:23:00.000-08:00</published><updated>2009-11-04T10:28:59.468-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-04T10:28:59.468-08:00</app:edited><title>New insights into web application performance</title><content type="html">&lt;p&gt;
I've sometimes thought that optimizing web applications is as much a science as dowsing. (No offense intended, dowsers of the world &amp;mdash; but you have to admit it's a hard thing to explain even when it does work out.) Even when you are completely willing to invest time and energy into optimizing an application, how do you actually go about it?
&lt;/p&gt;

&lt;p&gt;
Our team, along with everyone else in the world who cares about web application performance, has had to essentially guess at where time goes inside the browser. We've spent countless hours debating each others' wild-eyed speculations as to the true sources of latency afflicting a wide variety of applications. Indeed, web apps can be slow for all sorts of opaque and unintuitive reasons. Don't be fooled into thinking that bloated, slow JavaScript is the only culprit. We've seen pathological situations in which a few seemingly insignificant CSS tweaks can improve performance by a factor of 5 or more. Another dark gem: rearranging a mere few lines of JavaScript that were inadvertently calling DOM-related methods in an unfortunate sequence (which caused multiple redundant layouts) turned a life-negating 5 second operation into a sprightly 50 millisecond blink of an eye. That one took 5 days to find the offending 4 lines of JavaScript and then about 3 seconds to actually make the code change. &lt;a href="http://twitter.com/#search?q=%23nowiamwaybehindingooglereader"&gt;#nowiamwaybehindingooglereader&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
We couldn't take it anymore. We decided we had to find a way to transform the witchcraft of optimizing web apps into a legitimate engineering task, once and for all.
&lt;/p&gt;

&lt;p&gt;
My team began working on a series of changes to WebKit and Chrome to collect precise metrics on where time is, in fact, going within the browser. When, exactly, does layout occur? How long does each layout take? Can layout happen synchronously while my JavaScript is executing, or is it deferred? How much time is spent on CSS selector matching? How long does parsing (versus executing) JavaScript take? Does the process of actually painting pixels on the screen take much time? We instrumented the browser way deep down inside to produce a stream of such metrics, being very careful to keep observer effects to a minimum.
&lt;/p&gt;

&lt;p&gt;
Happily, we've managed to land these changes into both WebKit and Chrome over the last several weeks. Soon you'll see the first examples of tools that make these metrics available to web developers using WebKit-based browsers. Of course, we have a lot more instrumentation planned, but the ball is really rolling now thanks to lots of help from the friendly folks on the WebKit and Chrome teams (especially Pavel Feldman and Timothy Hatcher). We've gained many new insights, some of which I mentioned in my &lt;a href="http://code.google.com/events/io/2009/sessions/MeasureMillisecondsPerformanceTipsWebToolkit.html"&gt;Measure in Milliseconds&lt;/a&gt; talk at Google I/O earlier this year. When you see these metrics yourself for your own web apps, you'll likely be surprised &amp;mdash; and you'll almost certainly wonder how anyone tried to write high-performance code without this sort of insight. Be sure to keep an eye on the &lt;a href="http://dev.chromium.org/getting-involved/dev-channel"&gt;Chrome Dev Channel&lt;/a&gt; and the &lt;a href="http://nightly.webkit.org/"&gt;WebKit nightly builds&lt;/a&gt; for new Inspector features based on our work.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-4775442492850243785?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=12ZBLwGiW8g:r1ZVMg9Ekyg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=12ZBLwGiW8g:r1ZVMg9Ekyg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=12ZBLwGiW8g:r1ZVMg9Ekyg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/12ZBLwGiW8g" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/4775442492850243785?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/4775442492850243785?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/12ZBLwGiW8g/new-insights-into-web-application.html" title="New insights into web application performance" /><author><name>Kelly Norton</name><uri>http://www.blogger.com/profile/01326926836174999439</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="12592815615415541853" /></author><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/11/new-insights-into-web-application.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUMQX47fSp7ImA9WxNWGUQ.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-1013337970967515463</id><published>2009-10-19T15:08:00.000-07:00</published><updated>2009-10-19T15:11:20.005-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T15:11:20.005-07:00</app:edited><title>The enterprise (apps) in your pocket</title><content type="html">When building great enterprise apps for our users many of us often first target the desktop user. Did you know that GWT lets you just as easily build great user interfaces for your mobile users?&lt;br /&gt;
&lt;br /&gt;
Modern mobile phones such Android based devices and the iPhone ship will powerful web browsers which use the same Webkit rendering engine which GWT already supports and increasingly includes great capabilities like geo-location and offline storage.&lt;br /&gt;
&lt;br /&gt;
Today's guest blog post is from&amp;nbsp;Navin Kumar, CTO of Socialwok who has offered to share some of their experiences around building mobile apps for the enterprise.&lt;br /&gt;
&lt;br /&gt;
If you have an enterprise story you'd like share please&amp;nbsp;&lt;a href="mailto:fredsa@google.com"&gt;send me an email&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
Google Web Toolkit (GWT) is a great set of open source tools for developing powerful Ajax-enabled web applications. &amp;nbsp;&lt;a href="http://socialwok.com/"&gt;Socialwok&lt;/a&gt; uses GWT on top of Google App Engine to provide a feed based group collaboration service for Google Apps users. &amp;nbsp;GWT makes development more efficient, particularly for Java developers who work on both the front-end and the back-end. &amp;nbsp;Since we use Java language support for Google App Engine, this is true for us. &amp;nbsp;By using the Java programming language, GWT can make you more efficient in many other ways too. &amp;nbsp;For example, after spending a couple of months developing the desktop web version of Socialwok, we developed the mobile HTML 5 web version in four days.&lt;br /&gt;
To see the desktop web version of Socialwok go to &lt;a href="http://socialwok.com/"&gt;http://socialwok.com/&lt;/a&gt;&amp;nbsp;and use any existing Google Apps domain email address to login.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/_v1cyex1oKPA/SteJj9GWIGI/AAAAAAAAACM/fKiLO_BNcbI/s1600-h/File-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_v1cyex1oKPA/SteJj9GWIGI/AAAAAAAAACM/fKiLO_BNcbI/s320/File-1.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
Once you have created your socialwok network, you can now access the mobile web version by pointing your mobile web browser to &lt;a href="http://app.socialwok.com/"&gt;http://app.socialwok.com/&lt;/a&gt;. Login using your google apps domain email address.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/_v1cyex1oKPA/SteJkpDudhI/AAAAAAAAACU/rVAubgM4iuc/s1600-h/File-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_v1cyex1oKPA/SteJkpDudhI/AAAAAAAAACU/rVAubgM4iuc/s320/File-2.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
Here are a few pointers based on our experience in creating Socialwok's desktop and mobile web versions:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. &amp;nbsp;Think about the devices you want to support.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
75% of iPhone users say they browse the web more often from their iPhone now more than they ever did before. &amp;nbsp;40% of them browse the web more often from their iPhone than their own desktop. Hence, it is important to have a mobile web version of your application for different mobile web devices like iPhone and Android. Socialwok mobile web version supports mobile browsers based on the Webkit codebase like the iPhone's Safari and Android mobile web browsers. The first step was therefor to fix the &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;user.agent&lt;/span&gt;&amp;nbsp;in our module's &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;.gwt.xml&lt;/span&gt; file to speed up compile time by having GWT only compile the Webkit permutation:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: monospace; font-size: 12px; line-height: 15px; white-space: pre-wrap;"&gt;&amp;lt;set-property name="user.agent" value="safari"&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: monospace; font-size: small;"&gt;&lt;span style="font-size: 12px; line-height: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="line-height: normal; white-space: normal;"&gt;&lt;span style="font-family: inherit;"&gt;Of course, during development we enjoy GWT's quick edit-refresh-test model thanks to Development Mode (formerly Hosted Mode) which lets us test our code in a real browser while executing and debugging in Java.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Another thing to note is that with Mobile Safari on the iPhone and the Android Web Browser, you are now allowed to use webkit-specific CSS for mobile devices. &amp;nbsp;This allows you to use native accelerations that include transitions, border images, as well as natively-created gradients. &amp;nbsp;Here's an example of CSS used to create a native accelerated transition.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;.menuPanel {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;width: 100%;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;\-webkit-transition: opacity 500ms ease-out 100ms;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Look for more info &lt;a href="http://developer.apple.com/safari/library/referencelibrary/GettingStarted/GS_iPhoneWebApp/index.html"&gt;here&lt;/a&gt;. While the information is specific to the iPhone, the same rules do apply and work well on the Android browser as well.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2. Optimize for the screen that your users are using.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
iPhone and Android devices use very powerful touch screen user interfaces. The user interface for all the iPhone applications is pretty well-defined; it involves a navigation header at the top, the content in the middle, and maybe a footer at the bottom. &amp;nbsp;If you're thinking in GWT widgets, you should be thinking &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;VerticalPanel&lt;/span&gt;&amp;nbsp;or &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;FlowPanel&lt;/span&gt;. &amp;nbsp;These are the widgets of choice for the mobile web GWT developer. &lt;br /&gt;
&lt;br /&gt;
Screen real estate on mobile phones is precious. You have to optimize the amount of visible content on the screen. &amp;nbsp;Try to make things "expand" when you click on them. &amp;nbsp;For example, in Socialwok, when someone clicks a post from the listing screen, a new screen is given to the user with only the single "opened" post that lists all the attachments, comments, and other pieces of information right there.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/_v1cyex1oKPA/SteJmP-VbRI/AAAAAAAAACc/HOFbfn6QaFw/s1600-h/File-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_v1cyex1oKPA/SteJmP-VbRI/AAAAAAAAACc/HOFbfn6QaFw/s320/File-3.png" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_v1cyex1oKPA/SteJm2-RqHI/AAAAAAAAACk/qYpvRgDL-mU/s1600-h/File-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_v1cyex1oKPA/SteJm2-RqHI/AAAAAAAAACk/qYpvRgDL-mU/s320/File-4.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
Unlike the desktop version, instead of one single widget for the feed item, we need one widget for the feed listing, and one "feed item" panel, that contains the single update along with the corresponding comment thread. &lt;br /&gt;
&lt;br /&gt;
Finally, understand that your users are looking at the mobile as a "complement" to your desktop version.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/_v1cyex1oKPA/SteJoM21-aI/AAAAAAAAACs/i_dUtjxNqmQ/s1600-h/File-5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_v1cyex1oKPA/SteJoM21-aI/AAAAAAAAACs/i_dUtjxNqmQ/s320/File-5.png" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_v1cyex1oKPA/SteJokKqhDI/AAAAAAAAAC0/CJYWiZ3Tfcs/s1600-h/File-6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_v1cyex1oKPA/SteJokKqhDI/AAAAAAAAAC0/CJYWiZ3Tfcs/s320/File-6.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
While they might end up using the mobile version more often, they expect it to mirror the desktop interface in basic ways. &amp;nbsp;This is actually great because you have already developed your widgets using Java, and porting them to the mobile is only a matter of changing CSS classes, and removing a few unnecessary UI elements. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3. Share as much code as possible between versions.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
This is the most important reason why mobile development can be done rapidly. &amp;nbsp;All of GWT's HTTPRequest, marshalled &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;JavaScriptObject&lt;/span&gt;, and other non-UI code is shared between the mobile web and desktop web versions. &amp;nbsp;This concept is important in general for any GWT application that uses multiple EntryPoint modules. &amp;nbsp;The great thing about this is that the Java programming language makes this possible by it's own definition. &amp;nbsp;OOP developers tout code sharing all the time, and you should follow their advice nonetheless. &amp;nbsp;&lt;a href="http://code.google.com/webtoolkit/doc/1.6/DevGuideOrganizingProjects.html"&gt;This page&lt;/a&gt; in particular is very useful to understanding how to organize your GWT code.&lt;br /&gt;
&lt;br /&gt;
I hope the above pointers help you get started on desktop to mobile web development on GWT. For more information on Socialwok and GWT, check out Google's developer &lt;a href="http://www.youtube.com/watch?v=_vuKLLJ3PHY"&gt;GWT profile on Socialwok on YouTube&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Finally, here are some useful classes and libraries you can use for GWT mobile web development:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://code.google.com/p/google-web-toolkit-incubator/wiki/ImmutableResourceBundle"&gt;ImmutableResourceBundle&lt;/a&gt;&amp;nbsp;- A great set of tools that was started in the GWT incubator project but has now made their way in the mainline GWT trunk development&amp;nbsp;(soon to be known as&amp;nbsp;&lt;a href="http://code.google.com/p/google-web-toolkit/wiki/ClientBundle"&gt;ClientBundle&lt;/a&gt;). &amp;nbsp;ImmutableResourceBundle is the followup to the great ImageBundle interface. &amp;nbsp;Both seek to reduce greatly the number of round-trip times used by browsers to download cacheable resources such as images, CSS, and other resources. &amp;nbsp;The mobile browser is even more limited than the desktop browsers when it comes to downloading simultaneous resources, so the use of &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;data:&lt;/span&gt;&amp;nbsp;URLs and &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;CssBundle&lt;/span&gt; are used heavily by the mobile version of Socialwok.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/user/client/ui/FlowPanel.html"&gt;FlowPanel&lt;/a&gt; - Unlike desktop browsers which are more optimized for&lt;br /&gt;
tags that GWT uses for its CellPanel-based layout controls, mobile browsers like Safari and the Android browsers perform much better with &lt;br /&gt;
&lt;div&gt;
tags. &amp;nbsp;Layouts also seem to be more predictable with these tags than the others on the mobile phone.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://code.google.com/p/gwtquery/"&gt;GWTQuery&lt;/a&gt; - Ray Cromwell's excellent port of JQuery to GWT provides most of the JQuery functionality to allow you to modify CSS, and perform other actions with ease. &amp;nbsp;In the case of the mobile web interface, there are times when it is definitely necessary to modify CSS dynamically, and this library will make that process much easier on you as a developer.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://code.google.com/docreader/#p=gwt-google-apis&amp;amp;s=gwt-google-apis&amp;amp;t=Gears"&gt;GWT Google APIs (Gears)&lt;/a&gt; - Google Gears is a browser plugin installed in the Android Web Browser used to provide extra functionality, particularly offline support which is very import for mobile browsers which don't always have a permanent connection. &amp;nbsp;Google provides a GWT library that can be used to access the Gears plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;-- Navin Kumar, CTO, Socialwok&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-1013337970967515463?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=aDWJSfWAUQw:SURC0s_R1ss:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=aDWJSfWAUQw:SURC0s_R1ss:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=aDWJSfWAUQw:SURC0s_R1ss:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/aDWJSfWAUQw" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/1013337970967515463?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/1013337970967515463?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/aDWJSfWAUQw/enterprise-apps-in-your-pocket.html" title="The enterprise (apps) in your pocket" /><author><name>Fred Sauer, Developer Advocate</name><uri>http://www.blogger.com/profile/06804630764751433448</uri><email>fredsa@google.com</email><gd:extendedProperty name="OpenSocialUserId" value="09520208890341198929" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_v1cyex1oKPA/SteJj9GWIGI/AAAAAAAAACM/fKiLO_BNcbI/s72-c/File-1.png" height="72" width="72" /><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/10/enterprise-apps-in-your-pocket.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cCQnw-eSp7ImA9WxNWEEs.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-6947873275316124047</id><published>2009-10-08T22:04:00.000-07:00</published><updated>2009-10-08T22:11:03.251-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-08T22:11:03.251-07:00</app:edited><title>Building Enterprise web apps in the cloud</title><content type="html">&lt;i&gt;&lt;span style="font-family: inherit;"&gt;An important decision to make when building a web application is how to coordinate state between client and server. This includes how to create appropriate representations of your data to &lt;/span&gt;&lt;a href="http://code.google.com/webtoolkit/doc/1.6/DevGuideServerCommunication.html"&gt;&lt;span style="font-family: inherit;"&gt;send over the wire&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;div&gt;
&lt;i&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;span style="font-family: inherit;"&gt;There are many possible approaches. I'd like to present a straightforward one from&amp;nbsp;Jerome Breche, CEO of TimZon, who was kind enough to share it with us today.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;span style="font-style: normal;"&gt;&lt;i&gt;&lt;span style="font-style: normal; line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;span style="font-style: normal;"&gt;&lt;i&gt;&lt;span style="font-style: normal; line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;span style="font-style: normal;"&gt;&lt;i&gt;&lt;span style="font-style: normal; line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;When we started our first GWT project (&lt;/span&gt;&lt;a href="http://timzon.com/"&gt;&lt;span style="font-family: inherit;"&gt;TimZon.com&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;), we found out that one of the major benefits of using GWT is its ability to transfer complex object data structure between client and server through the &lt;/span&gt;&lt;a href="http://code.google.com/webtoolkit/doc/1.6/DevGuideServerCommunication.html#DevGuideRemoteProcedureCalls"&gt;&lt;span style="font-family: inherit;"&gt;RPC mechanism&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;. So when we initiated our second project (&lt;/span&gt;&lt;a href="http://snapabug.com/"&gt;&lt;span style="font-family: inherit;"&gt;SnapABug.com&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;) combining GWT and &lt;/span&gt;&lt;a href="http://code.google.com/appengine"&gt;&lt;span style="font-family: inherit;"&gt;Google App Engine&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;, we were very excited by the prospect of passing datastore objects directly though RPC.&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;
We quickly realized that this is not very practical. First one of our &lt;/span&gt;&lt;a href="http://code.google.com/appengine/docs/java/datastore/usingjdo.html"&gt;&lt;span style="font-family: inherit;"&gt;JDO&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt; objects includes images binary representation that we wouldn’t want to communicate through RPC. And then while making the JDO class serializable for GWT RPC may seem like a simple task, it created all kind of new problems since the JDO class will have to be configured as transient (using &lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;detachable = "false"&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;) and we would still need to copy the object when passing it through the RPC.

Instead we decided to simply create intermediary classes for the data objects used only for RPC communication. This way we can exactly control and optimize the data payload used by the RPC both for size and speed. On the JDO side, we simply created a getter and setter function to translate the JDO data into an RPC data format.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;Here is an example of how this works in client side code.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;1. &lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Employee&lt;/span&gt;&lt;span style="font-family: inherit;"&gt; class: contains JDO objects definition and getter and setter to translate them to GWT RPC serializable format&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;
&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Employee {
  &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  private Long id;
  
  @Persistent
  private String name;
  
  @Persistent
  private String email;
  
  @Persistent
  private Blob image;
   
  /**&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;   * Constructor
   * @param name
   * @param email
   */
  public Employee(String name, String email) {
    this.name = name;
    this.email = email;
  }
   
  /**
   * Set Employee from RPCDataEmployee
   */
  public void setRPCDataEmployee(RPCDataEmployee employee) {
    name = employee.name;
    email = employee.email;
  }
      
  /**
   * @return Employee data in RPC format
   */
  public RPCDataEmployee getRPCDataEmployee() {
    RPCDataEmployee employee = new RPCDataEmployee();
    employee.name = name;
    employee.email = email;
    return employee;
  }
}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-family: Times;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-family: Times;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;2. &lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;RPCDataEmployee&lt;/span&gt;&lt;span style="font-family: inherit;"&gt; class used by GWT RPC calls&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-family: Times;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-family: Times;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;public class RPCDataEmployee implements IsSerializable {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;    public String name;
    public String email;
    // Note: image Blob not included in RPC payload
}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-family: Times;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-family: Times;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;Here is an example of how this works in the server&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;3.&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;RPCDataEmployee&lt;/span&gt;&lt;span style="font-family: inherit;"&gt; server service implementation&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;
&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;public RPCDataEmployee getEmployee(String email){
  RPCDataEmployee employee =  new RPCDataEmployee();
             
  // create data store connection
  PersistenceManager pm = PMF.get().getPersistenceManager();
  
  // query datastore to get emmployee data
  String query = "select from "&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;      + Employee.class.getName()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;      + " where email == "&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;      + email;
  &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;  List&lt;employee&gt; employees =&lt;/employee&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;      (List&lt;employee&gt;) pm.newQuery(query).execute();
  &lt;/employee&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;  if (employees.size() == 1) {
    // record found
    employee = employees.get(0).getRPCDataEmployee();
  } else {
    // do something else...
  }
  &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;  pm.close();
  &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;  return employee;
}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-family: Times;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;While I am sure there are many other ways to achieve a similar result, maybe even avoiding duplicating the data classes, this solution was the easiest for us to get going quickly, keep our code very maintainable and control the amount of data exchanged between client and server.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;
&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;There is also a very interesting &lt;/span&gt;&lt;a href="http://groups.google.com/group/google-web-toolkit-contributors/browse_thread/thread/3c768d8d33bfb1dc/5a38aa812c0ac52b?pli=1"&gt;&lt;span style="font-family: inherit;"&gt;discussion&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt; about this subject on the GWT Google Group.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;span style="font-family: inherit;"&gt;-- Jerome Breche, CEO &amp;amp; Founder of TIMZON, LLC&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: inherit;"&gt;If you would like to share your experiences with GWT and Google App Engine, either privately or on this blog, I'd like to &lt;/span&gt;&lt;a href="mailto:fredsa@google.com"&gt;&lt;span style="font-family: inherit;"&gt;hear from you&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: inherit;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;span style="line-height: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-6947873275316124047?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=7YuMDRqkpcQ:Mhh1ioyBS4g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=7YuMDRqkpcQ:Mhh1ioyBS4g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=7YuMDRqkpcQ:Mhh1ioyBS4g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/7YuMDRqkpcQ" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/6947873275316124047?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/6947873275316124047?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/7YuMDRqkpcQ/building-enterprise-web-apps-in-cloud.html" title="Building Enterprise web apps in the cloud" /><author><name>Fred Sauer, Developer Advocate</name><uri>http://www.blogger.com/profile/06804630764751433448</uri><email>fredsa@google.com</email><gd:extendedProperty name="OpenSocialUserId" value="09520208890341198929" /></author><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/10/building-enterprise-web-apps-in-cloud.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcBRnc_fyp7ImA9WxNWEEk.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-7752577295082736591</id><published>2009-10-08T14:17:00.000-07:00</published><updated>2009-10-08T16:20:57.947-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-08T16:20:57.947-07:00</app:edited><title>Making AJAX Crawlable</title><content type="html">At the recent &lt;a href="http://searchmarketingexpo.com/east"&gt;Search Marketing and Expo East Conference&lt;/a&gt; (SMX) several members of the Google Web Toolkit team delivered a presentation on making AJAX enabled web apps crawlable. This presentation included a proposal that is currently in the works which aims to solve the fundamental problem that it is difficult to index AJAX enabled web apps and therefore their searchability suffers. If you care about SEO in your GWT apps, check out the post on the &lt;a href="http://googlewebmastercentral.blogspot.com/2009/10/proposal-for-making-ajax-crawlable.html"&gt;Google Webmaster Central Blog&lt;/a&gt; and &lt;a href="http://groups.google.com/group/Google-Web-Toolkit/post?sendowner=1&amp;amp;_done=/group/Google-Web-Toolkit/about%3F&amp;amp;"&gt;let us know your thoughts&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-7752577295082736591?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=ag6RDNo3hQo:XzXgrVU2wws:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=ag6RDNo3hQo:XzXgrVU2wws:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=ag6RDNo3hQo:XzXgrVU2wws:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/ag6RDNo3hQo" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/7752577295082736591?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/7752577295082736591?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/ag6RDNo3hQo/making-ajax-crawlable.html" title="Making AJAX Crawlable" /><author><name>Chris Ramsdale</name><uri>http://www.blogger.com/profile/04466857773545818674</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="14508142736121948704" /></author><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/10/making-ajax-crawlable.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ANR3g5cSp7ImA9WxNXF0U.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-4866637548971816377</id><published>2009-10-05T15:29:00.000-07:00</published><updated>2009-10-05T15:29:56.629-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-05T15:29:56.629-07:00</app:edited><title>GWT helps developers innovate in the enterprise</title><content type="html">I had an opportunity to sit down with &lt;a href="http://www.techcrunch.com/2009/09/15/tc50-demopit-winner-socialwok-lays-a-great-social-layer-over-google-apps/"&gt;TechCrunch50 Demopit winners&lt;/a&gt; and creators of &lt;a href="http://socialwok.com/"&gt;Socialwok&lt;/a&gt;,&amp;nbsp;a cloud based application which mixes&amp;nbsp;&lt;a href="http://www.google.com/apps/"&gt;Google Apps&lt;/a&gt;&amp;nbsp;and a unique set of social capabilities to make their customers more productive, both at their desks and on the road via their mobile web client. They chose &lt;a href="http://code.google.com/appengine/"&gt;Google App Engine&lt;/a&gt; for scalability and hassle free web hosting and &lt;a href="http://code.google.com/webtoolkit/"&gt;Google Web Toolkit&lt;/a&gt; to maximize their productivity so that they could focus on creating a great web experience for their users. You can watch the interview &lt;a href="http://www.youtube.com/watch?v=_vuKLLJ3PHY"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;object height="340" width="560"&gt;&lt;param name="movie" value="http://www.youtube.com/v/_vuKLLJ3PHY&amp;hl=en&amp;fs=1&amp;"&gt;
&lt;/param&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;/param&gt;
&lt;param name="allowscriptaccess" value="always"&gt;
&lt;/param&gt;
&lt;embed src="http://www.youtube.com/v/_vuKLLJ3PHY&amp;hl=en&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-4866637548971816377?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=oSzpHbjlX5M:7ibDUnIvMQ0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=oSzpHbjlX5M:7ibDUnIvMQ0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=oSzpHbjlX5M:7ibDUnIvMQ0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/oSzpHbjlX5M" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/4866637548971816377?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/4866637548971816377?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/oSzpHbjlX5M/gwt-helps-developers-innovate-in.html" title="GWT helps developers innovate in the enterprise" /><author><name>Fred Sauer, Developer Advocate</name><uri>http://www.blogger.com/profile/06804630764751433448</uri><email>fredsa@google.com</email><gd:extendedProperty name="OpenSocialUserId" value="09520208890341198929" /></author><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/10/gwt-helps-developers-innovate-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IBQ3Y9fyp7ImA9WxNXE0s.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-4428663567459646715</id><published>2009-09-30T18:45:00.000-07:00</published><updated>2009-09-30T18:45:52.867-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-30T18:45:52.867-07:00</app:edited><title>Riding the Google Wave</title><content type="html">&lt;br /&gt;
Today our colleagues down under &lt;a href="http://googleblog.blogspot.com/2009/09/surfs-up-wednesday-google-wave-update.html"&gt;began inviting the first 100,000 users to preview Google Wave&lt;/a&gt;. We are very proud of the work that they have done and are quite pleased that GWT has helped&amp;nbsp;&lt;a href="http://www.youtube.com/watch?v=lWMVzhXwh-I"&gt;make Google Wave a reality&lt;/a&gt;. You can read more in yesterday's&amp;nbsp;&lt;a href="http://www.infoq.com/news/2009/09/google-wave-backstage"&gt;Google Wave Backstage - Q&amp;amp;A with Dhanji Prasanna&lt;/a&gt;&amp;nbsp;at InfoQ.&lt;br /&gt;
&lt;br /&gt;
In fact the Wave team has told us that they would have not been able to build the user interface you see today without GWT. That's a great testament to our &lt;a href="http://code.google.com/webtoolkit/makinggwtbetter.html#introduction"&gt;mission statement&lt;/a&gt; which reflects our focus on &lt;a href="http://code.google.com/webtoolkit/"&gt;developer productivity and user performance&lt;/a&gt;, delivering a great AJAX experience across all major browsers. Also, with only 10-15% additional effort GWT allowed the team to build a user interface dedicated for mobile devices browsers.&lt;br /&gt;
&lt;br /&gt;
Of course there's still &lt;a href="http://googlewavedev.blogspot.com/"&gt;much to do&lt;/a&gt;&amp;nbsp;before Google Wave rolls out for everyone. If you weren't one of the developers who participated in the &lt;a href="http://www.youtube.com/watch?v=v_UyVmITiYQ&amp;amp;feature=player_embedded"&gt;developer preview&lt;/a&gt;&amp;nbsp;or helped build one of the many &lt;a href="http://wave-samples-gallery.appspot.com/"&gt;samples&lt;/a&gt;&amp;nbsp;perhaps there's an extension you would like to build. Check out the &lt;a href="http://code.google.com/apis/wave/"&gt;Google Wave API Documentation&lt;/a&gt;&amp;nbsp;to find out how you can get started with GWT and Google Wave.&lt;br /&gt;
&lt;br /&gt;
Congratulations to the Google Wave team on achieving this milestone and we look forward to continuing &amp;nbsp;to work together.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-4428663567459646715?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=3HI8e1iCPHA:fTt1lQPyxbY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=3HI8e1iCPHA:fTt1lQPyxbY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=3HI8e1iCPHA:fTt1lQPyxbY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/3HI8e1iCPHA" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/4428663567459646715?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/4428663567459646715?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/3HI8e1iCPHA/riding-google-wave.html" title="Riding the Google Wave" /><author><name>Fred Sauer, Developer Advocate</name><uri>http://www.blogger.com/profile/06804630764751433448</uri><email>fredsa@google.com</email><gd:extendedProperty name="OpenSocialUserId" value="09520208890341198929" /></author><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/09/riding-google-wave.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIBSXo-eCp7ImA9WxNXEUU.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-4064291112289267565</id><published>2009-09-25T09:00:00.000-07:00</published><updated>2009-09-28T18:09:18.450-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-28T18:09:18.450-07:00</app:edited><title>GWT Community Updates</title><content type="html">&lt;h3&gt;Community announcements&lt;/h3&gt;&lt;p&gt;&lt;a id="g_ax" href="http://code.google.com/p/gwt-mobile-webkit/" title="GWT on the go with gwt-mobile-webkit"&gt;GWT on the go with gwt-mobile-webkit&lt;/a&gt;: A new project is underway started by a developer in the GWT community that provides GWT API bindings to HTML 5 features supported by Mobile WebKit. While the project more closely follows the WebKit implementation for HTML 5 features and other WebKit libraries, other browsers are also supported for various HTML 5 APIs. Check out the &lt;a id="e1qw" href="http://code.google.com/p/gwt-mobile-webkit/" title="project homepage"&gt;project homepage&lt;/a&gt; for more details.&lt;/p&gt;&lt;p&gt;&lt;a id="muyy" href="http://code.google.com/p/cobogwave/" title="GWT Gadgets riding the Wave"&gt;GWT Gadgets riding the Wave&lt;/a&gt;: The Google Wave Gadget API is an awesome way to leverage the power of Wave in your gadgets. Thanks to the efforts of yet another great GWT community member, you can now more easily use the Google Wave Gadget API in your GWT developed Gadgets using the &lt;a id="dh4t" href="http://code.google.com/p/cobogwave/" title="cobogwave project"&gt;cobogwave&lt;/a&gt; project. This library builds on the existing GWT Gadgets support available in the &lt;a id="y-l6" href="http://code.google.com/p/gwt-google-apis/" title="Google API Libraries for GWT project"&gt;Google API Libraries for GWT&lt;/a&gt; project.&lt;/p&gt;&lt;p&gt;&lt;a id="ubxi" href="http://code.google.com/p/gwt-gdata/" title="GWT-GData v 1.10.1 released"&gt;GWT-GData v 1.10.1 released&lt;/a&gt;: Developed through the &lt;a id="q.om" href="http://groups.google.com/group/google-web-toolkit/browse_thread/thread/fbf592c8b84382fd" title="guidance of the GWT team, GWT community contributors and the main project lead"&gt;guidance of the GWT team, GWT community contributors and the main project lead&lt;/a&gt;, Bobby Soares, the &lt;a id="mymk" href="http://code.google.com/p/gwt-gdata/" title="gwt-gdata"&gt;gwt-gdata&lt;/a&gt; project recently had its 1.10.1 release. This is a nice library to access many of the GData APIs from &lt;a id="q-sa" href="http://code.google.com/apis/analytics/" title="Google Analytics"&gt;Google Analytics&lt;/a&gt; to &lt;a id="nm-e" href="http://code.google.com/apis/maps/documentation/mapsdata/" title="Google Maps Data"&gt;Google Maps Data&lt;/a&gt;. The full list of supported GData APIs can be found on the project page.&lt;/p&gt;&lt;p&gt;&lt;a id="r:wz" href="http://code.google.com/p/gwt-mvc/" title="GWT-MVC 0.3 released"&gt;GWT-MVC 0.3 released&lt;/a&gt;: The MVC pattern has proven its usefulness in the domain of web application development time and time again. If this pattern is a good fit for the project you're planning or currently working on, you may want to check out the &lt;a id="o-ln" href="http://code.google.com/p/gwt-mvc/" title="gwt-mvc"&gt;gwt-mvc&lt;/a&gt; project, which provides a layer of abstraction to make MVC modeled development easier in GWT.&lt;/p&gt;&lt;p&gt;&lt;a id="knm1" href="http://code.google.com/p/gwt-connectors/" title="GWT-Connectors 1.7 released"&gt;GWT-Connectors 1.7 released&lt;/a&gt;: The &lt;a id="cmfn" href="http://code.google.com/p/gwt-connectors/" title="gwt-connectors"&gt;gwt-connectors&lt;/a&gt; project is a really cool tool for developers who need to connect boxed components with connectors, and now includes connectors with arrow tips. You can check out the demo &lt;a id="qenp" href="http://www.aurea-bpm.com/gwt-connectors/Gwt_connectors_example.html" title="here"&gt;here&lt;/a&gt;, and if you like what you see and need it for your application, check out the project page for more information.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-4064291112289267565?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=Hp6sHj8YJMQ:ydOiqqbdqc8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=Hp6sHj8YJMQ:ydOiqqbdqc8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=Hp6sHj8YJMQ:ydOiqqbdqc8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/Hp6sHj8YJMQ" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/4064291112289267565?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/4064291112289267565?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/Hp6sHj8YJMQ/gwt-community-updates.html" title="GWT Community Updates" /><author><name>Sumit Chandel, Developer Programs Engineer</name><uri>http://www.blogger.com/profile/04432308492360866920</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03219604349908016700" /></author><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/09/gwt-community-updates.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcCQHs8fSp7ImA9WxNQF04.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-5913397671740469946</id><published>2009-09-23T10:14:00.000-07:00</published><updated>2009-09-23T11:54:21.575-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-23T11:54:21.575-07:00</app:edited><title>GWT 1.7.1 release fixes Mac OS X Snow Leopard issues</title><content type="html">&lt;p&gt;
If you don't use Mac OS X 10.6 (Snow Leopard), the &lt;a href="http://code.google.com/webtoolkit/download.html"&gt;GWT 1.7.1 release&lt;/a&gt; shouldn't interest you much -- you shouldn't see any changes. If you do use Mac OS X 10.6, good news. Running GWT with Java 6 has become simpler. &lt;a href="http://code.google.com/webtoolkit/download.html"&gt;Download it here&lt;/a&gt;.
&lt;/p&gt;&lt;br/&gt;
&lt;h3&gt;What's in the point release&lt;/h3&gt;
&lt;p&gt;
GWT's hosted mode uses the Standard Widget Toolkit (SWT), which only supports 32-bit operation. Hosted mode must therefore also run a 32-bit version of Java. Mac OS X 10.5 (Leopard) shipped with a 32-bit Java 5 and a 64-bit only Java 6. Java 5 was compatible with the 32-bit SWT bindings, so the GWT SDK directed users to use Java 5 only. With the Snow Leopard release, Apple only includes Java 6, but it now runs in both 32-bit and 64-bit modes. 
&lt;/p&gt;
&lt;p&gt;
In short, you can now run GWT on Snow Leopard using the Java command line argument -d32 without further modification. The GWT SDK no longer directs you to only use Java 5, and the ant scripts (including scripts generated by the webAppCreator tool) have been updated to include the -d32 flag where necessary. Also, Linux users will see a more informative error message when a non-32-bit Java runtime is used..
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-5913397671740469946?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=KMdHV22br8E:vlxlYzXk3Ys:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=KMdHV22br8E:vlxlYzXk3Ys:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=KMdHV22br8E:vlxlYzXk3Ys:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/KMdHV22br8E" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/5913397671740469946?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/5913397671740469946?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/KMdHV22br8E/gwt-171-release-fixes-mac-os-x-snow.html" title="GWT 1.7.1 release fixes Mac OS X Snow Leopard issues" /><author><name>Andrew Bowers</name><uri>http://www.blogger.com/profile/17404995007960091950</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="02987777633111939795" /></author><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/09/gwt-171-release-fixes-mac-os-x-snow.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAHQH4-cSp7ImA9WxNQFko.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-5820062634039137429</id><published>2009-09-22T20:25:00.000-07:00</published><updated>2009-09-22T20:32:11.059-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-22T20:32:11.059-07:00</app:edited><title>Delivering faster, richer GWT applications to your users</title><content type="html">&lt;div&gt;
GWT has always been about providing a &lt;a href="http://code.google.com/webtoolkit/makinggwtbetter.html#introduction"&gt;better experience&lt;/a&gt; for your users. Today GWT received a helping hand with the &lt;a href="http://googlecode.blogspot.com/2009/09/introducing-google-chrome-frame.html"&gt;release&lt;/a&gt; of an early version of  &lt;a href="http://www.google.com/chromeframe"&gt;Google Chrome Frame&lt;/a&gt;, an open source plug-in that brings HTML5, a faster JavaScript engine and other open web technologies to Internet Explorer.

&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
You're probably wondering how your users can take advantage of Google Chrome Frame. Simply add the following tag to the &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;head&amp;gt;&lt;/span&gt; section of your application's HTML page, just like you would for any other web application:
&lt;/div&gt;
&lt;div style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;meta equiv="X-UA-Compatible" content="chrome=1"&amp;gt;

&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
As you probably know GWT automatically builds a different version of your application for each major browser. It uses a special selection script to launch the version which has been specifically optimized for the user's browser and personal settings.

&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
Now you might be wondering how your existing apps will behave when your IE users with Google Chrome Frame installed visit your site. Will GWT try to launch the IE version or the WebKit version of your application?

&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
GWT's selection script detects your browser's rendering engine so that it can launch a version of your app which is optimized for your browser. When the Google Chrome Frame plug-in is installed and the &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;meta&lt;/span&gt; tag is present the WebKit rendering engine is used instead of the IE rendering engine. Since your app's existing selection script already recognizes WebKit based browsers it will know to launch a version of your app which has been optimized for Google Chrome Frame. If you don't include the &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;meta&lt;/span&gt; tag or if your users don't have Google Chrome Frame installed the GWT selection script will still know to launch the IE version of your app.

&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
In other words, your existing GWT apps are already setup to work with Google Chrome Frame. All you have to do is add the &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;meta&lt;/span&gt; tag to your HTML pages.

&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
If you like'd to encourage your IE users to install Google Chrome Frame or would simply like to learn more you can checkout the Google Chrome Frame &lt;a href="http://code.google.com/chrome/chromeframe/developers_guide.html"&gt;developer docs&lt;/a&gt;.
&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-5820062634039137429?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=nmViUvNeBzo:nod00HxoC_8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=nmViUvNeBzo:nod00HxoC_8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=nmViUvNeBzo:nod00HxoC_8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/nmViUvNeBzo" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/5820062634039137429?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/5820062634039137429?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/nmViUvNeBzo/delivering-faster-richer-gwt.html" title="Delivering faster, richer GWT applications to your users" /><author><name>Fred Sauer, Developer Advocate</name><uri>http://www.blogger.com/profile/06804630764751433448</uri><email>fredsa@google.com</email><gd:extendedProperty name="OpenSocialUserId" value="09520208890341198929" /></author><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/09/delivering-faster-richer-gwt.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMMSX04eip7ImA9WxNSGU4.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-5515892092783518772</id><published>2009-09-02T17:41:00.000-07:00</published><updated>2009-09-02T17:41:28.332-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-02T17:41:28.332-07:00</app:edited><title>Hydro4GE — a PaaS built with GWT</title><content type="html">&lt;h1&gt;


&lt;span style="font-size: 24px;"&gt;&lt;i&gt;Introduction&lt;/i&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;div&gt;
&lt;i&gt;From time to time we like to share experiences from fellow developers with you. It's a pleasure to present you today with this guest blog post by&amp;nbsp;Geoff Speicher,&amp;nbsp;&lt;span style="font-style: normal;"&gt;&lt;i&gt;Chief System Architect of&amp;nbsp;&lt;/i&gt;&lt;a href="http://www.hydro4ge.com/"&gt;&lt;i&gt;Hydro4GE&lt;/i&gt;&lt;/a&gt;&lt;i&gt;.&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;h1&gt;


&lt;span style="font-size: 24px;"&gt;Overview&lt;/span&gt;&lt;/h1&gt;
&lt;a href="http://www.hydro4ge.com/"&gt;&lt;b&gt;Hydro4GE&lt;/b&gt;&lt;/a&gt; (pronounced
hy-dro-forge) is a Platform-as-a-Service (PaaS) for building online
database applications.  Building a powerful tool for developers
itself requires a powerful toolkit to meet developers' expectations
of a development environment: a highly-interactive, rich user
interface (UI) with emerging features such as database schema
visualization via interactive, scalable graphics.  This article
describes our experience in using GWT to rewrite our old HTML+AJAX
UI to deliver all of these features with a polished look and solid
performance.&lt;br /&gt;
&lt;h2&gt;




Building the UI&lt;/h2&gt;
When we set out to rewrite the UI using GWT, a quick inventory
of available widgets was in order.  Our initial reaction was similar
to what some others have expressed: that the native GWT widget
library did not have quite the same breadth or flair as some
third-party libraries such as ExtJS or SmartGWT.  However,
experimentation with these libraries proved that they are also
fairly heavy in weight, and noticeably impacted the application's
performance both in its initial download and its interactive
responsiveness.&lt;br /&gt;
The reason is simple: these generic JavaScript libraries, though
highly optimized, are still just that — &lt;em&gt;generic&lt;/em&gt;.  It
is unrealistic for these libraries to achieve the same level of
efficiency as code that is produced by the GWT compiler.  For this
reason, we wanted to avoid the use of external JavaScript libraries
when possible.&lt;br /&gt;
After some careful consideration and a more detailed analysis
of our needs, we discovered that we only needed a small handful of widgets that
GWT didn't already provide, and all but one of those (covered in the next section)
were easily built using &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Composite&lt;/span&gt;.  There is already an
&lt;a href="http://googlewebtoolkit.blogspot.com/2009/05/widget-best-practices-widget-building.html"&gt;excellent
blog entry for building Composites&lt;/a&gt;, so we will not cover that topic here.
The visual styling of both the native and Composite widgets was easy
to customize thanks to GWT's liberal and logical use of CSS classnames.&lt;br /&gt;
As a quick demonstration, it's pretty impressive what a difference
you can achieve by building a few simple Composite widgets and
tweaking some of the default styles.  Compare the default styling
of an input form with one modified by a few simple customizations:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center"&gt;
  &lt;caption&gt;GWT Default Styles &amp;amp; Widgets&lt;/caption&gt;
  &lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/_v1cyex1oKPA/SpydNyPfx6I/AAAAAAAAAAs/ULGA-KQStlg/s1600-h/default.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_v1cyex1oKPA/SpydNyPfx6I/AAAAAAAAAAs/ULGA-KQStlg/s320/default.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align="center"&gt;
  &lt;caption&gt;Customized for Hydro4GE&lt;/caption&gt;
  &lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/_v1cyex1oKPA/SpydPZH0alI/AAAAAAAAAA0/PYVwaA4fXqs/s1600-h/styled.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_v1cyex1oKPA/SpydPZH0alI/AAAAAAAAAA0/PYVwaA4fXqs/s320/styled.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
If you have not already jumped on the bandwagon, Firefox+Firebug
is an indispensable tool for inspecting HTML and tweaking CSS.
Thanks to this and the flexibility of the GWT library, we were able
to achieve the polished look that we wanted without much work and
without sacrificing performance.&lt;br /&gt;
&lt;h2&gt;




Building a Widget from an External Library&lt;/h2&gt;
What about the one widget that we couldn't build using &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Composite&lt;/span&gt;?
We want to use vector graphics to generate scalable diagrams depicting
database structure and user interaction for systems you build with
Hydro4GE.  There are a small handful of vector graphics libraries
out there for GWT, but all of them require concessions that we are
not willing or able to make.  The Google Web Toolkit Incubator's
&lt;a href="http://code.google.com/docreader/#p=google-web-toolkit-incubator&amp;amp;s=google-web-toolkit-incubator&amp;amp;t=GWTCanvas"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;GWTCanvas&lt;/span&gt;&lt;/a&gt;
does not support text rendering (due to a limitation of HTML canvas),
and although projects such as &lt;a href="http://code.google.com/p/abstractcanvas/"&gt;abstractcanvas&lt;/a&gt;
attempt to overcome this limitation, text cannot be rotated and
precisely scaled.&lt;br /&gt;
In this section, we will show you how to integrate with &lt;a href="http://raphaeljs.com/"&gt;Raphael&lt;/a&gt;, a lightweight JavaScript
library for cross-platform vector graphics.  Raphael side-steps the
HTML canvas issue by using SVG on supported platforms, and Microsoft
VML on Internet Explorer.  Raphael does everything we need to build
our diagrams, except for one thing: integrate directly with our GWT
code.&lt;br /&gt;
We achieved this integration through two levels of abstraction: (1) a
&lt;a href="http://code.google.com/webtoolkit/doc/1.6/DevGuideCodingBasics.html#DevGuideOverlayTypes"&gt;JavaScript Overlay Type&lt;/a&gt;
to provide a zero-overhead interface to the underlying JavaScript API,
and (2) a
&lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/user/client/ui/Widget.html"&gt;GWT Widget&lt;/a&gt;
to wrap the overlay with a more Java-friendly API, resulting in a first-class Widget that will operate
side-by-side with native GWT Widgets.  Let's have a look at the
details for this two-part implementation, starting with the
Overlay class.&lt;br /&gt;
&lt;h3&gt;




The Overlay&lt;/h3&gt;
The RaphaelJS class is nearly an exact replica of the underlying
Raphael API.  This is made necessary by the restrictions that GWT
enforces on &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;JavaScriptObject&lt;/span&gt; types, so the implementation is fairly uncreative:
one method per Raphael method.  Many of these methods appear in the nested
class &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Shape&lt;/span&gt;, which represents the type returned by most of the native Raphael
methods.  The basic idea for the class is:&lt;br /&gt;
&lt;pre&gt;class RaphaelJS extends JavaScriptObject {
  protected static class Shape extends JavaScriptObject {
    public final native Shape rotate(double degree, boolean abs) /*-{
      return this.rotate(degree, abs);
    }-*/;
    public final native Shape scale(double sx, double sy) /*-{
      return this.scale(sx, sy);
    }-*/;
    public final native Shape translate(double dx, double dy) /*-{
      return this.translate(dx, dy);
    }-*/;
    // ...
  }

  /**
   * factory method
   */
  static public final native RaphaelJS create(Element e,
      int w, int h) /*-{
    return $wnd.Raphael(e, w, h);
  }-*/;

  public final native Element node() /*-{
    return this.node;
  }-*/;

  public final native Shape circle(double x, double y, double r) /*-{
    return this.circle(x,y,r);
  }-*/;

  public final native Shape rect(double x, double y,
      double w, double h) /*-{
    return this.rect(x, y, w, h);
  }-*/;

  // ...
}
&lt;/pre&gt;
&lt;h3&gt;




The Widget&lt;/h3&gt;
The Overlay bridges the gap between GWT and Javacript, but the
Widget is what truly makes the library useful to our application.
Since the Widget does not have the restrictions of the &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;JavaScriptObject&lt;/span&gt;
Overlay, we have the freedom to define our own API as an adaptor
to the Overlay.&lt;br /&gt;
&lt;pre&gt;public class Raphael extends Widget {
  private RaphaelJS overlay;

  public class Shape extends Widget {
    protected RaphaelJS.Shape rs;
    protected Shape(RaphaelJS.Shape s) {
      setElement(s.node());
      rs = s;
    }
    public Shape rotate(double degree, boolean isAbsolute) {
      rs.rotate(degree, isAbsolute);
      return this;
    }
    public Shape scale(double sx, double sy) {
      rs.scale(sx, sy);
      return this;
    }
    public Shape translate(double dx, double dy) {
      rs.translate(dx, dy);
      return this;
    }
    // ...
  }

  public class Circle extends Shape {
    public Circle(double x, double y, double r) {
      super(overlay.circle(x, y, r));
    }
  }

  public class Rectangle extends Shape {
    public Rectangle(double x, double y, double w, double h) {
      super(overlay.rect(x, y, w, h));
    }
    public Rectangle(double x, double y, double w, double h, double r) {
      super(overlay.rect(x, y, w, h, r));
    }
  }

  public class Text extends Shape {
    public Text(double x, double y, String str) {
      super(overlay.text(x, y, str));
    }
  }

  // ...

  public Raphael(int width, int height) {
    Element raphaelDiv = DOM.createDiv();
    setElement(raphaelDiv); 
    overlay = RaphaelJS.create(raphaelDiv, width, height);
  }  
}
&lt;/pre&gt;
This implementation defines separate classes that represent the
different types of objects (&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Circle&lt;/span&gt;, &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Text&lt;/span&gt;, &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Rectangle&lt;/span&gt;) developers can
append to a drawing.  A possible alternative implementation might
simply expose the underlying JavaScript API as a native GWT widget
— in the end, you can write an API that suits your needs.&lt;br /&gt;
We chose this implementation because it allows us to implement
scalable drawings through inheritance, resulting in custom classes that
can be instantiated and appended to any Panel.  For example, to
create a fullscreen drawing that contains a single, centered circle
of radius 20:&lt;br /&gt;
&lt;pre&gt;public class MyDrawing extends Raphael {
  public MyDrawing(int width, int height) {
    super(width, height);
    Circle c = new Circle(width/2, height/2, 20);
    // Raphael automatically appends the Circle to this drawing
  }
}

public class MyApp implements EntryPoint {
  public void onModuleLoad() {
    MyDrawing d = new MyDrawing(Window.getClientWidth(),
        Window.getClientHeight());
    RootPanel.get().add(d);
  }
}
&lt;/pre&gt;
This is a trivial example, but it clearly demonstrates the simplicity
that can be achieved by integrating an external JavaScript library
as a Widget.  To the consumers of this library, there is no difference
between using it (a third-party Javascript library) and the native
GWT widget library.  That's a powerful statement, and a testament
to the GWT design team.&lt;br /&gt;
&lt;h2&gt;




Communicating with the server&lt;/h2&gt;
With the UI visually complete, it was time to move on to integration
with the backend.  Our existing backend was implemented in PHP, and
we did not want to rewrite it in Java just to support GWT-RPC.
Without native support for GWT-RPC calls to a PHP backend, we needed
a flexible and efficient communication framework to accomplish the
equivalent task.  We chose JSON for its simplicity and solid support
in both GWT and PHP, but ultimately we learned that regardless of
the efficiency of the encoding, it's still easy to make design
mistakes that will lead to inefficient communications.&lt;br /&gt;
First, we need to get the client and server talking to each other.
Making JSON-encoded client requests from GWT is made trivial by using the
&lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/http/client/RequestBuilder.html"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;RequestBuilder&lt;/span&gt;&lt;/a&gt;
class in conjunction with
&lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/json/client/JSONObject.html"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;JSONObject&lt;/span&gt;&lt;/a&gt;,
and handling JSON on the server with PHP is easily accomplished using &lt;a href="http://framework.zend.com/"&gt;Zend Framework&lt;/a&gt;,
which provides the &lt;a href="http://framework.zend.com/manual/en/zend.json.html"&gt;Zend_Json&lt;/a&gt;
class for encoding/decoding JSON, and
&lt;a href="http://framework.zend.com/manual/en/zend.controller.html"&gt;Zend_Controller&lt;/a&gt;
for handling and routing requests.  This provides the framework we
need to tie into our PHP code running on the server.&lt;br /&gt;
Having addressed the encoding and handling of requests, our
attention turned to dealing with the size and frequency of requests.
The whole point of making AJAX requests was to transfer little bits
of data instead of re-sending an entire HTML document, but we found
a break-even point where the payload became so small that the request
frequency was the limiting factor.  At one point, we had gotten so
carried away breaking up information into atomic pieces that the
overhead of each request was exceeding 90% of the total time to
complete the request, leaving less than 10% of the time to actually
process and transfer the payload.&lt;br /&gt;
The reason this can happen is pretty straightforward.  Over any
network connection, there is a minimum amount of time necessary for
the HTTP request/response to live its lifecycle.  This is compounded
by the two-connection browser limit plus overhead imposed by the
network stack and connection latency.  The net effect of all this
is that if you dispatch one hundred requests in rapid succession,
each of which contains only a few hundred bytes of payload data,
it would take nearly one hundred times as long to complete all one
hundred requests as it would take to transfer the entire payload
(tens of kilobytes) in one request.  In terms of real-world figures,
this translates to a 300 or 400 millisecond time for completion,
as opposed to 30 or 40 seconds!&lt;br /&gt;
This lesson reminds us that when you write software, you must
always design for the limitations of the platform, even when you
have great tools at your disposal.  In this case, to write efficient
web software with GWT, you need to make every HTTP request reach
its fullest potential by maximizing its effects.&lt;br /&gt;
We achieved this by modeling each request as a collection of
atomic commands.  In this simple model, each command can return a
set of data, and is associated with one or more response data
handlers.  The commands are processed on the server within a database
transaction so that the entire request either succeeds or fails as
a single unit without leaving the database in an inconsistent
state.&lt;br /&gt;
This abstraction allows us to queue up many physical database
operations into one logical JSON request, not only improving
performance but also allowing us to handle the results in a modular
way that involves less code than a typical GWT request callback.
In this sense we have actually managed to reduce the complexity of
the asynchronous HTTP request for this specialized case.  For
example, take the code that handles selection of user roles from
the Hydro4GE database:&lt;br /&gt;
&lt;pre&gt;  public class SelectRoleHandler implements DatabaseRequest.Handler {
    public void handle(DatabaseRequest.Result result) {
      for (int row=0; row &amp;lt; result.getRowCount(); row++) {
        JSONObject data_row = result.getRowValues(row);
        Role r = new Role(data_row);
        // process role...
      }
    }
  }
&lt;/pre&gt;
Compare this to the code that you would typically write for an
HTTP request callback:&lt;br /&gt;
&lt;pre&gt;  public class SelectRoleCallback implements RequestCallback {
    public void onError(Request request, Throwable exception) {
      Window.alert("Couldn't retrieve JSON");
    }

    public void onResponseReceived(Request request, Response response) {
      if (200 == response.getStatusCode()) {
        JSONArray data_set =
            JSONParser.parse(response.getText()).isArray();
        if (data_set != null) {
          for (int row=0; row &amp;lt; data_set.size(); row++) {
            JSONObject data_row = data_set.get(row).isObject();
            Role r = new Role(data_row);
            // process role...
          }
        }
      } else {
        Window.alert("Couldn't retrieve JSON ("
            + response.getStatusText() + ")");
      }
    }
  }
&lt;/pre&gt;
Besides being easier to understand (and half as many lines!),
the Handler code has the advantage over the &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Callback&lt;/span&gt; in that multiple
independent handlers can be attached to a single request in order
to achieve separation of responsibility in handling each response.
In addition, each handler is isolated from the results of other
commands in the same request, so that there is no confusion over
which results you are handling.  This example does not even introduce
the complexity of handling multiple command responses in the typical
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;RequestCallback&lt;/span&gt; code, but the &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Handler&lt;/span&gt; code supports it implicitly
by its nature.&lt;br /&gt;
These concepts can and should be applied to GWT-RPC or any other
communications encoding.  The implementation details are different,
but the spirit is the same: make every HTTP request really count.&lt;br /&gt;
&lt;h2&gt;




Conclusion&lt;/h2&gt;
The techniques I have demonstrated here can be used
equally effectively in both new and existing projects.  Whether
you are trying to build a slick UI, wrap an external library, or
talk to a server, I have only scratched the surface of what is
possible with GWT.  I am especially looking forward to GWT 2.0 for
continued improvements on some of the topics covered here, made
possible by some exciting upcoming features such as &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;UiBinder&lt;/span&gt; and
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;CssResource&lt;/span&gt;.&lt;br /&gt;
In short, I am pretty excited about GWT and Hydro4GE, and I hope
you are too.  Be sure to check out the sneak peek of &lt;a href="http://www.hydro4ge.com/"&gt;Hydro4GE&lt;/a&gt; to see a 
&lt;a href="http://demo.hydro4ge.com/"&gt;demo&lt;/a&gt; of our GWT UI in action!&lt;br /&gt;
&lt;em&gt;Geoffrey C. Speicher, MS is a Software Engineer at &lt;a href="http://www.sea-incorporated.com/"&gt;Software Engineering
Associates&lt;/a&gt; and the Chief System Architect of &lt;a href="http://www.hydro4ge.com/"&gt;Hydro4GE&lt;/a&gt;.&lt;/em&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-5515892092783518772?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=gkcV-D6bfLw:Cfe946lzneo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=gkcV-D6bfLw:Cfe946lzneo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=gkcV-D6bfLw:Cfe946lzneo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/gkcV-D6bfLw" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/5515892092783518772?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/5515892092783518772?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/gkcV-D6bfLw/hydro4ge-paas-built-with-gwt.html" title="Hydro4GE — a PaaS built with GWT" /><author><name>Fred Sauer, Developer Advocate</name><uri>http://www.blogger.com/profile/06804630764751433448</uri><email>fredsa@google.com</email><gd:extendedProperty name="OpenSocialUserId" value="09520208890341198929" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_v1cyex1oKPA/SpydNyPfx6I/AAAAAAAAAAs/ULGA-KQStlg/s72-c/default.png" height="72" width="72" /><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/09/hydro4ge-paas-built-with-gwt.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMMRng7eyp7ImA9WxNTEUk.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-433938194208406965</id><published>2009-08-12T22:48:00.000-07:00</published><updated>2009-08-12T22:48:07.603-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-12T22:48:07.603-07:00</app:edited><title>GWT for Enterprise Developers</title><content type="html">Do you use GWT -or are thinking seriously about using it- to develop your internal or public facing web applications?&amp;nbsp;Do you work in a corporate setting or otherwise collaborate with multiple developers on a single web app? If their answer is yes to either of these questions perhaps we can share.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;b&gt;I'd like to share with you&lt;/b&gt;&lt;/div&gt;
&lt;b&gt;&lt;span style="font-weight: normal;"&gt;I will be giving a talk called &lt;a href="http://www.jbossworld.com/agenda/tracks/"&gt;Google Web Toolkit for the Enterprise Developers&lt;/a&gt;&amp;nbsp;at&amp;nbsp;&lt;a href="http://www.jbossworld.com/"&gt;JBoss World 2009&lt;/a&gt;&amp;nbsp;in Chicago, September 1-4. I hope to share practical tips and lesser known, yet really useful features in GWT. While the talk will focus primarily on corporate development scenarios, the content will most certainly be useful if you're the most valuable member of a one person team. I hope to see you there. Don't forget to bring your questions.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;span style="font-weight: normal;"&gt;&lt;/span&gt;Will you share with us?&lt;/b&gt;&lt;br /&gt;
Not everyone develops the same. In fact the same people may adopt different development styles as they move between teams. Different tools also work differently depending on the team and the project. I'd like to get to know your teams a little bit better and understand how GWT development happens for you. If you're willing to share with me please&amp;nbsp;&lt;a href="mailto:fredsa@google.com"&gt;send me an email&lt;/a&gt;.&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-433938194208406965?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=jUFBv8_zHEM:6Ql4Cbfu2b8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=jUFBv8_zHEM:6Ql4Cbfu2b8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=jUFBv8_zHEM:6Ql4Cbfu2b8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/jUFBv8_zHEM" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/433938194208406965?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/433938194208406965?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/jUFBv8_zHEM/gwt-for-enterprise-developers.html" title="GWT for Enterprise Developers" /><author><name>Fred Sauer, Developer Advocate</name><uri>http://www.blogger.com/profile/06804630764751433448</uri><email>fredsa@google.com</email><gd:extendedProperty name="OpenSocialUserId" value="09520208890341198929" /></author><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/08/gwt-for-enterprise-developers.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMNQ3Y5eyp7ImA9WxNTEUw.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-8328510931961234224</id><published>2009-08-12T15:25:00.000-07:00</published><updated>2009-08-12T16:08:12.823-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-12T16:08:12.823-07:00</app:edited><title>Seesmic duplicates their Adobe Air interface on the web with GWT</title><content type="html">&lt;p&gt;
Recently I was shown a demo of &lt;a href="http://seesmic.com/"&gt;Seesmic Web&lt;/a&gt;, an application that lets you manage multiple streams and Twitter accounts. The demo was very cool and notable because Seesmic's related product is Seesmic Desktop, implemented in &lt;a href="http://www.adobe.com/products/air/"&gt;Adobe Air&lt;/a&gt;. Seesmic Web replicates the desktop functionality, but on the web using GWT.
&lt;/p&gt;
&lt;p&gt;
The team chose &lt;a href="http://code.google.com/webtoolkit/"&gt;GWT&lt;/a&gt; to build &lt;a href="http://seesmic.com/app/"&gt;Seesmic Web&lt;/a&gt;, and I was curious to hear about their experience. In case it helps others in the process of evaluating GWT for building web apps, here is the response I got back from Johann Romefort, CTO at Seesmic.
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
The choice of using GWT was nearly natural once we defined the need for a very dynamic "single page" application.
&lt;/p&gt;
&lt;p&gt;
Our Flex developers found themselves in a known environment (Eclipse) - developing a webapp with a strongly typed language. It took them 2 weeks to learn the GWT Framework - together with the Java language itself! 
&lt;/p&gt;
&lt;p&gt;
We were delighted to see the number of high quality libraries already available, as well as the vivid community around GWT. Finally, the determination of Google to keep the project updated was a convincing factor for adopting this technology.
&lt;/p&gt;
&lt;p&gt;
From the beginning, we started using a MVC framework to keep our code well-structured, and it soon paid itself off in development. The predictability of the framework was a big plus: you write code, you reload, it works. All the bugs we encountered were documented, so finding workarounds was pretty straightforward. We were a bit anxious about legacy Javascript bridging, but JSNI proved to be a very easy way to use 3rd-party libraries.
&lt;/p&gt;
&lt;p&gt;
We started development with version 1.5.3 of GWT and we just ported the app to 1.7. The porting process was a breeze and we’re very happy to be able to use the Eclipse plug-in for GWT. 
&lt;/p&gt;
&lt;p&gt;
I guess one area of departure is that we did not follow the classical RPC way for our server-side interactions. Instead, we built a REST API to keep our back-end services agnostic from the client used. We’re using Restlets to interact with our REST API, which once again worked flawlessly, as expected.
&lt;/p&gt;
&lt;p&gt;
Our overall experience using GWT has been very positive. The fact that we develop in Java has a lot of advantages, such as being able to use java debugging tools - instead of just Firebug - if you’re in pure JavaScript. GWT has a few things we would like to see, like being able to load code dynamically instead of compiling everything in a large .js file, but it seems that GWT2.0 will bring forth some new possibilities.
&lt;/p&gt; &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-8328510931961234224?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=PSUULjUhKnc:qpRkFqnJ824:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=PSUULjUhKnc:qpRkFqnJ824:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=PSUULjUhKnc:qpRkFqnJ824:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/PSUULjUhKnc" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/8328510931961234224?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/8328510931961234224?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/PSUULjUhKnc/seesmic-duplicates-their-adobe-air.html" title="Seesmic duplicates their Adobe Air interface on the web with GWT" /><author><name>Andrew Bowers</name><uri>http://www.blogger.com/profile/17404995007960091950</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="02987777633111939795" /></author><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/08/seesmic-duplicates-their-adobe-air.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AGRHY-cSp7ImA9WxNTEUw.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-6471699701454801983</id><published>2009-08-11T15:18:00.000-07:00</published><updated>2009-08-12T15:22:05.859-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-12T15:22:05.859-07:00</app:edited><title>Separating View and Presenter code for better testability</title><content type="html">The &lt;a href="http://googletesting.blogspot.com/2009/08/tott-testing-gwt-without-gwttest.html"&gt;Google Testing blog&lt;/a&gt; has a post on &lt;a href="http://googletesting.blogspot.com/2009/08/tott-testing-gwt-without-gwttest.html"&gt;testing GWT applications&lt;/a&gt;. Specifically the post talks about testing best practices and the use (or non-use) of &lt;a href="http://code.google.com/webtoolkit/doc/1.6/DevGuideTesting.html#DevGuideJUnitCreation"&gt;GwtTestCase&lt;/a&gt;. It's worth checking out, especially if you are interested in better testability and architecture. To learn more about the MVP pattern mentioned, watch Ray Ryan's &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.youtube.com/watch?v=PDuhR18-EdM"&gt;Best Practices for Architecting your GWT App&lt;/a&gt;&lt;/span&gt; talk at Google I/O.
&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-6471699701454801983?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=qMQr9lg69EU:Q_7joBLRoTs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=qMQr9lg69EU:Q_7joBLRoTs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=qMQr9lg69EU:Q_7joBLRoTs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/qMQr9lg69EU" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/6471699701454801983?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/6471699701454801983?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/qMQr9lg69EU/separating-view-and-presenter-code-for.html" title="Separating View and Presenter code for better testability" /><author><name>Andrew Bowers</name><uri>http://www.blogger.com/profile/17404995007960091950</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="02987777633111939795" /></author><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/08/separating-view-and-presenter-code-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEGQn0zfCp7ImA9WxJbGEw.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-2839550950421524523</id><published>2009-07-28T12:09:00.000-07:00</published><updated>2009-07-28T12:50:23.384-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-28T12:50:23.384-07:00</app:edited><title>GWT Community Updates</title><content type="html">&lt;p&gt;&lt;span style="color: rgb(102, 102, 102); "&gt;&lt;b&gt;&lt;span style="font-size:130%;"&gt;Community announcements&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a id="ztqo" href="http://code.google.com/p/gwt-in-the-air/" title="GWT-in-the-Air (and in Yahoo! BrowserPlus)"&gt;GWT-in-the-Air (and in Yahoo! BrowserPlus&lt;sup&gt;&lt;span style="font-size:78%;"&gt;TM&lt;/span&gt;&lt;/sup&gt;)&lt;/a&gt;:&lt;/b&gt; Thomas Broyer, one of our &lt;a id="pclr" href="http://groups.google.com/group/Google-Web-Toolkit-Contributors" title="GWT contributors"&gt;GWT contributors&lt;/a&gt; and a regular on &lt;a id="o9dc" href="http://groups.google.com/group/Google-Web-Toolkit" title="the forum"&gt;the forum&lt;/a&gt;, has been working on the GWT-in-the-Air project over the last year. The project provides an &lt;a id="hazh" href="http://www.adobe.com/products/air/" title="Adobe AIR"&gt;Adobe AIR&lt;/a&gt; version of your GWT application, making it ready to run in the browser or on the desktop. Thomas has most recently added support for &lt;a href="http://browserplus.yahoo.com/" title="Yahoo! BrowserPlus"&gt;Yahoo! BrowserPlus&lt;sup&gt;&lt;span style="font-size:78%;"&gt;TM&lt;/span&gt;&lt;/sup&gt;&lt;/a&gt; as well, which allows you to add desktop capabilities to your GWT app.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a id="mnt4" href="http://code.google.com/p/gchart/" title="GChart 2.6 released"&gt;GChart 2.6 released&lt;/a&gt;:&lt;/b&gt; John Gunther recently announced the GChart 2.5 release, which adds a GWT canvas rendering option for better looking charts and graphs.&lt;a id="es48" href="http://gchart.googlecode.com/svn/trunk/doc/com/googlecode/gchart/client/doc-files/gchart2p6features.html" title="GChart 2.6 was also published"&gt;GChart 2.6 was also published&lt;/a&gt; recently which fixes deprecated event listener calls and other bug fixes. Check out the &lt;a id="rlde" href="http://gchart.googlecode.com/svn/trunk/live-demo/v2_6/com.googlecode.gchart.gchartdemoapp.GChartDemoApp/GChartDemoApp.html" title="live demo"&gt;live demo&lt;/a&gt; and &lt;a id="kp-0" href="http://gchart.googlecode.com/svn/trunk/doc/com/googlecode/gchart/client/package-summary.html#ChartGallery" title="examples"&gt;examples&lt;/a&gt; if you're interested in using it for your own GWT application.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a id="fhzb" href="http://code.google.com/p/spring4gwt/" title="An early look at Spring4Gwt"&gt;An early look at Spring4Gwt&lt;/a&gt;:&lt;/b&gt; Dustin Mallory has recently created a new project called spring4gwt, which, as you may have guessed, offers a way to integrate GWT with the &lt;a id="rgo9" href="http://www.springsource.org/" title="Spring"&gt;Spring&lt;/a&gt; framework. The project is still in its early stages, but aims to offer both exported Spring services to the GWT client and DI that works specifically for Spring components.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a id="x-o1" href="http://code.google.com/p/gwt-cs/" title="GWT-cs - Springifying your GWT application code"&gt;GWT-cs - Springifying your GWT application code&lt;/a&gt;:&lt;/b&gt; We've seen integrating with Spring, but what if you wanted to develop your GWT client-side code in a Spring-like fashion? In comes the newly started GWT-cs project for just such a use case. With this library, you can develop your GWT client-side application structure using Spring-like bean configuration in an XML format.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a id="x9f5" href="http://code.google.com/p/gwtupload/" title="Uploading with GWTUpload"&gt;Uploading with GWTUpload&lt;/a&gt;:&lt;/b&gt; While the &lt;a id="m-:c" href="http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/user/client/ui/FileUpload.html" title="FileUpload"&gt;FileUpload&lt;/a&gt; widget in GWT core provides one part of the key to uploading files in your GWT applications, the server-side component and it's interaction with the client-side form submission is often the part developers get stuck on. Using GWTUpload, you can get file uploads ready in just a few steps. You also get other nifty features like progress bars showing file upload progress (file size, bytes transferred).&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(102, 102, 102); "&gt;&lt;b&gt;&lt;span style="font-size:130%;"&gt;New Articles on the GWT homepage&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;We've recently published new articles on the GWT homepage, including:&lt;/p&gt;&lt;ul style="margin-top: 1px; margin-bottom: 0px;"&gt;&lt;li style="margin-top: 0px; margin-bottom: 2px;"&gt;&lt;a id="pwcu" href="http://code.google.com/webtoolkit/articles/using_gwt_with_hibernate.html" title="Using GWT with Hibernate"&gt;Using GWT with Hibernate&lt;/a&gt;: A tutorial articles that explains step-by-step how to integrate GWT with Hibernate using one of various integration strategies, while discussing the pros and cons of each approach.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px;"&gt;&lt;a id="e4w1" href="http://code.google.com/webtoolkit/articles/testing_methodologies_using_gwt.html" title="Testing Methodologies Using Google Web Toolkit"&gt;Testing Methodologies Using Google Web Toolkit&lt;/a&gt;: An article describing how to design your GWT application test-first, using principles of &lt;a id="gomf" href="http://en.wikipedia.org/wiki/Test-driven_development" title="Test-Driven Design"&gt;Test-Driven Design&lt;/a&gt; and the &lt;a id="buqz" href="http://martinfowler.com/eaaDev/ModelViewPresenter.html" title="Model-View-Presenter (Passive View)"&gt;Model-View-Presenter (Passive View)&lt;/a&gt; pattern.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These articles were created to address the many inquiries we've seen on integration and testing topics, so hopefully they will be helpful to you if you're at the point of making integration or design decisions in your GWT project. Also, many of these articles were written in collaboration with the GWT developer community, so if you have any articles or topics that you would like us to consider for publishing on the GWT homepage, feel free to &lt;a id="e4g7" href="http://groups.google.com/group/Google-Web-Toolkit/post?sendowner=1&amp;amp;_done=/group/Google-Web-Toolkit/about%3F&amp;amp;" title="get in touch with us"&gt;get in touch with us&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-2839550950421524523?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=bCS54PPyuLk:n-iAifI5cZ4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=bCS54PPyuLk:n-iAifI5cZ4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=bCS54PPyuLk:n-iAifI5cZ4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/bCS54PPyuLk" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/2839550950421524523?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/2839550950421524523?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/bCS54PPyuLk/gwt-community-updates.html" title="GWT Community Updates" /><author><name>Sumit Chandel, Developer Programs Engineer</name><uri>http://www.blogger.com/profile/04432308492360866920</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03219604349908016700" /></author><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/07/gwt-community-updates.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQCSH8zfyp7ImA9WxJbE0s.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-616443213763556124</id><published>2009-07-23T08:34:00.000-07:00</published><updated>2009-07-23T08:36:09.187-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-23T08:36:09.187-07:00</app:edited><title>Google Web Toolkit 1.7 Now Available</title><content type="html">GWT 1.7 is a minor update that adds better support for Internet Explorer 8, Firefox 3.5, and Safari 4. Each of these new browser versions introduced at least one change that negatively impacted compiled GWT modules, so we recommend that you do update to GWT 1.7 and recompile your existing applications to ensure that they work well with the latest versions of browsers. No source code changes on your part should be required.
&lt;p&gt;
Normally, a minor update such as this would have been named 1.6.5 (the previous latest version of GWT was 1.6.4), but we did add the value "ie8" to the "user.agent" deferred binding property, which could impact projects using custom deferred binding rules that are sensitive to that property. Thus, we went with GWT 1.7 rather than GWT 1.6.5, to indicate that you may 
need to pay attention to that change. Details are in the &lt;a href="http://code.google.com/webtoolkit/releases/release-notes-1.7.0.html"&gt;release notes&lt;/a&gt;. 
&lt;p&gt;
In every other respect, this is just a bugfix release, so in the vast 
majority of cases, the update-recompile process should be nearly effortless. 
&lt;p&gt;
&lt;b&gt;&lt;a href="http://code.google.com/webtoolkit/download.html"&gt;Download Google Web Toolkit 1.7&lt;/a&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-616443213763556124?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=0WTR0vzbg9o:cLAnovDysOs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=0WTR0vzbg9o:cLAnovDysOs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=0WTR0vzbg9o:cLAnovDysOs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/0WTR0vzbg9o" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/616443213763556124?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/616443213763556124?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/0WTR0vzbg9o/google-web-toolkit-17-now-available.html" title="Google Web Toolkit 1.7 Now Available" /><author><name>Bruce Johnson</name><uri>http://www.blogger.com/profile/12699642840488867708</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11460383164054803490" /></author><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/07/google-web-toolkit-17-now-available.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08BRH8ycCp7ImA9WxJUF0w.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-8339217656851359065</id><published>2009-07-15T16:57:00.000-07:00</published><updated>2009-07-15T21:50:55.198-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-15T21:50:55.198-07:00</app:edited><title>Introducing the Debug Panel for GWT</title><content type="html">&lt;br /&gt;
The primary intent of the Debug Panel for the &lt;a href="http://code.google.com/webtoolkit/"&gt;Google Web Toolkit&lt;/a&gt; (GWT) is to provide the developer of a GWT application performance data about the application as well as tools to debug the client side application code. Web applications built with GWT run mainly in the client's environment, over which the developer has little control or access. The Debug Panel provides tools to the developer to help lift the shroud over the client environment to help diagnose problems, help tune and improve performance as well as assist with application testing.&lt;br /&gt;
&lt;br /&gt;
As with any application, testing and quality assurance is important to a GWT application. Because a GWT application is user facing, performance testing is very important. However, measuring the performance of an application running in a browser is not easy. With all the moving parts of the client code - RPCs, DOM updates, etc. - and the fact that with GWT you are no longer writing JavaScript, it can be hard to locate bottlenecks. Automating the performance tests and getting accurate numbers on RPC response time is even harder. This is where the &lt;a href="http://code.google.com/p/gwt-debug-panel"&gt;Debug Panel for GWT&lt;/a&gt; comes into the picture. It is an external library that can easily be added to any GWT Web application and will provide you with that performance data, an insight into what goes on behind the scenes and help you automate the whole thing, too.&lt;br /&gt;
&lt;br /&gt;
Here is a sample screenshot of the Debug Panel in action:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/_v1cyex1oKPA/Sl5sMGRWKKI/AAAAAAAAAAc/v6QPSk3tL5E/s1600-h/dp1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_v1cyex1oKPA/Sl5sMGRWKKI/AAAAAAAAAAc/v6QPSk3tL5E/s400/dp1.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Here, the Debug Panel shows us the statistics of an invocation of the &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;EchoService &lt;/span&gt;as well as the startup times. It is clear from the example that RPC finished quickly. It shows that the slowest component was waiting for the server to respond at 121ms. While serializing the request and deserializing the response both took 19ms, updating the UI with the data returned from the server only took 2ms. These are the kinds of numbers you would want to see!&lt;br /&gt;
&lt;br /&gt;
Here is another example screenshot of the Debug Panel:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/_v1cyex1oKPA/Sl5sOZbq00I/AAAAAAAAAAk/g_HM9MBBoPM/s1600-h/dp2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_v1cyex1oKPA/Sl5sOZbq00I/AAAAAAAAAAk/g_HM9MBBoPM/s400/dp2.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
This time, the application was run in Hosted Mode and there was an exception during the RPC. Once you compile your application to JavaScript, the stack trace will be a JavaScript stack trace of course. The exception panel in the Debug Panel is also an example of the extensibility of the Debug Panel. As a GWT application developer, you can add your own panels to the Debug Panel that are customized to your application. The Debug Panel provides you with a framework to display your application's debug data as well as a lightweight component to add to your main application, so it can communicate the relevant data to the Debug Panel, without affecting runtime performance much.&lt;br /&gt;
&lt;br /&gt;
In fact, you can plug the Debug Panel into an existing application without changing the application's code. This also means that there is no change required in the compiled JavaScript. Therefore, you can serve your GWT web application both with the Debug Panel enabled, to internal IP's for example, or disabled for everybody else.&lt;br /&gt;
&lt;br /&gt;
Check out an &lt;a href="http://gwt-debug-panel.googlecode.com/svn/example/app.html"&gt;online example&lt;/a&gt; of the Debug Panel, check out the &lt;a href="http://code.google.com/p/gwt-debug-panel/source/browse/#svn/trunk/src/example/java/com/example"&gt;example's source&lt;/a&gt; to see how easy it is to use or check out the &lt;a href="http://code.google.com/p/gwt-debug-panel/"&gt;Google Code project&lt;/a&gt; for more information.&lt;br /&gt;
&lt;br /&gt;
Pascal Muetschard, Software Engineering Team&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-8339217656851359065?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=xhxvEHOspjo:2qhsz8yd018:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=xhxvEHOspjo:2qhsz8yd018:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=xhxvEHOspjo:2qhsz8yd018:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/xhxvEHOspjo" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/8339217656851359065?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/8339217656851359065?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/xhxvEHOspjo/introducing-debug-panel-for-gwt.html" title="Introducing the Debug Panel for GWT" /><author><name>Fred Sauer, Developer Advocate</name><uri>http://www.blogger.com/profile/06804630764751433448</uri><email>fredsa@google.com</email><gd:extendedProperty name="OpenSocialUserId" value="09520208890341198929" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_v1cyex1oKPA/Sl5sMGRWKKI/AAAAAAAAAAc/v6QPSk3tL5E/s72-c/dp1.png" height="72" width="72" /><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/07/introducing-debug-panel-for-gwt.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUEQn0zeSp7ImA9WxJWEUw.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-4975551778000746932</id><published>2009-06-15T18:36:00.000-07:00</published><updated>2009-06-15T18:36:43.381-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-15T18:36:43.381-07:00</app:edited><title>Come hear about GWT at the Googleplex tomorrow night (June 16, 2009)</title><content type="html">&lt;br /&gt;
For those of you in and around Silicon Valley, I'd like to invite you to see my &lt;a href="http://code.google.com/webtoolkit/"&gt;Google Web Toolkit&lt;/a&gt; presentation titled "&lt;i&gt;GWT Overview and Feature Preview&lt;/i&gt;" at the Silicon Valley Web Java User Group. I'll start with an overview of current GWT features and functionality. Towards the end I'll cover some of the features you can expect to see in &lt;a href="http://code.google.com/webtoolkit/makinggwtbetter.html#roadmap"&gt;GWT 2.0&lt;/a&gt;, many of which you can try out now if you don't mind &lt;a href="http://code.google.com/webtoolkit/makinggwtbetter.html#workingoncode"&gt;creating your own builds&lt;/a&gt;. Of course there will be plenty of time for Q&amp;amp;A and some time to network with other developers in the community.&lt;br /&gt;
&lt;br /&gt;
The meeting will be in the usual place on the Google campus. Please &lt;a href="http://www.meetup.com/sv-web-jug/calendar/10012641/"&gt;register here&lt;/a&gt; (&lt;a href="http://www.meetup.com/sv-web-jug/calendar/10012641/"&gt;http://www.meetup.com/sv-web-jug/calendar/10012641/&lt;/a&gt;). If you can't make this particular meeting, you can catch up on GWT when you have a moment by watching any of the&amp;nbsp;&lt;a href="http://code.google.com/events/io/sessions.html"&gt;Google I/O GWT session videos and slides&lt;/a&gt;&amp;nbsp;you missed. If you live further away, you could always start a local &lt;a href="http://www.gtugs.org/"&gt;Google Technology User Group&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Hope to see you there.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-4975551778000746932?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=cTfOLNlbFLg:MH3JpDTThp0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=cTfOLNlbFLg:MH3JpDTThp0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=cTfOLNlbFLg:MH3JpDTThp0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/cTfOLNlbFLg" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/4975551778000746932?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/4975551778000746932?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/cTfOLNlbFLg/come-hear-about-gwt-at-googleplex.html" title="Come hear about GWT at the Googleplex tomorrow night (June 16, 2009)" /><author><name>Fred Sauer, Developer Advocate</name><uri>http://www.blogger.com/profile/06804630764751433448</uri><email>fredsa@google.com</email><gd:extendedProperty name="OpenSocialUserId" value="09520208890341198929" /></author><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/06/come-hear-about-gwt-at-googleplex.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8NRHo4cSp7ImA9WxJXF0s.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-5906662093077923928</id><published>2009-06-11T17:04:00.000-07:00</published><updated>2009-06-11T17:34:55.439-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-11T17:34:55.439-07:00</app:edited><title>GWT Community Updates</title><content type="html">&lt;p&gt;&lt;span style="color: rgb(102, 102, 102); "&gt;&lt;b&gt;&lt;span style="font-size:130%;"&gt;Community announcements&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href="http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/69d5ccd01240a59c" title="Gilead GWT adapter for Google App Engine"&gt;Gilead GWT adapter for Google App Engine&lt;/a&gt;:&lt;/b&gt; Bruno Marchesson, creator of the Gilead (aka Hibernate4GWT) library, has created another adapter - this time for GWT applications running on App Engine. It is still in its early stages,  but this may be useful to those looking to build their applications using GWT and Google App Engine and who don't mind hammering on fresh code.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a id="yshe" href="http://vaadin.com/blog/-/blogs/vaadin-6-server-driven-ria-framework-announced-the-next-generation-of-it-mill-toolkit" title="Vaadin 6 (formerly IT Mill Toolkit) releases"&gt;Vaadin 6 (formerly IT Mill Toolkit) releases&lt;/a&gt;&lt;/b&gt;: The IT Mill team has come out with the latest release of their toolkit built using GWT technology. Vaadin offers a different take on Ajax application development that employs server-driven architecture with widgets composed of both client and server-side components. Their latest release is available on their new &lt;a id="walz" href="http://vaadin.com/home" title="site"&gt;site&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a id="p.81" href="http://www.jroller.com/sjivan/entry/smartgwt_out_of_beta_v1" title="SmartGWT out of beta with v1.1 release"&gt;SmartGWT out of beta with v1.1 release&lt;/a&gt;&lt;/b&gt;: Sanjiv Jivan has been hard at work getting the SmartGWT library ready for its out of beta release. It includes many useful new features that you might be interested in &lt;a id="h1:y" href="http://code.google.com/p/smartgwt/" title="checking out" style="color: rgb(85, 26, 139); "&gt;checking out&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(102, 102, 102); "&gt;&lt;b&gt;&lt;span style="font-size:130%;"&gt;Google I/O 2009 - Caught on video&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a id="p_d6" href="http://google-code-updates.blogspot.com/2009/06/google-web-toolkit-at-google-io.html" title="GWT at Google I/O"&gt;GWT at Google I/O&lt;/a&gt;:&lt;/b&gt; In case you missed it, we've captured all the &lt;a id="zgvv" href="http://code.google.com/events/io/sessions.html#gwt" title="GWT session goodness"&gt;GWT sessions&lt;/a&gt; at Google I/O on video, including the &lt;a id="i6ro" href="http://www.youtube.com/watch?v=v_UyVmITiYQ" title="stellar keynote presenting Google Wave"&gt;keynote presenting Google Wave&lt;/a&gt; (built with GWT).&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a id="nb01" href="http://www.youtube.com/view_play_list?p=AD62C6B86094F215" title="GWT Developers at Google I/O" style="color: rgb(85, 26, 139); "&gt;GWT Developers at Google I/O&lt;/a&gt;:&lt;/b&gt; A few external developers who use GWT also stopped by I/O and participated in the Developer Sandbox. Despite all the hustle and bustle around the sandbox area, we managed to talk to some of them on video about their development experience. Some of those we talked to include:&lt;/p&gt;&lt;ul&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;a id="v-xm" href="http://www.youtube.com/watch?v=w_PBMfXIfSM" title="DotSpots"&gt;DotSpots&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;a id="fr3o" href="http://www.youtube.com/watch?v=uOmAt6TT7hM" title="StudyBlue"&gt;StudyBlue&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;a id="mzaq" href="http://www.youtube.com/watch?v=OiZnB7BAJPc" title="Lombardi Blueprint"&gt;Lombardi Blueprint&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;a id="mdgj" href="http://www.youtube.com/watch?v=ifrLm51S_JI" title="Queplix"&gt;Queplix&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;a id="v4_h" href="http://www.youtube.com/watch?v=u0qWR3RGw3U" title="GoGrid"&gt;&lt;span style="font-size:100%;"&gt;GoGrid&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;a id="q..6" href="http://www.youtube.com/watch?v=CoYBkXD0QeU" title="Intercontinental Hotels Group"&gt;Intercontinental Hotels Group&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;a id="hy92" href="http://www.youtube.com/watch?v=qDhccfZuboE" title="Pentaho Corporation"&gt;Pentaho Corporation&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;We also talked to &lt;a id="p2e_" href="http://www.youtube.com/view_play_list?p=609EA7F04EF348EB" title="many other developers"&gt;many other developers&lt;/a&gt; using Google Technologies to create some great applications.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-5906662093077923928?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=4ixdAyFJBR8:HUAfWtaJMV4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=4ixdAyFJBR8:HUAfWtaJMV4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=4ixdAyFJBR8:HUAfWtaJMV4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/4ixdAyFJBR8" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/5906662093077923928?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/5906662093077923928?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/4ixdAyFJBR8/gwt-community-updates.html" title="GWT Community Updates" /><author><name>Sumit Chandel, Developer Programs Engineer</name><uri>http://www.blogger.com/profile/04432308492360866920</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03219604349908016700" /></author><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/06/gwt-community-updates.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUEQX85fCp7ImA9WxJQFU8.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-9066851838949011723</id><published>2009-05-28T09:30:00.000-07:00</published><updated>2009-05-28T09:30:00.124-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-28T09:30:00.124-07:00</app:edited><title>New GWT App Gallery posted (check it out)</title><content type="html">&lt;p&gt;A couple months ago, we asked the community to &lt;a id="zeh4" href="http://googlewebtoolkit.blogspot.com/2009/03/tell-us-about-your-gwt-applications-and.html" title="tell us about their GWT applications"&gt;tell us about their GWT applications&lt;/a&gt; and their experience developing them. We were greatly pleased to see many responses, and lots of neat applications. In fact, we had so many responses that we needed a better way to showcase and share them with the community.&lt;/p&gt;&lt;p&gt;Introducing the new &lt;a id="s3q4" href="http://gwtgallery.appspot.com/" title="GWT Application Gallery"&gt;GWT Application Gallery&lt;/a&gt; to save the day, now posted on the GWT homepage. Improving on the earlier GWT Application Gallery, the new gallery adds more features to make community interaction easier and application entries more meaningful. Here are some of these new features that you can look forward to:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;An easier way to submit entries for any GWT-related tools or application that you would like to share with the community&lt;/li&gt;&lt;li&gt;A comment and rating system for others in the GWT community to rate your applications&lt;/li&gt;&lt;li&gt;More screen real estate for application screenshots and thumbnails for your application entry&lt;/li&gt;&lt;li&gt;Searchable tags that you can apply to your GWT application entry&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;We already have a number of entries both from the previous app gallery and newer entries from respondents to our call out a few months ago, and we'd love to &lt;a id="yxzc" href="http://gwtgallery.appspot.com/" title="hear from you"&gt;hear from you&lt;/a&gt; too. So please, check out the new &lt;a id="nm4y" href="http://gwtgallery.appspot.com/" title="GWT App Gallery"&gt;GWT App Gallery&lt;/a&gt; to see the kind of great applications the community has been developing, share your opinions through the comments and ratings feature, and add your own applications to the gallery.&lt;/p&gt;&lt;p&gt;As a sidenote, &lt;a id="w3zc" href="http://code.google.com/io" title="Google IO"&gt;Google I/O&lt;/a&gt; is in full swing. In the spirit of sharing applications and development experiences, we've organized a &lt;a id="n_gz" href="http://code.google.com/events/io/sandbox.html" title="Developer Sandbox"&gt;Developer Sandbox&lt;/a&gt; area this year where third party developers who have used Google developer products can showcase their applications and talk about how they've created them. If you're attending Google I/O, drop by to check out some of these products live. I'll be around that area as well, so please come by to say hello.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-9066851838949011723?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=CcxUpt7t0x4:XS1oQH_7-Fg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=CcxUpt7t0x4:XS1oQH_7-Fg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=CcxUpt7t0x4:XS1oQH_7-Fg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/CcxUpt7t0x4" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/9066851838949011723?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/9066851838949011723?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/CcxUpt7t0x4/new-gwt-app-gallery-posted-check-it-out.html" title="New GWT App Gallery posted (check it out)" /><author><name>Sumit Chandel, Developer Programs Engineer</name><uri>http://www.blogger.com/profile/04432308492360866920</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03219604349908016700" /></author><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/05/new-gwt-app-gallery-posted-check-it-out.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IGRX8ycCp7ImA9WxJSF04.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-2257381629541057379</id><published>2009-05-07T15:22:00.000-07:00</published><updated>2009-05-07T15:32:04.198-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-07T15:32:04.198-07:00</app:edited><title>Google API Libraries for GWT - May 2009 Release</title><content type="html">&lt;p&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Eric Ayers, Google Web Toolkit Team&lt;/span&gt;&lt;/p&gt;&lt;p&gt;We are pleased to announce updates to the Google API Libraries for the &lt;a id="f2hz" href="http://code.google.com/webtoolkit" title="Google Web Toolkit" style="color: rgb(85, 26, 139); "&gt;Google Web Toolkit&lt;/a&gt;  project.  The Google API Libraries for GWT project allows GWT developers to access some of Google's popular JavaScript APIs.  This release contains new bindings for two libraries:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a id="v07s" href="http://code.google.com/apis/ajax/documentation/" title="Google AJAX Loader API"&gt;Google AJAX Loader API&lt;/a&gt;  - Allows dynamically loading an API from GWT code
&lt;/li&gt;&lt;li&gt;&lt;a id="pmma" href="http://code.google.com/apis/ajaxlanguage/" title="Google AJAX Language API"&gt;Google AJAX Language API&lt;/a&gt; - Provides translation, transliteration, and language detection services
&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These libraries each come with sample code and Javadoc documentation.&lt;/p&gt;&lt;p&gt;In addition, other libraries have been updated.  Highlights include:&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;UI Styling and full GoogleBar support for the &lt;a id="wpwe" href="http://code.google.com/apis/maps/" title="Google Maps API" style="color: rgb(85, 26, 139); "&gt;Google Maps API.&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;Ajax Loader support integrated with Search, Maps, Language, and Visualization.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;Formatters support, new event types, and new OrgChart features added to bindings for &lt;a id="ztxe" href="http://code.google.com/apis/visualization/" title="Google Visualization API" style="color: rgb(85, 26, 139); "&gt;Google Visualization API.&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;Bugfixes for the &lt;a id="k:qe" href="http://code.google.com/apis/gears/" title="Google Gears" style="color: rgb(85, 26, 139); "&gt;Gears API&lt;/a&gt; wrappers, for a full release of support for Gears 0.4 features.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;Locked Domain feature added and improved performance for the &lt;a id="yk25" href="http://code.google.com/apis/gadgets/" title="Gadgets API" style="color: rgb(85, 26, 139); "&gt;Gadgets API.&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;These updates are now available for &lt;a id="v8ge" href="http://code.google.com/p/gwt-google-apis/wiki/Downloads" title="download" style="color: rgb(85, 26, 139); "&gt;download&lt;/a&gt; at the &lt;a id="u7al" href="http://code.google.com/p/gwt-google-apis" title="Google API Libraries for GWT" style="color: rgb(85, 26, 139); "&gt;Google API Libraries for GWT&lt;/a&gt;  project hosted on Google Code.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-2257381629541057379?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=Y_xeKagTlsg:cUdnj-cVPjs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=Y_xeKagTlsg:cUdnj-cVPjs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=Y_xeKagTlsg:cUdnj-cVPjs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/Y_xeKagTlsg" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/2257381629541057379?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/2257381629541057379?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/Y_xeKagTlsg/google-api-libraries-for-gwt-may-2009.html" title="Google API Libraries for GWT - May 2009 Release" /><author><name>Sumit Chandel, Developer Programs Engineer</name><uri>http://www.blogger.com/profile/04432308492360866920</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03219604349908016700" /></author><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/05/google-api-libraries-for-gwt-may-2009.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04NR3g8fCp7ImA9WxJSFEU.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-6419625129269359996</id><published>2009-05-04T13:55:00.000-07:00</published><updated>2009-05-04T18:13:16.674-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-04T18:13:16.674-07:00</app:edited><title>GWT and Maven - Playing Nicely Together Since 2008</title><content type="html">&lt;p&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;&lt;span style="font-size:100%;"&gt;StudyBlue is an academic social networking application, built with GWT, that helps students study smarter, faster. To manage the build process during the development of their application, the StudyBlue team uses the Maven build system. Chris Klundt and Hicham Bouabdallah from StudyBlue have kindly dropped by to share their tips on getting GWT and Maven to play nicely together.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Maven is a great resource that allows developers to enable dependency management within their GWT web applications.  While a complete description of Maven's dependency management is beyond the scope of this article, we encourage you to read more &lt;a href="http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html" id="mm_m" target="_blank" title="here"&gt;here&lt;/a&gt; .  Essentially, Maven allows you to modularize your GWT project, separating the reusable pieces of code (i.e. Custom Widgets or Data Transfer Objects) into their own projects while maintaining versioning.  In addition, Maven allows you to incorporate several different modules without having to write/maintain a complex Ant build file.&lt;/p&gt;&lt;h3&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="font-family: 'georgia';"&gt;Modularization&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/h3&gt;&lt;p&gt;When developing your application you may quickly realize that it would be beneficial to separate large pieces into separate modules for easier management and reusability.  We have multiple internal applications that use the same Data Transfer Objects and Custom Widgets.  In our case, we found that separating these two pieces into separate modules made everyone's life easier.  In order to accomplish this, we created two separate Maven modules, studyblue-data and studyblue-widgets.&lt;/p&gt;&lt;p&gt;Your resulting project hierarchy will look like this once its all hooked up:&lt;/p&gt;&lt;img alt="Diagram illustrating a StudyBlue sample project hierarchy" /&gt; &lt;div id="sh8k" style="text-align: left;"&gt;&lt;img src="http://docs.google.com/a/google.com/File?id=dgf738w8_3hn5hmmhg_b" style="width: 648px; height: 147.23px;" /&gt;&lt;/div&gt;&lt;p&gt;Each of the new modules (data and widgets) look similar to the main project because they contain a gwt.xml file, however their project structure looks like this:&lt;/p&gt;&lt;pre&gt;+ studyblue-data/
  + src/
    + main/
      + java/
        + com.studyblue.data/
          Data.gwt.xml
        + com.studyblue.data.client/
          Data.java
          ...
      + resources/
    + test
      + java/
      + resources/
  pom.xml
&lt;/pre&gt;&lt;p&gt;Your Data.gwt.xml file would look like this:&lt;/p&gt;&lt;pre&gt;&amp;lt;module&amp;gt;
  &amp;lt;!-- Inherit the core Web Toolkit stuff. --&amp;gt;
  &amp;lt;inherits name="'com.google.gwt.user.User'/"&amp;gt;     
  &amp;lt;source path="client"&amp;gt;
&amp;lt;/module&amp;gt;
&lt;/pre&gt;&lt;p&gt;Your Data.java file would be empty in most cases:&lt;/p&gt;&lt;pre&gt;package com.studyblue.data;

import com.google.gwt.core.client.EntryPoint;

public class Data implements EntryPoint {
  
  public void onModuleLoad() {
  
  }
}&lt;/pre&gt;&lt;p&gt;As per usual, your source code goes under the com.studyblue.data.client package.  We created an additional project for studyblue-widgets similar to the one above.  At this point, you should have three projects open in your Workspace (your main web app, your newly created data module, and your newly created widget module).  Once you've organized your code, it's time to hook it up with your core web application via a few hooks with Maven and the gwt.xml files.&lt;/p&gt;&lt;h3&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="font-family: 'georgia';"&gt;Connecting to Maven&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;So what is that pom.xml file all about?  The first step is downloading the GWT-Maven plugin for Eclipse (which takes care of most of the heavy lifting) &lt;a href="http://gwt-maven.googlecode.com/svn/docs/maven-googlewebtoolkit2-plugin/index.html" id="t3rj" target="_blank" title="http://gwt-maven.googlecode.com/svn/docs/maven-googlewebtoolkit2-plugin/index.html"&gt;http://gwt-maven.googlecode.com/svn/docs/maven-googlewebtoolkit2-plugin/index.html&lt;/a&gt; . Once you've installed the plugin, you're ready to organize your pom.xml files (one each for: data, widgets, web app).&lt;/p&gt;&lt;p&gt;Our studyblue-data pom.xml file looks like the combination of the following:&lt;/p&gt;&lt;pre&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;
&amp;lt;project xmlns=&amp;quot;http://maven.apache.org/POM/4.0.0&amp;quot; xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; schemalocation=&amp;quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&amp;quot;&amp;gt;

  &amp;lt;modelversion&amp;gt;4.0.0&amp;lt;/modelversion&amp;gt;
  &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;groupid&amp;gt;studyblue&amp;lt;/groupid&amp;gt;&lt;/span&gt;
  &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;artifactid&amp;gt;studyblue-data&amp;lt;/artifactid&amp;gt;&lt;/span&gt;
  &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;version&amp;gt;1.1.0-SNAPSHOT&amp;lt;/version&amp;gt;&lt;/span&gt;
  &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;
  &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;name&amp;gt;studyblue gwt data&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;This is the portion that indicates how the jar should be created.  The jar's title is "[artifactId]-[version].[packaging]". The parts in red, you would subsitute with your own information.  *Note: We use -SNAPSHOT to notify Maven that the jar should be updated on every build (see below).&lt;/p&gt;&lt;pre&gt;  &amp;lt;repositories&amp;gt;
    &amp;lt;repository&amp;gt;
      &amp;lt;id&amp;gt;gwt-maven&amp;lt;/id&amp;gt;
      &amp;lt;url&amp;gt;http://gwt-maven.googlecode.com/svn/trunk/mavenrepo/&amp;lt;/url&amp;gt;
    &amp;lt;/repository&amp;gt;
  &amp;lt;/repositories&amp;gt;

  &amp;lt;!--  include pluginRepository and repository for GWT-Maven --&amp;gt;
  &amp;lt;pluginrepositories&amp;gt;
    &amp;lt;pluginrepository&amp;gt;
      &amp;lt;id&amp;gt;gwt-maven-plugins&amp;lt;/id&amp;gt;
      &amp;lt;url&amp;gt;http://gwt-maven.googlecode.com/svn/trunk/mavenrepo/&amp;lt;/url&amp;gt;
    &amp;lt;/pluginrepository&amp;gt;
  &amp;lt;/pluginrepositories&amp;gt;&lt;/pre&gt;&lt;p&gt;The repositories tag tells your project where to download the gwt jars (servlet, user, etc).  The pluginRepositories tag tells your project where to download the Maven-GWT plugin.&lt;/p&gt;&lt;pre&gt;  &amp;lt;build&amp;gt;
    &amp;lt;plugins&amp;gt;
      &amp;lt;plugin&amp;gt;
        &amp;lt;artifactid&amp;gt;maven-compiler-plugin&amp;lt;/artifactid&amp;gt;
        &amp;lt;configuration&amp;gt;
          &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;source&amp;gt;1.6&amp;lt;/source&amp;gt;&lt;/span&gt;
          &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;target&amp;gt;1.6&amp;lt;/target&amp;gt;&lt;/span&gt;
        &amp;lt;/configuration&amp;gt;
      &amp;lt;/plugin&amp;gt;
      &amp;lt;plugin&amp;gt;
        &amp;lt;artifactid&amp;gt;maven-eclipse-plugin&amp;lt;/artifactid&amp;gt;
        &amp;lt;version&amp;gt;2.5.1&amp;lt;/version&amp;gt;
        &amp;lt;configuration&amp;gt;
          &amp;lt;additionalprojectnatures&amp;gt;
            &amp;lt;projectnature&amp;gt;org.maven.ide.eclipse.maven2Nature&amp;lt;/projectnature&amp;gt;
          &amp;lt;/additionalprojectnatures&amp;gt;
          &amp;lt;additionalbuildcommands&amp;gt;
            &amp;lt;buildcommand&amp;gt;org.maven.ide.eclipse.maven2Builder&amp;lt;/buildcommand&amp;gt;
          &amp;lt;/additionalbuildcommands&amp;gt;
        &amp;lt;/configuration&amp;gt;
      &amp;lt;/plugin&amp;gt;
    &amp;lt;/plugins&amp;gt;
    &amp;lt;resources&amp;gt;
      &amp;lt;resource&amp;gt;
        &amp;lt;directory&amp;gt;src/main/java&amp;lt;/directory&amp;gt;
        &amp;lt;includes&amp;gt;
          &amp;lt;include&amp;gt;**/client/**&amp;lt;/include&amp;gt;
          &amp;lt;include&amp;gt;**/*.gwt.xml&amp;lt;/include&amp;gt;
        &amp;lt;/includes&amp;gt;
      &amp;lt;/resource&amp;gt;
    &amp;lt;/resources&amp;gt;
  &amp;lt;/build&amp;gt;&lt;/pre&gt;&lt;p&gt;The build tag tells Maven what Java version you want your jar to be compiled into (1.6 in this case).  The resources tag lets your project compiler know which java files should be included in the jar (i.e. ALL YOUR CODE).&lt;/p&gt;&lt;pre&gt;  &amp;lt;properties&amp;gt;
    &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;gwtversion&amp;gt;1.5.3&amp;lt;/gwtversion&amp;gt;&lt;/span&gt;
  &amp;lt;/properties&amp;gt;&lt;/pre&gt;&lt;p&gt;The properties tag allows us to set a variable (gwtVersion) so Maven knows which version of GWT it needs to download when compiling. When it's time to upgrade, just change the version and the rest takes care of itself.&lt;/p&gt;&lt;pre&gt;  &amp;lt;dependencies&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupid&amp;gt;com.google.gwt&amp;lt;/groupid&amp;gt;
      &amp;lt;artifactid&amp;gt;gwt-user&amp;lt;/artifactid&amp;gt;
      &amp;lt;version&amp;gt;${gwtVersion}&amp;lt;/version&amp;gt;
      &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;/span&gt;
    &amp;lt;/dependency&amp;gt;
  &amp;lt;/dependencies&amp;gt;&lt;/pre&gt;&lt;p&gt;The dependencies tag tells your project which jars you need to compile. In the case of the studyblue-data and studyblue-widgets modules, we reference the GWT user jar, so we need to include it. Notice it takes use of the gwtVersion variable. There are six different types of scope. The three most important are "runtime", "provided" and "compile". Runtime means "I don't need it during compilation of the jar, but I do need it when the jar is executed." Provided means "The project that depends on this module will provide the jar". Compile means "This module needs the jar immediately for compilation".&lt;/p&gt;&lt;p&gt;In this case, we plan on connecting the studyblue-data and studyblue-widget modules to our main web app, which will "provide" the necessary GWT jars for these modules.&lt;/p&gt;&lt;pre&gt;    &amp;lt;dependency&amp;gt;
      &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;groupid&amp;gt;studyblue&amp;lt;/groupid&amp;gt;&lt;/span&gt;
      &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;artifactid&amp;gt;studyblue-data&amp;lt;/artifactid&amp;gt;&lt;/span&gt;
      &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;version&amp;gt;1.1.0-SNAPSHOT&amp;lt;/version&amp;gt;&lt;/span&gt;
      &lt;span style="color:#000000;"&gt;&amp;lt;scope&amp;gt;compile&amp;lt;/scope&amp;gt;&lt;/span&gt;
    &amp;lt;/dependency&amp;gt;&lt;/pre&gt;&lt;p&gt;If one module needs to reference an additional module (i.e. studyblue-widgets depends on studyblue-data), you could insert the above code into studyblue-widget dependencies.&lt;/p&gt;&lt;pre&gt;  &amp;lt;/project&amp;gt;&lt;/pre&gt;&lt;p&gt;Don't forget to close your project tag :) Make sure you generate the appropriate pom.xml for your widgets module as well.&lt;/p&gt;&lt;h3&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="font-family: 'georgia';"&gt;Deployment&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Alright, so you've separated your data and widgets from your main app. You built two projects and included a pom.xml file in each.  Now it's time to build studyblue-data and studyblue-widgets into jars so you (and your teammates) can use them as necessary.&lt;/p&gt;&lt;p&gt;This part is super easy, just open command prompt or terminal and navigate to the project's root folder.  Type the following:&lt;/p&gt;&lt;pre&gt;  mvn clean deploy&lt;/pre&gt;&lt;p&gt;That's it.  Your project will be compiled with all the necessary libraries and is available for consumption by you and your teammates under the title entered above (studyblue-data-1.1.0-SNAPSHOT.jar and studyblue-widget-1.1.0-SNAPSHOT.jar).&lt;/p&gt;&lt;h3&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="font-family: 'georgia';"&gt;Putting It All Together&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/h3&gt;&lt;p&gt;So, you now have the two jars available, and you could just simply add them to your main web app's classpath.  However, if you enable Maven on your main web app, you'll be able to take advantage of Maven's dependency management.  This way you'll be able to download updated jars instantly and automatically.  Additionally, assuming your main web app project is Mavenized you can include the GWT jar dependencies (servlet, user, etc) in the web app automatically.&lt;/p&gt;&lt;p&gt;To do this, you need to insert the following into your main web apps pom.xml below the properties tag:&lt;/p&gt;&lt;pre&gt;  &amp;lt;profiles&amp;gt;
    &amp;lt;profile&amp;gt;
      &amp;lt;id&amp;gt;gwt-dev-windows&amp;lt;/id&amp;gt;
      &amp;lt;properties&amp;gt;
        &amp;lt;platform&amp;gt;windows&amp;lt;/platform&amp;gt;
      &amp;lt;/properties&amp;gt;
      &amp;lt;activation&amp;gt;
        &amp;lt;activebydefault&amp;gt;true&amp;lt;/activebydefault&amp;gt;
        &amp;lt;os&amp;gt;
          &amp;lt;family&amp;gt;Windows&amp;lt;/family&amp;gt;
        &amp;lt;/os&amp;gt;
      &amp;lt;/activation&amp;gt;
    &amp;lt;/profile&amp;gt;
    &amp;lt;profile&amp;gt;
      &amp;lt;id&amp;gt;gwt-dev-mac&amp;lt;/id&amp;gt;
      &amp;lt;properties&amp;gt;
        &amp;lt;platform&amp;gt;mac&amp;lt;/platform&amp;gt;
      &amp;lt;/properties&amp;gt;
      &amp;lt;activation&amp;gt;
        &amp;lt;os&amp;gt;
          &amp;lt;family&amp;gt;mac&amp;lt;/family&amp;gt;
        &amp;lt;/os&amp;gt;
      &amp;lt;/activation&amp;gt;
    &amp;lt;/profile&amp;gt;
    &amp;lt;profile&amp;gt;
      &amp;lt;id&amp;gt;gwt-dev-linux&amp;lt;/id&amp;gt;
      &amp;lt;properties&amp;gt;
        &amp;lt;platform&amp;gt;linux&amp;lt;/platform&amp;gt;
      &amp;lt;/properties&amp;gt;
      &amp;lt;activation&amp;gt;
        &amp;lt;os&amp;gt;
          &amp;lt;name&amp;gt;Linux&amp;lt;/name&amp;gt;
        &amp;lt;/os&amp;gt;
      &amp;lt;/activation&amp;gt;
    &amp;lt;/profile&amp;gt;
  &amp;lt;/profiles&amp;gt;&lt;/pre&gt;&lt;p&gt;The profiles tag allows our developers to use whichever GWT jars are necessary for their operating system (takes care of Windows vs. Mac vs. Linux automatically :) ).  No more keeping copies of all GWT jars and native libraries in your project folder.&lt;/p&gt;&lt;p&gt;Finally, modify the dependencies section to look like this:&lt;/p&gt;&lt;pre&gt;  &amp;lt;dependencies&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupid&amp;gt;com.google.gwt&amp;lt;/groupid&amp;gt;
      &amp;lt;artifactid&amp;gt;gwt-servlet&amp;lt;/artifactid&amp;gt;
      &amp;lt;version&amp;gt;${gwtVersion}&amp;lt;/version&amp;gt;
      &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;scope&amp;gt;runtime&amp;lt;/scope&amp;gt;&lt;/span&gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupid&amp;gt;com.google.gwt&amp;lt;/groupid&amp;gt;
      &amp;lt;artifactid&amp;gt;gwt-user&amp;lt;/artifactid&amp;gt;
      &amp;lt;version&amp;gt;${gwtVersion}&amp;lt;/version&amp;gt;
      &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;scope&amp;gt;compile&amp;lt;/scope&amp;gt;&lt;/span&gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupid&amp;gt;com.google.gwt&amp;lt;/groupid&amp;gt;
      &amp;lt;artifactid&amp;gt;gwt-dev&amp;lt;/artifactid&amp;gt;
      &amp;lt;version&amp;gt;${gwtVersion}&amp;lt;/version&amp;gt;
      &amp;lt;classifier&amp;gt;${platform}-libs&amp;lt;/classifier&amp;gt;
      &amp;lt;type&amp;gt;zip&amp;lt;/type&amp;gt;
      &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;scope&amp;gt;compile&amp;lt;/scope&amp;gt;&lt;/span&gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupid&amp;gt;com.google.gwt&amp;lt;/groupid&amp;gt;
      &amp;lt;artifactid&amp;gt;gwt-dev&amp;lt;/artifactid&amp;gt;
      &amp;lt;version&amp;gt;${gwtVersion}&amp;lt;/version&amp;gt;
      &amp;lt;classifier&amp;gt;${platform}&amp;lt;/classifier&amp;gt;
      &lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;scope&amp;gt;compile&amp;lt;/scope&amp;gt;&lt;/span&gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;groupid&amp;gt;studyblue&amp;lt;/groupid&amp;gt;&lt;/span&gt;
      &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;artifactid&amp;gt;studyblue-data&amp;lt;/artifactid&amp;gt;&lt;/span&gt;
      &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;version&amp;gt;1.1.0-SNAPSHOT&amp;lt;/version&amp;gt;&lt;/span&gt;
      &amp;lt;scope&amp;gt;compile&amp;lt;/scope&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;groupid&amp;gt;studyblue&amp;lt;/groupid&amp;gt;&lt;/span&gt;
      &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;artifactid&amp;gt;studyblue-widgets&amp;lt;/artifactid&amp;gt;&lt;/span&gt;
      &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;version&amp;gt;1.1.0-SNAPSHOT&amp;lt;/version&amp;gt;&lt;/span&gt;
      &amp;lt;scope&amp;gt;compile&amp;lt;/scope&amp;gt;
    &amp;lt;/dependency&amp;gt;
  &amp;lt;/dependencies&amp;gt;&lt;/pre&gt;&lt;p&gt;Notice here that the &amp;lt;scope&amp;gt; for the GWT jars is "compile", which ensures they are downloaded during compilation of the web app and "provided" to the dependent modules studyblue-data and studyblue-widgets. The GWT servlet jar is only needed when the web app is executed, so we choose "runtime" here.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Don't forget your gwt.xml&lt;/b&gt;&lt;/p&gt;&lt;p&gt;In order to make sure that our main web app knows about studyblue-data and studyblue-widgets we have to include the following lines in our main app's gwt.xml file:&lt;/p&gt;&lt;pre&gt;&amp;lt;inherits name='&lt;span style="color: rgb(255, 0, 0);"&gt;com.studyblue.data.Data&lt;/span&gt;' /&amp;gt;
&amp;lt;inherits name='&lt;span style="color: rgb(255, 0, 0);"&gt;com.studyblue.widgets.Widgets&lt;/span&gt;' /&amp;gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;Reflecting Updates In Your Modules&lt;/b&gt;&lt;/p&gt;&lt;p&gt;During development, we want our main web app to reflect changes that we make in the modules (studyblue-data and studyblue-widgets), everytime we build the project.  This way every developer who is working on a project that references the modules (including our main web app), can get the latest build of the jars. We use the Maven keyword "-SNAPSHOT" when versioning our modules during development (i.e. studyblue-data-1.1.0-SNAPSHOT).  &lt;span style="font-size:-1;"&gt;&lt;span style="font-family:Verdana, Arial, Helvetica;"&gt;Sn&lt;/span&gt;&lt;/span&gt;apshot is a special version that indicates a current development copy.  With a SNAPSHOT version, Maven will automatically fetch the latest SNAPSHOT every time you build your project. For rapidly moving code, this can be a necessity, particularly in a team environment. When you are ready to release the code, you finalize the version by removing "-SNAPSHOT".&lt;/p&gt;&lt;p&gt;To update your SNAPSHOTS before executing hosted mode or compilation, run this command in your project's root directory:&lt;/p&gt;&lt;pre&gt;mvn clean --update-snapshots&lt;/pre&gt;&lt;p&gt;&lt;b&gt;Running Hosted Mode and Compiling&lt;/b&gt;&lt;/p&gt;&lt;p&gt;As long as your Maven dependencies are added to your project's classpath, you can execute hosted mode and GWT-Compile without worry.  At StudyBlue, we use the Maven plugin for Eclipse (&lt;a title="http://m2eclipse.sonatype.org/update/" target="_blank" href="http://m2eclipse.sonatype.org/update/" id="phb4"&gt;http://m2eclipse.sonatype.org/update/&lt;/a&gt; ) to add all our Maven dependencies to our classpath, update snapshots and for editing the pom.xml files.&lt;/p&gt;&lt;h3&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="font-family: 'georgia';"&gt;Conclusion&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Maven can be tricky to setup, but once you've got it connected to your GWT project, you'll be amazed at how efficient and modular your application can become.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-6419625129269359996?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=yTgcDN0XLXc:hJUM-6vukw4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=yTgcDN0XLXc:hJUM-6vukw4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=yTgcDN0XLXc:hJUM-6vukw4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/yTgcDN0XLXc" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/6419625129269359996?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/6419625129269359996?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/yTgcDN0XLXc/gwt-and-maven-playing-nicely-together.html" title="GWT and Maven - Playing Nicely Together Since 2008" /><author><name>Sumit Chandel, Developer Programs Engineer</name><uri>http://www.blogger.com/profile/04432308492360866920</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03219604349908016700" /></author><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/05/gwt-and-maven-playing-nicely-together.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UMRHc9eip7ImA9WxJSEk8.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-8583955695129022213</id><published>2009-05-01T17:48:00.000-07:00</published><updated>2009-05-01T17:48:05.962-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-01T17:48:05.962-07:00</app:edited><title>Widget Best Practices / Widget Building</title><content type="html">&lt;div style="text-align: center;"&gt;
&lt;div style="text-align: left;"&gt;
Developers often asked what's the best way to go about building custom widgets. There are of course a number of best practices to consider when answering this question. In this post I'll highlight a few I like to start off with.

&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Prefer composition to&amp;nbsp;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;inheritance&lt;/span&gt;. Unnecessarily exposing implementation details is generally a bad idea, and it's no different when you are building custom widgets. In GWT terms, this means that your custom widgets should typically extend &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Composite&lt;/span&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;// &lt;span style="font-weight: bold;"&gt;Here the HorizontalPanel implementation is exposed&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;// &lt;span style="font-weight: bold;"&gt;Others may come to depend on the presence of one or more inherited methods&lt;/span&gt;&lt;/span&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;public class OverExtendedWidget extends HorizontalPanel {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;
&lt;/span&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&amp;nbsp;&amp;nbsp;public OverExtendedWidget() {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//...&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;
&lt;/span&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;//&lt;span style="font-weight: bold;"&gt; The use of HorizontalPanel is a hidden implementation detail&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;//&lt;span style="font-weight: bold;"&gt; We are free to change the implementation without affecting others&lt;/span&gt;&lt;/span&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;public class ConservativeWidget extends Composite {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;
&lt;/span&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;private final HorizontalPanel panel;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;
&lt;/span&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;public ConservativeWidget() {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;panel = new HorizontalPanel();&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;initWidget(panel);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// ...&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;


&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Conservative API&lt;/span&gt;. Extending &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Composite&lt;/span&gt; also ensures that you do not inadvertently expose methods inherited from the parent classes into your new widget's API. Doing so can quickly lead to other classes depending on not only your class' implementation, but also the implementation of any parent classes. Remember, you can always add to your API. It's generally impossible to take anything away without introducing a breaking change.
&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;public class LabeledTextBox extends Composite {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;
&lt;/span&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;//&lt;span style="font-weight: bold;"&gt; Be wary of multiple constructors as they can quickly get out of hand&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;public LabeledTextBox(String labelText) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// ...&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;
&lt;/span&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;public LabeledTextBox(String labelText, boolean hideUserEnteredText) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// ...&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;
&lt;/span&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;public LabeledTextBox(String labelText, String textBoxText, boolean hideUserEnteredText) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// ...&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;
&lt;/span&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;// &lt;span style="font-weight: bold;"&gt;Only expose getters and setters if you have a use case for them&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;public void setLabelText(String labelText) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// ...&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;
&lt;/span&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;public String getLabelText() {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// ...&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;


&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Recycle and reuse&lt;/span&gt;. When your widgets repeat themselves try to avoid mirroring that repetition in your implementation. Often it is better to compose your new widget out of smaller, reusable widgets. This can both reduce widget complexity and allows improved testability. In a future post we'll explore widget design trade offs and lighter weight alternatives to widget composition to ensure the best possible user experience, which is GWT's ultimate mission (see GWT's &lt;a href="http://code.google.com/webtoolkit/makinggwtbetter.html#introduction"&gt;mission statement&lt;/a&gt; for details).
&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;public class LoginPanel extends Composite {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;
&lt;/span&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;private final VerticalPanel container;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;
&lt;/span&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;//&lt;span style="font-weight: bold;"&gt; We've decomposed the Label/TextBox pair into a separate LabeledTextBox widget class&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;private final LabeledTextBox usernameTextBox;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;private final LabeledTextBox passwordTextBox;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;private final Button loginButton;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;
&lt;/span&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;public LoginPanel() {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;container = new VerticalPanel();&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;initWidget(container);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;
&lt;/span&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;usernameTextBox = new LabeledTextBox("Username");&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;container.add(usernameTextBox);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;
&lt;/span&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;passwordTextBox = new LabeledTextBox("Password", true);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;container.add(passwordTextBox);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;loginButton = new Button("Login");&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;container.add(loginButton);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;
&lt;/span&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;@Override&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;protected void onLoad() {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;super.onLoad();&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;usernameTextBox.setFocus(true);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;



&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Design for real use cases&lt;/span&gt;. Instead of just imagining how your API might be used, you should write actual use cases that you want to support. You can start with a few lines of code which construct and use your new widget. Once you get the hang of it, you may want to consider &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;test-driven development&lt;/a&gt;, a software development method whereby you write failing tests before you implement the features and functionality to make those same tests pass. While it may feel odd to write code that uses non-existent classes and/or interfaces and doesn't even compile, it can really help to flush out design problems early on. This should also help you with your 'Conservative API' efforts since the compiler will only complain about methods you actually try to use. As a bonus you can use your IDE to help you stub out your code. Eclipse, for example, provides many different kinds of &lt;a href="http://wiki.eclipse.org/FAQ_What_is_a_Quick_Fix%3F"&gt;Quick Fixes&lt;/a&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/_v1cyex1oKPA/Sfs-QD4O3oI/AAAAAAAAAAM/DN12CrUuKsA/s1600-h/df6tj88c_262hsm3qhdg_b+(1).png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_v1cyex1oKPA/Sfs-QD4O3oI/AAAAAAAAAAM/DN12CrUuKsA/s400/df6tj88c_262hsm3qhdg_b+(1).png" /&gt;&lt;/a&gt;&lt;/div&gt;
Eclipse Quick Fix offers to create a new Java class for you.&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/_v1cyex1oKPA/Sfs-YCaZdnI/AAAAAAAAAAU/C1ooCzzjPg4/s1600-h/df6tj88c_264d599vddq_b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_v1cyex1oKPA/Sfs-YCaZdnI/AAAAAAAAAAU/C1ooCzzjPg4/s400/df6tj88c_264d599vddq_b.png" /&gt;&lt;/a&gt;&lt;/div&gt;
Eclipse Quick Fix can add missing methods or make other code changes for you.&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Use Style&lt;/span&gt;. Your widgets should have a default look and feel. Your widgets should also allow for easy styling so that they will fit in with the rest of the page they live on. Providing CSS class names to key DOM elements in your widget is a good start. Setting a (primary) style name in the constructor is generally a good practice as well. This allows a designer to easily use different class names for different instances of your widgets on the same page. Browse the source for some of the out of the box GWT widgets to get an idea on how to do this.
&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;public class RadioButton extends CheckBox {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;
&lt;/span&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;public RadioButton(String name) {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// ...&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;setStyleName("gwt-RadioButton");&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;
&lt;/span&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;//&lt;span style="font-family: 'Times New Roman'; font-size: 16px;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-family: 'Times New Roman'; font-size: 16px;"&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Clean up after yourself&lt;/span&gt;. If you do extend Widget directly, use &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;onLoad()&lt;/span&gt;/&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;onUnload()&lt;/span&gt; rather than &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;onAttach()&lt;/span&gt;/&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;onDetach()&lt;/span&gt; to perform any DOM attachment setup or detachment cleanup. Any JavaScript references, such as event listeners, should be cleaned up in &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;onUnload()&lt;/span&gt; to avoid memory leaks. Those same references should be setup in &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;onLoad()&lt;/span&gt; rather than in the widget constructor. See for example the &lt;a href="http://code.google.com/p/google-web-toolkit/source/browse/trunk/user/src/com/google/gwt/user/client/ui/CheckBox.java?r=4993"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Checkbox&lt;/span&gt;&lt;/a&gt;&amp;nbsp;source code. Recall that the widget life-cycle consists of three stages (1) construction, (2) attach to DOM, (3) detach from DOM. The most common life cycle for a widget is simply 1&lt;span style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-family: Arial; font-size: 13px; white-space: pre;"&gt;→&lt;/span&gt;2. Since GWT is all about building AJAX applications, many of your widgets will at least see a 1&lt;span style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-family: Arial; font-size: 13px; white-space: pre;"&gt;→&lt;/span&gt;2&lt;span style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-family: Arial; font-size: 13px; white-space: pre;"&gt;→&lt;/span&gt;3 life cycle. Widgets that move around the DOM as they are manipulated on the page will likely see a 1&lt;span style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-family: Arial; font-size: 13px; white-space: pre;"&gt;→&lt;/span&gt;2&lt;span style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-family: Arial; font-size: 13px; white-space: pre;"&gt;→&lt;/span&gt;3, 2&lt;span style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-family: Arial; font-size: 13px; white-space: pre;"&gt;→&lt;/span&gt;3, 2&lt;span style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-family: Arial; font-size: 13px; white-space: pre;"&gt;→&lt;/span&gt;3, ... life cycle. A common way to be tripped up by life cycles is when you, say, move your initialization code from widget construction to the &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;onLoad()&lt;/span&gt; method without realizing that &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;onLoad()&lt;/span&gt; is called each time your widget is (re)attached to the DOM.
&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;// &lt;span style="font-weight: bold;"&gt;This method is called when a widget is attached to the browser's document&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;@Override&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;protected void onLoad() {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;setEventListener(inputElem, this);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// ...&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;
&lt;/span&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;// &lt;span style="font-weight: bold;"&gt;This method is called when a widget is detached from the browser's document&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;@Override&lt;/span&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;protected void onUnload() {&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//&lt;span style="font-weight: bold;"&gt; Clear out the inputElem's event listener (breaking the circular&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;//&lt;span style="font-weight: bold;"&gt; reference between it and the widget); avoid memory leaks&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;setEventListener(inputElem, null);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;// ...&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
I hope you enjoyed reading a few high level best practices for widget design. In a follow-up post we'll continue to look at widget design through the eyes of the GWT compiler.&lt;br /&gt;
&lt;br /&gt;
Finally, I hope you join us at&amp;nbsp;&lt;a href="http://code.google.com/events/io/"&gt;Google I/O&lt;/a&gt;&amp;nbsp;where we will have a number of&amp;nbsp;&lt;a href="http://code.google.com/events/io/sessions.html"&gt;sessions&lt;/a&gt; dedicated to GWT and plenty fellow developers to talk to, both on the conference room floor and in the &lt;a href="http://code.google.com/events/io/sandbox.html"&gt;developer sandbox&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-8583955695129022213?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=e5MfRMn3rkg:G_zU6t_Kib8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=e5MfRMn3rkg:G_zU6t_Kib8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=e5MfRMn3rkg:G_zU6t_Kib8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/e5MfRMn3rkg" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/8583955695129022213?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/8583955695129022213?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/e5MfRMn3rkg/widget-best-practices-widget-building.html" title="Widget Best Practices / Widget Building" /><author><name>Fred Sauer, Developer Advocate</name><uri>http://www.blogger.com/profile/06804630764751433448</uri><email>fredsa@google.com</email><gd:extendedProperty name="OpenSocialUserId" value="09520208890341198929" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_v1cyex1oKPA/Sfs-QD4O3oI/AAAAAAAAAAM/DN12CrUuKsA/s72-c/df6tj88c_262hsm3qhdg_b+(1).png" height="72" width="72" /><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/05/widget-best-practices-widget-building.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4AQXY9fSp7ImA9WxJSEUw.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-2984099496847788813</id><published>2009-04-30T09:27:00.000-07:00</published><updated>2009-04-30T10:02:20.865-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-30T10:02:20.865-07:00</app:edited><title>GWT Community Updates</title><content type="html">&lt;h3&gt;&lt;span style="color: rgb(102, 153, 255);"&gt;&lt;span style="font-family:'georgia';"&gt;Community announcements&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href="http://code.google.com/p/gwt-connectors/" title="Need a diagramming component in your GWT app?"&gt;Need a diagramming component in your GWT app?&lt;/a&gt; Now you can have one, thanks to the gwt-connectors project developed by &lt;a href="http://code.google.com/u/Robert.Waszkowski/"&gt;Robert Waszkowski&lt;/a&gt;. The &lt;a href="http://code.google.com/p/gwt-connectors/" title="gwt-connectors"&gt;gwt-connectors&lt;/a&gt; project, which uses Fred Sauer's &lt;a href="http://code.google.com/p/gwt-dnd/" title="gwt-dnd"&gt;gwt-dnd&lt;/a&gt;, allows you to create components, drag them around, connect them together, and then drag some more (with connectors redrawn appropriately). It's really quite fun, you should &lt;a href="http://www.aurea-bpm.com/gwt-connectors/Example.html" title="give it a try"&gt;give it a try&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href="http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/7a0f52cb3adf9261" title="HtmlUnit 2.5 released"&gt;HtmlUnit 2.5 released&lt;/a&gt;: For many, using JUnit TestCase and GWTTestCases to test their GWT applications is enough to sleep easy at night. However, in some cases, you want to test app navigtation flows in an automated way. For these cases, HtmlUnit comes to save the day. The HtmlUnit framework allows you to write tests that navigate through your application, fill forms, access attributes and values and so forth,  and includes support for GWT.&lt;/p&gt;&lt;p&gt;&lt;a href="http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/f8e05bdc0c3d8aae" title="A SimpleGesture goes a long way"&gt;A SimpleGesture goes a long way&lt;/a&gt;: A developer at IT Mill Toolkit decided to use his 10% time to build something really neat - a gesture-recognizing widget. Using SimpleGesture, you can capture mouse gestures in a given widget and trigger an associated action. You should &lt;a href="http://marc.virtuallypreinstalled.com/SimpleGesture" title="give the demo a try"&gt;give the demo a try&lt;/a&gt; if you want to see it in action, and &lt;a href="http://dev.itmill.com/browser/incubator/SimpleGesture/WebContent/WEB-INF/src/com/itmill/incubator/simplegesture" title="look up the source code"&gt;look up the source code&lt;/a&gt; if you want to code it into your own applications. It turns out that this widget also &lt;a href="http://www.youtube.com/watch?v=LEvJdTuZ8sc" title="works quite well with a Wiimote"&gt;works quite well with a Wiimote&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;&lt;span style="color: rgb(102, 153, 255);"&gt;&lt;span style="font-family:'georgia';"&gt;More fun stuff&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href="http://code.google.com/events/io/"&gt;Google I/O&lt;/a&gt;: The Google I/O website has been updated with new &lt;a href="http://code.google.com/events/io/sessions.html" title="sessions"&gt;sessions&lt;/a&gt;, &lt;a href="http://code.google.com/events/io/speakers.html" title="speakers"&gt;speakers&lt;/a&gt;  and &lt;a href="http://code.google.com/events/io/sandbox.html" title="developer sandbox participants"&gt;developer sandbox participants&lt;/a&gt; . It will be a great event for those who want to learn the latest about Google developer products or who want to mingle with other developers who are in the field and have built applications using Google technologies. We're hoping to see you there!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-2984099496847788813?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=UeuI2EgNA80:Jy26qzo3us0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=UeuI2EgNA80:Jy26qzo3us0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=UeuI2EgNA80:Jy26qzo3us0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/UeuI2EgNA80" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/2984099496847788813?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/2984099496847788813?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/UeuI2EgNA80/gwt-community-updates_30.html" title="GWT Community Updates" /><author><name>Sumit Chandel, Developer Programs Engineer</name><uri>http://www.blogger.com/profile/04432308492360866920</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03219604349908016700" /></author><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/04/gwt-community-updates_30.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IFRHc5eSp7ImA9WxVaEk0.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-4447580428536457120</id><published>2009-04-07T15:31:00.000-07:00</published><updated>2009-04-08T08:45:15.921-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-08T08:45:15.921-07:00</app:edited><title>Introducing GWT 1.6 and friends</title><content type="html">&lt;p&gt;Starting today, there is a simpler way to use the Java&lt;sup&gt;&lt;font size="-2"&gt;TM&lt;/font&gt;&lt;/sup&gt; language to develop and deploy world-scalable web applications. We are very happy to announce today:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;&lt;a href="http://code.google.com/webtoolkit"&gt;Google Web Toolkit 1.6&lt;/a&gt;&lt;/b&gt;,&lt;/li&gt;
  &lt;li&gt;An early look at &lt;b&gt;&lt;a href="http://code.google.com/appengine/docs/java/overview.html"&gt;Google App Engine for Java&lt;/a&gt;&lt;/b&gt;, and the brand-new&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;&lt;a href="http://code.google.com/eclipse"&gt;Google Plugin for Eclipse&lt;/a&gt;&lt;/b&gt; that supports a productive integration of the two.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What does this mean for you? It is easier than ever to create sophisticated web applications entirely in the Java language with Google Web Toolkit while working productively in Eclipse. And the
moment you're finished, with only a few button clicks you can upload and publish your application to the world on App Engine.&lt;/p&gt;
&lt;p&gt;In GWT 1.6, we've tried to make common tasks simpler while making it possible to do even more advanced things. If you're brand new to GWT, some of this is going to sound like gibberish, so
you'll also want to take a look at the &lt;a href="http://code.google.com/webtoolkit/overview.html" id="k7nr" title="GWT Overview"&gt;Product Overview&lt;/a&gt; as a gentler introduction.&lt;/p&gt;
&lt;h4&gt;Direct support for war output and related tools&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;GWT 1.6 changes the conventions for project organization to center on the standard Java web archive deployment structure. This new war support makes it easier to introduce GWT modules into
  existing web applications. It also makes GWT development more flexible by allowing hosted mode to work easily with any standard servlet container.&amp;nbsp;&lt;/li&gt;
  &lt;li&gt;In conjunction, there is a new webAppCreator tool which replaces the older projectCreator and applicationCreator tools. It is a unified, war-aware tool that can quickly create a working GWT
  module, configuration files, source files, and an ant build file that you can use as a starting point for your own code.&lt;/li&gt;
  &lt;li&gt;And, of course, it's pretty easy to create a war directory layout that you can upload to App Engine.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Hosted mode and compiler enhancements&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Hosted mode has been enhanced to take advantage of the new war-centric project structure to provide additional conveniences. For example, the new "Restart Server" button reloads server-side
  code without you having to restart your debugger, which can save you time when you're developing RPC services. Also, for you GWT experts out there using hosted mode with your own custom servers &amp;mdash;
  if you know what "-noserver" is, I'm talking to you &amp;mdash; you'll be glad to know that hosted mode integration "just works" now; generated resources such as bundled image files are automatically
  recreated when you refresh the hosted browser. This, too, can help speed up your development cycle.&lt;/li&gt;
  &lt;li&gt;Hosted mode has also been modified to work smoothly with &lt;a href="http://emma.sourceforge.net/"&gt;EMMA&lt;/a&gt;'s offline instrumentation, so that you can easily generate code coverage reports. If you're an Eclipse user, in addition to using the new Google Plugin for
  Eclipse, you should also look at &lt;a href="http://www.eclemma.org/"&gt;EclEmma&lt;/a&gt;, which makes it easy to enable code coverage for any launch configuration.&amp;nbsp;&lt;/li&gt;
  &lt;li&gt;Finally, the GWT compiler has gone parallel. It can compile multiple output permutations in parallel using the new -localWorkers flag, which can speed up web mode compiles noticeably on
  multi-core machines. In more elaborate build systems, it is also possible now to do parallel distributed compiles using the new compiler lifecycle classes Precompile, CompilePerms, and Link.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;New widgets and a shiny new approach to event handling&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;A big change that you will surely notice is GWT's overhauled event handling. The new&amp;nbsp;&lt;i&gt;Handler&lt;/i&gt;&amp;nbsp;pattern for managing widget events is easier to understand and more succinct
  than in previous releases. Widget writers can also easily create their own custom events.&lt;/li&gt;
  &lt;li&gt;The customizable and internationalized DatePicker is now a standard widget, and the new LazyPanel helps you speed up your code by delaying the creation of widgets until they're actually
  needed.&lt;/li&gt;
  &lt;li&gt;There's also a new API for triggering browser native events programmatically, which is a real boon for unit testing.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As usual, there are many more improvements than we can list above. The issue tracker has &lt;a
  href="http://code.google.com/p/google-web-toolkit/issues/list?can=2&amp;amp;q=milestone:1_6_RC,1_6_RC2%20status:FixedNotReleased,Fixed&amp;amp;sort=priority+id&amp;amp;colspec=ID%20Type%20Status%20Priority%20Milestone%20Owner%20Summary%20Category"&gt;the
full list of changes&lt;/a&gt;. We hope that these new features in GWT 1.6 will seem like only the beginning, though, as you start to using GWT alongside the new &lt;a href="http://code.google.com/eclipse"&gt;Google Plugin for Eclipse&lt;/a&gt; and deploying your
code on &lt;a href="http://code.google.com/appengine/docs/java/overview.html"&gt;App Engine&lt;/a&gt;. There's lots more to come on how these technologies work together to help you do cool new stuff faster.&lt;/p&gt;
&lt;p&gt;Last but not least, the GWT team will be at &lt;a href="http://code.google.com/events/io?utm_source=gwtblog&amp;amp;utm_medium=link&amp;amp;utm_campaign=io2009_campfire"&gt;Google I/O&lt;/a&gt; on May 27-28,
giving in-depth sessions on GWT and eager to hear your feedback on these new features. We hope you'll join us.&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;&lt;a href="http://code.google.com/webtoolkit/download.html"&gt;Download Google Web Toolkit 1.6&lt;/a&gt;&lt;/b&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-4447580428536457120?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=BqULEyuern4:yRqvufZIiKM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=BqULEyuern4:yRqvufZIiKM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=BqULEyuern4:yRqvufZIiKM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/BqULEyuern4" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/4447580428536457120?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/4447580428536457120?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/BqULEyuern4/introducing-gwt-16-and-friends.html" title="Introducing GWT 1.6 and friends" /><author><name>Bruce Johnson</name><uri>http://www.blogger.com/profile/12699642840488867708</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="11460383164054803490" /></author><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/04/introducing-gwt-16-and-friends.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcBQH07fCp7ImA9WxVaEUs.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-960541000752399137</id><published>2009-04-07T14:27:00.001-07:00</published><updated>2009-04-07T20:40:51.304-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-07T20:40:51.304-07:00</app:edited><title>Google Plugin for Eclipse™ — Peanut Butter to Eclipse's Chocolate</title><content type="html">&lt;p&gt;Eclipse™ is a delicious Java™ IDE.  However, developers using it to create &lt;a href="http://code.google.com/webtoolkit"&gt;Google Web Toolkit&lt;/a&gt; (and now &lt;a href="http://code.google.com/appengine"&gt;Google App Engine for Java&lt;/a&gt;) web applications have found themselves wanting better integration.&lt;/p&gt;&lt;p&gt;That's why we are very happy to announce the first release of the &lt;a href="http://code.google.com/eclipse"&gt;Google Plugin for Eclipse&lt;/a&gt;. Not only does the plugin make it easier to work with App Engine for Java and GWT; it also makes projects using &lt;em&gt;both&lt;/em&gt; easier.  A few key features:&lt;/p&gt;&lt;p&gt;&lt;a href="http://code.google.com/eclipse/docs/creating_new_webapp.html"&gt;New Web Application Wizard&lt;/a&gt;&lt;br/&gt;
Quickly create web applications that use GWT and/or App Engine.  Your new application is fully configured and ready to go.&lt;/p&gt;&lt;p&gt;&lt;a href="http://code.google.com/eclipse/docs/running_and_debugging.html"&gt;Run/Debug Web Application&lt;/a&gt;&lt;br/&gt;With a single click, you can run or debug your web application locally.  No more command-line headaches!&lt;/p&gt;&lt;p&gt;&lt;a href="http://code.google.com/eclipse/docs/appengine.html"&gt;Google App Engine for Java&lt;/a&gt;&lt;br/&gt;
Deploying your application to the cloud is easy with the deploy wizard...&lt;/p&gt;&lt;p&gt;&lt;img style="border-width:0;width: 400px; height: 232px;" src="http://3.bp.blogspot.com/_O_vtu7kSVo8/SduRsjR_U0I/AAAAAAAAAAU/xD_nM-qMc9c/s400/deploy_dialog.png" id="BLOGGER_PHOTO_ID_5322007579239338818" /&gt;
&lt;/p&gt;&lt;p&gt;As-you-type validation ensures that your code is compatible with App Engine.&lt;/p&gt;&lt;p&gt;&lt;a href="http://code.google.com/eclipse/docs/gwt.html"&gt;Google Web Toolkit&lt;/a&gt;&lt;br/&gt;
We've enhanced Eclipse's Java environment to integrate seamlessly with GWT:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Recognition of inline JavaScript (&lt;a href="http://code.google.com/eclipse/docs/gwt_jsni.html"&gt;JSNI&lt;/a&gt;): syntax highlighting, auto-indenting, Java Search and Refactoring integration&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/eclipse/docs/gwt_compile.html"&gt;GWT compiler&lt;/a&gt; shortcuts and configuration UI&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/eclipse/docs/gwt_wizards.html"&gt;Wizards&lt;/a&gt; to create entry points, modules and HTML pages&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ready to &lt;a href="http://code.google.com/eclipse/docs/getting_started.html"&gt;dig in&lt;/a&gt;?
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-960541000752399137?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=GuOvWei3O7o:SqTdeR9kbww:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=GuOvWei3O7o:SqTdeR9kbww:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=GuOvWei3O7o:SqTdeR9kbww:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/GuOvWei3O7o" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/960541000752399137?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/960541000752399137?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/GuOvWei3O7o/google-plugin-for-eclipse-peanut-butter.html" title="Google Plugin for Eclipse&amp;trade; &amp;mdash; Peanut Butter to Eclipse's Chocolate" /><author><name>Miguel Mendez</name><uri>http://www.blogger.com/profile/09636831288595210815</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04281076668666408557" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_O_vtu7kSVo8/SduRsjR_U0I/AAAAAAAAAAU/xD_nM-qMc9c/s72-c/deploy_dialog.png" height="72" width="72" /><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/04/google-plugin-for-eclipse-peanut-butter.html</feedburner:origLink></entry></feed>
