<?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;A08BRH8zfSp7ImA9WxJUF0w.&quot;"><id>tag:blogger.com,1999:blog-28098389</id><updated>2009-07-15T21:50:55.185-07: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="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>83</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" /><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><entry gd:etag="W/&quot;DEIBQnc7fCp7ImA9WxVbF0U.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-6909648170299853196</id><published>2009-04-02T10:02:00.001-07:00</published><updated>2009-04-03T12:22:33.904-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-03T12:22:33.904-07:00</app:edited><title>GWT Community Updates</title><content type="html">&lt;p&gt;It's about that time again.  We've had a lot of activity in the community since the last update that we'd like to share. Check them out below:&lt;/p&gt;&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;b&gt;Spreading the word&lt;/b&gt;: The community is lucky to have a number of active members who blog, present and contribute to GWT. They are often a great resource for more news about GWT than can be tracked in our own single blog. Check out some of these GWT gems below:&lt;/p&gt;&lt;ul&gt;&lt;li style="margin-bottom:10px;"&gt;&lt;a href="http://www.ongwt.com/" title="onGWT" style="color: rgb(85, 26, 139); "&gt;onGWT&lt;/a&gt;: maintained by Didier Girard, it's constantly updated with tidbits of news relating to GWT.&lt;/li&gt;&lt;li style="margin-bottom:10px;"&gt;&lt;a id="n:vp" href="http://examples.roughian.com/" title="Roughian Examples" style="color: rgb(85, 26, 139); "&gt;Roughian Examples&lt;/a&gt; : Ian Bambury has created a site that gives a different take on how GWT components fit together. There is also a free email course available!&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a id="eg72" href="http://www.itmill.com/itmill-toolkit/" title="IT Mill Toolkit 5.3.0" style="color: rgb(85, 26, 139); "&gt;IT Mill Toolkit 5.3.0 production release ready&lt;/a&gt;: The folks at IT Mill have worked hard to create IT Mill Toolkit - a set of technologies and tools that allow you to develop Ajax applications using Google Web Toolkit based, server-side binded widgets. Check out their &lt;a id="jrqc" href="http://www.itmill.com/news/2009-03-04_Server-driven_Rich_Web_Applications_in_Pure_Java_-_IT_Mill_Toolkit_5_3_0_Now_Ready_for_Production.htm" title="latest announcement" style="color: rgb(85, 26, 139); "&gt;latest production release announcement&lt;/a&gt; for more details.&lt;/p&gt;&lt;p&gt;&lt;a id="d3.7" href="http://code.google.com/webtoolkit/articles.html" title="GWT Articles section revamped" style="color: rgb(85, 26, 139); "&gt;GWT Articles section revamped&lt;/a&gt;: We've been working on updating and enriching articles on various GWT topics. The latest addition treats the topic of testing methodology using GWT. Please check out the new articles and let us know what you think of them. Also, if there is a topic that you are an expert on that you would like to write about, &lt;a id="lozc" href="http://groups.google.com/group/Google-Web-Toolkit/post?sendowner=1&amp;_done=/group/Google-Web-Toolkit/about%3F&amp;" title="get in touch with us"&gt;get in touch with us&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;a href="http://code.google.com/events/io/" style="color: rgb(85, 26, 139); "&gt;&lt;p&gt;Google I/O&lt;/a&gt;: Google's developer conference is just around the corner. If you're planning on attending, you're still in time for &lt;a id="xl__" href="https://io2009.event-projects.com/" title="early bird registration" style="color: rgb(85, 26, 139); "&gt;early bird registration&lt;/a&gt; prices! There are going to be some great &lt;a id="s-72" href="http://code.google.com/events/io/sessions.html#gwt" title="GWT sessions" style="color: rgb(85, 26, 139); "&gt;GWT sessions&lt;/a&gt; presented at this year's conference that you won't want to miss. 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-6909648170299853196?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=Jpqqq7VOO9g:JgGVXFwLx-c: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=Jpqqq7VOO9g:JgGVXFwLx-c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=Jpqqq7VOO9g:JgGVXFwLx-c: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/Jpqqq7VOO9g" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/6909648170299853196?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/6909648170299853196?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/Jpqqq7VOO9g/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/04/gwt-community-updates.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIBQ3o5fSp7ImA9WxVbFEs.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-8377318117903657264</id><published>2009-03-30T19:00:00.000-07:00</published><updated>2009-03-30T19:29:12.425-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-30T19:29:12.425-07:00</app:edited><title>Google Web Toolkit 1.6 RC2 Now Available</title><content type="html">The Google Web Toolkit engineering team is happy to announce that the second Google Web Toolkit 1.6 Release Candidate is now available from the &lt;a href="http://code.google.com/p/google-web-toolkit/downloads/list"&gt;project download page&lt;/a&gt; for you to try out. (The first GWT 1.6 Release Candidate was announced a couple of weeks ago on the the &lt;a href="http://groups.google.com/group/Google-Web-Toolkit"&gt;GWT Developer Forum&lt;/a&gt;.)

&lt;h4&gt;New Project Structure in GWT 1.6&lt;/h4&gt;
GWT 1.6 introduces a new project structure based on the standard J2EE web archive (&lt;a href="http://en.wikipedia.org/wiki/WAR_file"&gt;war&lt;/a&gt;) format. We believe this will make it much, much easier to add a GWT module into an existing web app or otherwise mix GWT with other technologies. For more details, check out the updated &lt;a href="http://code.google.com/docreader/?p=google-web-toolkit-doc-1-6&amp;amp;s=google-web-toolkit-doc-1-6&amp;amp;t=DevGuideDirectoriesPackageConventions"&gt;standard directory and package layout&lt;/a&gt; for GWT 1.6.

&lt;h4&gt;New EventHandler System&lt;/h4&gt;
The event system has been updated to be more in line with Java norms, making it both easier to use and easier to write your own widgets. This also paves the way for making events easier to extend in the future. Have a look at the new &lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/event/shared/EventHandler.html"&gt;EventHandler&lt;/a&gt; and &lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/event/shared/HandlerManager.html"&gt;HandlerManager&lt;/a&gt; classes to get a sense for how they work. We've also added new methods for triggering real native browser events.

&lt;h4&gt;New Widgets&lt;/h4&gt;
The new &lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/user/datepicker/client/DatePicker.html"&gt;DatePicker&lt;/a&gt; and &lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/user/datepicker/client/DateBox.html"&gt;DateBox&lt;/a&gt; widgets allow your users to select a date from a calendar. The new &lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/user/client/ui/LazyPanel.html"&gt;LazyPanel&lt;/a&gt; widget makes it easy to delay the creation of certain sections of your application until they are first accessed, improving startup performance.

