tag:blogger.com,1999:blog-206331702024-03-07T08:58:04.151+00:00Graeme Rocher's BlogThought's about software, Grails, Java, web development and anything else that comes to mind.Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.comBlogger153125tag:blogger.com,1999:blog-20633170.post-35278092336598110522012-01-05T09:04:00.001+00:002012-01-05T09:04:37.469+00:00MovedThis blog has <a href="http://graemerocher.tumblr.com">moved home to Tumblr</a>.Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com0tag:blogger.com,1999:blog-20633170.post-18667817824805438292011-12-15T16:56:00.001+00:002011-12-15T16:58:21.582+00:00Grails 2.0 Released!Long time no post, but after lots of hard work from the Grails core team we are pleased to announce <a href="http://grails.org/2.0.0+Release+Notes">the Grails 2.0 release</a>.<div><br /></div><div>I have posted a <a href="http://blog.springsource.org/2011/12/15/grails-2-0-released/">comprehensive announcement</a> on the SpringSource blog.</div><div><br /></div><div>Enjoy!</div>Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com0tag:blogger.com,1999:blog-20633170.post-6029965403464445372011-04-13T09:07:00.003+01:002011-04-13T10:34:49.554+01:00Grails on Cloud FoundryFor those of you who missed it, yesterday we launched the new <a href="http://www.cloudfoundry.com/">Cloud<br />Foundry</a> which we hope will become the premier deployment model for<br /><a href="http://grails.org/">Grails</a> (and Spring, Ruby, Node.js etc.) applications in the the<br />future. If you missed the presentation checkout the <a href="http://www.youtube.com/user/cloudfoundry">YouTube recording</a>.<br /><br />It represents the culmination of a huge amount of work within <a href="http://www.vmware.com/">VMware</a> and we're super excited about the potential it has to completely revolutionize deployment models for Grails applications in the future.<br /><br />Here are some further resources specific to Grails users:<br /><br />Website: <a href="http://www.cloudfoundry.com/" target="_blank">http://www.cloudfoundry.com/</a><br />Wiki & Sample applications: <a href="https://github.com/SpringSource/cloudfoundry-samples/wiki/Grails" target="_blank">https://github.com/SpringSource/cloudfoundry-samples/wiki/Grails</a><div><a href="https://github.com/SpringSource/cloudfoundry-samples/wiki/Grails" target="_blank"></a>Tutorial: <a href="http://blog.springsource.com/2011/04/12/one-step-deployment-with-grails-and-cloud-foundry/">http://blog.springsource.com/2011/04/12/one-step-deployment-with-grails-and-cloud-foundry/</a><br />Plugin Documentation: <a href="http://blog.springsource.com/2011/04/12/one-step-deployment-with-grails-and-cloud-foundry/" target="_blank>http://blog.springsource.com/<wbr>2011/04/12/one-step-deployment-with-grails-and-cloud-foundry/</a><br>Plugin Docs: <a href=" com="" foundry="" docs="" manual="">http://grails-plugins.github.<wbr>com/grails-cloud-foundry/docs/<wbr>manual/index.html</a><br /><br />Signups are currently on a first come first serve basis under a limited beta programme.</div>Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com0tag:blogger.com,1999:blog-20633170.post-5654295475424641382010-04-16T13:41:00.006+01:002010-04-16T14:18:15.017+01:00Reading i18n messages from the database with GrailsIn a recent consulting engagement, a client wanted to know how to go about reading i18n messages from the database rather than static properties files (the default in Grails). Considering how easy this is to do I was surprised when I Googled it that there was no information on how this is achieved.<div><br /></div><div>Anyway it's dead simple. Just create a domain class that models a message:</div><div><br /></div><div><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span style="color:#ae398a;">class</span> Message {</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>String <span style="color:#0000c9;">code</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>Locale <span style="color:#0000c9;">locale</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>String <span style="color:#0000c9;">text</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; min-height: 19.0px">}</p></div><div><br /></div><div>Then implement a class that extends the org.springframework.context.support.AbstractMessageSource class. In the example below I am using simple GORM finders to lookup a message using the code and locale</div><div><br /></div><div><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span style="color:#ae398a;">class</span> DatabaseMessageSource <span style="color:#ae398a;">extends</span> AbstractMessageSource {</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; min-height: 19.0px"><br /></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span><span style="color:#ae398a;">protected</span> MessageFormat resolveCode(String code, Locale locale) {<span class="Apple-tab-span" style="white-space:pre"> </span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>Message msg = Message.<span style="text-decoration: underline">findByCodeAndLocale</span>(code, locale)</p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space: pre; "> </span>def format</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span><span style="color:#ae398a;">if</span>(msg) {</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>format = <span style="color:#ae398a;">new</span> MessageFormat(msg.<span style="text-decoration: underline">text</span>, msg.<span style="text-decoration: underline">locale</span>)</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>}</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span><span style="color:#ae398a;">else</span> {</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>format = <span style="color:#ae398a;">new</span> MessageFormat(code, locale )<span class="Apple-tab-span" style="white-space:pre"> </span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>}</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span><span style="color:#ae398a;">return</span> format;</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>}</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco">}</p><div><span class="Apple-style-span" style="font-family:Monaco, serif;font-size:130%;"><span class="Apple-style-span" style="font-size:14px;"><br /></span></span></div></div><div>Then wire it in using Spring by configuring a "messageSource" bean in the grails-app/conf/spring/resources.groovy file:</div><div><br /></div><div><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco">beans = {</p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space: pre; "> </span><span style="text-decoration: underline">messageSource</span>(DatabaseMessageSource) </p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco">}</p></div><div><br /></div><div>And that's it. Now you're serving messages from the database. Of course this is a terrible inefficient implementation since we're hitting the database for ever message code used in the application. However, it's pretty easy to introduce caching. Just create a cache key:</div><div><br /></div><div><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color:#777777;"><span style="color:#000000;">@</span>Immutable</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span style="color:#ae398a;">class</span> MessageKey <span style="color:#ae398a;">implements</span> Serializable {</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>String <span style="color:#0000c9;">code</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>Locale <span style="color:#0000c9;">locale</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco">}</p></div><div><br /></div><div>Then configure an appropriate cache bean (I'm using Ehcache) in Spring and wire it into your MessageSource:</div><div><br /></div><div><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco">beans = {</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"> <span style="text-decoration: underline">messageCache</span>(EhCacheFactoryBean) {</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>timeToLive = 500</p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space: pre; "> </span>// other cache properties</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"> }</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"> <span style="text-decoration: underline">messageSource</span>(DatabaseMessageSource) {</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>messageCache = <span style="text-decoration: underline">messageCache</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"> }<span class="Apple-tab-span" style="white-space:pre"> </span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco">}</p></div><div><br /></div><div>Finally, update your implementation to use caching:</div><div><br /></div><div><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span style="color:#ae398a;">class</span> DatabaseMessageSource <span style="color:#ae398a;">extends</span> AbstractMessageSource {</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; min-height: 19.0px"><br /></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color:#0000c9;"><span style="color:#000000;"><span class="Apple-tab-span" style="white-space:pre"> </span>Ehcache </span>messageCache</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; min-height: 19.0px"><span class="Apple-tab-span" style="white-space:pre"> </span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>@Override</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span><span style="color:#ae398a;">protected</span> MessageFormat resolveCode(String code, Locale locale) {<span class="Apple-tab-span" style="white-space:pre"> </span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span><span style="color:#ae398a;">def</span> key = <span style="color:#ae398a;">new</span> MessageKey(code,locale)</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span><span style="color:#ae398a;">def</span> format = messageCache.<span style="color:#66d4fe;">get</span>(key)?.value</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span><span style="color:#ae398a;">if</span>(!format) {</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>Message msg = Message.<span style="text-decoration: underline">findByCodeAndLocale</span>(code, locale)<span class="Apple-tab-span" style="white-space:pre"> </span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span><span style="color:#ae398a;">if</span>(msg) {</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>format = <span style="color:#ae398a;">new</span> MessageFormat(msg.<span style="text-decoration: underline">text</span>, msg.<span style="text-decoration: underline">locale</span>)</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>}</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span><span style="color:#ae398a;">else</span> {</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>format = <span style="color:#ae398a;">new</span> MessageFormat(code, locale)<span class="Apple-tab-span" style="white-space:pre"> </span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>}</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>messageCache.put <span style="color:#ae398a;">new</span> Element(key, format)</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span><span style="color:#ae398a;">return</span> format</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; min-height: 19.0px"><span class="Apple-tab-span" style="white-space:pre"> </span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>}<span class="Apple-tab-span" style="white-space:pre"> </span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span><span style="color:#ae398a;">return</span> format;</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"><span class="Apple-tab-span" style="white-space:pre"> </span>}</p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco">}</p><div><span class="Apple-style-span" style="font-family:Monaco, serif;font-size:130%;"><span class="Apple-style-span" style="font-size:14px;"><br /></span></span></div></div><div><br /></div><div><br /></div>Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com5tag:blogger.com,1999:blog-20633170.post-23587750512113654892009-09-17T20:23:00.004+01:002009-09-17T21:28:53.190+01:00Grails - dependency resolution done rightOver the past couple of weeks I have been working on improving <a href="http://grails.org/">Grails</a> dependency resolution capabilities for both applications and <a href="http://grails.org/plugin/home">plugins</a>. In previous versions of Grails (1.1 and below) you had limited options when it came to dependency resolution.<br /><br />You could use the <a href="http://grails.org/Maven+Integration">Grails Maven plugin,</a> but that forced you to use, heavin forbid, Maven. We also shipped with basic Ant + Ivy support, but it was only really designed to be used for automation with continuous integration servers that support Ant and not at development time.<br /><br />With Grails 1.2 this all changes with the introduction of Grails' <a href="http://hudson.grails.org/job/grails_core/ws/grails-doc/output/guide/3.%20Configuration.html#3.7%20Dependency%20Resolution">dependency resolution DSL</a>, which you can use to define your dependencies. Built on Ivy we have now eliminated one of the last remnants of XML usage in the Grails framework:<br /><pre> dependencies {<br /> runtime 'com.mysql:mysql-connector-java:5.1.5'<br /> test 'junit:junit:3.8.2'<br /> }</pre>Grails takes application defined dependencies (defined in grails-app/conf/BuildConfig.groovy) and merges them with dependencies defined in the framework or any installed plugins. If there are conflicts you can exclude dependencies inherited from the framework or you can override plugin dependencies.<br /><br />By default Grails will only resolve dependencies against your Grails installation but you can enable remote repository resolution easily:<br /><pre>repositories {<br /> mavenCentral()<br />mavenRepo <span class="java-quote">"http://repository.codehaus.org"</span><br />}</pre>If you're addicted to your pom.xml file then we have even added the ability to read dependencies from the pom.xml instead of using the DSL. All in all, Grails 1.2 will give you significantly better control over dependencies and how they are resolved.<br /><br />We're still on track to release Grails 1.2 by the end of the month, but if you want to hear more about it I'll be talking about Grails 1.2 at upcoming events such as <a href="http://jaoo.dk/aarhus-2009/">JAOO</a> (Denmark), <a href="http://www.springone2gx.com/">SpringOne2GX</a> (New Orleans, USA) and the <a href="http://www.grails-exchange.com/">Grails eXchange</a> (London). See you there!Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com1tag:blogger.com,1999:blog-20633170.post-3934158961978715832009-05-21T12:41:00.002+01:002009-05-21T13:06:12.297+01:00Grails 1.1.1, Gr8conf, AppEngine and other happeningsJust got back from <a href="http://gr8conf.org">Gr8conf</a> and really had a blast. It was a nice small group of 90-100 which meant you could really have a lot of one on one time with many of the attendees who had questions. The sessions were also not too short. Having that extra bit of time to elaborate on things makes a real different compared to the 45 minute rush you have at JavaOne et al.<br /><br />All in all it felt more like a <a href="http://www.nofluffjuststuff.com">No Fluff</a> event, which can only be described as a good thing. Right before the conference we released <a href="http://grails.org/1.1.1+Release+Notes">Grails 1.1.1</a> which is mainly a bug fix release, but the exciting part is the new <a href="http://grails.org/plugin/app-engine">Google AppEngine plugin</a> which works with Grails 1.1.1<br /><br />The plugin takes the heavy lifting out of configuring a Grails application for usage on <a href="http://appengine.google.com">AppEngine</a> by automatically configuring the AppEngine development environment and a JDO persistence layer (JPA is coming too soon). You get reloading out of the box too, so Grails + AppEngine is really the most productive environment for developing JVM applications for AppEngine.<br /><br />One missing feature from the AppEngine support right now is GORM (you have to use the raw JDO APIs). However, we are<a href="https://svn.codehaus.org/grails-plugins/grails-gorm-jpa/trunk/test/integration/org/grails/jpa/BasicPersistenceMethodsTests.groovy"> hard at work</a> developing GORM-JPA (and potentially GORM-JDO) which will bring most of the features of GORM on top of standard JPA.<br /><br />GORM-JPA is not the only exciting thing happening right now in the Grails plugin front. We are working with Adobe on integrating Flex and BlazeDS closely with Spring. The results of that can be seen in the recent <a href="http://www.springsource.org/node/1476">Spring/BlazeDS integration 1.0 Rc2 release</a>. The next phase is to build on top of that for the Grails plugin which is on my todo list to complete soon. Exciting times.<br /><br />The plugin community itself continues to flourish, checkout these:<br /><ul><li> It is now finally possible to write Grails applications for different Portals such as <a href="http://grails.org/plugin/portlets-liferay">Liferay</a> and <a href="http://grails.org/plugin/portlets-pluto">Pluto</a> thanks to the <a href="http://grails.org/plugin/portlets">Portlets plugins</a>.<br /></li><li>There is an excellent new plugin that embeds an <a href="http://grails.org/plugin/ldap-server">LDAP server</a> into Grails for easily testing LDAP</li><li>The<a href="http://grails.org/plugin/flex-scaffold"> Flex Scaffold plugin</a> let's you generated complete CRUD applications using Grails and Adobe Flex</li><li>The <a href="http://grails.org/plugin/build-test-data">Build Test Data</a> plugin let's you quickly create dummy test data</li><li>Using the <a href="http://grails.org/plugin/springws">Spring WS plugin</a> writing SOAP web services, feels more like writing REST service. Easy and painless.</li></ul>These are just a few isolated mentions, there is activity going on<a href="http://svn.grails-plugins.codehaus.org/"> all the time</a> on the plugin space.Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com0tag:blogger.com,1999:blog-20633170.post-31750997192801284392009-03-10T17:23:00.002+00:002009-03-10T17:32:01.736+00:00Grails 1.1 ReleasedYes! <a href="http://grails.org">Grails</a> 1.1 is out and <a href="http://grails.org/Download">available for download</a>. Checkout my <a href="http://blog.springsource.com/2009/03/10/grails-11-released/">blog post on the SpringSource team</a> blog for a more detailed overview of the highlights. It is a strange feeling after a release goes out, like a mixture of relief, happiness and that "ok what now" feeling. Maybe I take software too seriously :-|<br /><br />Nice to see how Twitter is abuzz <a href="http://search.twitter.com/search?q=grails+1.1">with the news </a>(note live results, link will change overtime) right now. Other than that we are now planning the launch of the Grails.org plugin portal. To support that I have been writing a few plugins for Grails. It is niceto actually write Grails apps/plugins rather than work on the internals all the time.<br /><br />Anyway the result is 2 new plugins called <a href="http://www.grails.org/Commentable+Plugin">Commentable</a> and <a href="http://www.grails.org/Taggable+Plugin">Taggable</a> that allow you to generically tag and comment on domain instances. I also have a new blog plugin in the works which will power the new Grails.org blog when that is ready. Actually its already available, but I need to document it better, and I'll save that for another post.<br /><br />As for beyond Grails 1.1, we are now at the planning phase, but there are loads of things we are considering from OSGi to JCR to Cloud computing. Exciting times.Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com14tag:blogger.com,1999:blog-20633170.post-48973707553650321832009-02-11T10:57:00.002+00:002009-02-11T11:01:04.201+00:00Grails at the London Java WUGI'll be doing a talk at the London Java Web User Group on <a href="http://skillsmatter.com/event/java-jee/building-twitter-with-grails-in-40-minutes-2-by-popular-demand">Building Twitter with Grails in 40 Minutes</a> on Monday the 16th of February. If you want to come a long you need to register ASAP, the last talk I did we had to turn away people as we could only fit 70 in the room.<br /><br />See you there!Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com4tag:blogger.com,1999:blog-20633170.post-75052316669746295072009-02-11T09:46:00.002+00:002009-02-11T09:59:29.173+00:00Grails Happenings: 1.1, Wired, Book etc.Regular readers, I must apologize for the relative lack of updates compared to 2008, but it seems I have caught the Twitter bug, where you can get <a href="http://twitter.com/graemerocher">more frequent ramblings</a> of my activities.<br /><br />Nevertheless, we are progressing well with <a href="http://grails.org">Grails</a> 1.1 which should be out this month. Loads of <a href="http://www.grails.org/1.1-RC1+Release+Notes">exciting stuff</a> is on the way and I am really happy with what we have achieved. The Groovy 1.6 + Grails 1.1 combination is going to be a great one.<br /><br />In other news we (<a href="http://www.springsource.com">SpringSource</a>) have done a <a href="http://www.springsource.com/customer/casestudies">case study</a> with <a href="http://www.wired.com">Wired.com</a> about their usage of Grails. We hope to put out more case studies and white papers in the future about Grails for those looking to convince their managers that Grails is the way to go. You can download the case study <a href="http://www.springsource.com/files/Wired.com%20Case%20study._0.pdf">here</a>.<br /><br />In other news InfoQ has a nice <a href="http://www.infoq.com/news/2009/02/dynamicjasper">article up about Grails and Dynamic Jasper</a>. For thsoe of you who don't know, InfoQ are also the organizers of <a href="http://www.qconlondon.com">QCon</a>, which I will be <a href="http://qconlondon.com/london-2009/schedule/thursday.jsp">speaking at</a> in March. I'll also be doing a half day Groovy/Grails workshop at the <a href="http://java.sun.com/javaone/2009/javauniversity.jsp">JavaOne University</a> this year if you're looking for a more comprehensive engagement.<br /><br />Finally, <a href="http://javajeff.blogspot.com/">Jeff</a> and I completed <a href="http://apress.com/book/view/1590599950">The Definitive Guide to Grails, Second Edition</a> which is a complete re-write (and a heftier one at that) of the original book with up-t0-date information covering Grails 1.0 and many of the features of Grails 1.1.Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com6tag:blogger.com,1999:blog-20633170.post-59546621905459269922008-12-23T13:50:00.003+00:002008-12-23T14:06:34.236+00:00Grails & Maven Kiss and Make-up with Grails 1.1 Beta 2So <a href="http://grails.org">Grails</a> 1.1 Beta 2 is out. Rejoice! There are many new features that are detailed in the r<a href="http://grails.org/1.1-Beta2+Release+Notes">elease notes</a>. However, one of the main ones in this beta is the new support for <a href="http://maven.apache.org">Maven</a>.<br /><br />Regular readers of my blog will probably be aware of my <a href="http://graemerocher.blogspot.com/2008/01/why-grails-doesnt-use-maven.html">long</a> <a href="http://graemerocher.blogspot.com/2006/09/vote-to-stop-maven-infesting-spring.html">history</a> as one who, ahem, is not particularily fond of Maven. Granted I am <span style="font-weight: bold;">still</span> not particularily fond of Maven, but it is the Christmas period and in the spirit of "why can't we all just get a long" I am proud to say that Grails <a href="http://grails.org/Maven+Integration">integrates nicely with Maven</a> now :-)<br /><br />Peter Ledbrook, core Grails committers, has been tirelessly working away at making the Grails + Maven experience a seamless one. I personally even went as far as installing Maven 2 onto my machine, which was a huge jump for me I can tell you, and I can tell you Peter's done a great job!<br /><br />As ever we encourage Maven users to give the Maven integration a go and report any issues that you may have with it in <a href="http://jira.codehaus.org/browse/GRAILS?report=com.atlassian.jira.plugin.system.project:roadmap-panel">JIRA</a>. Enjoy!Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com15tag:blogger.com,1999:blog-20633170.post-70959188312209392192008-12-09T23:31:00.003+00:002008-12-10T14:40:04.931+00:00Grails + Spring IntegrationRegular readers will recall I mentioned in my announcement of the <a href="http://graemerocher.blogspot.com/2008/11/groovy-and-grails-join-spring-family.html">SpringSource acquisition of G2One</a> that the potential to integrate <a href="http://grails.org/">Grails</a> with more Spring portfolio products is huge. Well, SpringSource colleague Russ Miles has taken <a href="http://www.russmiles.com/home/2008/12/9/spring-integration-in-grails-part-1.html">the first steps</a> in integrating Grails with <a href="http://www.springsource.org/spring-integration">Spring Integration 1.0</a>.<br /><br />For those of you who don't know, Spring Integration is a lightweight way to do message passing through endpoints in a similar way to some of the big ESBs. The article is a precursor to even more exciting stuff involving Spring Integration being made available as a Grails plugin. Watch this space.Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com2tag:blogger.com,1999:blog-20633170.post-90518792384076611882008-11-25T17:06:00.002+00:002008-11-25T17:08:42.526+00:00Interview with me on Grails PodcastThose crazy guys over at the <a href="http://www.grailspodcast.com/">Grails podcast</a> interviewed me about various things ranging from being part of <a href="http://www.springsource.com/">SpringSource</a> to the upcoming <a href="http://grails.org/">Grails</a> 1.1 release to my deep hatred of all things Maven. <a href="http://www.grailspodcast.com/blog/id/109">Check it out</a>.Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com0tag:blogger.com,1999:blog-20633170.post-42390478978725441422008-11-11T09:12:00.004+00:002008-11-11T09:30:23.864+00:00Groovy and Grails join the Spring familyYou may have already read about it in the various news outlets and blogs covering the announcement, but if you haven’t I’m excited to spread the word that <a href="http://www.g2one.com/">G2One</a> - The Groovy/Grails company - has been acquired by <a href="http://www.springsource.com/">SpringSource</a>. The result is that <a href="http://groovy.codehaus.org/">Groovy</a> and <a href="http://grails.org/">Grails</a> join the growing number of excellent Open Source projects delivered by SpringSource.<br /><br />The Spring Framework really pioneered simplified development on the Java platform. A philosophy that is the very essence of Grails. Both frameworks aggressively try to makes the lives of developers easier. The Spring Framework provides an abstraction layer of common Java enterprise APIs, whilst Grails uses the Groovy dynamic language to further simplify Spring and Java. In this sense Grails fits perfectly into SpringSource’s philosophy.<br /><br />On the Grails front this is great news at multiple levels. With Grails already being based on Spring, users of Grails now have access to expertise about not only Grails, but also Spring, the framework that underpins all of Grails. Grails will benefit further from tighter integration with the Spring Framework with exciting integration possibilities on the horizon between Grails and great Spring portfolio products like Spring Batch, Spring Integration and SpringSource dm Server.<br /><br />Grails will benefit from greater visibility and wider adoption simply by being under the SpringSource umbrella. In addition, SpringSource will bring all their expertise around Eclipse plugin development ensuring that users of Groovy and Grails have a first class experience in the Eclipse IDE.<br /><br />At SpringSource, there is a lot of excitement about Groovy and Grails. Grails adds that little bit of Web 2.0 spice to the company and provides yet another avenue for users to adopt the Spring Framework. We’re literally buzzing with ideas on how Spring, Groovy and Grails can be integrated in the future and look forward to the feedback of the respective communities.<br /><br />I personally will continue to lead Grails at SpringSource, whilst Guillaume remains the project lead of Groovy. The majority of the former G2One team have taken up positions at SpringSource. On the topic of Guillaume, he is as excited about this development as I am and has a great post on the benefits of the acquisition to Groovy. Check it out!<br /><br /><span style="font-weight: bold;">Resources:</span><br /><ul><li><a href="http://www.springsource.com/g2one">SpringSource/G2One Acquisition Announcement</a><br /></li><li><a href="http://glaforge.free.fr/weblog/index.php?itemid=259">Guillaume LaForge’s Blog</a><br /></li><li><a href="http://blog.springsource.com/2008/11/11/more-weapons-for-the-war-on-complexity-springsource-acquires-groovygrails-leader/">Rod Johnson's Blog </a><br /></li></ul>Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com43tag:blogger.com,1999:blog-20633170.post-89512908897193452232008-11-03T14:10:00.001+00:002008-11-03T14:15:21.840+00:00Couple of nice Grails UI articles<a href="http://weblog.dangertree.net/">Matt Taylor</a> has posted a couple of <a href="http://weblog.dangertree.net/2008/11/02/using-grailsui-datatable-tag/">nice</a> <a href="http://weblog.dangertree.net/2008/11/02/adding-row-expansion-to-the-grailsui-datatable/">articles</a> demonstrating how to use <a href="http://grails.org/GrailsUI+Plugin">GrailsUI</a>'s dataTable component. Cool stuff.Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com0tag:blogger.com,1999:blog-20633170.post-64185311398623642832008-11-01T11:25:00.002+00:002008-11-01T11:29:46.455+00:00GrailsUI 1.0 ReleasedOver the past few months we've had a lot of demand from different clients for a UI component library for <a href="http://grails.org">Grails</a>, built and supported by <a href="http://www.g2one.com">G2One</a>. Thanks to a great collaborative effort, <a href="http://grails.org/GrailsUI+Plugin">GrailsUI 1.0</a> is now available built on the excellent Yahoo UI library.<br /><br />Matthew Taylor, G2One Software Engineer and the lead of the GrailsUI project, has <a href="http://weblog.dangertree.net/2008/10/31/grailsui-10-released/">the lowdown</a> on what is on offer. Check it out!Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com2tag:blogger.com,1999:blog-20633170.post-54881964065317073452008-10-31T08:48:00.011+00:002008-10-31T09:39:40.451+00:00New GORM Features Coming in 1.1Now that <a href="http://www.amazon.com/Definitive-Guide-Grails-Second/dp/1590599950">The Definitive Guide to Grails 2nd Edition</a> (barring a few reviews) is a wrap, I've been refocusing in <a href="http://grails.org">Grails</a> development. First up, is GORM and we've implemented a number of great improvements including:<br /><span style="font-size:130%;"><br /></span><span style="font-weight: bold;"><span style="font-size:100%;">Better GORM events</span><br /><br /></span>Previously, GORM supported beforeInsert, beforeUpdate and beforeDelete events, now there is afterInsert, afterUpdate and afterDelete to complete the picture<br /><br /><span style="font-weight: bold;font-size:100%;" >Persistence of Collections of Basic Types</span><br /><br />GORM now supports <a href="http://jira.codehaus.org/browse/GRAILS-1023">persisting basic types</a> like String, Integer and so on using a join table:<br /><pre><code>class Person {<br /> static hasMany = [nicknames:String]<br />}</code></pre><span style="font-size:100%;"><span style="font-weight: bold;">Improvements to Data Binding</span></span><br /><br />It is now simpler to bind data to a subset of properties. Previously you could use the syntax:<br /><pre><code>person.properties = params</code></pre>Which would bind all the incoming request parameters to the person. If you didn't want that behavior you could use the <a href="http://grails.org/doc/1.0.x/ref/Controllers/bindData.html">bindData</a> method. Now you can bind to a subset of properties using the subscript operator:<br /><pre><code>person.properties["firstName","lastName"] = params</code></pre>And access a subset of the domain classes properties using the same syntax:<br /><pre><code>person.properties["firstName","lastName"].each { println it }</code></pre><span style="font-size:100%;"><span style="font-weight: bold;">Read-Only Access to Objects</span></span><br /><br />Persistent instances can now be loaded in a read-only state using the read method:<br /><pre><code>def book = Book.read(1)</code></pre><span style="font-size:100%;"><span style="font-weight: bold;">Default Sort Order</span></span><br /><br />Associations can now be sorted using a default sort order declared at the class level:<br /><pre><code>class Book {<br />String title<br />static mapping = {<br /> sort "title"<br />}<br />}<code></code></code></pre>Or at the association level:<br /><pre><code>class Author {<br /> static hasMany = [books:Book]<br /> static mapping = {<br /> books sort:"title"<br /> }<br />}</code></pre><span style="font-weight: bold;font-size:100%;" >Batch Fetching</span><br /><br />GORM now supports configuring batch fetching (an optimization of lazy loading) using the ORM DSL at the class level:<br /><pre><code>class Book {<br />String title<br />static mapping = {<br /> batchSize 15<br />}<br />}</code></pre>Or at the association level:<br /><pre><code>class Author {<br /> static hasMany = [books:Book]<br /> static mapping = {<br /> books batchSize:15<br /> }<br />}</code></pre><span style="font-weight: bold;font-size:100%;" >Improvements to Dynamic Finders</span><br /><br />There is a new InList suffix that can be used with dynamic finders:<br /><pre><code>def groovyBooks = Book.findByAuthorInList(['Dierk Koenig', 'Graeme Rocher'])</code></pre>Dynamic finders can also now use the query cache:<br /><pre><code>def books = Book.findByTitle("Groovy in Action", [cache:true] )</code></pre>And upgrade to a pessimistic lock:<br /><pre><code>def books = Book.findByTitle("Groovy in Action", [lock:true] )</code></pre><span style="font-size:100%;"><span style="font-weight: bold;">Legacy Mapping for Many-to-Many and Unidirectional One-to-manys</span></span><br /><br />Many-to-many and Unidirectional One-to-many associations can use the joinTable argument to alter the way they map to the underlying database:<br /><pre><code>class Book {<br /> String title<br /> static belongsTo = Author<br /> static hasMany = [authors:Author]<br /><br /> static mapping = {<br /> authors joinTable:[name:"mm_author_books", key:'mm_book_id' ]<br /> }<br />}<br />class Author {<br /> String name<br /> static hasMany = [books:Book]<br /> static mapping = {<br /> books joinTable:[name:"mm_author_books", key:'mm_author_id']<br /> }<br />}<br /><br /></code></pre>Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com19tag:blogger.com,1999:blog-20633170.post-58514973161299572692008-10-02T09:39:00.005+01:002008-10-07T14:22:03.457+01:00Sky.com relaunches written in GrailsThe main portal for <a href="http://www.sky.com/">Sky television</a> has relaunched written in <a href="http://grails.org/">Grails</a>. Sky, also known as British Sky Broadcasting or <span class="blsp-spelling-error" id="SPELLING_ERROR_0">BSkyB</span>, employs 17000 people in the UK and operates the largest <span class="blsp-spelling-corrected" id="SPELLING_ERROR_1">satellite</span> network in the UK.<br /><br />The site receives a million+ hits per day and joins all the other <span class="blsp-spelling-error" id="SPELLING_ERROR_2">subsites</span> also written in Grails:<br /><ul><li><a href="http://movies.sky.com/">Sky Movies</a></li><li><a href="http://tv.sky.com/">Sky TV</a></li><li><a href="http://sky1.sky.com/">Sky1 Channel Site</a></li><li><a href="http://showbiz.sky.com/">Sky Showbiz</a></li></ul>Congrats to the Sky team!<br /><br /><span style="font-weight: bold;">Update 07/10: </span>Couple of new things have arison since this was posted. Firstly, Sky actually employ 17000 people not 11000. Seems the Google sample data I obtained was out of date.<br /><br />Also Glenn Saqui has a nice write-up on the architecture of Sky.com on <a href="http://www.anyware.co.uk/2005/2008/10/03/sky-tv-sites-now-all-built-with-grails/">Marc's Blog</a>. Altogether the 4 subsites listed above receive over 110 million hits per month and run on a cluster of web layer machines and 2 db machines. Checkout the aforementioned link for more info.Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com8tag:blogger.com,1999:blog-20633170.post-29394455875474164382008-09-02T09:34:00.002+01:002008-09-02T09:41:23.362+01:00Terracotta meets Grails with the Terracotta for Grails plugin<a href="http://grails.org">Our</a> busy community of plugin developers have been at it again and now there is a brand new <a href="http://grails.org/Terracotta+Plugin">plugin for Grails</a> that adds support for the <a href="http://www.terracotta.org/">Terracotta</a> data grid. It was always possible to do this with a bit of <a href="http://mike.brevoort.com/2008/01/29/terracotta-1-grails-searchable-pluginme-1/">manual configuration</a>, but now the plugin automates things nicely using a few new Grails command line scripts.<br /><br />This is one of the really great things about Grails and Groovy, because Groovy classes are just standard Java classes it is possible to integrate Groovy or Grails applications with any existing Java infrastructure, including data grids like Terracotta and Coherence. Awesome stuff.Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com0tag:blogger.com,1999:blog-20633170.post-60768209652643728722008-09-01T10:31:00.003+01:002008-09-01T10:50:00.766+01:00Groovy/Grails Community goes wild launches two sitesWow, the <a href="http://groovy.codehaus.org">Groovy</a>/<a href="http://grails.org">Grails</a> community is really getting it together. First we had the launch of <a href="http://www.grailscrowd.com/">grailscrowd.com</a>, which is a social networking site for Groovy/Grails people to connect with other Groovy/Grails people. The site is built on Grails and its only been up for a few days but aldready over 600 people registered. If you haven't done so do so! The source code for GrailsCrowd is also availabe <a href="http://github.com/dima767/grails-crowd/tree/master">at Github</a><br /><br />Not to be outdown, however, <a href="http://blogs.bytecode.com.au/glen/2008/08/31/groovyawards-org-launches.html">Glen Smith has launched </a>the <a href="http://www.groovyawards.org">Groovy Awards</a> ! A site dedicated to nominating the best contributors and to the Groovy / Grails community. Awards up for grabs include Groovy / Grails t-shirts and other goodies. Check it out.<br /><br />On my front, I know I have been rather inactive posting. Books are really all consuming beasts. I have given a go to <a href="http://twitter.com/graemerocher">twittering</a> now and again about what I'm writing about, although I'm still not sure I "get" twitter.Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com5tag:blogger.com,1999:blog-20633170.post-66174381558149652232008-07-28T17:03:00.002+01:002008-07-28T17:05:26.781+01:00London Groovy/Grails User Group Meeting - 31st July 2008I'll be giving a talk on the state of <a href="http://grails.org">Grails</a> at the London Groovy+Grails user group meeting on the 31st of July. <a href="http://www.skillsmatter.com">Skills Matter</a> are hosting it as usual, be sure to <a href="http://skillsmatter.com/event/java-jee/ggug-meeting">sign-up here</a>.Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com4tag:blogger.com,1999:blog-20633170.post-61749128654316290882008-07-14T15:44:00.002+01:002008-07-14T15:50:36.501+01:00Groovy/Grails Training in North AmericaApologies for not posting as frequently recently, I've been hard at work on the second edition of "The Definitive Guide to Grails" and also working on feature development for <a href="http://grails.org">Grails</a> 1.1 (we now have JSP tag library support in GSP and massive improvements to the plug-in system).<br /><br />Nevertheless, on to the topic of this post, we (<a href="http://www.g2one.com">G2One In</a><a href="http://www.g2one.com">c</a> - The Groovy/Grails company) have launched our public <a href="http://www.g2one.com/training/">Groovy & Grails training programme</a> in the US. Announcing this exciting news is <a href="http://javajeff.blogspot.com/2008/07/g2one-groovy-grails-training-in-north.html">Jeff Brown</a>, our main guy in the US, who has this to say:<br /><br />"Our training events are a fantastic experience. G2One are the folks who lead and sustain the development of both Groovy and Grails. No one understands the technology better than the people who build it. G2One training events give developers an opportunity to spend several days with a technology expert covering everything from fundamentals to advanced language and framework features.<br /><br />The sessions include a perfect mix of lecture and reinforcing lab work. That hands on approach is a great way for developers to internalize the details. There is no better way to quickly get a team up and running with the technology."<br /><br />Check it out!Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com2tag:blogger.com,1999:blog-20633170.post-66716492078218654782008-06-16T13:21:00.004+01:002008-06-17T09:10:39.872+01:00Brian Guan on Grails at LinkedInBrian Guan, one of the pioneers of <a href="http://grails.org/">Grails</a> use within <a href="http://www.linkedin.com">LinkedIn</a>, has started a<a href="http://blog.linkedin.com/blog/2008/06/grails-at-linke.html"> blog series</a> about their experiences with Grails. The first post presents the slides the LinkedIn guys presented at the recent <a href="http://www.g2one.com/meetup">Groovy/Grails meetup</a> at JavaOne. It makes for an interested read so check it out!Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com3tag:blogger.com,1999:blog-20633170.post-32488736671827189732008-06-06T14:24:00.002+01:002008-06-06T14:33:37.770+01:00Grails 1.0.3 Released<a href="http://www.g2one.com">We've</a> just released <a href="http://grails.org">Grails 1.0.3</a>, which includes 230 issues resolutions and improvements since the last release. The <a href="http://grails.org/1.0.3+Release+Notes">release notes</a> go through the full details, including outlining some of the new features like enum support and interactive mode.<br /><br />Grails has come a long way, since the release of 1.0 Grails has been downloaded over 186000 times averaging out to around 50000 times per month. That puts it on par or not far behind some of the biggest open source projects like Spring, Hibernate and Struts in terms of downloads.<br /><br />The most exciting thing for me though is the plug-in community with over <a href="http://plugins.grails.org">70 plug-ins</a> in the repository some of the new ones include <a href="http://www.grails.org/Apache+Axis2+Plugin">Axis 2 support</a>, <a href="http://www.grails.org/J2D+Plugin">Java2D with GraphicsBuilder</a> and <a href="http://www.grails.org/Profiler+Plugin">profiling</a> (contributed by one of the biggest Grails users <a href="http://www.linkedin.com">LinkedIn</a>) and <a href="http://www.grails.org/Debug+Plugin">debugging</a> plug-ins. Awesome stuff.<br /><br />Now I'm shifting my focus to the <a href="http://apress.com/book/view/1590597583">second edition of the book</a>, and feature development for <a href="http://grails.org/Roadmap">Grails 1.1</a>.Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com12tag:blogger.com,1999:blog-20633170.post-40490913523346099302008-05-23T08:55:00.001+01:002008-05-23T08:56:26.485+01:00Groovy Grails Training From G2One and Callista Enterprise<a href="http://www.g2one.com/">G2One, Inc.</a> and <a href="http://www.callistaenterprise.se/">Callista Enterprise AB</a> have announced a partnership to support Advanced <a href="http://groovy.codehaus.org">Groovy</a> and <a href="http://grails.org">Grails</a> training in Scandinavia.<br /><br />Göteborg 2008-09-08<br />Stockholm 2008-09-15<br />Malmö 2008-09-22<br /><br />The 3 day comprehensive course covers details from intro to advanced for both the Groovy language and the Grails framework. The course description may be found <a href="http://www.callistaenterprise.se/download/18.146c1a30118e9c69ac680005494/GroovyGrails.pdf">here</a>.<br /><br />As with all G2One training events, students will receive a free 12 month license for IntelliJ IDEA. IDEA's JetGroovy brings fantastic support for both Groovy and Grails to the IDE.<br /><br />Please contact us at training at g2one dot com with any training related inquiries.Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com1tag:blogger.com,1999:blog-20633170.post-49608811672831334702008-05-22T09:17:00.002+01:002008-05-22T09:18:55.239+01:00Grails in Depth slides from JavaOne 08Although I wasn't able to make JavaOne due to my bought of pneumonia, Guillaume did an excellent job of delivering my presentations and then did everyone a favour by posting them online! Here we go for those who haven't seen them yet:<br /><br /><br /><div style="width:425px;text-align:left" id="__ss_410880"><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=psts57642957641911finv1-1210965254603201-9"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=psts57642957641911finv1-1210965254603201-9" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"><a href="http://www.slideshare.net/?src=embed"><img src="http://static.slideshare.net/swf/logo_embd.png" style="border:0px none;margin-bottom:-5px" alt="SlideShare"/></a> | <a href="http://www.slideshare.net/glaforge/javaone-2008-ts5764-grails-in-depth?src=embed" title="View JavaOne 2008 - TS-5764 - Grails in Depth on SlideShare">View</a> | <a href="http://www.slideshare.net/upload?src=embed">Upload your own</a></div></div>Graeme Rocherhttp://www.blogger.com/profile/12301973191113958910noreply@blogger.com10