&lt;p&gt;
For full details, be sure to check out &lt;a href="http://code.google.com/docreader/?p=google-web-toolkit-doc-1-6&amp;amp;s=google-web-toolkit-doc-1-6&amp;amp;t=ReleaseNotes_1_6"&gt;What's New in GWT 1.6?&lt;/a&gt;, and then &lt;a href="http://code.google.com/p/google-web-toolkit/downloads/list"&gt;download the release candidate&lt;/a&gt; and give it a whirl. Let us know what you think in the &lt;a href="http://groups.google.com/group/Google-Web-Toolkit/"&gt;GWT Developer Forum&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-8377318117903657264?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=Htmt-trHPxU:4ePiAXein14: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=Htmt-trHPxU:4ePiAXein14:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=Htmt-trHPxU:4ePiAXein14: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/Htmt-trHPxU" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/8377318117903657264?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/8377318117903657264?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/Htmt-trHPxU/google-web-toolkit-16-rc2-now-available.html" title="Google Web Toolkit 1.6 RC2 Now Available" /><author><name>Scott Blum</name><uri>http://www.blogger.com/profile/04328148728956370495</uri><email>scottb@google.com</email><gd:extendedProperty name="OpenSocialUserId" value="16871420751184532228" /></author><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2009/03/google-web-toolkit-16-rc2-now-available.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QFRXk-eCp7ImA9WxVbEUU.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-2264024072173273242</id><published>2009-03-27T14:28:00.000-07:00</published><updated>2009-03-27T14:28:34.750-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-27T14:28:34.750-07:00</app:edited><title>Tell us about your GWT applications and prototypes</title><content type="html">A common question that is asked when developers and IT managers first consider &lt;a href="http://code.google.com/webtoolkit/"&gt;Google-Web-Toolkit&lt;/a&gt; is: Who's using it? There are a number of places where you can find a partial answer such our own &lt;a href="http://code.google.com/webtoolkit/app_gallery.html"&gt;App Gallery&lt;/a&gt; or the Google Code &lt;a href="http://google-code-updates.blogspot.com/2008/12/google-web-toolkit-out-in-wild.html"&gt;blog&lt;/a&gt;. The community has started its own lists as well, such as those &lt;a href="http://google.wikia.com/wiki/Google_Web_Toolkit"&gt;here&lt;/a&gt;, &lt;a href="http://www.gwtsite.com/whos-using-gwt/"&gt;here&lt;/a&gt; and &lt;a href="http://www.ociweb.com/mark/programming/GWT.html#WhoIsUsingIt"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
While we encourage you to share directly with the GWT community in the&amp;nbsp;&lt;a href="https://groups.google.com/group/Google-Web-Toolkit/"&gt;user forum&lt;/a&gt;, we realize some of you may prefer to give feedback more privately, perhaps because your company policies require you to.&amp;nbsp;If you have a story you would like to share, we would love to hear about it. Just send me an &lt;a href="mailto:fredsa@google.com"&gt;email&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I look forward to hearing about your GWT projects and experiences.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-2264024072173273242?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=Kgbc7yW9VYU:OSdswyq18gk: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=Kgbc7yW9VYU:OSdswyq18gk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=Kgbc7yW9VYU:OSdswyq18gk: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/Kgbc7yW9VYU" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/2264024072173273242?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/2264024072173273242?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/Kgbc7yW9VYU/tell-us-about-your-gwt-applications-and.html" title="Tell us about your GWT applications and prototypes" /><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/03/tell-us-about-your-gwt-applications-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYERXo9eyp7ImA9WxVVEk8.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-2064395773525570542</id><published>2009-03-04T16:20:00.000-08:00</published><updated>2009-03-04T18:28:24.463-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-04T18:28:24.463-08:00</app:edited><title>Giving your GWT Application a Voice</title><content type="html">&lt;p&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;&lt;span style="font-size:100%;"&gt;Jason Freeman recently created Piano Etudes, an audio-enabled GWT application integrated with Flash. We're happy to say that Jason had a chance to stop by to talk about the development strategy he used to add audio to Piano Etudes. Check it out below.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;As a faculty member at the &lt;a href="http://gtcmt.gatech.edu/"&gt;Georgia Tech Center for Music Technology&lt;/a&gt;, I recently developed &lt;a href="http://transition.turbulence.org/spotlight/pianoetudes/net.jasonfreeman.pianoetudes.PianoEtudes/wordpress/"&gt;Piano Etudes&lt;/a&gt;, a musical application built with GWT, along with a student of mine, Akito Van Troyer. Since Piano Etudes is about music, audio was a top priority for us throughout the development process. In this post, I’d like to share what we’ve learned from our experiences with audio and GWT and explain how we implemented audio functionality.&lt;/p&gt;&lt;p&gt;There is currently no built-in audio support in GWT; nevertheless, it’s fairly simple to add audio to a GWT app. Several audio APIs for GWT exist in various stages of development, including Fred Sauer’s &lt;a href="http://code.google.com/p/gwt-voices/"&gt;gwt-voices&lt;/a&gt;, CodeLathe’s &lt;a href="http://www.codelathe.com/gwtsm/"&gt;GWT SoundManager&lt;/a&gt;, Jeffrey Miller’s &lt;a href="http://code.google.com/p/gwt-sound/"&gt;gwt-sound&lt;/a&gt;, and the sound classes in the &lt;a href="http://code.google.com/p/google-web-toolkit-incubator/"&gt;GWT Incubator&lt;/a&gt;. Most of these libraries in turn rely upon the Flash Sound API instead of the inconsistent audio support found natively in web browsers.&lt;/p&gt;&lt;p&gt;For &lt;a href="http://www.jasonfreeman.net/pianoetudes/"&gt;Piano Etudes&lt;/a&gt;, we found it easier to build our own GWT classes to support the audio features we needed, instead of using one of the APIs listed above. We wrote &lt;a href="http://code.google.com/docreader/#p=google-web-toolkit-doc-1-5&amp;amp;s=google-web-toolkit-doc-1-5&amp;amp;t=DevGuideJavaScriptNativeInterface"&gt;JSNI&lt;/a&gt; methods to access Scott Schiller’s &lt;a href="http://www.schillmania.com/projects/soundmanager2/"&gt;SoundManager2&lt;/a&gt; Javascript Sound API. SoundManager2, which similarly relies upon Flash, is a clean and elegant API that Scott has been fanatically supporting and updating. A couple of the GWT audio libraries also use SoundManager2, though they only support a subset of its API.&lt;/p&gt;&lt;p&gt;Regardless of how you choose to implement audio in your GWT app, we've discovered a few key principles while working on Piano Etudes that you may want to consider:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Keep your audio code in separate Java classes&lt;/li&gt;&lt;li&gt;Tune your application to avoid timing problems with audio&lt;/li&gt;&lt;li&gt;Identify complex audio rendering and move it from the client to the server when necessary&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="font-family:'georgia';"&gt;Keep your audio code separate&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Because audio support in GWT is rapidly evolving, the API you choose to use today may not be the one you use a year from now. So it’s essential to wrap your audio functionality in your own audio classes. Then if you change implementations later, you’ll only have to tweak a few classes instead of auditing your entire code base.&lt;/p&gt;&lt;p&gt;For &lt;a href="http://www.jasonfreeman.net/pianoetudes/"&gt;Piano Etudes&lt;/a&gt;, we created two GWT Java classes to handle all audio functionality. These are the only classes in our code base that assume a particular audio implementation and are also the only classes that contain JSNI methods.&lt;/p&gt;&lt;p&gt;One class, called SoundManager, includes static JSNI methods for initializing SoundManager2 and configuring its global parameters.&lt;/p&gt;&lt;p&gt;For example, &lt;code&gt;Soundmanager.setDebugMode()&lt;/code&gt; will enable or disable debugging:&lt;/p&gt;&lt;pre&gt;public native void setDebugMode(boolean b) /*-{
  $wnd.soundManager.debugMode = b;
}-*/;&lt;/pre&gt;&lt;p&gt;Each instance of our other class, called Sound, represents a single audio file to be played back in GWT. This class wraps methods such as play, pause, stop, getting and setting panning, and getting and setting playback position.&lt;/p&gt;&lt;p&gt;It was important for us to hide SoundManager2’s implementation details from the rest of our GWT code. Both SoundManager2 and parts of our GWT application code have their own bookkeeping, so there is potential for bad cross usage if the code isn't kept separate. For instance, SoundManager2 requires that an ID string be assigned to each sound object, and it uses that ID in many of its methods. Our Sound class handles this ID string internally and privately. The constructor method generates a unique ID string for each instance of the Sound object:&lt;/p&gt;&lt;pre&gt;public Sound(String fileName) {
  soundID = CustomIDGenerator.getUniqueId();
  
  // additional initialization code
}&lt;/pre&gt;&lt;p&gt;The Sound object then uses this ID in other methods. For example:&lt;/p&gt;&lt;pre&gt;public native void stop() /*-{
  $wnd.soundManager.stop(this.@net.jasonfreeman.pianoetudes.client.sound.Sound::soundID);
}-*/;&lt;/pre&gt;&lt;p&gt;There is no need for any other application code to be aware of this ID string; they are able to use instances of Sound in a more object-oriented, implementation-neutral manner.&lt;/p&gt;&lt;h3&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="font-family:'georgia';"&gt;Tune your application for well-timed audio&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;In &lt;a href="http://www.jasonfreeman.net/pianoetudes/" &gt;Piano Etudes&lt;/a&gt;, the timing of audio events is important. Typically, each measure of moveable music is stored as a separate audio file, so when audio files do not play back at the correct times, there is an audible gap or jump between measures of music. Audio timing is similarly important in applications where sound effects are triggered by user actions or where multiple audio files must play back together in sync.&lt;/p&gt;&lt;p&gt;Neither Javascript nor Flash are famous for precise timing, so there is an upper bound on timing precision within GWT as well. But there are a few strategies that do improve precision:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Optimize GWT code.&lt;/b&gt; The performance of your audio code can be affected by sluggish code elsewhere. We use a combination of Java and Javascript profiling tools to isolate hot spots and resolve performance problems. It’s also important to realize that even if your app doesn’t feel sluggish, it may still suffer from performance problems that affect audio. For example: I once found a bug in a conditional statement that had turned O(n) code into O(n&lt;sup&gt;2&lt;/sup&gt;) code. Even though the problem was not noticeably slowing down the GUI widget with which it was associated, it was degrading the timing of audio events.&lt;/li&gt;&lt;p&gt;&lt;/p&gt;&lt;li&gt;&lt;b&gt;Beware of silent gaps at the beginning and end of MP3 files.&lt;/b&gt; These are often created in the encoding process and can cause unwanted delays in audio playback. Use an encoder, such as &lt;a href="http://lame.sourceforge.net/"&gt;LAME&lt;/a&gt;, that supports a &amp;quot;nogaps&amp;quot; option.&lt;/li&gt;&lt;p&gt;&lt;/p&gt;&lt;li&gt;&lt;b&gt;Preload your sound files.&lt;/b&gt; When timing is important, create your sound objects and load your audio files in advance. If you wait to do so until the moment you are ready to play them, there will be a noticeable delay the first time each sound is played. In SoundManager2, the &amp;quot;autoLoad&amp;quot; flag will force audio files to load in advance.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="font-family:'georgia';"&gt;Know when it’s time to move server side&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Both Flash and GWT have limited capabilities when it comes to audio. You can play sounds, jump around within sounds, combine them together, query waveform data, and perform other basic tasks. Newer versions of Flash do support some sample-level manipulation of audio data, but it would be tough to use these features from JavaScript or, by extension, from GWT. (In fact, it’s tough to use these features at all in their present form.)&lt;/p&gt;&lt;p&gt;So what if your GWT app requires advanced audio features such as sample-accurate timing, sound synthesis, digital signal processing, or mixdowns to audio files? You could implement audio functionality in a Java applet instead of through Flash, taking advantage of a Java-based audio API such as &lt;a href="http://www.softsynth.com/jsyn/"&gt;JSyn&lt;/a&gt;, &lt;a href="http://java.sun.com/products/java-media/sound/"&gt;JavaSound&lt;/a&gt;, or &lt;a href="http://code.compartmental.net/tools/minim/"&gt;Minim&lt;/a&gt; to access additional features unavailable in GWT. But if you’re like me, the headaches associated with Java applets are one of the reasons you’re using GWT in the first place, so that is not an enticing solution.&lt;/p&gt;&lt;p&gt;Fortunately, there is another alternative: render your audio on the server. This successfully avoids the limitations of client-side systems, though it does introduce other issues related to scalability, latency, and bandwidth. While it’s not a universal solution, it is a valuable strategy for your toolbox.&lt;/p&gt;&lt;p&gt;Here’s a simple use case: in &lt;a href="http://www.jasonfreeman.net/pianoetudes/"&gt;Piano Etudes&lt;/a&gt;, we wanted users to be able to download the music they created as an MP3 file. In GWT and Flash there is no obvious way to render an audio file to disk or to convert it into an MP3. So instead, we handle this task server side.&lt;/p&gt;&lt;p&gt;When a user clicks a button to download the MP3 of their music, GWT sends a representation of that music to the server; for each audio track, it describes the audio clips in the track and the timings of those clips. We post the data as JSON via HTTP to a PHP script, but this could be done just as easily via any other client-server communication paradigm supported in GWT. Here’s some code for the client side:&lt;/p&gt;&lt;pre&gt;FormPanel mp3Form = new FormPanel("_blank");
HorizontalPanel panel = new HorizontalPanel();
Hidden mp3Data = new Hidden("data", timeline.getAsJSON());
panel.add(mp3Data);
mp3Form.setWidget(panel);
mp3Form.setAction(URL.encode(SERVER_SCRIPT_URL));
mp3Form.setMethod(FormPanel.METHOD_POST);&lt;/pre&gt;&lt;p&gt;This code snippet submits a JSON array to the server representing the audio clips and timings for each track of music. The JSON data is sent as a hidden field in an HTML form. The result obtained from the server (the MP3 file) is returned to a new web browser window, keeping the GWT app open in the current window.&lt;/p&gt;&lt;p&gt;When the server-side script receives the data from the client, it processes that data to create and run a simple script in a computer-music language called &lt;a href="http://rtcmix.org/"&gt;RTCmix&lt;/a&gt;. (Classic scripting languages for computer music, such as &lt;a href="http://www.csounds.com/"&gt;CSound&lt;/a&gt; and &lt;a href="http://rtcmix.org/"&gt;RTCmix&lt;/a&gt;, are great for rendering audio server-side.) The audio file output by the RTCmix script is then converted to an MP3 using &lt;a href="http://lame.sourceforge.net/"&gt;LAME&lt;/a&gt;, and that file is returned to the client browser, which downloads it. Here is a simplified excerpt from our PHP script (our entire script is only 100 lines of code):&lt;/p&gt;&lt;pre&gt;// initialize the rtcmix script
$audio = tempnam("/tmp", "PianoEtude"); // output file
$script = "set_option(\"AUDIO_OFF\", \"CLOBBER_ON\")\n"; // non-real-time
$script .= "rtsetparams(44100, 2)\n"; // sampling rate and number of output channels
$script .= "rtoutput(\"$audio\")\n"; // output to temp file
$script .= "load(\"" . $CMIX_LIB_PATH . "\")\n"; // library path for rtcmix

// create an rtcmix command to place each audio clip
$timeline = json_decode($data);
foreach ($timeline as $track) {
  $insertPoint = 0;
  foreach ($track as $soundObject) {
    $soFileName = $soundObject[0];
    $soDur = $soundObject[1];
    $script .= "rtinput(\"$soFileName\")\n";
    // insert the audio clip into the output audio file
    $script .= "STEREO($insertPoint, 0, DUR(), 0.5, 0.5, 0.5)\n";
    $insertPoint += $soDur;
  }
}

// execute the rtcmix script
$scriptFile = tempnam("/tmp", "script");
$handle = fopen($scriptFile, 'w');
fwrite($handle, $script);
fclose($handle);
$cmd = "$rtcmix &amp;lt; $scriptFile";
$result = shell_exec($cmd);

// convert to MP3
$mp3File = tempnam("/tmp", "mp3");
$cmd = "$lame $audio $mp3File";
$result = shell_exec($cmd);
// return result
readfile($mp3File);&lt;/pre&gt;&lt;p&gt;You can also use client-side and server-side audio together. For example: instead of just having the web browser download this server-generated MP3 file to disk, our GWT app could use a client-side audio API to play it back inside of the app.&lt;/p&gt;&lt;h3&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="font-family:'georgia';"&gt;Let your GWT application be heard&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;By using a variety of GWT or Javascript APIs to connect with the Flash Sound API, you can add rich audio features to your GWT apps; for more advanced functionality, GWT apps can communicate with a server to render audio remotely. Regardless of the exact implementation(s) you choose, keeping your GWT app optimized and your audio code structurally isolated will ensure that audio performs well in your app and can incorporate future improvements to audio support in the browser&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-2064395773525570542?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/NWLT?a=rVw0TYwmI_E:Udszt75R9UI: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=rVw0TYwmI_E:Udszt75R9UI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/NWLT?i=rVw0TYwmI_E:Udszt75R9UI: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/rVw0TYwmI_E" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/2064395773525570542?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/2064395773525570542?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/rVw0TYwmI_E/giving-your-gwt-application-voice.html" title="Giving your GWT Application a Voice" /><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/03/giving-your-gwt-application-voice.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4ERnsyfyp7ImA9WxVWEEs.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-912586064745977455</id><published>2009-02-19T09:37:00.000-08:00</published><updated>2009-02-19T09:35:07.597-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-19T09:35:07.597-08:00</app:edited><title>GWT Community Updates</title><content type="html">&lt;p&gt;A couple of months ago, we put the spotlight on the &lt;a href="http://googlewebtoolkit.blogspot.com/2008/12/gwt-community-updates.html"&gt;GWT community&lt;/a&gt; to highlight some of the great things that have been going on. Since then, there has been a lot of new activity to talk about, so we'd like to share these announcements with you below:&lt;/p&gt;&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;span class="Apple-style-span" style="color: rgb(85, 26, 139); "&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: rgb(0, 0, 0); font-family: arial; "&gt;&lt;a href="http://gwt-widget.sourceforge.net/?q=node/57//"&gt;GWT Server Library (GWT-SL) 0.1.5b Released&lt;/a&gt;: The GWT-SL library provides developers with a way to easily use GWT with the Spring framework. In this latest release, the library provides support for integration with Gilead (formerly known as hibernate4gwt) and has been updated to work with GWT 1.5.3, and also includes many other new features and improvements.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: rgb(85, 26, 139); "&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: rgb(0, 0, 0); font-family: arial; "&gt;&lt;a href="http://noon.gilead.free.fr/gilead/index.php?mact=News,cntnt01,detail,0&amp;amp;cntnt01articleid=4&amp;amp;cntnt01returnid=15"&gt;Gilead 1.2.1 Released&lt;/a&gt;: Gilead lets you export persistent entites from the JVM to the outside world. For GWT, it means easy integration with Hibernate. This maintenance releases includes support for Maven support and comet4gwt among other new enhancements. If you use Hibernate, or any other of the new technologies Gilead now supports, check out the library on their &lt;a href="http://noon.gilead.free.fr/gilead/index.php"&gt;project page&lt;/a&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial; "&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Dependency Injection in GWT: &lt;/span&gt;You may already be familiar with &lt;a href="http://code.google.com/p/google-gin/"&gt;GIN (GWT INjection)&lt;/a&gt;, a dependency injection library that integrates GWT with the Guice framework. However, in case you wanted to try a new flavor of guice (pun intended), you may want to take a look at the recently introduced &lt;a href="http://code.google.com/p/suco/"&gt;suco&lt;/a&gt; library, which offers its own guice-style dependency injection technique.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial; "&gt;&lt;a href="http://code.google.com/p/emite/"&gt;emite 0.4.6 Released&lt;/a&gt;: emite is an open-source library that implements an XMPP communication protocol and provides hooks for GWT integration. This means you can now make your GWT applications more chatty using this library. If you want to have your users chatting over and about your GWT application, this library might be worth checking out.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 153, 255); font-size: 19px;"&gt;More fun stuff&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial; "&gt;&lt;a href="http://code.google.com/events/io/"&gt;Google I/O&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial; font-weight: bold; "&gt;: &lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial; "&gt;Google's developer conference is coming back again this year at the Moscone Center in San Francisco, California. If you attended &lt;a href="http://sites.google.com/site/io/"&gt;last year&lt;/a&gt;, you'll know that lots of great talks and impromptu chats with Google engineers await. Like last year, the conference will feature a handful of awesome &lt;a href="http://www.youtube.com/view_play_list?p=89854BC9F577BE78"&gt;GWT related talks&lt;/a&gt;, not to mention members of the GWT team onsite to answer all your questions. Check out the &lt;a href="https://io2009.event-projects.com/"&gt;registration page&lt;/a&gt; if you'd like to meet some of us in person.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-912586064745977455?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=BYsi0SOb"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=l1zIlizP"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?i=l1zIlizP" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/zrP_nmUGiUA" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/912586064745977455?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/912586064745977455?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/zrP_nmUGiUA/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/02/gwt-community-updates.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIGSH88cCp7ImA9WxVXFUQ.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-3167928722412912764</id><published>2009-02-13T10:13:00.000-08:00</published><updated>2009-02-13T22:38:49.178-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-13T22:38:49.178-08:00</app:edited><title>Upcoming AJAX panel - JQuery, Dojo, YUI, GWT, and MooTools at the Googleplex</title><content type="html">&lt;p&gt;Community meetups are a great way to meet new people with similar passions and interests as your own. It's also a great place for the community to exchange ideas. Often you get an interesting presentation to boot.&lt;/p&gt;

&lt;p&gt;In fact, for those of you interested and within reasonable traveling distance, the &lt;a href="http://www.svwebbuilder.com/"&gt;Silicon Valley Web Builders&lt;/a&gt; and the &lt;a href="http://javascript.meetup.com/9/"&gt;Silicon Valley JavaScript Meetup Group&lt;/a&gt; have organized an exciting &lt;a href="http://matrixajax.eventbrite.com/"&gt;AJAX Panel&lt;/a&gt; next week on February 18th 2009. There will be representatives there from YUI, Dojo, MooTools, JQuery and of course GWT. There's a lot of interest, so be sure to &lt;a href="http://matrixajax.eventbrite.com/"&gt;sign up&lt;/a&gt; before the event fills up.&lt;/p&gt;

&lt;p&gt;I've also been talking with the &lt;a href="http://sv-gtug.org/"&gt;SV-GTUG&lt;/a&gt; (Silicon Valley - Google Technology User Group) organizers about doing a GWT presentation at an upcoming meeting. We don't have a firm date yet, but I'd like to start collecting your questions and suggestions for material you'd like to see covered. You can vote on other people's ideas or post your own questions &lt;a href="http://moderator.appspot.com/#16/e=1b9ea"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Finally, if you know about or organize a local user group that has developers interested in GWT, let &lt;a href="mailto:fredsa@google.com"&gt;me&lt;/a&gt; know. I'd like to hear about your group, and perhaps there's a way we can help make your meetings even more compelling.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-3167928722412912764?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=SP5htMu2"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=SvvRSX2v"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?i=SvvRSX2v" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/0WQhh4Za0RI" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/3167928722412912764?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/3167928722412912764?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/0WQhh4Za0RI/upcoming-ajax-panel-jquery-dojo-yui-gwt.html" title="Upcoming AJAX panel - JQuery, Dojo, YUI, GWT, and MooTools at the Googleplex" /><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/02/upcoming-ajax-panel-jquery-dojo-yui-gwt.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEFQno9eip7ImA9WxVQGUk.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-184216069236077617</id><published>2009-02-06T09:45:00.000-08:00</published><updated>2009-02-06T09:50:13.462-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-06T09:50:13.462-08:00</app:edited><title>Google API Libraries for GWT Update</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;Another round of updates is ready for the &lt;a href="http://code.google.com/p/gwt-google-apis/"&gt;Google API Libraries&lt;/a&gt; for &lt;a href="http://code.google.com/webtoolkit/"&gt;Google Web Toolkit&lt;/a&gt; (GWT). This update brings bug fixes and new features to three of the existing libraries.  The &lt;a href="http://google-code-updates.blogspot.com/2008/12/google-visualization-api-library-now.html"&gt;Google Visualization API Library for GWT&lt;/a&gt; moves from a release candidate to a public release with a few bug fixes.  The &lt;a href="http://code.google.com/docreader/#p=gwt-google-apis&amp;s=gwt-google-apis&amp;t=Gadgets"&gt;Gadgets API Library for GWT&lt;/a&gt; now supports &lt;a href="http://www.google.com/adwords/gadgetads/"&gt;GadgetAds&lt;/a&gt; , gadget based internationalization and an important bug fix for Windows developers using GWT hosted mode.   The &lt;a href="http://googlegeodevelopers.blogspot.com/2009/01/google-maps-api-library-for-gwt.html"&gt;Google Maps API Library for GWT&lt;/a&gt; now includes support for the &lt;a href="http://googlegeodevelopers.blogspot.com/2008/07/improvements-to-ads-in-maps-api.html"&gt;GAdsManager&lt;/a&gt; and &lt;a href="http://googlegeodevelopers.blogspot.com/2008/10/geocoding-in-reverse.html"&gt;reverse geocoding&lt;/a&gt; support. We are also announcing a major update to the &lt;a href="http://code.google.com/docreader/#p=gwt-google-apis&amp;s=gwt-google-apis&amp;t=Gears"&gt;Gears API Library for GWT&lt;/a&gt; to support the Gears 0.4 feature set, which includes Geolocation, HTTP Request, Desktop and Blob support.&lt;/p&gt;&lt;p&gt;This release is exciting to me not just for the new features that have been added, but also for the number of new contributors to the libraries from the open source community.  Special thanks to Mark Renouf for contributing Gears 0.4 support, and all those that filed &lt;a href="http://code.google.com/p/gwt-google-apis/issues/list"&gt;issues&lt;/a&gt; and contributed &lt;a href="http://code.google.com/docreader/#p=gwt-google-apis&amp;s=gwt-google-apis&amp;t=MakingGALGWTBetter"&gt;patches&lt;/a&gt;.&lt;p&gt;You can find the new libraries ready for &lt;a href="http://code.google.com/p/gwt-google-apis/wiki/Downloads"&gt;download&lt;/a&gt; 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-184216069236077617?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=GzPJUFyM"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=MAdhoMAT"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?i=MAdhoMAT" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/uE4xU3OwvOg" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/184216069236077617?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/184216069236077617?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/uE4xU3OwvOg/google-api-libraries-for-gwt-update.html" title="Google API Libraries for GWT Update" /><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/02/google-api-libraries-for-gwt-update.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8CR3wyeip7ImA9WxVREU4.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-828048073853287767</id><published>2009-01-16T09:57:00.000-08:00</published><updated>2009-01-16T12:14:26.292-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-16T12:14:26.292-08:00</app:edited><title>GWT Advocacy</title><content type="html">&lt;p&gt;I'm a huge fan of GWT and have been since its public release in 2006. I have spent a fair amount of my spare time working with GWT by participating in the &lt;a href="http://groups.google.com/group/Google-Web-Toolkit"&gt;user forum&lt;/a&gt; and &lt;a href="http://groups.google.com/group/Google-Web-Toolkit-Contributors"&gt;contributors forum&lt;/a&gt;, submitting patches to the &lt;a href="http://code.google.com/p/google-web-toolkit/issues/list"&gt;issue tracker&lt;/a&gt; and maintaining open source libraries for GWT, including ones providing support for Drag and Drop (&lt;a href="http://code.google.com/p/gwt-dnd/"&gt;gwt-dnd&lt;/a&gt;), Logging (&lt;a href="http://code.google.com/p/gwt-log/"&gt;gwt-log&lt;/a&gt;) and sound (&lt;a href="http://code.google.com/p/gwt-voices/"&gt;gwt-voices&lt;/a&gt;). GWT has gone through a number of exciting releases, with &lt;a href="http://googlewebtoolkit.blogspot.com/2008/08/gwt-15-now-available.html"&gt;1.5&lt;/a&gt; easily being the most impressive release yet. You probably know that the team is fiercely working on the upcoming 1.6 release. Andrew &lt;a href="http://googlewebtoolkit.blogspot.com/2008/12/whats-ahead-for-google-web-toolkit_10.html"&gt;posted a month ago&lt;/a&gt; about the new features slated for 1.6. As usual, I'm not sure if I'm more excited about what's in the upcoming release or all the possible things we can do next!&lt;/p&gt;

&lt;p&gt;I'm pleased to announce that I have joined the Developer Relations team at Google as a Developer Advocate for GWT. Some of you may be wondering what a Developer Advocate does. The role has two parts. We are advocates for you, the developer, which is to make your voice heard within the product and engineering teams at Google. We also advocate broader use of Google Developer Products and APIs. Both roles work hand in hand. By listening to developer's needs I will be advocating to improve GWT as a product. A better product in turn helps increase adoption thereby growing the GWT community.&lt;/p&gt;

&lt;p&gt;I look forward to spreading the word and to helping &lt;a href="http://code.google.com/webtoolkit/makinggwtbetter.html"&gt;make GWT even better&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-828048073853287767?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=sJL8yDMc"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=L1rNFXfE"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?i=L1rNFXfE" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/kAX8RfouULM" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/828048073853287767?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/828048073853287767?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/kAX8RfouULM/gwt-advocacy.html" title="GWT Advocacy" /><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/01/gwt-advocacy.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIDRXw6cSp7ImA9WxRaF0w.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-6414011690011915238</id><published>2008-12-19T10:00:00.000-08:00</published><updated>2008-12-19T10:16:14.219-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-19T10:16:14.219-08:00</app:edited><title>GWT Community Updates</title><content type="html">&lt;p&gt;The GWT community is full of activity; so much so that it sometimes becomes difficult to keep track of! I thought it would be a good idea to try and gather some of this action in one place, so without further ado, here's what's going on in the GWT community!&lt;/p&gt;&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 id="r08i" href="http://blog.noelios.com/2008/10/28/restlet-110-released/" title="Restlet 1.1.0 released"&gt;Restlet 1.1.0 released&lt;/a&gt;: Using REST APIs with Servlets used to require wasted hours writing custom code. Fortunately, Restlet came along to take that pain away. Even more fortunately, Restlet integrates with GWT to make dealing with REST APIs a breeze. The team has recently announced their 1.1.0 release, might be worth a spin if you've exhausted yourself writing custom code and need some REST.&lt;/p&gt;&lt;p&gt;&lt;a id="y.3y" href="http://noon.gilead.free.fr/gilead/" title="Hibernate4GWT (Gilead) 1.2 RC1"&gt;Hibernate4GWT (Gilead) 1.2 RC1&lt;/a&gt;: Hibernate is an extremely powerful ORM framework for the Java programming language. It has proven itself as an invaluable tool for those with tight data-to-domain mapping, and thanks to Hibernate4GWT, has become easily accessible to GWT application developers. Hibernate 1.2 RC1 (aka Gilead) is now available to download.&lt;/p&gt;&lt;p&gt;&lt;a id="csdy" href="http://www.jroller.com/sjivan/entry/smartgwt_1_0_released" title="SmartGWT 1.0 released"&gt;SmartGWT 1.0 released&lt;/a&gt;: SmartClient is a framework that allows you to not only utilize its widget library for your application UI, but also tie these widgets in with your server-side for data management. SmartGWT 1.0, combining both GWT and SmartClient, has been released thanks to the efforts of Sanjiv Jivan. Read more about it in Sanjiv's release announcement.&lt;/p&gt;&lt;p&gt;&lt;a id="uuye" href="http://groups.google.com/group/Google-Web-Toolkit-Contributors/browse_thread/thread/72cf8810759c7c3" title="GWT Maven heaven"&gt;GWT Maven heaven&lt;/a&gt;: The gwt-maven project developed by Charlie Collins and fellow project members provides a way for developers using a Maven to easily integrate GWT into their build system. We also have Nicolas De loof who has been working on a GWT Maven plug-in in the Mojo project. We're happy to say that Charlie Collins and Nicolas De loof are now going to form GWT Maven heaven by integrating the functionality of both plugin together and hosting them on the Mojo project.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-6414011690011915238?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=Y8zHYtvU"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=e0cbFKng"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?i=e0cbFKng" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/nxOyjMTEzfA" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/6414011690011915238?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/6414011690011915238?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/nxOyjMTEzfA/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/2008/12/gwt-community-updates.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYCQn07cSp7ImA9WxRaFU4.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-8359828116344784640</id><published>2008-12-16T13:33:00.000-08:00</published><updated>2008-12-17T10:06:03.309-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-17T10:06:03.309-08:00</app:edited><title>Put Your GWT App on Facebook in 10 minutes</title><content type="html">&lt;p&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;&lt;span style="font-size:100%;"&gt;Jared Jacobs is the frontend lead at &lt;a href="http://www.kaching.com"&gt;kaChing&lt;/a&gt;, a marketplace for investing talent. He had a chance to stop by and give us the lowdown on his team's successful port of their GWT application onto the Facebook platform. If you're looking to socialize your application on Facebook, read on for the steps to make it happen.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;As you may know, social networks like Facebook, LinkedIn, and MySpace can be an excellent place to grow a new business. Most of the kaChing community first discovered us through friends using our &lt;a href="http://www.facebook.com/apps/application.php?id=2339204748" id="eual" title="Fantasy Stock Exchange"&gt;Fantasy Stock Exchange&lt;/a&gt; Facebook app.&lt;/p&gt;&lt;p&gt;In this post, I'll help you get your GWT app running as a Facebook app. Believe it or not, it can be done in just two easy steps.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Create the Facebook App.&lt;br&gt;Follow the instructions on Facebook's &lt;a href="http://developers.facebook.com/get_started.php" id="jqyy" title="Getting Started page"&gt;Getting Started page&lt;/a&gt; to create and name your Facebook app. Accept the default settings for now.&lt;/li&gt;&lt;br&gt;&lt;li&gt;Point your Facebook App at your GWT App.&lt;br&gt;Adjust these Facebook App settings:&lt;br&gt;&lt;table style="border: 1px solid rgb(192, 192, 192);" cellpadding="3" cellspacing="0"&gt;  &lt;tbody&gt;  &lt;tr&gt;&lt;td style="border-color: rgb(192, 192, 192); border-width: 2px; border-right: 2px solid rgb(192, 192, 192); border-bottom: 2px solid rgb(192, 192, 192);" valign="top" width="120"&gt;  Callback URL  &lt;/td&gt;  &lt;td style="border-color: rgb(192, 192, 192); border-width: 2px; border-bottom: 2px solid rgb(192, 192, 192);"&gt;  Enter the URL of your GWT app's main HTML page. Tip: For a quick development cycle, run your server locally and use a &lt;i&gt;localhost&lt;/i&gt; URL.
&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td style="border-color: rgb(192, 192, 192); border-width: 2px; border-right: 2px solid rgb(192, 192, 192);" valign="top" width="120"&gt;  Canvas Page URL  &lt;/td&gt;  &lt;td&gt;  Choose a path beneath apps.facebook.com for your Facebook app. Also select the &lt;b&gt;Use iframe&lt;/b&gt; radio button.
&lt;/td&gt;  &lt;/tr&gt;  &lt;/tbody&gt;  &lt;/table&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;And you're done! Visit the Canvas Page URL that you chose, and you'll see your GWT app running in Facebook. The rest of this post will suggest a couple of ways to integrate more fully, to better leverage the Facebook platform.&lt;/p&gt;&lt;br&gt;&lt;h3&gt;&lt;span style="color: rgb(102, 153, 255);"&gt;&lt;span style="font-family:'georgia';"&gt;Getting rid of unwanted scroll bars&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;If your GWT app is too wide for the containing Facebook iframe and you can't stomach a horizontal scrollbar, then you need to make your app slimmer - at least when it's running inside Facebook. Facebook's width limit (currently 760px) is a hard limit.&lt;/p&gt;&lt;p&gt;If your GWT app is too tall, it'll be clipped and you'll see a vertical scrollbar along the right side. To fix this, you can specify a large fixed canvas height for your app using the &lt;span style="font-family:Courier New;"&gt;CanvasUtil&lt;/span&gt; feature of Facebook's &lt;a href="http://wiki.developers.facebook.com/index.php/JavaScript_Client_Library" id="v0y6" title="JavaScript Client Library"&gt;JavaScript Client Library&lt;/a&gt;. You can read the docs for more detail, but in practice it boils down to adding the following snippet to the body of your app's main HTML page:&lt;/p&gt;&lt;pre id="line23"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; 
  src=&amp;quot;http://static.ak.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php&amp;quot;&amp;gt;
&amp;lt;/script&amp;gt;
&amp;lt;div id=&amp;apos;FB_HiddenContainer&amp;apos; 
  style=&amp;apos;display:none;position:absolute;left:-100px;top:-100px;width:0;height:0&amp;apos;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
  window.onload = function(){
    FB_RequireFeatures([&amp;apos;CanvasUtil&amp;apos;], function(){
      FB.XdComm.Server.init(&amp;apos;&lt;span style="background-color: rgb(255, 255, 0);"&gt;some/path/to/xd_receiver.html&lt;/span&gt;&amp;apos;);
      FB.CanvasClient.setCanvasHeight(&amp;apos;&lt;span style="background-color: rgb(255, 255, 0);"&gt;2000px&lt;/span&gt;&amp;apos;);
    });
  };
&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;p&gt;You should customize the highlighted parts. Here's a description of what's going on in the snippet above:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;The first &lt;span style="font-family:Courier New;"&gt;script&lt;/span&gt; tag loads &lt;span style="font-family:Courier New;"&gt;FB_RequireFeatures&lt;/span&gt;, the entry point to the Facebook JS Client Library.&lt;/li&gt;
&lt;li&gt;The &lt;span style="font-family:Courier New;"&gt;FB_RequireFeatures&lt;/span&gt; call loads the &lt;span style="font-family:Courier New;"&gt;CanvasUtil&lt;/span&gt; feature (the &lt;span style="font-family:Courier New;"&gt;FB.CanvasClient&lt;/span&gt; object).&lt;/li&gt;
&lt;li&gt;Before using &lt;span style="font-family:Courier New;"&gt;FB.CanvasClient&lt;/span&gt;, we must set up a &lt;a href="http://wiki.developers.facebook.com/index.php/Cross_Domain_Communication_Channel" id="dhzy" title="Cross Domain Communication Channel"&gt;Cross Domain Communication Channel&lt;/a&gt; between your app's canvas window and the containing Facebook window. This means a) hosting Facebook's &lt;span style="font-family:Courier New;"&gt;xd_receiver.html&lt;/span&gt; file somewhere on your server, b) telling the Facebook JS Client Library where to find it (hence the &lt;span style="font-family:Courier New;"&gt;FB.XdComm.Server.init&lt;/span&gt;&lt;span style="font-family:Verdana;"&gt; call), and c) adding an &lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;FB_HiddenContainer&lt;/span&gt; div to the body of your main HTML page to serve as the container for channel iframes.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-family:Verdana;"&gt;
If your app changes its height from time to time, you can ask the Facebook's JS library&lt;/span&gt; to check your canvas window's height at regular intervals and adjust the containing iframe's height to match. To do so, replace the &lt;span style="font-family:Courier New;"&gt;FB.CanvasClient.setCanvasHeight&lt;/span&gt;&lt;span style="font-family:Verdana;"&gt; call&lt;/span&gt; in the snippet above with:
&lt;pre style="margin-left: 40px;" id="line43"&gt;FB.CanvasClient.setCanvasHeight('2000px&lt;/span&gt;',
function(){FB.CanvasClient.startTimerToSizeToContent()});&lt;/pre&gt;&lt;p&gt;For more info on the CanvasUtil feature, including how to make the containing Facebook window scroll to a desired location, see &lt;a title="this demo iframe app" href="http://apps.facebook.com/wzhu_public_resize/" id="kvmu"&gt;this demo iframe app&lt;/a&gt;.&lt;/p&gt;&lt;br&gt;&lt;h3&gt;&lt;span style="color: rgb(102, 153, 255);"&gt;&lt;span style="font-family:'georgia';"&gt;Accessing Facebook User Data&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;If a Facebook user is logged into Facebook when accessing your Facebook app, the app URL will include the user's Facebook ID in the query string as the &lt;span style="font-family:Courier New;"&gt;fb_sig_user&lt;/span&gt; or &lt;span style="font-family:Courier New;"&gt;fb_sig_canvas_user&lt;/span&gt; parameter, depending on whether the user has authorized your application. (See &lt;a title="Authorizing Applications" href="http://wiki.developers.facebook.com/index.php/Authorizing_Applications" id="rcp2"&gt;Authorizing Applications&lt;/a&gt; for more on the various request parameters.) You can use this Facebook ID, in conjunction with your app's ID and secret key, to request information about the user from Facebook using any of Facebook's various APIs. As a GWT app author, you are likely to be using a Java server, so consider using one of &lt;a title="these Java Facebook clients" href="http://wiki.developers.facebook.com/index.php/Java#Alternative_Java_clients" id="pizu"&gt;these Java Facebook clients&lt;/a&gt;. We use &lt;a title="this open-source Facebook Java API" href="http://code.google.com/p/facebook-java-api/" id="f:xc"&gt;this open-source Facebook Java API&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;For a high-level overview of Facebook's various APIs and their relative merits, I'd recommend a &lt;a title="recent blog post" href="http://www.ccheever.com/blog/?p=10" id="wcwx"&gt;recent blog post&lt;/a&gt; by Facebook Platform engineer Charlie Cheever.&lt;/p&gt;&lt;br&gt;&lt;h3&gt;&lt;span style="color: rgb(102, 153, 255);"&gt;&lt;span style="font-family:'georgia';"&gt;Get some Face time for your app&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I hope this article helps you get your snazzy, snappy GWT apps to larger audiences. If you can afford the time investment, be sure to utilize social network integration points that can spur viral growth, such as invitations, profile boxes, and activity streams.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-8359828116344784640?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=UPRWesTL"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=915ejfW7"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?i=915ejfW7" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/Ns61ul4pT4I" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/8359828116344784640?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/8359828116344784640?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/Ns61ul4pT4I/put-your-gwt-app-on-facebook-in-10.html" title="Put Your GWT App on Facebook in 10 minutes" /><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/2008/12/put-your-gwt-app-on-facebook-in-10.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMMSHozeSp7ImA9WxRaEEk.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-5088486737866671419</id><published>2008-12-11T17:40:00.000-08:00</published><updated>2008-12-11T17:48:09.481-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-11T17:48:09.481-08:00</app:edited><title>Spotlight On Developers Using Google Web Toolkit</title><content type="html">&lt;p&gt;One of the best resources for developers looking for tips on building applications or learning about a new technology is to hear from other developers who have already been through the experience and built world-class applications. That's why we're happy to share videos of a few developers who used the Google Web Toolkit to build rich, sophisticated Ajax applications that have wowed audiences, won prestigious awards and are pushing the boundaries of what we've come to expect from a web application.&lt;/p&gt;&lt;p&gt;Check them out in our new &lt;a href="http://code.google.com/webtoolkit/app_gallery.html"&gt;Who's Using GWT&lt;/a&gt; page. In these videos, the developers explain how they used GWT to build their apps, their opinions on GWT overall, and tips and learnings from working with GWT. These videos include the developers behind:&lt;/p&gt;&lt;ul&gt;&lt;li&gt; &lt;span style="font-weight: bold;"&gt;GoGrid&lt;/span&gt;: the cloud computing infrastructure service provider that won "Best of Show" at the Linux World 2008 Product Excellence Awards.&lt;/li&gt;&lt;br&gt;&lt;li&gt; &lt;span style="font-weight: bold;"&gt;Lombardi Blueprint&lt;/span&gt;: a business process mapping and diagramming tool that was used as a case study at this year's Google I/O conference.&lt;/li&gt;&lt;br&gt;&lt;li&gt; &lt;span style="font-weight: bold;"&gt;scenechronize&lt;/span&gt;: a film and television production management application, presented at the Sundance Film Festival and Festival de Cannes in 2008.&lt;/li&gt;&lt;br&gt;&lt;li&gt; &lt;span style="font-weight: bold;"&gt;Whirled&lt;/span&gt;: a social virtual world website, where users can keep up with friends, discuss on boards, and play a number of wildly entertaining mini-games.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;We'd love to hear from others in the community. If you would like to share your experience developing GWT applications with the rest of the community, let us know in the &lt;a href="http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/c07cdb1c436fdaa7"&gt;forum&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-5088486737866671419?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=GmHcI9qO"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=8u6HDISE"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?i=8u6HDISE" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/SbQeLGlQIzY" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/5088486737866671419?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/5088486737866671419?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/SbQeLGlQIzY/spotlight-on-developers-using-google.html" title="Spotlight On Developers Using Google Web Toolkit" /><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/2008/12/spotlight-on-developers-using-google.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ECRH0-eSp7ImA9WxRbGUk.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-4865117362285513313</id><published>2008-12-10T14:53:00.001-08:00</published><updated>2008-12-10T14:54:25.351-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-10T14:54:25.351-08:00</app:edited><title>What's ahead for Google Web Toolkit</title><content type="html">&lt;span style="font-style: italic;" class="byline-author"&gt;By Andrew Bowers, Google Web Toolkit Team&lt;/span&gt;
&lt;p&gt; 
A lot of discussion occurs in the Google Web Toolkit contributors forum about development progress, feature requests, and the roadmap. We realize that many of you are very busy and would like to see a simple roadmap on the website, so we've updated "&lt;a title="Making GWT Better" href="http://code.google.com/webtoolkit/makinggwtbetter.html#roadmap" id="dggh"&gt;Making GWT Better&lt;/a&gt;" with our current plans.
&lt;/p&gt;
&lt;p&gt;
As with any development work, its hard to exactly predict when things will land, so we've stayed away from specific dates and releases past the next one. You'll be happy to know that release 1.6 is well underway and on target for Q1 of 2009.
&lt;/p&gt;
&lt;p&gt;
You can check for future updates in the &lt;a href="http://code.google.com/webtoolkit/makinggwtbetter.html#roadmap"&gt;Making GWT Better&lt;/a&gt; section of our website.
&lt;/p&gt;

&lt;h3&gt;Release 1.6&lt;/h3&gt; 
&lt;p&gt;Anticipated Time Frame - Q1 2009&lt;/p&gt; 
&lt;ul&gt;&lt;li&gt;&lt;b&gt;New compiled file deployment structure&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Easily compile into a war file structure, &lt;span&gt; making it easy to deploy your compiled GWT application into standard servlet containers&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Migration from Tomcat to Jetty hosted mode server&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;A more pluggable architecture for the hosted mode server will enable developers to use servlet containers other than Tomcat with the Hosted Mode browser&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Uniform event handlers&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Event handlers will be implemented in a uniform fashion across all widgets, with listeners deprecated&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;DatePicker, LazyPanel migrated in from incubator&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;New widgets from the incubator&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;String performance improvements&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;StringBuilder uses deferred binding to optimize string appends per-browser&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Compiler performance improvements&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;1.6 will introduce parallel permutation compilations and other performance tweaks for faster compiles&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;

&lt;h3&gt;Post 1.6&lt;/h3&gt; &lt;p&gt;The following are features that are on our roadmap for releases post 1.6, but are in various states of development. As we reach the end of the 1.6 cycle, we'll update the roadmap with which features we are targeting for the next release.&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;b&gt;Developer Guided Code splitting&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Developer guided code splitting is a mechanism that allows developers to specify asynchronous split points in their code where the code base can be split and downloaded in different chunks. This is currently an R&amp;amp;D project but looks promising.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Analysis of compiled code, aka Story of your compile (SOYC)&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Aims to give developers concrete information about their compiled JavaScript, such as which Java classes are generating the most JavaScript code.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;In-browser hosted mode, aka Out-of-process Hosted Mode (OOPHM)&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;In-browser hosted mode will allow GWT developers to debug their apps within a browser rather than GWT's hosted mode browser&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;UI Binder&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;The UI Binder will allow the creation of UI elements in a declarative fashion. Watch for UI Binder to land in the GWT incubator soon.
&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Client Bundle&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Client Bundle implements the power of deferred binding used in Image Bundle in a generic fashion so that it can be used on many resources. These include TextResource, ImageResource, and CSSResource&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;RPC performance improvements&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Ongoing work to improve the performance of RPC&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-4865117362285513313?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=YiPQpj92"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=kA9DWWBX"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?i=kA9DWWBX" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/yIb2scDneRI" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/4865117362285513313?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/4865117362285513313?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/yIb2scDneRI/whats-ahead-for-google-web-toolkit_10.html" title="What's ahead for Google Web Toolkit" /><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/2008/12/whats-ahead-for-google-web-toolkit_10.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ECRng5eip7ImA9WxRbGEk.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-8879400575959255240</id><published>2008-12-09T09:41:00.000-08:00</published><updated>2008-12-09T11:07:47.622-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-09T11:07:47.622-08:00</app:edited><title>Visualizations in your GWT application</title><content type="html">&lt;span style="font-style: italic;" class="byline-author"&gt;By Eric Ayers, Google Web Toolkit Team&lt;/span&gt;
&lt;p&gt;
For those of you interested in creating &lt;a title="visualizations" href="http://code.google.com/apis/visualization/documentation/gallery.html" id="z-q1"&gt;visualizations&lt;/a&gt; in your Google Web Toolkit applications, we're happy to announce the &lt;a href="http://code.google.com/docreader/#p=gwt-google-apis&amp;amp;s=gwt-google-apis&amp;amp;t=Visualization" id="z_bs" title="Google Visualization API Library"&gt;Google Visualization API Library&lt;/a&gt; for &lt;a href="http://code.google.com/webtoolkit/" id="s:ei" title="Google Web Toolkit"&gt;Google Web Toolkit&lt;/a&gt; (GWT).  This adds another library of Java language bindings for JavaScript APIs provided by Google, collectively known as the suite of &lt;a href="http://code.google.com/p/gwt-google-apis/" id="rucr" title="Google API Libraries for Google Web Toolkit"&gt;Google API Libraries for Google Web Toolkit&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
We're also releasing a General Availability build of the &lt;a title="Google Maps API Library for GWT" href="http://code.google.com/docreader/#p=gwt-google-apis&amp;amp;s=gwt-google-apis&amp;amp;t=Maps" id="y0um"&gt;Google Maps API Library for GWT&lt;/a&gt;. This build contains a few bug fixes that contributors have reported. Thank you for reporting those, and please continue to report them in the &lt;a title="issue tracker." href="http://code.google.com/p/gwt-google-apis/issues/list" id="fe2z"&gt;issue tracker.&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
You can read more about the &lt;a href="http://google-code-updates.blogspot.com/2008/12/google-visualization-api-library-now.html"&gt;new Visualization API in the announcement&lt;/a&gt; on the Google Code blog.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-8879400575959255240?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=BoeF9dIb"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=4Zpju5CK"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?i=4Zpju5CK" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/1mU1oK48NOE" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/8879400575959255240?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/8879400575959255240?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/1mU1oK48NOE/visualizations-in-your-gwt-application.html" title="Visualizations in your GWT application" /><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/2008/12/visualizations-in-your-gwt-application.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUGR3gzeSp7ImA9WxRbF0U.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-6739747499026933728</id><published>2008-12-08T14:41:00.000-08:00</published><updated>2008-12-08T16:57:06.681-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-08T16:57:06.681-08:00</app:edited><title>GWT: No need to shortchange your style</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. StudyBlue has done a great job with their application styling and design, so much so that they are shooting for a Crunchie Award on Tech Crunch for &lt;a id="mdd4" href="http://crunchies2008.techcrunch.com/nominations/?nominee=studyblue.com&amp;amp;category=4" title="Best Design 2008"&gt;Best Design 2008&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;&lt;span style="font-size:100%;"&gt;We're fortunate to have StudyBlue President Chris Klundt and Eric Wuebben, Creative Director for StudyBlue, share their experience styling their potentially award-winning application using GWT and well-planned CSS techniques. If you've ever wondered how you can turn your GWT project into the next most styling application on the block, read on below. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;We've been approached by many programmers and designers alike that question how we got such a custom look using GWT. Our response is simple, "Use GWT to build the house, not to paint it." When you build a new house, you don't have your building contractor pick out the furniture, choose the color palette, or stencil the walls. Similarly, you shouldn't use GWT to inject all the "style" into your website. Instead, you rough it out with GWT and push the design to CSS.&lt;/p&gt;&lt;p&gt;Whether you're building a small widget to embed in an existing site, or you're building an entire web-application from scratch (that's us :-) ), we recommend the following three tenants to ensure maximum design efficiency and flexibility:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Know your design team&lt;/li&gt;&lt;br&gt;&lt;li&gt;Keep all visual elements in the CSS&lt;/li&gt;&lt;br&gt;&lt;li&gt;Deploy to a test environment&lt;/li&gt;&lt;/ol&gt;&lt;br&gt;&lt;h3&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="font-family:'georgia';"&gt;Know Your Design Team&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Sticking with our home construction analogy, you might go about building a home by first having an architect envision a space, then having his apprentice detail the blueprints, before finally having a contractor build the house. Similarly, you should assemble a good design team before diving into the construction of your site with GWT. Chances are, if you are a strong Java programmer (i.e. "the GWT Programmer"), you are not as strong at CSS design and image slicing. You need to know what team members you have at your disposal, and what their strengths are. Once you're set with a Designer and a CSS Stylist (they may be the same person), we recommend you follow this general workflow:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Create a Photoshop image of the widget/site. This file should assume that "anything is possible" and be the ideal look for your widget/site.&lt;/li&gt;&lt;br&gt;&lt;li&gt;Have the Web Designer slice the image into pieces that can be implemented using HTML Tables or DIVs. Even better if this stage can be accomplished with future flexibility in mind for mulitple uses, flexibility, etc...
&lt;/li&gt;&lt;br&gt;&lt;li&gt;Layout the "blueprint" in complete HTML. Create exactly what the HTML code should look like after the respective GWT application code renders the widget/site.&lt;/li&gt;&lt;br&gt;&lt;li&gt;Begin building the layout using GWT. Remember to make mini-widgets out of every piece of reusable code.&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;p&gt;Let's elaborate a bit on points 2, 3 and 4.&lt;p&gt;Part of knowing your team means understanding what your Web Designer's preferences are when it comes to using Tables or DIVs.  GWT offers widgets that encompass both Tables (HorizontalPanel, FlexTable, etc.) and DIVs (FlowPanel, HTML, etc.).  There are benefits and drawbacks to using each of them. For example, Tables might be good for vertical/horizontal centering or adding stability to a grid. They are poor for dynamic positioning, hover states, "rounded corners", etc. Whatever the case, both the GWT Programmer and the Web Designer should have an agreed understanding on which layouts (Tables or DIVs) are to be used and when it's appropriate to make exceptions.  We prefer to do use DIVs, using FlowPanel much more often than HorizontalPanel or VerticalPanel.&lt;/p&gt;&lt;p&gt;Creating a "blueprint" is important for three reasons. First, it helps eliminate guess work from the GWT Programmer.  An HTML "blueprint" can quickly be tested on all browsers to prove that the style renders to the structure as expected. Secondly, "blueprints" are an easy way to communicate between GWT Programmer and Web Designer without both parties having to be in the same room at the same time. Plus it makes it easy to assign blame when things don't look right :-). Finally, creating the "blueprint" will help you realize what looks in the original artwork are impossible to recreate on the site (hopefully none).
&lt;blockquote&gt;Note: Using the WebDeveloper plugin (or Firebug's Inspect) for Mozilla Firefox is a great way to inspect your final layout as a GWT Programmer, to make sure you match the "blueprint". More on this later.
&lt;/blockquote&gt;&lt;/p&gt;&lt;p&gt;Finally, when you start creating the layout in GWT, remember to break down each piece into a Composite class. Not every Composite you create will be reusable.  Sometimes you have to make your widgets so specific that they can't be reused. That's OK, it's a common occurrence in UI programming. However, many widgets you can design to be reusable.  One obvious example is "buttons" on your website.&lt;/p&gt;&lt;br&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;Keep all visual elements in the CSS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;We can't stress this point enough: PUSH YOUR STYLING TO A CASCADING STYLE SHEET (CSS). Just about everything you can do style wise can be done with CSS, so keep it that way.&lt;/p&gt;&lt;br&gt;&lt;b style="color: #FF0000"&gt;BAD:&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;java&lt;/b&gt;&lt;pre&gt;HTML randomText = new HTML("This is some random text in a DIV");
DOM.setElementProperty(randomText.getElement(), "color", "green");
DOM.setElementProperty(randomText.getElement(), "fontSize", "16px");&lt;/pre&gt;&lt;br&gt;&lt;b style="color: #4CC417"&gt;GOOD:&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;java&lt;/b&gt;&lt;pre&gt;HTML randomText = new HTML("This is some random text in a DIV");
randomText.setStyleName("sb-TextWidgets-RandomText");&lt;/pre&gt;&lt;b&gt;CSS&lt;/b&gt;&lt;pre&gt;  .sb-TextWidgets-RandomText{
   color: green;
   font-size: 16px;
 }&lt;/pre&gt;&lt;br&gt;So, what are we gaining by doing this?
&lt;ol&gt;&lt;li&gt;Changing something as simple as color or font-size requires only a CSS update as opposed to redeploying the whole GWT code.&lt;/li&gt;&lt;br&gt;&lt;li&gt;In the above case, we cut out one line of java code. When your application is 40,000+ lines, saving 1-4 lines for every single widget can greatly improve compile time and size. &lt;/li&gt;&lt;br&gt;&lt;li&gt;The Web Designer can make style changes without ever having to look at or run Hosted Mode. (*assuming you have a good test environment - see below)&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;So let's look at a more complex example, a navigation bar with "hover" and "selected" states. Below you'll notice we've created reusable code for our "hover" and "selected" state that can be used by any widget that we want to implement "hover" or "selected".&lt;/p&gt;&lt;p&gt;&lt;b&gt;Hover Class:&lt;/b&gt;&lt;blockquote&gt;&lt;pre&gt;public class Hover {

    private static MouseListenerAdapter mla;

    public static MouseListenerAdapter getHoverMla(){
        if(mla == null){
            mla = new MouseListenerAdapter(){
                    public void onMouseEnter(Widget hoverableWidget){
                       hoverableWidget.addStyleDependentName("hover");
                    }
                    public void onMouseLeave(Widget hoverableWidget){
                        hoverableWidget.removeStyleDependentName("hover");
                    }
                };
        }
        return mla;
    }
   
    .
    .
    .
}
&lt;/pre&gt;&lt;/blockquote&gt;&lt;b&gt;Selected Class:&lt;/b&gt;&lt;blockquote&gt;&lt;pre&gt;public class Selected {

    private List&amp;lt;HTML&amp;gt; itemList;

    private ClickListener cl;
   
    public Selected(){

        itemList = new ArrayList&amp;lt;HTML&amp;gt;();

        cl = new ClickListener(){
            public void onClick(Widget selectedItem) {
                for(HTML item : itemList){
                    if(item.equals(selectedItem)){
                        item.addStyleDependentName("selected");
                    }
                    else{
                        item.removeStyleDependentName("selected");
                    }
                }
            }
        };
       
    }
   
    public ClickListener getSelectedCL(){
        return cl;
    }
   
    public void addItem(HTML item){
        itemList.add(item);
        item.addClickListener(cl);
    }
   
    public void removeItem(HTML item){
        itemList.remove(item);
        item.removeClickListener(cl);
    }
   
}&lt;/pre&gt;&lt;/blockquote&gt;&lt;b&gt;Navigation Bar Class:&lt;/b&gt;&lt;blockquote&gt;&lt;pre&gt;public class NavBar extends Composite{

    public static String BLOG_HOME="http://blog.studyblue.com/";
   
    private int ID=1;
    private Selected selector;

    public NavBar(){
        super();

        selector = new Selected();
       
        FlowPanel holder = new FlowPanel();
        holder.setStyleName("NavBar-Holder");    
       
        holder.add(link("Blog",""));
        holder.add(link("About Us","about"));
        holder.add(link("Jobs","about/jobs"));
      
        setWidget(holder);
    }

    private HTML link(String text, String location){
        HTML ret = new HTML(text);
        ret.setStyleName("nav-item-"+ID);
        ret.addStyleName("nav-item");

        selector.addItem(ret);
        ret.addMouseListener(Hover.getHoverMla());
        ret.addClickListener(new ClickListener(){
            public void onClick(Widget sender){
               ///Open popup with blog page location
            }
        });

        ID++;

        return ret;
    }

}
&lt;/pre&gt;&lt;/blockquote&gt;&lt;b&gt;CSS code:&lt;/b&gt;&lt;blockquote&gt;&lt;pre&gt;.nav-item {
    background-image: url(images/nav.png);   
    background-repeat: no-repeat;   
    background-position: 0 0;   
    display: block;   
    height: 0px;   
    padding: 30px 0 0 0;   
    overflow: hidden;
}

.nav-item-1 { background-position: 0 0;        width: 65px; }
.nav-item-2 { background-position: -65px 0;    width: 90px; }
.nav-item-3 { background-position: -155px 0;   width: 65px; }

.nav-item-1-hover { background-position: 0 -30px; }
.nav-item-2-hover { background-position: -65px -30px; }
.nav-item-3-hover { background-position: -155px -30px; }

.nav-item-1-selected { background-position: 0 -60px; }
.nav-item-2-selected { background-position: -65px -60px; }
.nav-item-3-selected { background-position: -155px -60px; }&lt;/pre&gt;&lt;/blockquote&gt;&lt;b&gt;Image File &lt;/b&gt;(nav.png)
&lt;blockquote&gt;&lt;img src="https://docs.google.com/a/google.com/File?id=ddm488s5_1c53q2kfk_b" style="width: 219px; height: 90px;" /&gt;&lt;/blockquote&gt;&lt;/p&gt;&lt;br&gt;&lt;p&gt;So, let's break down what is going on here. The NavBar is a Composite which is holding a FlowPanel ("holder"). This FlowPanel is a DIV which is going to hold our 3 links: "blog", "about us", and "jobs". Each one of these links is an HTML widget (i.e. a DIV). Inside the method "link" we first are creating each HTML with the appropriate text, setting its style name with a unique integer, adding an additional style name. From there, we add the link to our "selector" as well as add a "hover" listener. Finally, we add a ClickListener which initiates an action (in this case taking the user to the blog).&lt;/p&gt;&lt;p&gt;Some things to note:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Note the difference between "setStyleName" and "addStyleName". HTML widgets come default with "gwt-HTML" as the SET style name. When you call setStyleName(), you replace "gwt-HTML" with whatever you choose. This new SET style name is what is used when the method "addStyleDependentName" is called.  addStyleName() simply just adds an additional style, which is not used for "addStyleDependentName".&lt;/li&gt;&lt;br&gt;&lt;li&gt;In our case, the "hover" and "selected" style names were added dynamically using addStyleDependentName(). So, we needed to make sure that the SET style name was the complete identity (i.e. "nav-item-1"). addStyleDependentName() takes care of adding the additional style names (i.e. "nav-item-1-hover" and/or "nav-item-1-selected").&lt;/li&gt;&lt;br&gt;&lt;li&gt;The additional style name, "nav-item" is added permanently onto each link, but is not the SET style name. Thus, it is always present, despite the addition/subtraction of style dependent names.&lt;/li&gt;&lt;br&gt;&lt;li&gt;The Web Designer and GWT Programmer both know that all widgets will have a style DEPENDENT name of "hover" and "selected" (if necessary), which means the GWT Programmer can recycle the Hover and Selected code, and the Web Developer can anticipate what style names will be present for "hover" and "selected"&lt;/li&gt;&lt;br&gt;&lt;li&gt;*CSS Tip: Loading all of the states (off, selected and hover) into the one nav.png image, helps prevent flickering when the user hovers or selects the link.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Without our CSS, the result would simply look like this:&lt;blockquote&gt;  Blog
About Us
Jobs
&lt;/blockquote&gt;&lt;/p&gt;&lt;br&gt;&lt;p&gt;However, by adding a few style names, we are able to achieve a look like this:&lt;blockquote&gt;&lt;img src="https://docs.google.com/a/google.com/File?id=ddm488s5_2gbhk3ddg_b" style="width: 219px; height: 30px;" /&gt;&lt;/blockquote&gt;&lt;/p&gt;&lt;br&gt;&lt;p&gt;We also streamlined our development by standardizing the use of stand-alone buttons on the site. That way, the GWT Programmer can create a button widget that can be reused depending on the size and color button needed. The widget uses DEPENDENT style names to produce small, medium, or large buttons colored with green, white, blue, or red that are preset in the style sheet and work for flexible content lengths.&lt;blockquote&gt;&lt;img src="https://docs.google.com/a/google.com/File?id=ddm488s5_4frr3c6hq_b" style="width: 600px; height: 70px;" /&gt;&lt;/blockquote&gt;&lt;/p&gt;&lt;br&gt;&lt;h3&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="font-family:'georgia';"&gt;Deploy To A Test Environment&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;It is really important to have a test environment for your Web Designer to mess with. As a GWT Programmer, you can't expect that your Web Designer will be able to run Hosted Mode. Also, until the GWT guys implement Out-of-Process Hosted Mode (OOPHM), you will definitely want to take a look at your product in all the major browsers before deploying to production. We run a Tomcat instance on a powerful box over at Amazon Web Services. Using SVN and Ant, we update all our code to the test machine, compile it, create a WAR and deploy it using one command. The key here is that this process takes over 6 minutes every time we want to deploy new code. Six minutes may not seem like that long, but when your Web Developer is waiting 6 minutes every time you need to make a small change to the layout, it gets annoying. So we implemented two ideas to help ease the pain.&lt;/p&gt;&lt;p&gt;First, if you take one thing away from this post, don't style using the GWT DOM class. Set your style names and let the CSS do the work. If we had put all the styles in the GWT code, it would take us 6 minutes to change the color of some trivial text, only to find out that we liked it better the old way (another 6 minutes).&lt;/p&gt;&lt;p&gt;Second, pull out your CSS files and images directory to some location outside your WAR. The idea here is that the Web Designer can manipulate the CSS and imagery without ever getting inside your WAR. This way, when its time to deploy new code, you don't overwrite the Web Designer's changes by replacing the CSS file and/or images on accident. This also helps with remote collaboration. The Web Designer gives the GWT Programmer the "blueprints", the GWT Programmer builds the app and deploys it to the test server, the Web Designer is free to make changes to the CSS and images while checking compatibility across all the browsers. Theoretically, you'd never have to be in the same room (although we don't prefer it that way).&lt;/p&gt;&lt;p&gt;Now get out there and build an awesome GWT house!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-6739747499026933728?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=7iIK0hBt"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=IIeGAIDB"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?i=IIeGAIDB" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/J98z7XMRnWk" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/6739747499026933728?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/6739747499026933728?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/J98z7XMRnWk/gwt-no-need-to-shortchange-your-style.html" title="GWT: No need to shortchange your style" /><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/2008/12/gwt-no-need-to-shortchange-your-style.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IEQ3czeyp7ImA9WxRUFUo.&quot;"><id>tag:blogger.com,1999:blog-28098389.post-5624963857046226588</id><published>2008-11-24T16:41:00.000-08:00</published><updated>2008-11-24T18:18:22.983-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-24T18:18:22.983-08:00</app:edited><title>Profiling GWT application performance</title><content type="html">&lt;p&gt;&lt;span style="font-style: italic;" class="byline-author"&gt;By Sumit Chandel, Google Web Toolkit Team&lt;/span&gt;&lt;/p&gt;&lt;p&gt;A couple weeks ago, I talked about &lt;a href="http://googlewebtoolkit.blogspot.com/2008/11/improving-performance-with-on-demand.html"&gt;On-demand widget creation in GWT&lt;/a&gt;, a technique you can use to improve the performance of your own GWT applications. What we detailed there was how to apply the technique and what benefits it yields, however we only briefly touched on when and where to apply the pattern.&lt;/p&gt;&lt;p&gt;Applying on-demand widget creation in your application requires a measured understanding of your GWT application's performance. Profiling your application is key to identifying performance hot spots that could be improved using the lazy load pattern or other performance tune-up techniques.&lt;/p&gt;&lt;p&gt;The two key data points to consider when profiling your application are slowdowns and memory usage. Here the term slowdown relates to how slow your application performs in terms of the JavaScript and DOM manipulations that are being processed to run the application. Obviously slowdowns are bad because they lead to sluggish user experiences and less users on your site. Memory usage is equally important as an application that leaks or consumes large amounts of memory is likely to slowdown or crash the user's browser, which also leads to users leaving your site, most likely preceded by profuse cursing.&lt;/p&gt;&lt;p&gt;In this post I wanted to share some tips you could use to profile your own GWT application to help plan your on-demand creation strategy or apply other performance improving code fixes.&lt;/p&gt;&lt;h3&gt;&lt;span style="font-size:100%;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 102, 255);"&gt;&lt;span class="Apple-style-span"  style="font-family:'georgia';"&gt;Profiling application performance&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;One of the tools that I usually use to profile GWT applications is the &lt;a href="http://getfirebug.com/"&gt;FireBug plugin for Firefox&lt;/a&gt;. It has great support for profiling JavaScript performance, which you can use to help find hotspots in your code where certain widget creation calls are taking up too much time and would be better loaded on demand.&lt;/p&gt;&lt;p&gt;Don't try this out just yet! The GWT compiler takes care of optimizing and obfuscating the JavaScript generated from your GWT source, therefore if you tried to run the FireBug profiler over your application without first compiling your application with the -style PRETTY flag, you'll have a really hard time figuring out what you're profiling.&lt;/p&gt;&lt;p&gt;To re-compile your GWT application in PRETTY mode, simply tweak the MyApplication-compile script if you used the applicationCreator or change your GWT compile run configuration to pass the -style PRETTY mode flag to the compiler (e.g. for Linux -compile script shown below):&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;#!/bin/sh
APPDIR=`dirname $0`;
java  -Xmx256M -cp
 "$APPDIR/src:$APPDIR/bin:$APPDIR/../../gwt-user.jar:$APPDIR/../../gwt-dev-linux.jar"
 com.google.gwt.dev.GWTCompiler -style PRETTY -out "$APPDIR/www" "$@"
 com.google.gwt.sample.mail.Mail;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Once you've compiled in PRETTY mode, you should be able to use FireBug's JavaScript performance profiler with ease to help identify spots where you would want to load your widgets on demand rather than all at once. You can look forward to something like the screenshot below:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_YuwctsIuxOw/SStUPiH6bGI/AAAAAAAAAB0/YcrLgync2lc/s1600-h/screenshot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_YuwctsIuxOw/SStUPiH6bGI/AAAAAAAAAB0/YcrLgync2lc/s400/screenshot.png" alt="Screenshot showing how to use FireBug to profile your GWT application" id="BLOGGER_PHOTO_ID_5272400414602062946" border="0" /&gt;&lt;/a&gt;
&lt;p&gt;Yet another way to profile your application is to do it manually by setting start / finish timestamps before and after the component you care about profiling, respectively. For example, let's say I wanted to determine the initial load time for the phone book application we developed as an example in the last blog post. I would first set a timestamp in my host HTML page, way up in the &amp;lt;head&amp;gt; of the document to make sure that the timestamp is recorded right when the first resource is picked up.&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;title&amp;gt;Phonebook&amp;lt;/title&amp;gt;
&amp;lt;script language="javascript"&amp;gt;
  window.startTime = new Date().getTime();
&amp;lt;/script&amp;gt;
&amp;lt;iframe src="javascript:''" id="__gwt_historyFrame"
 style="border: 0pt none ; position: absolute; width: 0pt; height: 0pt;"&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Then I would add the finish timestamp right at the end of the onModuleLoad() method, which should allow me to get a good indication of how long it took to load the application from start to finish.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;
public void onModuleLoad() {
...
displayLoadTime();
}

private native void displayLoadTime() /*-{
$wnd.alert("Load time: " + (new Date().getTime() - $wnd.startTime));
}-*/;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;A note about what's being measured here - there are some elements that are not included in this measuring technique that affect load time performance. For example, any external scripts that are required to load your application will not be factored into this measure by default; nor will any references to other external resources such as stylesheets. You can include these resources in your load time measurement by adding the corresponding tag in your module XML file so that they are loaded synchronously. Also, image fetches are not included in this load time measure (although you can use the &lt;a href="http://code.google.com/docreader/#p=google-web-toolkit-doc-1-5&amp;amp;s=google-web-toolkit-doc-1-5&amp;amp;t=DevGuideImageBundleMotivation"&gt;ImageBundle&lt;/a&gt; to gather your images in a single download that you can time individually). What's more, any code that is executed in a &lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwt/user/client/DeferredCommand.html"&gt;DeferredCommand&lt;/a&gt; or an &lt;a href="http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwt/user/client/IncrementalCommand.html"&gt;IncrementalCommand&lt;/a&gt; will not be picked up with this measuring technique.&lt;/p&gt;&lt;p&gt;Also, this measure captures the time it takes to execute code to load and display the widget, but not actually render it on the browser DOM with styles applied. Capturing that kind of measure would require far from trivial browser instrumentation.&lt;/p&gt;&lt;p&gt;That said, this measuring technique is still a good way to profile parts of your application and compare them to other implementations since you can accurately measure the time it takes to execute the code responsible for loading your widgets. You could set up the same load time measurement around any other widget creation method that you want to evaluate for on-demand loading. If you feel that setting up alerts to display the load time measurements is a little silly, you may want to take a look at Fred Sauer's &lt;a href="http://code.google.com/p/gwt-log/"&gt;gwt-log&lt;/a&gt; project, which allows you to log timestamps among other things while developing your GWT application.&lt;/p&gt;&lt;p&gt;Another note about manual timer measurements - there is a slight difference in timer resolution depending in which browser you're running the code above. However, the delta between browsers is usually less than 15ms, and not a humanly noticeable delay. Therefore this difference should be negligible as you collect data points to plan out your on-demand widget creation strategy.&lt;/p&gt;&lt;p&gt;Another thing to keep in mind is that aside from timer resolution differences, browsers do have different load times in general, so it's important to profile your application for each major browser you intend on supporting for your users.&lt;/p&gt;&lt;p&gt;Aside from the profiling techniques described above, there is always the old fashioned way of doing things - just trying it out and seeing how it feels. When something feels sluggish, chances are that it is and needs to be fixed. If you want to drill down to numbers, typically a delay greater than 0.8 seconds in load time is perceived by the user as a full second delay, and starts to qualify an application as sluggish.&lt;/p&gt;
&lt;h3&gt;&lt;span style="font-size:100%;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 102, 255);"&gt;&lt;span class="Apple-style-span"  style="font-family:'georgia';"&gt;Profile and proceed&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Hopefully this post gave you some guidance on how to go about collecting data points about your application in order to plan strategies and fixes to improve performance. While some of the profiling techniques listed above should go a long way, the state of profiling tools around Ajax is still evolving and will take some time before becoming the rich environment developers may remember from days of old (desktop development).&lt;/p&gt;&lt;p&gt;A good place to get more tips about profiling and performance tune up techniques is on our very own &lt;a href="http://groups.google.com/group/Google-Web-Toolkit"&gt;GWT developer forum&lt;/a&gt;. We have tons of developers posting up there who have developed their own tricks to profile their GWT applications and improve performance, and they'd be happy to share their insights if you're looking for more ways to improve your own applications.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28098389-5624963857046226588?l=googlewebtoolkit.blogspot.com'/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=Yqy5wgbT"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/blogspot/NWLT?a=7UUs2Flg"&gt;&lt;img src="http://feeds.feedburner.com/~f/blogspot/NWLT?i=7UUs2Flg" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/NWLT/~4/v58IsMgYGDI" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/5624963857046226588?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/28098389/posts/default/5624963857046226588?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/NWLT/~3/v58IsMgYGDI/profiling-gwt-application-performance.html" title="Profiling GWT application performance" /><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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_YuwctsIuxOw/SStUPiH6bGI/AAAAAAAAAB0/YcrLgync2lc/s72-c/screenshot.png" height="72" width="72" /><feedburner:origLink>http://googlewebtoolkit.blogspot.com/2008/11/profiling-gwt-application-performance.html</feedburner:origLink></entry></feed>
