<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-20633170</id><updated>2012-01-17T02:41:21.319Z</updated><category term='groovy seam grails'/><category term='apple safari google'/><category term='http://beta.blogger.com/img/gl.link.gif'/><title type='text'>Graeme Rocher's Blog</title><subtitle type='html'>Thought's about software, Grails, Java, web development and anything else that comes to mind.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default?start-index=101&amp;max-results=100'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>153</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-20633170.post-3527809233659811052</id><published>2012-01-05T09:04:00.001Z</published><updated>2012-01-05T09:04:37.469Z</updated><title type='text'>Moved</title><content type='html'>This blog has &lt;a href="http://graemerocher.tumblr.com"&gt;moved home to Tumblr&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-3527809233659811052?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/3527809233659811052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=3527809233659811052' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3527809233659811052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3527809233659811052'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2012/01/moved.html' title='Moved'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-1866781782480543829</id><published>2011-12-15T16:56:00.001Z</published><updated>2011-12-15T16:58:21.582Z</updated><title type='text'>Grails 2.0 Released!</title><content type='html'>Long time no post, but after lots of hard work from the Grails core team we are pleased to announce &lt;a href="http://grails.org/2.0.0+Release+Notes"&gt;the Grails 2.0 release&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have posted a &lt;a href="http://blog.springsource.org/2011/12/15/grails-2-0-released/"&gt;comprehensive announcement&lt;/a&gt; on the SpringSource blog.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Enjoy!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-1866781782480543829?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/1866781782480543829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=1866781782480543829' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1866781782480543829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1866781782480543829'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2011/12/grails-20-released.html' title='Grails 2.0 Released!'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-602996540346444537</id><published>2011-04-13T09:07:00.003+01:00</published><updated>2011-04-13T10:34:49.554+01:00</updated><title type='text'>Grails on Cloud Foundry</title><content type='html'>For those of you who missed it, yesterday we launched the new &lt;a href="http://www.cloudfoundry.com/"&gt;Cloud&lt;br /&gt;Foundry&lt;/a&gt; which we hope will become the premier deployment model for&lt;br /&gt;&lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; (and Spring, Ruby, Node.js etc.) applications in the the&lt;br /&gt;future. If you missed the presentation checkout the &lt;a href="http://www.youtube.com/user/cloudfoundry"&gt;YouTube recording&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It represents the culmination of a huge amount of work within &lt;a href="http://www.vmware.com/"&gt;VMware&lt;/a&gt; and we're super excited about the potential it has to completely revolutionize deployment models for Grails applications in the future.&lt;br /&gt;&lt;br /&gt;Here are some further resources specific to Grails users:&lt;br /&gt;&lt;br /&gt;Website: &lt;a href="http://www.cloudfoundry.com/" target="_blank"&gt;http://www.cloudfoundry.com/&lt;/a&gt;&lt;br /&gt;Wiki &amp;amp; Sample applications: &lt;a href="https://github.com/SpringSource/cloudfoundry-samples/wiki/Grails" target="_blank"&gt;https://github.com/SpringSource/cloudfoundry-samples/wiki/Grails&lt;/a&gt;&lt;div&gt;&lt;a href="https://github.com/SpringSource/cloudfoundry-samples/wiki/Grails" target="_blank"&gt;&lt;/a&gt;Tutorial: &lt;a href="http://blog.springsource.com/2011/04/12/one-step-deployment-with-grails-and-cloud-foundry/"&gt;http://blog.springsource.com/2011/04/12/one-step-deployment-with-grails-and-cloud-foundry/&lt;/a&gt;&lt;br /&gt;Plugin Documentation: &lt;a href="http://blog.springsource.com/2011/04/12/one-step-deployment-with-grails-and-cloud-foundry/" target="_blank&amp;gt;http://blog.springsource.com/&amp;lt;wbr&amp;gt;2011/04/12/one-step-deployment-with-grails-and-cloud-foundry/&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;Plugin Docs: &amp;lt;a href=" com="" foundry="" docs="" manual=""&gt;http://grails-plugins.github.&lt;wbr&gt;com/grails-cloud-foundry/docs/&lt;wbr&gt;manual/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Signups are currently on a first come first serve basis under a limited beta programme.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-602996540346444537?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/602996540346444537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=602996540346444537' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/602996540346444537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/602996540346444537'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2011/04/grails-on-cloud-foundry.html' title='Grails on Cloud Foundry'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-565429547542464138</id><published>2010-04-16T13:41:00.006+01:00</published><updated>2010-04-16T14:18:15.017+01:00</updated><title type='text'>Reading i18n messages from the database with Grails</title><content type='html'>In 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.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway it's dead simple. Just create a domain class that models a message:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span style="color:#ae398a;"&gt;class&lt;/span&gt; Message {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;String &lt;span style="color:#0000c9;"&gt;code&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Locale &lt;span style="color:#0000c9;"&gt;locale&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;String &lt;span style="color:#0000c9;"&gt;text&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; min-height: 19.0px"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;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&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span style="color:#ae398a;"&gt;class&lt;/span&gt; DatabaseMessageSource &lt;span style="color:#ae398a;"&gt;extends&lt;/span&gt; AbstractMessageSource {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; min-height: 19.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:#ae398a;"&gt;protected&lt;/span&gt; MessageFormat resolveCode(String code, Locale locale) {&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;Message msg = Message.&lt;span style="text-decoration: underline"&gt;findByCodeAndLocale&lt;/span&gt;(code, locale)&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;  &lt;/span&gt;def format&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;span style="color:#ae398a;"&gt;if&lt;/span&gt;(msg) {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;format = &lt;span style="color:#ae398a;"&gt;new&lt;/span&gt; MessageFormat(msg.&lt;span style="text-decoration: underline"&gt;text&lt;/span&gt;, msg.&lt;span style="text-decoration: underline"&gt;locale&lt;/span&gt;)&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;}&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;span style="color:#ae398a;"&gt;else&lt;/span&gt; {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;format = &lt;span style="color:#ae398a;"&gt;new&lt;/span&gt; MessageFormat(code, locale )&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;}&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;span style="color:#ae398a;"&gt;return&lt;/span&gt; format;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;}&lt;/p&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Monaco, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span"  style="font-size:14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Then wire it in using Spring by configuring a "messageSource" bean in the grails-app/conf/spring/resources.groovy file:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;beans = {&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt; &lt;/span&gt;&lt;span style="text-decoration: underline"&gt;messageSource&lt;/span&gt;(DatabaseMessageSource) &lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;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:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color:#777777;"&gt;&lt;span style="color:#000000;"&gt;@&lt;/span&gt;Immutable&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span style="color:#ae398a;"&gt;class&lt;/span&gt; MessageKey &lt;span style="color:#ae398a;"&gt;implements&lt;/span&gt; Serializable {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;String &lt;span style="color:#0000c9;"&gt;code&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Locale &lt;span style="color:#0000c9;"&gt;locale&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then configure an appropriate cache bean (I'm using Ehcache) in Spring and wire it into your MessageSource:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;beans = {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;   &lt;span style="text-decoration: underline"&gt;messageCache&lt;/span&gt;(EhCacheFactoryBean) {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;timeToLive = 500&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt; &lt;/span&gt;// other cache properties&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;   }&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;   &lt;span style="text-decoration: underline"&gt;messageSource&lt;/span&gt;(DatabaseMessageSource) {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;messageCache = &lt;span style="text-decoration: underline"&gt;messageCache&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;   }&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finally, update your implementation to use caching:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span style="color:#ae398a;"&gt;class&lt;/span&gt; DatabaseMessageSource &lt;span style="color:#ae398a;"&gt;extends&lt;/span&gt; AbstractMessageSource {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; min-height: 19.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color:#0000c9;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Ehcache &lt;/span&gt;messageCache&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; min-height: 19.0px"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;@Override&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:#ae398a;"&gt;protected&lt;/span&gt; MessageFormat resolveCode(String code, Locale locale) {&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;span style="color:#ae398a;"&gt;def&lt;/span&gt; key = &lt;span style="color:#ae398a;"&gt;new&lt;/span&gt; MessageKey(code,locale)&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;span style="color:#ae398a;"&gt;def&lt;/span&gt; format = messageCache.&lt;span style="color:#66d4fe;"&gt;get&lt;/span&gt;(key)?.value&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;span style="color:#ae398a;"&gt;if&lt;/span&gt;(!format) {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;Message msg = Message.&lt;span style="text-decoration: underline"&gt;findByCodeAndLocale&lt;/span&gt;(code, locale)&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;&lt;span style="color:#ae398a;"&gt;if&lt;/span&gt;(msg) {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;format = &lt;span style="color:#ae398a;"&gt;new&lt;/span&gt; MessageFormat(msg.&lt;span style="text-decoration: underline"&gt;text&lt;/span&gt;, msg.&lt;span style="text-decoration: underline"&gt;locale&lt;/span&gt;)&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;}&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;&lt;span style="color:#ae398a;"&gt;else&lt;/span&gt; {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;format = &lt;span style="color:#ae398a;"&gt;new&lt;/span&gt; MessageFormat(code, locale)&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;}&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;messageCache.put &lt;span style="color:#ae398a;"&gt;new&lt;/span&gt; Element(key, format)&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;&lt;span style="color:#ae398a;"&gt;return&lt;/span&gt; format&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; min-height: 19.0px"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;}&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;span style="color:#ae398a;"&gt;return&lt;/span&gt; format;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco"&gt;}&lt;/p&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Monaco, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span"  style="font-size:14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-565429547542464138?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/565429547542464138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=565429547542464138' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/565429547542464138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/565429547542464138'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2010/04/reading-i18n-messages-from-database.html' title='Reading i18n messages from the database with Grails'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-2358775051211365489</id><published>2009-09-17T20:23:00.004+01:00</published><updated>2009-09-17T21:28:53.190+01:00</updated><title type='text'>Grails - dependency resolution done right</title><content type='html'>Over the past couple of weeks I have been working on improving &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; dependency resolution capabilities for both applications and &lt;a href="http://grails.org/plugin/home"&gt;plugins&lt;/a&gt;. In previous versions of Grails (1.1 and below) you had limited options when it came to dependency resolution.&lt;br /&gt;&lt;br /&gt;You could use the &lt;a href="http://grails.org/Maven+Integration"&gt;Grails Maven plugin,&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;With Grails 1.2 this all changes with the introduction of Grails' &lt;a href="http://hudson.grails.org/job/grails_core/ws/grails-doc/output/guide/3.%20Configuration.html#3.7%20Dependency%20Resolution"&gt;dependency resolution DSL&lt;/a&gt;, 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:&lt;br /&gt;&lt;pre&gt;    dependencies {&lt;br /&gt;      runtime 'com.mysql:mysql-connector-java:5.1.5'&lt;br /&gt;      test 'junit:junit:3.8.2'&lt;br /&gt;  }&lt;/pre&gt;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.&lt;br /&gt;&lt;br /&gt;By default Grails will only resolve dependencies against your Grails installation but you can enable remote repository resolution easily:&lt;br /&gt;&lt;pre&gt;repositories {&lt;br /&gt;      mavenCentral()&lt;br /&gt;mavenRepo &lt;span class="java-quote"&gt;"http://repository.codehaus.org"&lt;/span&gt;&lt;br /&gt;}&lt;/pre&gt;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.&lt;br /&gt;&lt;br /&gt;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 &lt;a href="http://jaoo.dk/aarhus-2009/"&gt;JAOO&lt;/a&gt; (Denmark), &lt;a href="http://www.springone2gx.com/"&gt;SpringOne2GX&lt;/a&gt; (New Orleans, USA) and the &lt;a href="http://www.grails-exchange.com/"&gt;Grails eXchange&lt;/a&gt; (London). See you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-2358775051211365489?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/2358775051211365489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=2358775051211365489' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2358775051211365489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2358775051211365489'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2009/09/grails-dependency-resolution-done-right.html' title='Grails - dependency resolution done right'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-393415896197871583</id><published>2009-05-21T12:41:00.002+01:00</published><updated>2009-05-21T13:06:12.297+01:00</updated><title type='text'>Grails 1.1.1, Gr8conf, AppEngine and other happenings</title><content type='html'>Just got back from &lt;a href="http://gr8conf.org"&gt;Gr8conf&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;All in all it felt more like a &lt;a href="http://www.nofluffjuststuff.com"&gt;No Fluff&lt;/a&gt; event, which can only be described as a good thing. Right before the conference we released &lt;a href="http://grails.org/1.1.1+Release+Notes"&gt;Grails 1.1.1&lt;/a&gt; which is mainly a bug fix release, but the exciting part is the new &lt;a href="http://grails.org/plugin/app-engine"&gt;Google AppEngine plugin&lt;/a&gt; which works with Grails 1.1.1&lt;br /&gt;&lt;br /&gt;The plugin takes the heavy lifting out of configuring a Grails application for usage on &lt;a href="http://appengine.google.com"&gt;AppEngine&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;One missing feature from the AppEngine support right now is GORM (you have to use the raw JDO APIs). However, we are&lt;a href="https://svn.codehaus.org/grails-plugins/grails-gorm-jpa/trunk/test/integration/org/grails/jpa/BasicPersistenceMethodsTests.groovy"&gt; hard at work&lt;/a&gt; developing GORM-JPA (and potentially GORM-JDO) which will bring most of the features of GORM on top of standard JPA.&lt;br /&gt;&lt;br /&gt;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 &lt;a href="http://www.springsource.org/node/1476"&gt;Spring/BlazeDS integration 1.0 Rc2 release&lt;/a&gt;. 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.&lt;br /&gt;&lt;br /&gt;The plugin community itself continues to flourish, checkout these:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; It is now finally possible to write Grails applications for different Portals such as &lt;a href="http://grails.org/plugin/portlets-liferay"&gt;Liferay&lt;/a&gt; and &lt;a href="http://grails.org/plugin/portlets-pluto"&gt;Pluto&lt;/a&gt; thanks to the &lt;a href="http://grails.org/plugin/portlets"&gt;Portlets plugins&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There is an excellent new plugin that embeds an &lt;a href="http://grails.org/plugin/ldap-server"&gt;LDAP server&lt;/a&gt; into Grails for easily testing LDAP&lt;/li&gt;&lt;li&gt;The&lt;a href="http://grails.org/plugin/flex-scaffold"&gt; Flex Scaffold plugin&lt;/a&gt; let's you generated complete CRUD applications using Grails and Adobe Flex&lt;/li&gt;&lt;li&gt;The &lt;a href="http://grails.org/plugin/build-test-data"&gt;Build Test Data&lt;/a&gt; plugin let's you quickly create dummy test data&lt;/li&gt;&lt;li&gt;Using the &lt;a href="http://grails.org/plugin/springws"&gt;Spring WS plugin&lt;/a&gt; writing SOAP web services, feels more like writing REST service. Easy and painless.&lt;/li&gt;&lt;/ul&gt;These are just a few isolated mentions, there is activity going on&lt;a href="http://svn.grails-plugins.codehaus.org/"&gt; all the time&lt;/a&gt; on the plugin space.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-393415896197871583?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/393415896197871583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=393415896197871583' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/393415896197871583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/393415896197871583'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2009/05/grails-111-gr8conf-appengine-and-other.html' title='Grails 1.1.1, Gr8conf, AppEngine and other happenings'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-3175099719280128439</id><published>2009-03-10T17:23:00.002Z</published><updated>2009-03-10T17:32:01.736Z</updated><title type='text'>Grails 1.1 Released</title><content type='html'>Yes! &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; 1.1 is out and &lt;a href="http://grails.org/Download"&gt;available for download&lt;/a&gt;. Checkout my &lt;a href="http://blog.springsource.com/2009/03/10/grails-11-released/"&gt;blog post on the SpringSource team&lt;/a&gt; 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 :-|&lt;br /&gt;&lt;br /&gt;Nice to see how Twitter is abuzz &lt;a href="http://search.twitter.com/search?q=grails+1.1"&gt;with the news &lt;/a&gt;(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.&lt;br /&gt;&lt;br /&gt;Anyway the result is 2 new plugins called &lt;a href="http://www.grails.org/Commentable+Plugin"&gt;Commentable&lt;/a&gt; and &lt;a href="http://www.grails.org/Taggable+Plugin"&gt;Taggable&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-3175099719280128439?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/3175099719280128439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=3175099719280128439' title='20 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3175099719280128439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3175099719280128439'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2009/03/grails-11-released.html' title='Grails 1.1 Released'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-4897370755365032183</id><published>2009-02-11T10:57:00.002Z</published><updated>2009-02-11T11:01:04.201Z</updated><title type='text'>Grails at the London Java WUG</title><content type='html'>I'll be doing a talk at the London Java Web User Group on &lt;a href="http://skillsmatter.com/event/java-jee/building-twitter-with-grails-in-40-minutes-2-by-popular-demand"&gt;Building Twitter with Grails in 40 Minutes&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;See you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-4897370755365032183?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/4897370755365032183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=4897370755365032183' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4897370755365032183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4897370755365032183'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2009/02/grails-at-london-java-wug.html' title='Grails at the London Java WUG'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-7505231666974629507</id><published>2009-02-11T09:46:00.002Z</published><updated>2009-02-11T09:59:29.173Z</updated><title type='text'>Grails Happenings: 1.1, Wired, Book etc.</title><content type='html'>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 &lt;a href="http://twitter.com/graemerocher"&gt;more frequent ramblings&lt;/a&gt; of my activities.&lt;br /&gt;&lt;br /&gt;Nevertheless, we are progressing well with &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; 1.1 which should be out this month.  Loads of &lt;a href="http://www.grails.org/1.1-RC1+Release+Notes"&gt;exciting stuff&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;In other news we (&lt;a href="http://www.springsource.com"&gt;SpringSource&lt;/a&gt;) have done a &lt;a href="http://www.springsource.com/customer/casestudies"&gt;case study&lt;/a&gt; with &lt;a href="http://www.wired.com"&gt;Wired.com&lt;/a&gt; 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 &lt;a href="http://www.springsource.com/files/Wired.com%20Case%20study._0.pdf"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In other news InfoQ has a nice &lt;a href="http://www.infoq.com/news/2009/02/dynamicjasper"&gt;article up about Grails and Dynamic Jasper&lt;/a&gt;. For thsoe of you who don't know, InfoQ are also the organizers of &lt;a href="http://www.qconlondon.com"&gt;QCon&lt;/a&gt;, which I will be &lt;a href="http://qconlondon.com/london-2009/schedule/thursday.jsp"&gt;speaking at&lt;/a&gt; in March. I'll also be doing a half day Groovy/Grails workshop at the &lt;a href="http://java.sun.com/javaone/2009/javauniversity.jsp"&gt;JavaOne University&lt;/a&gt; this year if you're looking for a more comprehensive engagement.&lt;br /&gt;&lt;br /&gt;Finally, &lt;a href="http://javajeff.blogspot.com/"&gt;Jeff&lt;/a&gt; and I completed &lt;a href="http://apress.com/book/view/1590599950"&gt;The Definitive Guide to Grails, Second Edition&lt;/a&gt; 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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-7505231666974629507?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/7505231666974629507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=7505231666974629507' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/7505231666974629507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/7505231666974629507'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2009/02/grails-happenings-11-wired-book-etc.html' title='Grails Happenings: 1.1, Wired, Book etc.'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-5954662190545926992</id><published>2008-12-23T13:50:00.003Z</published><updated>2008-12-23T14:06:34.236Z</updated><title type='text'>Grails &amp; Maven Kiss and Make-up with Grails 1.1 Beta 2</title><content type='html'>So &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; 1.1 Beta 2 is out. Rejoice! There are many new features that are detailed in the r&lt;a href="http://grails.org/1.1-Beta2+Release+Notes"&gt;elease notes&lt;/a&gt;. However, one of the main ones in this beta is the new support for &lt;a href="http://maven.apache.org"&gt;Maven&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Regular readers of my blog will probably be aware of my &lt;a href="http://graemerocher.blogspot.com/2008/01/why-grails-doesnt-use-maven.html"&gt;long&lt;/a&gt; &lt;a href="http://graemerocher.blogspot.com/2006/09/vote-to-stop-maven-infesting-spring.html"&gt;history&lt;/a&gt; as one who, ahem, is not particularily fond of Maven. Granted I am &lt;span style="font-weight: bold;"&gt;still&lt;/span&gt; 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 &lt;a href="http://grails.org/Maven+Integration"&gt;integrates nicely with Maven&lt;/a&gt; now :-)&lt;br /&gt;&lt;br /&gt;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!&lt;br /&gt;&lt;br /&gt;As ever we encourage Maven users to give the Maven integration a go and report any issues that you may have with it in &lt;a href="http://jira.codehaus.org/browse/GRAILS?report=com.atlassian.jira.plugin.system.project:roadmap-panel"&gt;JIRA&lt;/a&gt;.  Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-5954662190545926992?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/5954662190545926992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=5954662190545926992' title='22 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/5954662190545926992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/5954662190545926992'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/12/grails-maven-kiss-and-make-up-with.html' title='Grails &amp; Maven Kiss and Make-up with Grails 1.1 Beta 2'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-7095918831220939219</id><published>2008-12-09T23:31:00.003Z</published><updated>2008-12-10T14:40:04.931Z</updated><title type='text'>Grails + Spring Integration</title><content type='html'>Regular readers will recall I mentioned in my announcement of the &lt;a href="http://graemerocher.blogspot.com/2008/11/groovy-and-grails-join-spring-family.html"&gt;SpringSource acquisition of G2One&lt;/a&gt; that the potential to integrate &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; with more Spring portfolio products is huge. Well, SpringSource colleague Russ Miles has taken &lt;a href="http://www.russmiles.com/home/2008/12/9/spring-integration-in-grails-part-1.html"&gt;the first steps&lt;/a&gt; in integrating Grails with &lt;a href="http://www.springsource.org/spring-integration"&gt;Spring Integration 1.0&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-7095918831220939219?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/7095918831220939219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=7095918831220939219' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/7095918831220939219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/7095918831220939219'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/12/grails-spring-integration.html' title='Grails + Spring Integration'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-9051879238407661188</id><published>2008-11-25T17:06:00.002Z</published><updated>2008-11-25T17:08:42.526Z</updated><title type='text'>Interview with me on Grails Podcast</title><content type='html'>Those crazy guys over at the &lt;a href="http://www.grailspodcast.com/"&gt;Grails podcast&lt;/a&gt; interviewed me about various things ranging from being part of &lt;a href="http://www.springsource.com/"&gt;SpringSource&lt;/a&gt; to the upcoming &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; 1.1 release to my deep hatred of all things Maven. &lt;a href="http://www.grailspodcast.com/blog/id/109"&gt;Check it out&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-9051879238407661188?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/9051879238407661188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=9051879238407661188' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/9051879238407661188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/9051879238407661188'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/11/interview-with-me-on-grails-podcast.html' title='Interview with me on Grails Podcast'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-4239047897872544142</id><published>2008-11-11T09:12:00.004Z</published><updated>2008-11-11T09:30:23.864Z</updated><title type='text'>Groovy and Grails join the Spring family</title><content type='html'>You 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 &lt;a href="http://www.g2one.com/"&gt;G2One&lt;/a&gt; - The Groovy/Grails company - has been acquired by &lt;a href="http://www.springsource.com/"&gt;SpringSource&lt;/a&gt;. The result is that &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; and &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; join the growing number of excellent Open Source projects delivered by SpringSource.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Resources:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.springsource.com/g2one"&gt;SpringSource/G2One Acquisition Announcement&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://glaforge.free.fr/weblog/index.php?itemid=259"&gt;Guillaume LaForge’s Blog&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.springsource.com/2008/11/11/more-weapons-for-the-war-on-complexity-springsource-acquires-groovygrails-leader/"&gt;Rod Johnson's Blog &lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-4239047897872544142?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/4239047897872544142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=4239047897872544142' title='98 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4239047897872544142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4239047897872544142'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/11/groovy-and-grails-join-spring-family.html' title='Groovy and Grails join the Spring family'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>98</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-8951290889719345223</id><published>2008-11-03T14:10:00.001Z</published><updated>2008-11-03T14:15:21.840Z</updated><title type='text'>Couple of nice Grails UI articles</title><content type='html'>&lt;a href="http://weblog.dangertree.net/"&gt;Matt Taylor&lt;/a&gt; has posted a couple of &lt;a href="http://weblog.dangertree.net/2008/11/02/using-grailsui-datatable-tag/"&gt;nice&lt;/a&gt; &lt;a href="http://weblog.dangertree.net/2008/11/02/adding-row-expansion-to-the-grailsui-datatable/"&gt;articles&lt;/a&gt; demonstrating how to use &lt;a href="http://grails.org/GrailsUI+Plugin"&gt;GrailsUI&lt;/a&gt;'s dataTable component. Cool stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-8951290889719345223?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/8951290889719345223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=8951290889719345223' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/8951290889719345223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/8951290889719345223'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/11/couple-of-nice-grails-ui-articles.html' title='Couple of nice Grails UI articles'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-6418531139862364283</id><published>2008-11-01T11:25:00.002Z</published><updated>2008-11-01T11:29:46.455Z</updated><title type='text'>GrailsUI 1.0 Released</title><content type='html'>Over the past few months we've had a lot of demand from different clients for a UI component library for &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt;, built and supported by &lt;a href="http://www.g2one.com"&gt;G2One&lt;/a&gt;. Thanks to a great collaborative effort, &lt;a href="http://grails.org/GrailsUI+Plugin"&gt;GrailsUI 1.0&lt;/a&gt; is now available built on the excellent Yahoo UI library.&lt;br /&gt;&lt;br /&gt;Matthew Taylor, G2One Software Engineer and the lead of the GrailsUI project, has &lt;a href="http://weblog.dangertree.net/2008/10/31/grailsui-10-released/"&gt;the lowdown&lt;/a&gt; on what is on offer. Check it out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-6418531139862364283?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/6418531139862364283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=6418531139862364283' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6418531139862364283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6418531139862364283'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/11/grailsui-10-released.html' title='GrailsUI 1.0 Released'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-5488196406531707345</id><published>2008-10-31T08:48:00.011Z</published><updated>2008-10-31T09:39:40.451Z</updated><title type='text'>New GORM Features Coming in 1.1</title><content type='html'>Now that &lt;a href="http://www.amazon.com/Definitive-Guide-Grails-Second/dp/1590599950"&gt;The Definitive Guide to Grails 2nd Edition&lt;/a&gt; (barring a few reviews) is a wrap, I've been refocusing in &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; development. First up, is GORM and we've implemented a number of great improvements including:&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:100%;"&gt;Better GORM events&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Previously, GORM supported beforeInsert, beforeUpdate and beforeDelete events, now there is afterInsert, afterUpdate and afterDelete to complete the picture&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Persistence of Collections of Basic Types&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;GORM now supports &lt;a href="http://jira.codehaus.org/browse/GRAILS-1023"&gt;persisting basic types&lt;/a&gt; like String, Integer and so on using a join table:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;class Person {&lt;br /&gt;   static hasMany = [nicknames:String]&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Improvements to Data Binding&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It is now simpler to bind data to a subset of properties. Previously you could use the syntax:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;person.properties = params&lt;/code&gt;&lt;/pre&gt;Which would bind all the incoming request parameters to the person. If you didn't want that behavior you could use the &lt;a href="http://grails.org/doc/1.0.x/ref/Controllers/bindData.html"&gt;bindData&lt;/a&gt; method. Now you can bind to a subset of properties using the subscript operator:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;person.properties["firstName","lastName"] = params&lt;/code&gt;&lt;/pre&gt;And access a subset of the domain classes properties using the same syntax:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;person.properties["firstName","lastName"].each { println it }&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Read-Only Access to Objects&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Persistent instances can now be loaded in a read-only state using the read method:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;def book = Book.read(1)&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Default Sort Order&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Associations can now be sorted using a default sort order declared at the class level:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;class Book {&lt;br /&gt;String title&lt;br /&gt;static mapping = {&lt;br /&gt;     sort "title"&lt;br /&gt;}&lt;br /&gt;}&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;Or at the association level:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;class Author {&lt;br /&gt;    static hasMany = [books:Book]&lt;br /&gt;    static mapping = {&lt;br /&gt;              books sort:"title"&lt;br /&gt;    }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Batch Fetching&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;GORM now supports configuring batch fetching (an optimization of lazy loading) using the ORM DSL at the class level:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;class Book {&lt;br /&gt;String title&lt;br /&gt;static mapping = {&lt;br /&gt;     batchSize 15&lt;br /&gt;}&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;Or at the association level:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;class Author {&lt;br /&gt;    static hasMany = [books:Book]&lt;br /&gt;    static mapping = {&lt;br /&gt;              books batchSize:15&lt;br /&gt;    }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Improvements to Dynamic Finders&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There is a new InList suffix that can be used with dynamic finders:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;def groovyBooks = Book.findByAuthorInList(['Dierk Koenig', 'Graeme Rocher'])&lt;/code&gt;&lt;/pre&gt;Dynamic finders can also now use the query cache:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;def books = Book.findByTitle("Groovy in Action", [cache:true] )&lt;/code&gt;&lt;/pre&gt;And upgrade to a pessimistic lock:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;def books = Book.findByTitle("Groovy in Action", [lock:true] )&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Legacy Mapping for Many-to-Many and Unidirectional One-to-manys&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Many-to-many and Unidirectional One-to-many associations can use the joinTable argument to alter the way they map to the underlying database:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;class Book {&lt;br /&gt; String title&lt;br /&gt; static belongsTo = Author&lt;br /&gt; static hasMany = [authors:Author]&lt;br /&gt;&lt;br /&gt; static mapping = {&lt;br /&gt;     authors joinTable:[name:"mm_author_books", key:'mm_book_id' ]&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;class Author {&lt;br /&gt; String name&lt;br /&gt; static hasMany = [books:Book]&lt;br /&gt; static mapping = {&lt;br /&gt;     books joinTable:[name:"mm_author_books", key:'mm_author_id']&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-5488196406531707345?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/5488196406531707345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=5488196406531707345' title='32 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/5488196406531707345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/5488196406531707345'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/10/new-gorm-features-coming-in-11.html' title='New GORM Features Coming in 1.1'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>32</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-5851497316129957269</id><published>2008-10-02T09:39:00.005+01:00</published><updated>2008-10-07T14:22:03.457+01:00</updated><title type='text'>Sky.com relaunches written in Grails</title><content type='html'>The main portal for &lt;a href="http://www.sky.com/"&gt;Sky television&lt;/a&gt; has relaunched written in &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt;. Sky, also known as British Sky Broadcasting  or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;BSkyB&lt;/span&gt;, employs 17000 people in the UK and operates the largest &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;satellite&lt;/span&gt; network in the UK.&lt;br /&gt;&lt;br /&gt;The site receives a million+ hits per day and joins all the other &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;subsites&lt;/span&gt; also written in Grails:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://movies.sky.com/"&gt;Sky Movies&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://tv.sky.com/"&gt;Sky TV&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://sky1.sky.com/"&gt;Sky1 Channel Site&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://showbiz.sky.com/"&gt;Sky Showbiz&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Congrats to the Sky team!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update 07/10: &lt;/span&gt;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.&lt;br /&gt;&lt;br /&gt;Also Glenn Saqui has a nice write-up on the architecture of Sky.com on &lt;a href="http://www.anyware.co.uk/2005/2008/10/03/sky-tv-sites-now-all-built-with-grails/"&gt;Marc's Blog&lt;/a&gt;. 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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-5851497316129957269?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/5851497316129957269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=5851497316129957269' title='20 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/5851497316129957269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/5851497316129957269'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/10/skycom-relaunches-written-in-grails.html' title='Sky.com relaunches written in Grails'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-2939445587547416438</id><published>2008-09-02T09:34:00.002+01:00</published><updated>2008-09-02T09:41:23.362+01:00</updated><title type='text'>Terracotta meets Grails with the Terracotta for Grails plugin</title><content type='html'>&lt;a href="http://grails.org"&gt;Our&lt;/a&gt; busy community of plugin developers have been at it again and now there is a brand new &lt;a href="http://grails.org/Terracotta+Plugin"&gt;plugin for Grails&lt;/a&gt; that adds support for the &lt;a href="http://www.terracotta.org/"&gt;Terracotta&lt;/a&gt;  data grid. It was always possible to do this with a bit of &lt;a href="http://mike.brevoort.com/2008/01/29/terracotta-1-grails-searchable-pluginme-1/"&gt;manual configuration&lt;/a&gt;, but now the plugin automates things nicely using a few new Grails command line scripts.&lt;br /&gt;&lt;br /&gt;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.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-2939445587547416438?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/2939445587547416438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=2939445587547416438' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2939445587547416438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2939445587547416438'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/09/terracotta-meets-grails-with-terracotta.html' title='Terracotta meets Grails with the Terracotta for Grails plugin'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-6076820965264372872</id><published>2008-09-01T10:31:00.003+01:00</published><updated>2008-09-01T10:50:00.766+01:00</updated><title type='text'>Groovy/Grails Community goes wild launches two sites</title><content type='html'>Wow, the &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt;/&lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; community is really getting it together. First we had the launch of &lt;a href="http://www.grailscrowd.com/"&gt;grailscrowd.com&lt;/a&gt;, 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 &lt;a href="http://github.com/dima767/grails-crowd/tree/master"&gt;at Github&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Not to be outdown, however, &lt;a href="http://blogs.bytecode.com.au/glen/2008/08/31/groovyawards-org-launches.html"&gt;Glen Smith has launched &lt;/a&gt;the &lt;a href="http://www.groovyawards.org"&gt;Groovy Awards&lt;/a&gt; ! 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.&lt;br /&gt;&lt;br /&gt;On my front, I know I have been rather inactive posting. Books are really all consuming beasts. I have given a go to &lt;a href="http://twitter.com/graemerocher"&gt;twittering&lt;/a&gt; now and again about what I'm writing about, although I'm still not sure I "get" twitter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-6076820965264372872?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/6076820965264372872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=6076820965264372872' title='27 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6076820965264372872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6076820965264372872'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/09/groovygrails-community-goes-wild.html' title='Groovy/Grails Community goes wild launches two sites'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>27</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-6617438155814965223</id><published>2008-07-28T17:03:00.002+01:00</published><updated>2008-07-28T17:05:26.781+01:00</updated><title type='text'>London Groovy/Grails User Group Meeting - 31st July 2008</title><content type='html'>I'll be giving a talk on the state of &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; at the London Groovy+Grails user group meeting on the 31st of July. &lt;a href="http://www.skillsmatter.com"&gt;Skills Matter&lt;/a&gt; are hosting it as usual, be sure to &lt;a href="http://skillsmatter.com/event/java-jee/ggug-meeting"&gt;sign-up here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-6617438155814965223?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/6617438155814965223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=6617438155814965223' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6617438155814965223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6617438155814965223'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/07/london-groovygrails-user-group-meeting.html' title='London Groovy/Grails User Group Meeting - 31st July 2008'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-6174912865431629088</id><published>2008-07-14T15:44:00.002+01:00</published><updated>2008-07-14T15:50:36.501+01:00</updated><title type='text'>Groovy/Grails Training in North America</title><content type='html'>Apologies 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 &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; 1.1 (we now have JSP tag library support in GSP and massive improvements to the plug-in system).&lt;br /&gt;&lt;br /&gt;Nevertheless, on to the topic of this post, we (&lt;a href="http://www.g2one.com"&gt;G2One In&lt;/a&gt;&lt;a href="http://www.g2one.com"&gt;c&lt;/a&gt; - The Groovy/Grails company) have launched our public &lt;a href="http://www.g2one.com/training/"&gt;Groovy &amp;amp; Grails training programme&lt;/a&gt; in the US. Announcing this exciting news is &lt;a href="http://javajeff.blogspot.com/2008/07/g2one-groovy-grails-training-in-north.html"&gt;Jeff Brown&lt;/a&gt;, our main guy in the US, who has this to say:&lt;br /&gt;&lt;br /&gt;"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.&lt;br /&gt;&lt;br /&gt;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."&lt;br /&gt;&lt;br /&gt;Check it out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-6174912865431629088?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/6174912865431629088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=6174912865431629088' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6174912865431629088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6174912865431629088'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/07/groovygrails-training-in-north-america.html' title='Groovy/Grails Training in North America'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-6671649207821865478</id><published>2008-06-16T13:21:00.004+01:00</published><updated>2008-06-17T09:10:39.872+01:00</updated><title type='text'>Brian Guan on Grails at LinkedIn</title><content type='html'>Brian Guan, one of the pioneers of &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; use within &lt;a href="http://www.linkedin.com"&gt;LinkedIn&lt;/a&gt;, has started a&lt;a href="http://blog.linkedin.com/blog/2008/06/grails-at-linke.html"&gt; blog series&lt;/a&gt; about their experiences with Grails. The first post presents the slides the LinkedIn guys presented at the recent &lt;a href="http://www.g2one.com/meetup"&gt;Groovy/Grails meetup&lt;/a&gt; at JavaOne. It makes for an interested read so check it out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-6671649207821865478?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/6671649207821865478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=6671649207821865478' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6671649207821865478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6671649207821865478'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/06/brian-guan-on-grails-at-linkedin.html' title='Brian Guan on Grails at LinkedIn'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-3248873667182718973</id><published>2008-06-06T14:24:00.002+01:00</published><updated>2008-06-06T14:33:37.770+01:00</updated><title type='text'>Grails 1.0.3 Released</title><content type='html'>&lt;a href="http://www.g2one.com"&gt;We've&lt;/a&gt; just released &lt;a href="http://grails.org"&gt;Grails 1.0.3&lt;/a&gt;, which includes 230 issues resolutions and improvements since the last release. The &lt;a href="http://grails.org/1.0.3+Release+Notes"&gt;release notes&lt;/a&gt; go through the full details, including outlining some of the new features like enum support and interactive mode.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;The most exciting thing for me though is the plug-in community with over &lt;a href="http://plugins.grails.org"&gt;70 plug-ins&lt;/a&gt; in the repository some of the new ones include &lt;a href="http://www.grails.org/Apache+Axis2+Plugin"&gt;Axis 2 support&lt;/a&gt;, &lt;a href="http://www.grails.org/J2D+Plugin"&gt;Java2D with GraphicsBuilder&lt;/a&gt; and &lt;a href="http://www.grails.org/Profiler+Plugin"&gt;profiling&lt;/a&gt; (contributed by one of the biggest Grails users &lt;a href="http://www.linkedin.com"&gt;LinkedIn&lt;/a&gt;) and &lt;a href="http://www.grails.org/Debug+Plugin"&gt;debugging&lt;/a&gt; plug-ins. Awesome stuff.&lt;br /&gt;&lt;br /&gt;Now I'm shifting my focus to the &lt;a href="http://apress.com/book/view/1590597583"&gt;second edition of the book&lt;/a&gt;, and feature development for &lt;a href="http://grails.org/Roadmap"&gt;Grails 1.1&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-3248873667182718973?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/3248873667182718973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=3248873667182718973' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3248873667182718973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3248873667182718973'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/06/grails-103-released.html' title='Grails 1.0.3 Released'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-4049091352334609930</id><published>2008-05-23T08:55:00.001+01:00</published><updated>2008-05-23T08:56:26.485+01:00</updated><title type='text'>Groovy Grails Training From G2One and Callista Enterprise</title><content type='html'>&lt;a href="http://www.g2one.com/"&gt;G2One, Inc.&lt;/a&gt; and &lt;a href="http://www.callistaenterprise.se/"&gt;Callista Enterprise AB&lt;/a&gt; have announced a partnership to support Advanced &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; and &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; training in Scandinavia.&lt;br /&gt;&lt;br /&gt;Göteborg 2008-09-08&lt;br /&gt;Stockholm 2008-09-15&lt;br /&gt;Malmö 2008-09-22&lt;br /&gt;&lt;br /&gt;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 &lt;a href="http://www.callistaenterprise.se/download/18.146c1a30118e9c69ac680005494/GroovyGrails.pdf"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Please contact us at training at g2one dot com with any training related inquiries.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-4049091352334609930?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/4049091352334609930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=4049091352334609930' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4049091352334609930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4049091352334609930'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/05/groovy-grails-training-from-g2one-and.html' title='Groovy Grails Training From G2One and Callista Enterprise'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-4960881167283133470</id><published>2008-05-22T09:17:00.002+01:00</published><updated>2008-05-22T09:18:55.239+01:00</updated><title type='text'>Grails in Depth slides from JavaOne 08</title><content type='html'>Although 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:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px;text-align:left" id="__ss_410880"&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=psts57642957641911finv1-1210965254603201-9"/&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;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"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;&lt;a href="http://www.slideshare.net/?src=embed"&gt;&lt;img src="http://static.slideshare.net/swf/logo_embd.png" style="border:0px none;margin-bottom:-5px" alt="SlideShare"/&gt;&lt;/a&gt; | &lt;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"&gt;View&lt;/a&gt; | &lt;a href="http://www.slideshare.net/upload?src=embed"&gt;Upload your own&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-4960881167283133470?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/4960881167283133470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=4960881167283133470' title='45 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4960881167283133470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4960881167283133470'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/05/grails-in-depth-slides-from-javaone-08.html' title='Grails in Depth slides from JavaOne 08'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>45</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-4831204136419377728</id><published>2008-05-19T12:35:00.002+01:00</published><updated>2008-05-19T12:40:39.724+01:00</updated><title type='text'>Grails.org now powered by Grails</title><content type='html'>We've just launched a re-write of the &lt;a href="http://grails.org"&gt;Grails.org&lt;/a&gt; site in Grails. Previously the site was powered by Confluence (the Atlassian wiki), now in the spirit of eating ones own dog food it is a fully Grails powered site.&lt;br /&gt;&lt;br /&gt;Ever since the Seam guys launched &lt;a href="http://seamframework.org"&gt;seamframework.org&lt;/a&gt; powered by Seam I felt something had to be done, before we could look them in the face again ;-)&lt;br /&gt;&lt;br /&gt;Now its there and its more than a simple page turner, but a full featured wiki engine including versioning, diff'ing etc. and the source code is available &lt;a href="http://svn.codehaus.org/grails/trunk/grails-samples/grails.org/"&gt;at Codehaus&lt;/a&gt;. Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-4831204136419377728?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/4831204136419377728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=4831204136419377728' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4831204136419377728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4831204136419377728'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/05/grailsorg-now-powered-by-grails.html' title='Grails.org now powered by Grails'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-3413858468282080856</id><published>2008-05-10T10:31:00.002+01:00</published><updated>2008-05-10T10:42:50.447+01:00</updated><title type='text'>On missing JavaOne 08</title><content type='html'>As I write this JavaOne 08 is being wrapped up and I am horizontal in bed. I somehow managed to get pleurisy and pneumonia a few days before the event so missed it completely.&lt;br /&gt;&lt;br /&gt;Luckily, the awesome Guillaume Laforge delivered &lt;a href="http://graemerocher.blogspot.com/2008/03/grails-at-javaone-communityone-08.html"&gt;my talks&lt;/a&gt; on Groovy and Grails instead of me, but sorry to those who were expecting to see me there, health comes first in this case.&lt;br /&gt;&lt;br /&gt;It seems to have been another successful conference from what I could infer from the &lt;a href="http://summize.com/search?q=%23groovy"&gt;twitter feed&lt;/a&gt; and various blog postings. Was nice to hear &lt;a href="http://www.manning.com/koenig/"&gt;Groovy in Action&lt;/a&gt; was 3rd and &lt;a href="http://www.apress.com/book/view/1590597583"&gt;The Definitive Guide to Grails&lt;/a&gt; 6th of the best seller list after day 1.&lt;br /&gt;&lt;br /&gt;On that topic of the books, being bed bound for a couple of weeks has given me the chance (when I'm not sleeping and feeling too ill) to spend some time planning and writing the second edition of the "The Definitive Guide..".&lt;br /&gt;&lt;br /&gt;I'm co-authoring with &lt;a href="http://aboutgroovy.com"&gt;Scott Davis&lt;/a&gt;, so the book should be bigger badder and more impressive this time. Target release date is the end of the year. Lets hope the codene doesn't make my ramblings to incoherent!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-3413858468282080856?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/3413858468282080856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=3413858468282080856' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3413858468282080856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3413858468282080856'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/05/on-missing-javaone-08.html' title='On missing JavaOne 08'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-8775907798698746311</id><published>2008-05-01T10:45:00.003+01:00</published><updated>2008-05-01T10:49:59.945+01:00</updated><title type='text'>Spring Application Platform and Grails</title><content type='html'>For those of you interested, Grails applications deploy and execute on SpringSource's new &lt;a href="http://www.springsource.com/beta/s2ap"&gt;Application Platform&lt;/a&gt; without any issues. I have updated the Grails &lt;a href="http://grails.org/Deployment"&gt;deployment page&lt;/a&gt; to that effect.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-8775907798698746311?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/8775907798698746311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=8775907798698746311' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/8775907798698746311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/8775907798698746311'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/05/spring-application-platform-and-grails.html' title='Spring Application Platform and Grails'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-2285691711288656248</id><published>2008-04-26T17:47:00.002+01:00</published><updated>2008-04-26T17:53:44.542+01:00</updated><title type='text'>Grails wins second prize at JAX awards</title><content type='html'>Great to hear that &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; won second prize at the JAX innovation awards, &lt;a href="http://jax-award.de/jax_award/gewinner_08_en.php"&gt;Guillaume was there to accept&lt;/a&gt; the award as I was away on annual leave in Thailand.&lt;br /&gt;&lt;br /&gt;Would have been nice to win first prize, but since &lt;a href="http://jax-award.de/jax_award/gewinner_eng.php"&gt;Groovy won last year &lt;/a&gt;I guess that would be too much to expect :-)&lt;br /&gt;&lt;br /&gt;There is a remarkable amount of innovation going on within the Grails community itself, just in the past week or so we've had new releases of the &lt;a href="http://grails.org/Selenium+plugin"&gt;Selenium plug-in&lt;/a&gt;, the &lt;a href="http://grails.org/JSecurity+Plugin"&gt;JSecurity plug-in&lt;/a&gt;, a &lt;a href="http://grails.org/jawr+plugin"&gt;JAWR plug-in&lt;/a&gt;, an &lt;a href="http://grails.org/OpenID+Plugin"&gt;OpenID plug-in&lt;/a&gt; and the new simple &lt;a href="http://grails.org/Authentication+Plugin"&gt;Authentication Plug-in&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;All contributed by our awesome user community. Amazing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-2285691711288656248?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/2285691711288656248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=2285691711288656248' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2285691711288656248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2285691711288656248'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/04/grails-wins-second-prize-at-jax-awards.html' title='Grails wins second prize at JAX awards'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-1937667309989428112</id><published>2008-04-25T15:45:00.003+01:00</published><updated>2008-04-25T19:08:22.114+01:00</updated><title type='text'>Choosing an OSS License and the Ext-JS saga</title><content type='html'>The news that &lt;a href="http://java.dzone.com/news/if-your-open-source-provider-a"&gt;Ext-JS has, from one release to the next, changed from a modified LGPL to a GPL&lt;/a&gt; based license nearly made me fall off my chair. There have been many poor judged, and ill advised decisions made by software companies over the last few years, but this has got to be up there with the stupidist I've seen and I'm not even personally an Ext-JS user.&lt;br /&gt;&lt;br /&gt;What they have effectively done is built up a community, taking full advantage of the open source model by accepting user contributions and patches and then turned around and kicked their own community up the backside. It is projects like Ext-JS that give open source a bad name. How can a company have faith in open source if the people behind it can't even decide how to license the thing?&lt;br /&gt;&lt;br /&gt;When you start off in the software business you have to very early on decide whether you are an open source company or whether you are a commercial software company. If you choose the former then you need to choose an appropriate license. For platforms the GPL license can make a lot of sense (think Linux and Java) to prevent forks, force contributions etc. although I'm still not a big fan of it.&lt;br /&gt;&lt;br /&gt;On the otherhand for libraries or frameworks only a few licenses make sense (Apache 2.0, MIT, BSD and to a lesser extent LGPL).  With &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; we went for Apache 2.0 as one of the most liberal licenses out there. Once you've decided on the license as an open source company your job is the grow the community by attracting users who put faith in your product and the fact that its licensed in a liberal way. Those users &lt;span style="font-weight: bold;"&gt;would not come in the first place&lt;/span&gt; if you had a restrictive license.&lt;br /&gt;&lt;br /&gt;By choosing the open source route you have made a decision as a company to promote the community driven approach. Of course this doesn't stop you from releasing a commercial version, you could dual license it as Ext-JS have done for those who want the comfortable feeling of paying for something.  You cannot however, have it both ways you are either an open source company or you are not. Ext-JS seem to be stuck in 2 minds as to whether they really are an open source company, it is this indecisiveness that is going to see their community go elsewhere.&lt;br /&gt;&lt;br /&gt;It is not like they're unique either, the Ajax framework space is super competitive and they've just dropped the ball and given their competitors a big advantage. My personally prediction on this one is that they'll lose a lot of users, probably to Yahoo UI and jQuery UI or possibly Dojo. Something else will soon come along to fill their space and soon they will have lost their competitive advantage, their users and all those license renewals.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-1937667309989428112?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/1937667309989428112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=1937667309989428112' title='29 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1937667309989428112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1937667309989428112'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/04/choosing-and-oss-license-and-ext-js.html' title='Choosing an OSS License and the Ext-JS saga'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>29</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-8685559081135939001</id><published>2008-03-13T10:45:00.004Z</published><updated>2008-03-13T10:54:36.812Z</updated><title type='text'>Large commercial Grails site goes live</title><content type='html'>&lt;a href="http://sky.com/"&gt;Sky&lt;/a&gt; (commercially known as &lt;a href="http://en.wikipedia.org/wiki/British_Sky_Broadcasting"&gt;BSkyB&lt;/a&gt;), who are the biggest satellite broadcaster in the UK and largely owned by &lt;a href="http://en.wikipedia.org/wiki/News_Corporation"&gt;News Corporation&lt;/a&gt; (Rupert Murdoch et al), have re-launched their &lt;a href="http://showbiz.sky.com/"&gt;Sky showbiz news portal&lt;/a&gt;, powered by &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The site was put together by &lt;a href="http://www.energizedwork.com/"&gt;&lt;span style="text-decoration: underline;"&gt;energizedwork&lt;/span&gt;&lt;/a&gt;, a consulting firm in the UK, well done guys!&lt;br /&gt;&lt;br /&gt;This represents one of the largest, commercial public facing Grails applications (that we at&lt;a href="http://www.g2one.com/"&gt; G2One Inc&lt;/a&gt; are able to talk about at least ;-) out there at the moment with traffic in the region of 186 million page views a month. Its great to see so many huge companies taking the leap to Grails, long may it continue!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-8685559081135939001?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/8685559081135939001/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=8685559081135939001' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/8685559081135939001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/8685559081135939001'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/03/large-commercial-grails-site-goes-live.html' title='Large commercial Grails site goes live'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-4973844500336879863</id><published>2008-03-13T10:19:00.002Z</published><updated>2008-03-13T10:43:00.705Z</updated><title type='text'>Grails at JavaOne &amp; CommunityOne 08</title><content type='html'>This year, along with &lt;a href="http://glaforge.free.fr/weblog/"&gt;Guillaume&lt;/a&gt;, I will be presenting 2 talks at JavaOne 08 on Groovy and Grails:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://www28.cplan.com/cc191/session_details.jsp?isid=295764&amp;amp;ilocation_id=191-1&amp;amp;ilanguage=english"&gt;TS-5764 - Grails in Depth&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://www28.cplan.com/cc191/session_details.jsp?isid=295793&amp;amp;ilocation_id=191-1&amp;amp;ilanguage=english"&gt;TS-5793 - Groovy and Grails: Changing the&lt;br /&gt;Landscape of Java™ Platform, Enterprise Edition (Java EE Platform)&lt;br /&gt;Patterns&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;As well as a single talk at Monday's CommunityOne 08 event:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www28.cplan.com/cc197/session_details.jsp?isid=297193&amp;amp;ilocation_id=197-1&amp;amp;ilanguage=english"&gt;S297193 - Grails: Productive Web Development with Groovy, Spring, and Hibernate&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;See you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-4973844500336879863?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/4973844500336879863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=4973844500336879863' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4973844500336879863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4973844500336879863'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/03/grails-at-javaone-communityone-08.html' title='Grails at JavaOne &amp; CommunityOne 08'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-3385020760489651091</id><published>2008-03-12T18:47:00.000Z</published><updated>2008-03-12T18:49:02.298Z</updated><title type='text'>Using Groovy &amp; BeanBuilder for Spring + Hibernate Integration Testing</title><content type='html'>Checkout my new &lt;a href="http://groovy.dzone.com/"&gt;Groovy Zone&lt;/a&gt; article &lt;a href="http://groovy.dzone.com/articles/using-groovy-beanbuilder-sprin"&gt;Using Groovy &amp;amp; BeanBuilder for Spring + Hibernate Integration Testing&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-3385020760489651091?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/3385020760489651091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=3385020760489651091' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3385020760489651091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3385020760489651091'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/03/using-groovy-beanbuilder-for-spring.html' title='Using Groovy &amp; BeanBuilder for Spring + Hibernate Integration Testing'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-946480750924199474</id><published>2008-03-11T15:04:00.005Z</published><updated>2008-03-11T17:38:36.075Z</updated><title type='text'>Groovy is Java AND Groovy is not Java</title><content type='html'>There is a new &lt;a href="http://softwaremaven.innerbrane.com/2008/02/our-dynamic-language-shootout.html"&gt;dynamic language shootout&lt;/a&gt; featured &lt;a href="http://www.infoq.com/news/2008/03/jdl_shootout"&gt;on InfoQ&lt;/a&gt; where &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; comes out on top as the JVM language of choice for a variety of reasons and one of the reasons cited was that it is a near superset of Java. &lt;a href="http://softwaremaven.innerbrane.com/2008/02/our-dynamic-language-shootout.html#comment-6675360252729247436"&gt;Queue the comments&lt;/a&gt; from the &lt;a href="http://ola-bini.blogspot.com/2008/02/is-groovy-like-java.html"&gt;Ola Bini brigade&lt;/a&gt; that:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"If you're going to use Groovy the same way you use Java, there is absolutely no gain. Just a performance hit."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;However, this sadly is missing the point. Sure, if you write Groovy like Java you get no real benefit, but it provides that migration and, crucially, learning path onto a Groovier way.&lt;br /&gt;&lt;br /&gt;Learning a programming language is for the most part trivial and can be achieved in a few days. Learning the &lt;span style="font-weight: bold;"&gt;libraries&lt;/span&gt; is what takes the time. Groovy shares the same Java APIs as standard Java, you know things that you know and love like &lt;span style="font-family:courier new;"&gt;java.io.File&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;java.lang.String&lt;/span&gt; etc.?&lt;br /&gt;&lt;br /&gt;The real difference comes in what it adds to these standard libraries through &lt;a href="http://groovy.codehaus.org/groovy-jdk/"&gt;the GDK&lt;/a&gt;. For example great stuff like this:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;myFile.eachLine { println it }&lt;br /&gt;&lt;br /&gt;def contents = new URL("http://google.com").text&lt;br /&gt;&lt;br /&gt;def list = ['a','c','&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;b']&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;list = list.collect { it.toUpperCase() }.sort()&lt;br /&gt;&lt;br /&gt;def text = "Hello World"&lt;br /&gt;text = text - "World"&lt;br /&gt;println text // prints "Hello "&lt;br /&gt;println text[0..-3] // prints "Hell"&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Once you learn the "new way" combined with &lt;a href="http://groovy.codehaus.org/ExpandoMetaClass"&gt;meta-programming &lt;/a&gt;capabilities that Groovy has on offer you'll never look back.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://davisworld.org/"&gt;Scott Davis&lt;/a&gt; came up with a great quote to describe this at the recent &lt;a href="http://www.groovygrails.com/"&gt;2GX: Groovy/Grails Experience&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"Groovy is Java AND Groovy is not Java at the same time"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In other words, you get the best of both worlds.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-946480750924199474?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/946480750924199474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=946480750924199474' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/946480750924199474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/946480750924199474'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/03/groovy-is-java-and-groovy-is-not-java.html' title='Groovy is Java AND Groovy is not Java'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-798643554581754265</id><published>2008-03-06T11:36:00.003Z</published><updated>2008-03-06T11:40:24.847Z</updated><title type='text'>The Grails Podcast Returns</title><content type='html'>Sven is back with his &lt;a href="http://hansamann.podspot.de/post/grails-podcast-episode-49-catching-up-glen-smith-joins/"&gt;Grails podcast&lt;/a&gt;, now a fortnightly event, and even better &lt;a href="http://blogs.bytecode.com.au/glen"&gt;Glen Smith&lt;/a&gt;, the brilliant ozzie behind &lt;a href="http://code.google.com/p/gravl/"&gt;Gravl&lt;/a&gt; and &lt;a href="http://code.google.com/p/groovyblogs/"&gt;Groovyblogs&lt;/a&gt; (2 great Grails sample applications), has joined him!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://hansamann.podspot.de/post/grails-podcast-episode-49-catching-up-glen-smith-joins/"&gt;Check it out&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-798643554581754265?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/798643554581754265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=798643554581754265' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/798643554581754265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/798643554581754265'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/03/grails-podcast-returns.html' title='The Grails Podcast Returns'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-2250473242916363376</id><published>2008-03-05T10:49:00.002Z</published><updated>2008-03-05T10:53:59.420Z</updated><title type='text'>Using Grails with Atlassian Crowd</title><content type='html'>The &lt;a href="http://www.atlassian.com"&gt;Atlassian&lt;/a&gt; guys (creators of JIRA, Confluence etc.) are using &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; for some of their projects and have written a &lt;a href="http://blogs.atlassian.com/developer/2008/03/threes_a_crowd_securing_a_grai.html"&gt;nice article&lt;/a&gt; on how to setup Grails, with the &lt;a href="http://grails.org/AcegiSecurity+Plugin"&gt;Acegi plugin&lt;/a&gt;, and Atlassian's single sign-on (SSO) solution &lt;a href="http://www.atlassian.com/software/crowd/"&gt;Crowd&lt;/a&gt;. Nice work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-2250473242916363376?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/2250473242916363376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=2250473242916363376' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2250473242916363376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2250473242916363376'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/03/using-grails-with-atlassian-crowd.html' title='Using Grails with Atlassian Crowd'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-6983010473020595111</id><published>2008-02-25T12:37:00.003Z</published><updated>2008-02-25T12:41:02.273Z</updated><title type='text'>2GX: Groovy/Grails featured on eWeek</title><content type='html'>The nice chaps at &lt;a href="http://www.eweek.com/"&gt;eWeek&lt;/a&gt; turned up at the &lt;a href="http://www.groovygrails.com/"&gt;2GX:Groovy/Grails Experience&lt;/a&gt; and interviewed me and Scott from &lt;a href="http://www.aboutgroovy.com/"&gt;aboutGroovy&lt;/a&gt; on the subject of Groovy and Grails and its relationship to Java. Check &lt;a href="http://www.eweek.com/c/a/Application-Development/Groovy-Climbing-Programmer-Ranks/"&gt;it out&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-6983010473020595111?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/6983010473020595111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=6983010473020595111' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6983010473020595111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6983010473020595111'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/02/2gx-groovygrails-featured-on-eweek.html' title='2GX: Groovy/Grails featured on eWeek'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-7027266628166308622</id><published>2008-02-25T12:12:00.002Z</published><updated>2008-02-25T12:34:25.447Z</updated><title type='text'>2GX: Standalone Spring BeanBuilder from Grails</title><content type='html'>At &lt;a href="http://www.groovygrails.com"&gt;2GX - The Groovy/Grails Experience&lt;/a&gt;, I did a presentation on empowering Spring with Groovy DSLs which demonstrated Grails' &lt;a href="http://grails.org/doc/1.0.x/guide/14.%20Grails%20and%20Spring.html#14.3%20Runtime%20Spring%20with%20the%20Beans%20DSL"&gt;Spring BeanBuilder&lt;/a&gt; in action.&lt;br /&gt;&lt;br /&gt;The demo showed how Spring and Hibernate can be dynamically configured at runtime using BeanBuilder and then interacted with via the Groovy shell. I promised a few I would make it available so &lt;a href="http://grails.org/files/beanbuilder-demo.zip"&gt;here it is&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You'll need &lt;a href="http://groovy.codehaus.org"&gt;Groovy 1.5&lt;/a&gt; and &lt;a href="http://gant.codehaus.org"&gt;Gant&lt;/a&gt; setup before you start then just type:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;gant start&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-7027266628166308622?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/7027266628166308622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=7027266628166308622' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/7027266628166308622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/7027266628166308622'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/02/2gx-standalone-spring-beanbuilder-from.html' title='2GX: Standalone Spring BeanBuilder from Grails'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-8699016376981682510</id><published>2008-02-25T11:04:00.009Z</published><updated>2008-02-25T13:25:00.750Z</updated><title type='text'>2GX: Keynote - The Amazing Growth of Grails</title><content type='html'>So, I'm back from the &lt;a href="http://www.groovygrails.com/"&gt;2GX - The Groovy/Grails Experience&lt;/a&gt; which was yet another event, brilliantly put together by Jay Zimmerman and the &lt;a href="http://www.nofluffjuststuff.com/"&gt;No Fluff &lt;/a&gt;crew. The good news is, if you missed out there is another one in the fall/autumn months in San Jose, CA.&lt;br /&gt;&lt;br /&gt;The attendance was excellent for such a focused conference with close to 200 people in total all buzzing about &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; &amp;amp; &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt;. I delivered my "State of Grails" keynote on the Thursday evening which went into some analysis of where we are since the release of Grails 1.0 from a growth perspective, but also from a technology perspective.&lt;br /&gt;&lt;br /&gt;I wasn't planning to, but a few people at the conference asked me to post my slides to help persuade managers etc. of the viability of Grails, not just from a technical perspective, but from a growth and community perspective. So if you're in the same position, &lt;a href="http://grails.org/files/State%20of%20Grails.pdf"&gt;check out my slides&lt;/a&gt;, the following is a summary of the contents.&lt;br /&gt;&lt;br /&gt;When we released Grails 1.0, &lt;a href="http://www.codehaus.org/"&gt;Codehaus'&lt;/a&gt; bandwith usage went up by a staggering 40gb. The downloads have been in the 10s of thousands since the release and luckily &lt;a href="http://www.contegix.com/"&gt;Contegix&lt;/a&gt;, the kind folks who host Codehaus, have freed up some extra bandwith for the servers.&lt;br /&gt;&lt;br /&gt;The mailing list traffic on the Grails user mailing list has &lt;a href="http://grails.markmail.org/"&gt;gone through the roof&lt;/a&gt;, averaging close to 140 messages a day in January and looking the same for Feb:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3pq3YXk6Asw/R8KrK6RKL1I/AAAAAAAAADg/i1Ag2y6Hb0k/s1600-h/markmail.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3pq3YXk6Asw/R8KrK6RKL1I/AAAAAAAAADg/i1Ag2y6Hb0k/s400/markmail.png" alt="" id="BLOGGER_PHOTO_ID_5170883526103019346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The traffic is contributing to make Grails one of the most vibrant communities around anyone one Java web framework &lt;a href="http://www.nabble.com/Web-Development-Framework-f16257.html"&gt;according to Nabble&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3pq3YXk6Asw/R8KrrqRKL2I/AAAAAAAAADo/aAlYFSjgIyA/s1600-h/nabble.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_3pq3YXk6Asw/R8KrrqRKL2I/AAAAAAAAADo/aAlYFSjgIyA/s400/nabble.png" alt="" id="BLOGGER_PHOTO_ID_5170884088743735138" border="0" /&gt;&lt;/a&gt;Further evidence of the growing community is the Grails plug-in eco-system where Grails now has no less than &lt;a href="http://svn.grails-plugins.codehaus.org/"&gt;47 user contributed plug-ins&lt;/a&gt; in the plug-in repository representing nearly 2 million lines of user contributed code:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3pq3YXk6Asw/R8KsbqRKL3I/AAAAAAAAADw/RDKBPZ1MH5c/s1600-h/plugins.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_3pq3YXk6Asw/R8KsbqRKL3I/AAAAAAAAADw/RDKBPZ1MH5c/s400/plugins.png" alt="" id="BLOGGER_PHOTO_ID_5170884913377455986" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Blog traffic is also on the up, a year ago the blog traffic for Grails was merely a blip on the horizon (all probably posted by me ;-). Now &lt;a href="http://technorati.com/chartimg/grails?size=l&amp;amp;days=360"&gt;according to technorati&lt;/a&gt; people are talking about Grails, a lot:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3pq3YXk6Asw/R8Ks76RKL4I/AAAAAAAAAD4/h1_URMhfBrs/s1600-h/blogs.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3pq3YXk6Asw/R8Ks76RKL4I/AAAAAAAAAD4/h1_URMhfBrs/s400/blogs.png" alt="" id="BLOGGER_PHOTO_ID_5170885467428237186" border="0" /&gt;&lt;/a&gt;Clearly, we still have a long way to go to make Grails as hugely popular as things like Spring and Hibernate, but we're heading in the right direction which is great news.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-8699016376981682510?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/8699016376981682510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=8699016376981682510' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/8699016376981682510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/8699016376981682510'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/02/2gx-keynote-amazing-growth-of-grails.html' title='2GX: Keynote - The Amazing Growth of Grails'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3pq3YXk6Asw/R8KrK6RKL1I/AAAAAAAAADg/i1Ag2y6Hb0k/s72-c/markmail.png' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-2324792375213895608</id><published>2008-02-12T11:29:00.000Z</published><updated>2008-02-12T11:36:10.797Z</updated><title type='text'>See you at the Groovy/Grails Experience</title><content type='html'>Last time there was a &lt;a href="http://www.grails-exchange.com/"&gt;major Groovy/Grails conference&lt;/a&gt;, we promised to get &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; 1.0 out in time for the conference, somehow we slipped a few months ;-)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.groovygrails.com"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 471px; height: 56px;" src="http://grails.org/images/banner.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This time there is no such slippage and the &lt;a href="http://www.groovygrails.com/gg/2gexperience"&gt;2G - Groovy/Grails Experience&lt;/a&gt; is coming to Reston, Virginia on the 21-23 of Feb! Organised by the &lt;a href="http://nofluffjuststuff.com/"&gt;No Fluff&lt;/a&gt; crowd, it features an amazing amount of great &lt;a href="http://www.groovygrails.com/gg/conference/schedule?showId=131"&gt;Groovy &amp;amp; Grails talks&lt;/a&gt; from &lt;a href="http://www.groovygrails.com/gg/conference/speakers?showId=131"&gt;some great speakers&lt;/a&gt; (other than me of course ;-).&lt;br /&gt;&lt;br /&gt;I'll be doing 3 talks on various aspects of Grails and can't wait, its going to be a great event. See you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-2324792375213895608?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/2324792375213895608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=2324792375213895608' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2324792375213895608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2324792375213895608'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/02/see-you-at-groovygrails-experience.html' title='See you at the Groovy/Grails Experience'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-1231841691943780041</id><published>2008-02-05T10:54:00.000Z</published><updated>2008-02-05T10:56:36.522Z</updated><title type='text'>Grails 1.0 is out the door!</title><content type='html'>We've put the finishing touches on Grails 1.0 and &lt;a href="http://grails.org/1.0+Release+Notes"&gt;its out&lt;/a&gt;. Time to celebrate with some sleep.. enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-1231841691943780041?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/1231841691943780041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=1231841691943780041' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1231841691943780041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1231841691943780041'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/02/grails-10-is-out-door.html' title='Grails 1.0 is out the door!'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-6816438028915175526</id><published>2008-01-18T14:05:00.001Z</published><updated>2008-01-18T15:41:46.925Z</updated><title type='text'>RE: Groovy and JRuby: Enterprise-Ready?</title><content type='html'>There is a report that is being pushed around comments on blog posts with the aim of spreading FUD. The report can be found here:&lt;br /&gt;&lt;a href="http://www.huxili.com/index.php?cat=reports&amp;amp;id=ID000188"&gt;&lt;br /&gt;http://www.huxili.com/index.php?cat=reports&amp;amp;id=ID000188&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It is entitled "Groovy and JRuby: Enterprise Ready?" and its conclusion is that Groovy is not due to "memory leaks".  The report is complete nonsense of course,  and it put together by someone who doesn't understand the different language idioms.&lt;br /&gt;&lt;br /&gt;The report provides no code examples, further bringing to question its validity, however it states  that Groovy runs out of memory when running these steps:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Call shell.evaluate("x =  100")   &lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Call System.gc()   &lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Thread.sleep(1000)   &lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Record used memory   &lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p&gt;Repeating (1-4)   &lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;I'm going to have a go at guessing the Groovy code they used. I can bet it goes something like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;shell = new GroovyShell()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;while(true) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   shell.evaluate("x = 100")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   sleep(2000)&lt;br /&gt;System.gc()&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So what is the problem with this code? And why would it result in a memory leak? The answer is that each GroovyShell instance has an internal class loader. Groovy is a compiled language. Even little scripts like this are compiled into classes so over time the class loader just gets bigger and bigger. The solution? Here we go:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; while(true) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    new GroovyShell().evaluate("x = 100")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    sleep(2000)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So what this does is allow the GroovyShell (and its class loader) to be garbage collected by the JVM. When the class loader is garbage collected so are the classes loaded  within it. JRuby of course doesn't have this problem as its interpreted.&lt;br /&gt;&lt;br /&gt;Judging whether a language is "enterprise-ready" without knowing the language idioms and basing it on a 4 line script is to be honest quite ridiculous, so remember beware of silly "official" looking reports without verifying the facts for yourself.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-6816438028915175526?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/6816438028915175526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=6816438028915175526' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6816438028915175526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6816438028915175526'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/01/re-groovy-and-jruby-enterprise-ready.html' title='RE: Groovy and JRuby: Enterprise-Ready?'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-4654873426926218090</id><published>2008-01-18T09:34:00.001Z</published><updated>2008-01-18T09:50:15.192Z</updated><title type='text'>The Great Language Backlash</title><content type='html'>Something interesting has been happening in the blogosphere over the last few days. It seemed to all kick-off with Rick Hightowers post on &lt;a href="http://www.jroller.com/RickHigh/entry/thanks_zed_btw_syntax_matters"&gt;Why Syntax Matters&lt;/a&gt;. It seems a mini-backlash is brewing against the Ruby hype.&lt;br /&gt;&lt;br /&gt;Rick feels (and this is his opinion) that Sun should ditch JRuby and support &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; because the syntax and migration path is so much easier for Java developers. He and several commenters on his blog, feel that Ruby is too different to Java. The post was features on &lt;a href="http://www.javalobby.org/java/forums/t105687.html?start=30"&gt;JavaLobby&lt;/a&gt; and &lt;a href="http://www.infoq.com/news/2008/01/sun_drop_jruby"&gt;InfoQ&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This is of course the main reason I was sold about Groovy as it eliminates the context switching between languages as they are so similar, but a blog post that got me thinking the most was Cedric's entitled &lt;a href="http://beust.com/weblog/archives/000472.html"&gt;I'm not Tired of Java Yet&lt;/a&gt;. And you know what? I agree with him.&lt;br /&gt;&lt;br /&gt;Unlike Ola Bini (JRuby committer) who is &lt;a href="http://ola-bini.blogspot.com/2008/01/viability-of-java-and-stable-layer.html"&gt;repeatedly questioning Java&lt;/a&gt;, I love Java and still believe it is a great language for many common tasks. Its just not great for &lt;span style="font-weight: bold;"&gt;everything&lt;/span&gt;. In the past Java was seen as "the one language to rule them all". Now as alternative languages like Groovy start to mature, its about picking the right language to solve the problem at hand and that tool is often Java.&lt;br /&gt;&lt;br /&gt;Things like processing strings, doing really dynamic stuff and heavy manipulating of collections can get painful in Java. However, its death is highly, highly exaggerated. One of the reasons I believe so strongly in &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; and &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; is that it is not about ditching Java or the Java platform, it's about embracing it.&lt;br /&gt;&lt;br /&gt;Groovy supports true &lt;a href="http://memeagora.blogspot.com/2006/12/polyglot-programming.html"&gt;polygot programming&lt;/a&gt; when combined with Java thanks to the seamless way they integrate with one another. I, and most Groovy programmers, still love programming in Java and have no plans to ditch it anytime soon. Use each language when it makes sense. It is about using the &lt;span style="font-weight: bold;"&gt;best tool for the job&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-4654873426926218090?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/4654873426926218090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=4654873426926218090' title='25 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4654873426926218090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4654873426926218090'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/01/great-language-backlash.html' title='The Great Language Backlash'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>25</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-1185656489331180520</id><published>2008-01-16T16:54:00.000Z</published><updated>2008-01-16T16:57:06.779Z</updated><title type='text'>Grails 1.0 RC4 out, not long to go...</title><content type='html'>&lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; 1.0-RC4 is out. Download &lt;a href="http://grails.org/Download"&gt;here&lt;/a&gt;. In three weeks 1.0 final will be with us, fun times :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-1185656489331180520?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/1185656489331180520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=1185656489331180520' title='34 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1185656489331180520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1185656489331180520'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/01/grails-10-rc4-out-not-long-to-go.html' title='Grails 1.0 RC4 out, not long to go...'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>34</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-2027202902255745950</id><published>2008-01-16T09:11:00.001Z</published><updated>2009-03-25T12:19:54.082Z</updated><title type='text'>Why Grails doesn't use Maven</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt; As of Grails 1.1, Grails now &lt;a href="http://www.grails.org/Maven+Integration"&gt;provides Maven support&lt;/a&gt;. My personal feelings towards Maven haven't changed much, it is in my view basically the EJB2 of build tools. However, if you want to use Maven with Grails that is now a possiblity.&lt;br /&gt;&lt;br /&gt;In his post entitled &lt;a href="http://jonasfagundes.com/blog/2008/01/grails-the-good-the-ugly-and-the-bad"&gt;"Grails - The Good, The Bad and the Ugly"&lt;/a&gt;, Jonas has some nice praise for &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt;, his main beef is that it is not built on Maven.&lt;br /&gt;&lt;br /&gt;So I wanted to clarify why exactly we chose not use &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; (by default) and the explanation is there for all to see in Jonas' first example of creating a Grails application vs creating a Maven project:&lt;br /&gt;&lt;br /&gt;Instead of&lt;br /&gt;&lt;code&gt;&lt;br /&gt;grails create-app name&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;could be just&lt;br /&gt;&lt;code&gt;&lt;br /&gt;mvn archetype:create -U                                     \&lt;br /&gt;-DarchetypeGroupId=net.liftweb                             \&lt;br /&gt;-DarchetypeArtifactId=lift-archetype-blank                 \&lt;br /&gt;-DarchetypeVersion=0.4                                   \&lt;br /&gt;-DremoteRepositories=http://scala-tools.org/repo-releases  \&lt;br /&gt;-DgroupId=your.proj.gid -DartifactId=your-proj-id&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;My goodness, what a mouthful the Maven example is. There is a common acronym in the open source world called RTFM (read the *ing manual), when a user asks a question on a mailing list and the "experts" respond by pointing them to the place in the manual.&lt;br /&gt;&lt;br /&gt;For me Grails is all about dramatically simplifying, and reducing the cases where you have to RTFM. Grails wraps popular Java libraries like Spring, Hibernate, Sitemesh and  Quartz and does a damn good job of hiding that complexity.&lt;br /&gt;&lt;br /&gt;I'm not saying you never have to RTFM manual, but once you have learnt Grails  the cases where you need to are few and far between and for simple things like creating an application, once you know how, you never need to go back. In other words Grails is all about simplifying Java EE.&lt;br /&gt;&lt;br /&gt;Now Maven is the complete opposite of this. Why do I have to go and read their manual everytime I want to creating a project. I mean there is no way I will remember all that crap and their documentation is pretty appauling to begin with.&lt;br /&gt;&lt;br /&gt;I think only Java people would be willing to accept a build system like Maven with all its complexities. Any other community would be like "what the hell is this?". For me Maven is the EJB2 of build systems: over complicated, over engineered and requiring an intelligent, code generating IDE just to work with it.&lt;br /&gt;&lt;br /&gt;Having said all of that there are a good number of companies adopting Maven (god help them) and so I am not against having Maven support in Grails, but not by default.  Arnaud from &lt;a href="http://www.octo.com/"&gt;Octo&lt;/a&gt; has put together the excellent &lt;a href="http://forge.octo.com/maven/sites/mtg/"&gt;Maven Tools for Grails&lt;/a&gt; project, which allows you to create a POM for a Grails application and integrates Grails with the Maven lifecycle.  Maybe one day we will include it in Grails core by default as an optional extra if Arnaud is interested in that.&lt;br /&gt;&lt;br /&gt;However, I feel there is no use putting Maven in by default, because I strongly believe that in the long term it will be replaced by better tools like Gant, Raven, or Buildr.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-2027202902255745950?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/2027202902255745950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=2027202902255745950' title='45 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2027202902255745950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2027202902255745950'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/01/why-grails-doesnt-use-maven.html' title='Why Grails doesn&apos;t use Maven'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>45</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-1254416976568933611</id><published>2008-01-14T10:24:00.000Z</published><updated>2008-01-14T14:04:18.361Z</updated><title type='text'>Relevance on Grails vs Rails Architecture</title><content type='html'>Oh I love these back and forth posts, as a follow-up to their &lt;a href="http://www.relevancellc.com/2008/1/10/help-graeme-make-his-case"&gt;original thoughts&lt;/a&gt; on &lt;a href="http://graemerocher.blogspot.com/2008/01/grails-making-java-developers-forget.html"&gt;my last post&lt;/a&gt;, Relevance have put up one called &lt;a href="http://www.relevancellc.com/2008/1/11/how-to-pick-a-platform"&gt;"How to pick a platform"&lt;/a&gt;. Unsurprising, they choose Rails over Grails for the case where there is no legacy "baggage".&lt;br /&gt;&lt;br /&gt;Since they're a Rails company (althouth this may change given they've hired 2 guys from the Groovy/Grails community ;-) this isn't really surprising. The conclusions are that Rails' architecture is better because:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ruby is a better language than Groovy.&lt;/li&gt;&lt;li&gt;Spring does most of its heavy lifting in the &lt;a href="http://ola-bini.blogspot.com/2008/01/language-explorations.html"&gt;stable layer&lt;/a&gt;, which is not the right place.&lt;/li&gt;&lt;/ul&gt;So let's deal with these one by one. First, the whole "Ruby is better than Groovy" deal, this in my view is subjective and not worth arguing. Ruby has some nice features, and so does Groovy. If you come from a Perl background you'll probably like Ruby's syntax. If you're a Java guy, Groovy is pretty nice.&lt;br /&gt;&lt;br /&gt;Stu's,  second point is somewhat confusing and contradictory. He link's off to this &lt;a href="http://ola-bini.blogspot.com/2008/01/language-explorations.html"&gt;post by Ola Bini&lt;/a&gt;  where Ola says and I quote:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"The first layer is what I called the stable layer. It's not a very large part of the application in terms of functionality. But it's the part that everything else builds on top off, and is as such a very important part of it. This layer is the layer where static type safety will really help. &lt;span style="font-weight: bold;"&gt;Currently, Java is really the only choice for this layer.&lt;/span&gt; More about that later, though."&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Later Ola goes on to say that Java is no good for the stable layer either and that another statically typed language like Scala would be better, but at no point does he say that a dynamically typed language is good for the stable layer.&lt;br /&gt;&lt;br /&gt;Since Rails is 100% Ruby and, according to Ola Bini (JRuby committer) its not a good idea to build "the stable layer" in a dynamically typed language (Ruby) who has the better architecture?&lt;br /&gt;&lt;br /&gt;Grails where the stable layer is built on powerful, stable and performant Spring or Rails where the stable layer is in Ruby, which is dog slow and &lt;a href="http://www.radicalbehavior.com/5-question-interview-with-twitter-developer-alex-payne/"&gt;problematic&lt;/a&gt;. I'll let you decide.&lt;br /&gt;&lt;br /&gt;Personally, I don't buy into Ola's problems with Java for this so called stable layer nor do I believe that a dynamic language can't be used, at least in part, in the stable layer, because 25% of Grails' "stable" layer is written in Groovy.  However, what I will say is Relevances' 2 conclusions are complete nonsense and fall into the "Crap" category of their &lt;a href="http://relevancellc.com/2008/1/10/help-graeme-make-his-case"&gt;original post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;What I advise anyone trying to make this decisions is download and try out both frameworks and use what suits you and your company. Every business is unique and not every framework is suitable for every business need. Don't buy into nonsense from either Stu or I that ones architecture is better than the other without comparing how it fits into your own existing architecture.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-1254416976568933611?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/1254416976568933611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=1254416976568933611' title='20 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1254416976568933611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1254416976568933611'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/01/relevance-on-grails-vs-rails.html' title='Relevance on Grails vs Rails Architecture'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-2120010071767401385</id><published>2008-01-10T09:02:00.000Z</published><updated>2008-01-10T17:58:48.887Z</updated><title type='text'>Grails Making Java Developers Forget about Rails</title><content type='html'>In &lt;a href="http://raincitysoftware.blogspot.com/2007/12/10-reasons-to-switch-from-rails-to.html"&gt;10 reasons to switch from Rails to Grails&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here is another 10:&lt;br /&gt;&lt;br /&gt;1. A &lt;a href="http://grails.org/Views+and+Layouts"&gt;view technology&lt;/a&gt; that &lt;a href="http://grails.org/Dynamic+Tag+Libraries"&gt;doesn't suck&lt;/a&gt;&lt;br /&gt;2. Mixed source development made easy with the Groovy &lt;a href="http://blackdragsview.blogspot.com/2007/07/joint-compilation-in-groovy.html"&gt; joint compiler &lt;/a&gt;(no falling back to C to solve those performance problems ;-)&lt;br /&gt;3. Built in support for rich conversations with &lt;a href="http://grails.org/WebFlow"&gt;Web Flow&lt;/a&gt;&lt;br /&gt;4. &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; 1.0 coming out within the month&lt;br /&gt;5. IntelliJ's &lt;a href="http://www.jetbrains.com/idea/features/groovy_grails.html"&gt;JetGroovy&lt;/a&gt; Plug-in&lt;br /&gt;6. A rich &lt;a href="http://grails.org/Plugins"&gt;plug-in system&lt;/a&gt; that integrates Grails with technologies Java people care about like GWT,  DWR, JMS etc.&lt;br /&gt;7. A buzzing and growing community with a &lt;a href="http://www.nabble.com/forum/Search.jtp?forum=16257&amp;amp;local=n&amp;amp;query=grails+or+rails"&gt;larger traffic mailing list&lt;/a&gt; as opposed to a stagnating one&lt;br /&gt;8. Built on &lt;a href="http://www.springframework.org/"&gt;Spring&lt;/a&gt;, the ultimate Enterprise Application Integration technology&lt;br /&gt;9. A &lt;a href="http://grails.org/Services"&gt;Service&lt;/a&gt; layer with automatic transaction demarcation and support for scopes&lt;br /&gt;10. &lt;a href="http://www.amazon.co.uk/Practical-Grails-Projects-Development-Platform/dp/1590599748/ref=pd_bbs_8?ie=UTF8&amp;amp;s=books&amp;amp;qid=1199956896&amp;amp;sr=8-8"&gt;More&lt;/a&gt; &lt;a href="http://www.pragprog.com/titles/sdgrvr"&gt;books&lt;/a&gt; &lt;a href="http://www.pragprog.com/titles/vslg"&gt;coming&lt;/a&gt; and being adopted by &lt;a href="https://www.sdn.sap.com/irj/sdn/wiki?path=/display/Community/Composition+on+Grails&amp;amp;"&gt;enterprise&lt;/a&gt; organisations near you&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Relevance guys have &lt;a href="http://www.relevancellc.com/2008/1/10/help-graeme-make-his-case"&gt;chipped in&lt;/a&gt;! They've gone ahead and neatly organised my points, good job. Let's deal with the ones under the "Crap" section:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Grails 1.0 coming out -&lt;/span&gt;&lt;br /&gt;Ok fair point not a reason to choose Rails over Grails, unless stable release numbers is an issue for you&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Built on Spring - &lt;/span&gt;&lt;br /&gt;To put this one under crap sadly misses the point by a million miles. Rails has zero enterprise penetration, let's put that out there right now. Grails on the other hand has enterprise penetration and is only growing.  A large part of this is the Spring toolkit which solves more enteprise problems than you can shake a stick at.&lt;br /&gt;&lt;br /&gt;The comments on the Relevance blog back this up. Rails' attitude of openly shirking the enterprise has left a big gaping whole that Grails is happily filling.  And finally for a Rails guy to call Spring a leaky abstraction is a little rich.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A Buzzing and Growing Community -&lt;/span&gt;&lt;br /&gt;I'm not arguing that Rails has a smaller community, merely that it has plateaud, whilst Grails has no where near reached that point and has the potential to go much much further. Watch this space.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;More books coming - &lt;/span&gt;&lt;br /&gt;See above, even though I don't regard Grails as second best now for those that think that we won't be second best for long trust me ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-2120010071767401385?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/2120010071767401385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=2120010071767401385' title='50 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2120010071767401385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2120010071767401385'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/01/grails-making-java-developers-forget.html' title='Grails Making Java Developers Forget about Rails'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>50</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-3746133914088570958</id><published>2008-01-08T12:42:00.000Z</published><updated>2008-01-08T12:59:18.026Z</updated><title type='text'>Groovy &amp; Grails Happenings in the New Year</title><content type='html'>First let me say happy new year to all readers. I myself have just got back into the swing of things after spending some family time over in Spain.&lt;br /&gt;&lt;br /&gt;It is nice to get back and see that even though with the holiday period the good stuff coming out of the Groovy and Grails community doesn't stop.&lt;br /&gt;&lt;br /&gt;First up we have the &lt;a href="http://pragdave.blogs.pragprog.com/pragdave/2008/01/two-new-groovy.html"&gt;announcement&lt;/a&gt; from the Pragmatic (almost mistyped that Programmatic!) Programmers that, shock/horror, they don't just do Ruby books, but have announced 2 new Groovy books: &lt;a href="http://www.pragprog.com/titles/sdgrvr"&gt;Groovy Recipes&lt;/a&gt; by &lt;a href="http://davisworld.org"&gt;Scott Davis&lt;/a&gt; and &lt;a href="http://www.pragprog.com/titles/vslg"&gt;Programming Groovy&lt;/a&gt; by &lt;a href="http://www.agiledeveloper.com/blog/"&gt;Venkat&lt;/a&gt; - thee of the unpronounceable surname ;-)&lt;br /&gt;&lt;br /&gt;Next, for those of you who haven't been following Glen Smith's exploits in producing his Grails based blog called Gravl, checkout the latest &lt;a href="http://blogs.bytecode.com.au/glen/2008/01/08/1199737601310.html"&gt;screencast&lt;/a&gt; its looking really awesome. In the spirit of consuming ones own dog food, once he has done I may well migrate to Gravl!&lt;br /&gt;&lt;br /&gt;Finally, the Grails user community continues to be busy with new plug-in releases and so on. The most significant of which is James' (who has also built his on Grails based blog) &lt;a href="http://www.jameswilliams.be/blog/entry/46"&gt;Google Chart API plug-in&lt;/a&gt; which looks really nice and Andreas' &lt;a href="http://grails.org/RichUI+Plugin"&gt;RichUI plug-in&lt;/a&gt; which adds a whole bunch of new tags to create rich components like tabbed panes, tag clouds, tree widgets to name just a few.  Most of the components seem to take advantage of the Yahoo UI JavaScript library. Neat stuff.&lt;br /&gt;&lt;br /&gt;As for the Grails 1.0 release we were supposed to ship that by the end of the year, but with the Groovy release coming a bit later and our aims to deliver a really high quality to release we decided to push it back a bit. The target is this month sometime so stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-3746133914088570958?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/3746133914088570958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=3746133914088570958' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3746133914088570958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3746133914088570958'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2008/01/groovy-grails-happenings-in-new-year.html' title='Groovy &amp; Grails Happenings in the New Year'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-1213764413338396662</id><published>2007-12-19T06:10:00.001Z</published><updated>2007-12-19T06:16:36.752Z</updated><title type='text'>SAP announces Composition on Grails 1.0</title><content type='html'>Congrats to the &lt;a href="https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/8054"&gt;SAP guys&lt;/a&gt; who have announced &lt;a href="https://www.sdn.sap.com/irj/sdn/wiki?path=/display/Community/Composition+on+Grails"&gt;Composition on Grails&lt;/a&gt; 1.0, their toolkit for allowing quick development of composite applications on SAP NetWeaver 7.1 which is based on the current Grails 1.0 stream.&lt;br /&gt;&lt;br /&gt;The following quote summarises their motivations for choosing &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; and &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;quote&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"First, we needed a scripting language that runs in the JVM, so that ruled out some languages right there. Anything that runs outside the JVM will require some duplication of processes, and interprocess communication is more complicated. Second, we felt that &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.hibernate.org/" target="_blank"&gt;Hibernate&lt;/a&gt;&lt;span style="font-style: italic;"&gt; and &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.springframework.org/" target="_blank"&gt;Spring&lt;/a&gt;&lt;span style="font-style: italic;"&gt; were well proven and we wanted to take advantage of them. Finally, the Groovy syntax and lifecycle management is very Java-like. This matters because the availability of skilled programmers is crucial in the enterprise space, and there are loads of Java developers out there."&lt;/span&gt;&lt;br /&gt;&lt;/quote&gt;&lt;br /&gt;It is a great to see a company as large of SAP who "gets it".  Good job.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-1213764413338396662?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/1213764413338396662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=1213764413338396662' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1213764413338396662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1213764413338396662'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/12/sap-announces-composition-on-grails-10.html' title='SAP announces Composition on Grails 1.0'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-2675547653757011857</id><published>2007-12-15T20:17:00.001Z</published><updated>2007-12-15T22:37:14.785Z</updated><title type='text'>Grails at the Spring Experience</title><content type='html'>Yesterday I did two talks at the &lt;a href="http://www.thespringexperience.com/conference/hollywood/2007/12/index.html"&gt;Spring Experience&lt;/a&gt; about &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; and &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; which went well. One thing I found interesting is the misconceptions that people have about Grails. The audience here was of a completely different kind to what I normally face and were under the impression that:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;a) Grails had nothing to do with Spring. The reality is quite different, Grails is built on Spring, can leverage existing Spring beans and take advantage of all the Spring APIs&lt;/div&gt;&lt;div&gt;b) Grails requires you to leave Java and use Groovy. This was the most shocking one, most people thought to use Grails you have to only use Groovy. The reality is that if we wanted that we would have gone off and used Ruby on Rails. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The goal of Grails is to create a web platform where you can use Groovy for what its great at and use Java when it makes sense. Grails can completely leverage any existing Java codebase and existing Spring ApplicationContext definitions.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another interesting event at the Spring Experience was the Web Development BOF on Friday night. The overwhelming cry from Spring users attending the BOF was for Spring to use more conventions on the web layer. Keith Donald asked me to give the audience an overview of the conventions Grails uses.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;By the end of it the general audience response was: well why don't we just use Grails? Overall a good result :-)  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-2675547653757011857?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/2675547653757011857/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=2675547653757011857' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2675547653757011857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2675547653757011857'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/12/grails-at-spring-experience.html' title='Grails at the Spring Experience'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-5822916532433912924</id><published>2007-12-06T21:18:00.000Z</published><updated>2007-12-07T08:13:49.973Z</updated><title type='text'>RE: Groovy in Ruby: Implement Interface with a Map</title><content type='html'>Oops, he did it again! Having started off with the disclaimer that he is working with the Groovy community, Charles Nutter has a &lt;a href="http://headius.blogspot.com/2007/12/groovy-in-ruby-implement-interface-with.html"&gt;blog post&lt;/a&gt; that demonstrates how to do Groovy's coercion to a Map in JRuby.&lt;br /&gt;&lt;br /&gt;Unfortunately, the irony in his post is that all he has done is demonstrate one of JRuby's shortcomings in terms of Java integration: it lacks built in coercion support. All of this is done whilst demonstrating only a small subset of what Groovy's as keyword is capable of.&lt;br /&gt;&lt;br /&gt;The Ruby code demonstrated is as follows:&lt;br /&gt;&lt;pre&gt;1. module InvokableHash&lt;br /&gt;2.   def as(java_ifc)&lt;br /&gt;3.     java_ifc.impl {|name, *args| self[name].call(*args)}&lt;br /&gt;4.   end&lt;br /&gt;5. end&lt;/pre&gt;Which then can be used as a method like:&lt;br /&gt;&lt;pre&gt;1. impl = {&lt;br /&gt;2.   :i =&gt; 10,&lt;br /&gt;3.   :hasNext =&gt; proc { impl[:i] &gt; 0 },&lt;br /&gt;4.   :next =&gt; proc { impl[:i] -= 1 }&lt;br /&gt;5. }&lt;br /&gt;6. iter = impl.as java.util.Iterator&lt;br /&gt;7. while (iter.hasNext)&lt;br /&gt;8.   puts iter.next&lt;br /&gt;9. end&lt;/pre&gt;If you were to implement this in Groovy you could do:&lt;br /&gt;&lt;pre&gt;1. Map.metaClass.as = { delegate.asType(it) }&lt;br /&gt;&lt;/pre&gt;However, in a further act of irony this code actually uses Groovy's built in coercion support and hence is in fact rather useless. All in one line of code!&lt;br /&gt;&lt;br /&gt;What is even more amusing is his post conveniently skips over the fact that the &lt;span style="font-weight: bold;"&gt;as&lt;/span&gt; keyword is a general purpose coercion mechanism for all types of coercion operations, not just maps. For example this is also possible:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;1. { println 'foo' } as Runnable&lt;/pre&gt;And it can be extended by implementing the &lt;span style="font-weight: bold;"&gt;asType&lt;/span&gt; method.&lt;br /&gt;&lt;br /&gt;The most entertaining quote however is this one:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"Now if you ask the Groovy team, they'll make some claim like "it's all Java objects" or "Groovy integrates seamlessly with Java" but neither of those are entirely true."&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Charles is trying hard to claim that JRuby's Java integration is no different to Groovy's. To those who want to try a little experiment have a go at this:&lt;br /&gt;&lt;br /&gt;1) Write a plain JRuby/Groovy class&lt;br /&gt;2) Write a Java class that creates a new instance of the JRuby/Groovy class and invokes a method on it&lt;br /&gt;3) Set a break point on the Java class and step debug from the Java into the JRuby/Groovy class&lt;br /&gt;4) Compile the sources and put them in a JAR&lt;br /&gt;5) Put the JAR on the classpath of another app and write another Java class that references the JRuby/Groovy class&lt;br /&gt;&lt;br /&gt;With Groovy and its joint compiler or IntelliJ IDEA's JetGroovy this is no problem, with JRuby you won't get passed step 2 without have to resort to introducing interfaces, creating dynamic proxies etc etc.&lt;br /&gt;&lt;br /&gt;What the Groovy team says is this: Groovy has the same security model, the same debugger, the same profilers, the same object model, the same APIs, and close to the same syntax. For the Java developer its a no brainer.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-5822916532433912924?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/5822916532433912924/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=5822916532433912924' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/5822916532433912924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/5822916532433912924'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/12/re-groovy-in-ruby-implement-interface.html' title='RE: Groovy in Ruby: Implement Interface with a Map'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-4144802702542636893</id><published>2007-11-23T09:28:00.001Z</published><updated>2007-11-23T09:50:52.535Z</updated><title type='text'>On the road to Grails 1.0: An incredible amount of Grails stuff going on</title><content type='html'>Apologies to frequent  readers of this blog that I've been a bit quite, but &lt;a href="http://www.g2one.com"&gt;we're&lt;/a&gt; plowing away trying get get &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; 1.0 out in time for Christmas. In the meantime an incredible amount of activity has gone on around the Grails community.&lt;br /&gt;&lt;br /&gt;Firstly, congrats to &lt;a href="http://martin.adamek.sk/?p=5"&gt;Martin&lt;/a&gt; and &lt;a href="http://blogs.sun.com/geertjan/date/20071121"&gt;Geertjan&lt;/a&gt; from Sun for their work on the &lt;a href="http://docs.codehaus.org/display/GROOVY/NetBeans+Plugin"&gt;NetBeans Groovy/Grails integration&lt;/a&gt;, it looks very promising and it is nice to see the progress made by the open source IDEs given the great support we have in &lt;a href="http://www.jetbrains.net/confluence/display/GRVY/Groovy+Home;jsessionid=523AAA9A5C6D08DED3D75EBDB88C86BB"&gt;IntelliJ iDEA&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Next thing I wanted to mention was the incredible amount of code that is being written by the community to make Grails even better. The guys at &lt;a href="http://www.cantinaconsulting.com/"&gt;Catalina Consulting&lt;/a&gt; have created no fewer than &lt;a href="http://www.cantinaconsulting.com/grails-plugins/"&gt;3 new plug-ins&lt;/a&gt; that provide integration with Amazon S3, the Red5 Flash Server and Streaming Video support to Grails.&lt;br /&gt;&lt;br /&gt;However, there is more! To further increase Grails' integrations with Java based Ajax stacks two new plug-ins have been created by our users. The &lt;a href="http://grails.org/ZK+Plugin"&gt;ZK Grails Plugin &lt;/a&gt;provides integration with &lt;a href="http://www.zkoss.org/"&gt;ZK&lt;/a&gt;, a rich event-driven, component oriented Ajax stack. Whilst, the &lt;a href="http://grails.org/Echo2+Plugin"&gt;Echo2 Grails Plugin&lt;/a&gt; does the same for &lt;a href="http://www.nextapp.com/platform/echo2/echo/"&gt;Echo2&lt;/a&gt;, another component oriented Ajax stack that lets you create Ajax apps in a similar way to Swing.&lt;br /&gt;&lt;br /&gt;What is interesting for me about these two plug-ins is:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;It demonstrates how Grails can be integrated with existing Java frameworks to further enhance its capabilities. This is all down to Groovy's seamless integration with Java and Grails' extensible &lt;a href="http://grails.org/The+Plug-in+Developers+Guide"&gt;Plug-in system&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;We now have &lt;a href="http://grails.org/Plugins"&gt;Plug-ins&lt;/a&gt; that provide varying levels of integration for many of the significant Java based Ajax stacks such as GWT, Echo2, DWR, ZK, Open Laszlo and Dojo. All driven by our user community.&lt;/li&gt;&lt;/ol&gt;Other things of significance include the launch of 4 new public Grails based sites in the past month, including:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.my-workboard.com/"&gt;WorkBoard&lt;/a&gt; - A FaceBook application that provides classified ads&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.foodtube.co.uk/"&gt;Food Tube&lt;/a&gt; - A London restaurant guide and booking service&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.filmsuggestions.com/"&gt;FilmSuggestions.com&lt;/a&gt; - Catalogue your favourite films, commenting and tagging as you go&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jobinsiders.de/"&gt;Job Insiders&lt;/a&gt; - A German Job rating community&lt;/li&gt;&lt;/ul&gt;Congrats to the guys behind those sites. So overall exciting times for Groovy and Grails and with 1.0 out soon, hopefully 2008 will be another big year.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-4144802702542636893?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/4144802702542636893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=4144802702542636893' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4144802702542636893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4144802702542636893'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/11/on-road-to-grails-10-incredible-amount.html' title='On the road to Grails 1.0: An incredible amount of Grails stuff going on'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-2082525173135999643</id><published>2007-11-01T23:29:00.000Z</published><updated>2007-11-01T23:32:54.917Z</updated><title type='text'>Grails Development with IntelliJ IDEA</title><content type='html'>The &lt;a href="http://www.jetbrains.com"&gt;JetBrains&lt;/a&gt; folks have contributed a great &lt;a href="http://docs.codehaus.org/display/GRAILS/IDEA+Integration"&gt;write-up&lt;/a&gt; on the wiki summarising the powerful capability offered by &lt;a href="http://www.jetbrains.net/confluence/display/GRVY/Groovy+Home"&gt;JetGroovy&lt;/a&gt;, their &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt;/&lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; plug-in for &lt;a href="http://www.jetbrains.com/idea"&gt;IntelliJ IDEA&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-2082525173135999643?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/2082525173135999643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=2082525173135999643' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2082525173135999643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2082525173135999643'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/11/grails-development-with-intellij-idea.html' title='Grails Development with IntelliJ IDEA'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-7152256870772273465</id><published>2007-11-01T23:16:00.000Z</published><updated>2007-11-01T23:29:07.605Z</updated><title type='text'>Grails eXchange - The aftermath</title><content type='html'>I have been meaning to do a write-up on the &lt;a href="http://www.grails-exchange.com"&gt;Grails eXchange 2007&lt;/a&gt;, a great conference hosted by my former employers &lt;a href="http://www.skillsmatter.com"&gt;Skills Matter&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Overall the conference was great, it had the feel of some of the &lt;a href="http://www.nofluffjuststuff.com"&gt;No Fluff&lt;/a&gt; events I've been to and it was awesome to have so many people passionate about &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; &amp;amp; &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; in the same place.&lt;br /&gt;&lt;br /&gt;Some of the highlights for me were seeing the amazing &lt;a href="http://www.jetbrains.net/confluence/display/GRVY/Groovy+Home"&gt;JetGroovy&lt;/a&gt; plug-in in action &lt;a href="http://blip.tv/file/448895"&gt;demo'ed&lt;/a&gt; by &lt;a href="http://www.jetbrains.com"&gt;JetBrains&lt;/a&gt;, Meeting the awwwesome (pronounced with a proper ozzy accent of course) &lt;a href="http://blogs.bytecode.com.au/glen/"&gt;Glen Smith&lt;/a&gt; (the man behind  &lt;a href="http://www.groovyblogs.org"&gt;Groovy blogs&lt;/a&gt;) and his presentation entitled &lt;a href="http://www.grails-exchange.com/files/GlenSmith_TheWholeNineYards.pdf"&gt;"The Whole Nine Yards"&lt;/a&gt; and the general networking and social aspect.&lt;br /&gt;&lt;br /&gt;Now its back to focusing on getting Grails 1.0 out. My current focus is not on code, but on improving our documentation. Stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-7152256870772273465?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/7152256870772273465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=7152256870772273465' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/7152256870772273465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/7152256870772273465'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/11/grails-exchange-aftermath.html' title='Grails eXchange - The aftermath'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-4289111065626106940</id><published>2007-10-18T14:38:00.000+01:00</published><updated>2007-10-18T14:42:22.697+01:00</updated><title type='text'>Groovy Quote of the Day from Geertjan at Sun</title><content type='html'>"The main message I'm going home with is the rather obvious realisation that Groovy is in a completely different category to any other scripting language, because of its relationship with Java. Hence, lots of stuff (such as the Java debugger, as indicated above) can simply be reused when working with Groovy. That insight should also inform the tooling provided for Groovy." - &lt;a href="http://blogs.sun.com/geertjan/entry/stepping_through_groovy_in_netbeans"&gt;Geertjan&lt;/a&gt; at the &lt;a href="http://www.grails-exchange.com"&gt;Grails eXchange&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a great quote from Geertjan from Sun and highlights what we've been saying about &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; for years: Java integration is more than being able to invoke a method on a Java class, it is object model integration, tools integration, debugger integration, profiling integration etc. etc. etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-4289111065626106940?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/4289111065626106940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=4289111065626106940' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4289111065626106940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4289111065626106940'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/10/groovy-quote-of-day-from-geertjan-at.html' title='Groovy Quote of the Day from Geertjan at Sun'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-6122206020455445167</id><published>2007-10-17T22:57:00.000+01:00</published><updated>2007-10-17T23:05:54.365+01:00</updated><title type='text'>Grails 1.0 RC1, IntelliJ 7.0 &amp; Grails eXchange Day 1</title><content type='html'>You can probably tell by the title that I am trying to cram too much into one blog post, but anyway there you go..&lt;br /&gt;&lt;br /&gt;First off, we released &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; 1.0 RC1 there first of a few release candidates that will go out before 1.0 final. Check out the &lt;a href="http://docs.codehaus.org/display/GRAILS/1.0-RC1+Release+Notes"&gt;release notes&lt;/a&gt; for all the good stuff in this release.&lt;br /&gt;&lt;br /&gt;Second, &lt;a href="http://www.jetbrains.com"&gt;JetBrains&lt;/a&gt; have released &lt;a href="http://www.jetbrains.com/idea"&gt;IntelliJ IDEA 7.0&lt;/a&gt;. What was simply the best Java IDE on the planet is now also simply the best &lt;a href="http://www.jetbrains.com/idea/features/groovy_grails.html"&gt;Groovy/Grails IDE&lt;/a&gt; on the planet. Congrats to the JetBrains guys and check it out.&lt;br /&gt;&lt;br /&gt;Finally, today was day 1 of the &lt;a href="http://www.skillsmatter.com"&gt;Skills Matter's&lt;/a&gt; Grails &lt;a href="http://www.grails-exchange.com"&gt;eXchange&lt;/a&gt; conference which went well. It has the feel of some of the &lt;a href="http://www.nofluffjuststuff.com"&gt;No Fluff&lt;/a&gt; conferences I've been to and it is great to have so many people excited about Groovy &amp;amp; Grails in one place. Big thanks to &lt;a href="http://www.skillsmatter.com"&gt;Skills Matter&lt;/a&gt; for organising it all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-6122206020455445167?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/6122206020455445167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=6122206020455445167' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6122206020455445167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6122206020455445167'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/10/grails-10-rc1-intellij-70-grails.html' title='Grails 1.0 RC1, IntelliJ 7.0 &amp; Grails eXchange Day 1'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-2440217810301042577</id><published>2007-10-10T14:30:00.000+01:00</published><updated>2007-10-10T16:41:09.927+01:00</updated><title type='text'>G2One: The Groovy/Grails Company is born</title><content type='html'>As &lt;a href="http://www.nabble.com/Announcing-G2One%3A-The-Groovy-Grails-Company-tf4599726.html"&gt;announced&lt;/a&gt; to the &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; &amp;amp; &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; mailing lists today we communicated the formation of &lt;a href="http://www.g2one.com/"&gt;G2One&lt;/a&gt; Inc, &lt;b&gt;the&lt;/b&gt; source for Groovy/Grails expertise and today is my first "official" day as CTO at &lt;a href="http://www.g2one.com/"&gt;G2One&lt;/a&gt; Inc.&lt;br /&gt;&lt;br /&gt;Almost overnight we now have like 4 fulltime people working on Groovy/Grails and what a difference it makes.&lt;br /&gt;&lt;br /&gt;Exciting times. The ball is now rolling !&lt;br /&gt;&lt;br /&gt;PS A special thank you to the guys at &lt;a href="http://www.skillsmatter.com/"&gt;Skills Matter&lt;/a&gt; who I have, up until recently, been working for, for the past year.  They're organising a great little Groovy/Grails &lt;a href="http://www.grails-exchange.com/"&gt;get together&lt;/a&gt; and have been superb in their support for Groovy/Grails over the last year.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-2440217810301042577?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/2440217810301042577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=2440217810301042577' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2440217810301042577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2440217810301042577'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/10/g2one-groovygrails-company-is-born.html' title='G2One: The Groovy/Grails Company is born'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-6096443925589026575</id><published>2007-10-09T09:24:00.000+01:00</published><updated>2007-10-09T09:31:05.839+01:00</updated><title type='text'>SAP Using Groovy &amp; Grails, Release Grails-based Product</title><content type='html'>&lt;a href="http://www.sap.com"&gt;SAP&lt;/a&gt;, one of the largest providers of enterprise software and services in the world today, have been using &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt;/&lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; internally for a while now. I first met the nice chaps from SAP at JavaOne in May where they attended my half-day Groovy/Grails workshop.&lt;br /&gt;&lt;br /&gt;However, the big news is the &lt;a href="https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/7526"&gt;announcement&lt;/a&gt; that they have released a new community driven product called &lt;a href="https://www.sdn.sap.com/irj/sdn/wiki?path=/display/Community/Composition+on+Rails&amp;"&gt;Composition on Rails&lt;/a&gt; (Side note - not sure DHH and co will be happy with the name, oh well...) that allows you to use their SAP NetWeaver Composition Environment to quickly prototype applications using Groovy/Grails. Exciting stuff!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-6096443925589026575?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/6096443925589026575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=6096443925589026575' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6096443925589026575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6096443925589026575'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/10/sap-using-groovy-grails-release-grails.html' title='SAP Using Groovy &amp; Grails, Release Grails-based Product'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-6661528273127497118</id><published>2007-10-05T09:08:00.000+01:00</published><updated>2007-10-05T09:11:59.780+01:00</updated><title type='text'>LinkedIn Looking for Groovy/Grails Developers</title><content type='html'>The guys over at popular networking site &lt;a href="http://www.linkedin.com"&gt;LinkedIn&lt;/a&gt; are looking for software engineers with experience building web 2.0 apps preferably with &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt;/&lt;a href="http://grails.org"&gt;Grails&lt;/a&gt;. &lt;a href="http://www.linkedin.com/jobs?viewJob=&amp;jobId=373610&amp;fromSearch=6&amp;sik=1191476395753"&gt;Check it out&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-6661528273127497118?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/6661528273127497118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=6661528273127497118' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6661528273127497118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6661528273127497118'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/10/linkedin-looking-for-groovygrails.html' title='LinkedIn Looking for Groovy/Grails Developers'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-800342192718905093</id><published>2007-10-03T09:41:00.000+01:00</published><updated>2007-10-03T09:45:50.184+01:00</updated><title type='text'>Refactr Interview Grails Dev Marc Palmer</title><content type='html'>Software consultancy &lt;a href="http://refactr.com"&gt;Refactr&lt;/a&gt; have posted a &lt;a href="http://refactr.com/blog/2007/10/02/refactr-intrview-series-1/"&gt;great interview&lt;/a&gt; with &lt;a href="http://www.anyware.co.uk"&gt;Marc Palmer&lt;/a&gt;, one of the committers for &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt;, about his experiences developing Grails apps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-800342192718905093?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/800342192718905093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=800342192718905093' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/800342192718905093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/800342192718905093'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/10/refactr-interview-grails-dev-marc.html' title='Refactr Interview Grails Dev Marc Palmer'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-6709224002529673421</id><published>2007-09-25T16:30:00.000+01:00</published><updated>2007-09-25T16:36:06.742+01:00</updated><title type='text'>Grails at JAOO 07</title><content type='html'>Just finished my talk on &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; at &lt;a href="http://jaoo.dk"&gt;JAOO&lt;/a&gt;. It went very well, the room was packed out with people having to stand at the back. Grails was extremely well received and the audience enthusiastic.&lt;br /&gt;&lt;br /&gt;The conference seems interesting, there aren't many low level technical talks. Most talks seem to be design or patterns or enterprise architecture talks. There are also many .NET talks, so its quite a diverse conference. An interesting concept.&lt;br /&gt;&lt;br /&gt;JAOO uses a system of rating talks with red, yellow and green papers depending if the talk was rubbish, average or good. I managed 15 yellows, 98 greens and no reds. Not bad :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-6709224002529673421?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/6709224002529673421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=6709224002529673421' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6709224002529673421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6709224002529673421'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/09/grails-at-jaoo-07.html' title='Grails at JAOO 07'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-3845675286752725557</id><published>2007-09-21T09:22:00.000+01:00</published><updated>2007-09-21T15:27:03.586+01:00</updated><title type='text'>The new meta-programming APIs in Groovy 1.1 beta 3</title><content type='html'>As &lt;a href="http://glaforge.free.fr/weblog/index.php?itemid=222"&gt;announced&lt;/a&gt; by Guillaume, &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; 1.1 beta 3 is out and the final release is just round the corner. There is lots of good stuff in there, but I want to talk here primarily about the new meta-programming API improvements that have been introduced in this release.&lt;br /&gt;&lt;br /&gt;Groovy has always had the underlying &lt;a href="http://groovy.codehaus.org/api/groovy/lang/MetaObjectProtocol.html"&gt;Meta Object Protocol&lt;/a&gt; (MOP) that allowed the same behaviour as languages such as Ruby and Small Talk, however the API onto these has, up until now, not been as elegant as it could have been. With Groovy 1.1 beta 3 there is a lot more at your finger tips including...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Runtime evaluation with respondsTo &amp;amp; hasProperty&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;It is now a lot easier to inspect the runtime thanks to the addition of hasProperty and respondsTo for meta classes so you can do:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;class Foo {&lt;br /&gt;    String name = "Wilma"&lt;br /&gt;    def sayHello() { println "hello $name" }&lt;br /&gt;    def sayHello(String message) { println "hello $message" }&lt;br /&gt;}&lt;br /&gt;def f = new Foo()&lt;br /&gt;&lt;br /&gt;if(f.metaClass.respondsTo(f,'sayHello') {&lt;br /&gt;    f.sayHello()&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Since Groovy supports method overloading and typed arguments to support good Java interoperability you can also specify a type:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;if(f.metaClass.respondsTo(f,'sayHello', String) {&lt;br /&gt;    f.sayHello("Fred")&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;Groovy also differentiates method and property access so you can do this:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;if(f.metaClass.hasProperty(f,'name') {&lt;br /&gt;     println f.name&lt;br /&gt;}&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;See the &lt;a href="http://groovy.codehaus.org/Evaluating+the+MetaClass+runtime"&gt;docs here&lt;/a&gt; for more info on hasProperty and respondsTo&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Missing method/property interception with methodMissing &amp;amp; propertyMissing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As of beta 3, Groovy now supports the concept of "method missing". It has always been possible to intercept method dispatch using &lt;a href="http://groovy.codehaus.org/Using+invokeMethod+and+getProperty"&gt;invokeMethod&lt;/a&gt;. However, this has the overhead of intercepting &lt;span style="font-weight: bold;"&gt;every&lt;/span&gt; method call instead of just the "missing" ones. As of Groovy 1.1 beta 3, Groovy now supports "method missing" and "property missing", which are only called when method dispatch fails (ie just before a MissingMethodException would be thrown anyway.)&lt;br /&gt;&lt;br /&gt;A trivial example can be seen below, we use this feature in Grails to implement dynamic finders such as findByTitleAndAuthor("Groovy in Action", "Dierk Koenig"):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;Foo.metaClass.methodMissing = { String name, args -&gt;&lt;br /&gt;    Foo.metaClass."$name" = { Object[] varArgs -&gt; &lt;br /&gt;        "$name : ${varArgs.inspect()}" &lt;br /&gt;    }&lt;br /&gt;    delegate."$name"(args)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;def f = new Foo()&lt;br /&gt;f.sayHello('Fred')&lt;br /&gt;assert f.notARealMethod("boo") &lt;br /&gt;            == 'notARealMethod : [["boo"]]'&lt;br /&gt;assert f.notARealMethod("boo", "hoo") &lt;br /&gt;            == 'notARealMethod : [["boo", "hoo"]]'&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Notice how in the example above we can dynamically register a new method on the fly and then call that method. This also has the implicationthat the next dispatch to the same method is faster. See the docs here for more &lt;a href="http://groovy.codehaus.org/Using+methodMissing+and+propertyMissing"&gt;info&lt;/a&gt; and there are a whole load of docs on doing dynamic Groovy and meta-programming to be found &lt;a href="http://groovy.codehaus.org/Dynamic+Groovy"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-3845675286752725557?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/3845675286752725557/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=3845675286752725557' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3845675286752725557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3845675286752725557'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/09/new-meta-programming-apis-in-groovy-11.html' title='The new meta-programming APIs in Groovy 1.1 beta 3'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-1444764241682278932</id><published>2007-09-19T10:29:00.001+01:00</published><updated>2007-09-19T14:35:50.803+01:00</updated><title type='text'>Gavin King saying nice stuff about Groovy/Grails</title><content type='html'>Gavin King has been featured in a &lt;a href="http://labs.jboss.com/jbosslabs/transcripts/King_JavaOne2007.html"&gt;podcast&lt;/a&gt; where he has some nice things to say about &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt;. Transcript &lt;a href="http://labs.jboss.com/jbosslabs/transcripts/King_JavaOne2007.html"&gt;here&lt;/a&gt;. Thanks Gavin! For what its worth Seam makes JSF palatable ;-)&lt;br /&gt;&lt;br /&gt;In related news Gavin also has a &lt;a href="http://in.relation.to/Bloggers/MoreXMLThanCode"&gt;blog post&lt;/a&gt; about the downside of ActiveRecord storing model info in the DB. The funny thing is this is nothing new, we realised that having your model in the DB was a crap idea from day one when we created Grails. That is why &lt;a href="http://grails.org/GORM"&gt;GORM&lt;/a&gt; has not such deficiencies.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-1444764241682278932?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/1444764241682278932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=1444764241682278932' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1444764241682278932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1444764241682278932'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/09/gavin-king-saying-nice-stuff-about.html' title='Gavin King saying nice stuff about Groovy/Grails'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-6127037050596351126</id><published>2007-09-03T13:40:00.000+01:00</published><updated>2007-09-03T13:54:27.838+01:00</updated><title type='text'>David HH Living in Cloud Cookoo-land</title><content type='html'>This latest little &lt;a href="http://www.infoworld.com/article/07/08/31/Rails-creator-on-Java-and-other-junk_1.html"&gt;outburst&lt;/a&gt; from David HH of &lt;a href="http://rubyonrails.org"&gt;Rails&lt;/a&gt; fame is hilarious.  Even Charles Nutter must be on the floor laughing. David honestly believes that JRuby is a bridge for people to move to the C Ruby runtime because its a superior environment without the "junk"? I had to do a double take when I read that.&lt;br /&gt;&lt;br /&gt;So let's see, enterprises are going to give up on a platform that provides monitoring, profiling, JIT, a deployment architecture that isn't a joke, threading, a compiled byte-code format, clustering, distributed caching, transactions that don't suck, maturity and performance all to build Rails apps?&lt;br /&gt;&lt;br /&gt;Ignore the enterprise, it is ok. &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; is settling in quite nicely in the enterprise, and everything else will flow from there ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-6127037050596351126?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/6127037050596351126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=6127037050596351126' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6127037050596351126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6127037050596351126'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/09/david-hh-living-in-cloud-cookoo-land.html' title='David HH Living in Cloud Cookoo-land'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-3289238323250069630</id><published>2007-08-31T14:37:00.000+01:00</published><updated>2007-08-31T16:32:09.882+01:00</updated><title type='text'>Grails 0.6 Released with Rich Conversation Support (AKA Spring Web Flow)</title><content type='html'>We've just released &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; 0.6 which takes Grails even further away from its Rails-like beginnings. Thanks to integration with the &lt;a href="http://www.springframework.org/webflow"&gt;Spring Web Flow&lt;/a&gt; project and support for Spring scopes Grails now supports rich conversations a la &lt;a href="http://www.jboss.com/products/seam"&gt;Seam&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The essence of it is that we have created a Groovy builder for construction Web Flows. This is both a good thing for Grails and for the Web Flow project as the current mechanism for flow definition in Web Flow is via XML which has limited expressiveness and too many angles for my liking.&lt;br /&gt;&lt;br /&gt;An example of a &lt;a href="http://grails.org/WebFlow"&gt;Grails Flow&lt;/a&gt; can be seen below:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt; showCart {&lt;br /&gt;    on("checkout").to "enterPersonalDetails"&lt;br /&gt;    on("continueShopping").to "showCatalogue"&lt;br /&gt; }                                         &lt;br /&gt; enterPersonalDetails {&lt;br /&gt;  on("submit") {&lt;br /&gt;   def p = new Person(params)&lt;br /&gt;   flow.person = p &lt;br /&gt;   def e = yes()&lt;br /&gt;   if(p.hasErrors() || !p.validate())return error()    &lt;br /&gt;  }.to "enterShipping"   &lt;br /&gt;  on("return").to "showCart"&lt;br /&gt;  on(Exception).to "handleError"&lt;br /&gt; }              &lt;br /&gt; enterShipping  {&lt;br /&gt;  on("back").to "enterPersonalDetails"&lt;br /&gt;  on("submit") {&lt;br /&gt;   def a = new Address(params)                           &lt;br /&gt;   flow.address = a&lt;br /&gt;   if(a.hasErrors() || !a.validate()) return error()    &lt;br /&gt;  }.to "enterPayment"&lt;br /&gt; }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt; &lt;br /&gt;Web Flow will completely manage the state transitions and Grails integrates Hibernate into the picture to make sure you get atomic conversations.&lt;br /&gt;&lt;br /&gt;You can also encapsulate business logic inside service classes and define services as living in a particular scope:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;class BookService {&lt;br /&gt;   static scope = "flow"&lt;br /&gt;   ...&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Thus allowing conversations with a particular service scoped to individual clients. It is all rather exciting stuff and extends Grails' capabilities allowing much more complex workflows.&lt;br /&gt;&lt;br /&gt;This is not the only exciting feature in Grails 0.6. The headliners are:&lt;br /&gt;&lt;br /&gt;   *  Joint Groovy/Java Compilation&lt;br /&gt;   * Spring Web Flow Integration&lt;br /&gt;   * Support for Spring scopes to allow scoped services&lt;br /&gt;   * Improved support for REST with automatic XML/JSON marshalling and RESTful URL mappings&lt;br /&gt;   * New Config DSL for configuration not possible by convention&lt;br /&gt;   * Refreshed scaffolding interface and branding&lt;br /&gt;   * Support for Sitemesh inline decorators&lt;br /&gt;   * Controllers can now call tag libraries as methods&lt;br /&gt;   * New GSP tags&lt;br /&gt;   * Massive improvements to speed of start-up time, unit tests and generation tools&lt;br /&gt;&lt;br /&gt;Checkout the full &lt;a href="http://grails.org/0.6+Release+Notes"&gt;release notes&lt;/a&gt; for details and download &lt;a href="http://grails.org/Download"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-3289238323250069630?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/3289238323250069630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=3289238323250069630' title='21 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3289238323250069630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3289238323250069630'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/08/grails-06-released-with-rich.html' title='Grails 0.6 Released with Rich Conversation Support (AKA Spring Web Flow)'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-2710244428956095252</id><published>2007-08-20T13:13:00.000+01:00</published><updated>2007-08-20T14:04:22.454+01:00</updated><title type='text'>Setting up an Apple Airport Exreme Router with Virgin Media set-top box</title><content type='html'>A while ago I set-up my &lt;a href="http://www.apple.com/airportextreme/"&gt;Airport Extreme&lt;/a&gt; router with my &lt;a href="http://www.virginmedia.com/"&gt;Virgin Media&lt;/a&gt; cable connection and it was painful, but I got it working. Anyway, a friend had similar trouble so I helped him set up his and given that this might be a relatively frequent occurance and Virgin's support for Apple products equates to zero I thought I would post the info here for others to benefit.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 1) Plug in the relevant cables&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm not going to go into detail here, but basically plug the ethernet cable into the "Ethernet" slot of the set-top box then the other end into the router in the slot with the circle of dots around it. Make sure the set-top box is powered on and the router is too.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 2) Install Airport Extreme Software Update&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Chuck in the Apple provided CD and run the installer, then reboot.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 3) Enable Wireless and Connect to the Base Station&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Enable your wireless connection and then connect to the Wireless network. It is probably called "Apple Base Station" or some generic default name.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 4) Run "Airport Utility"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Run the "Airport Utility" program in "/Applications/Utilities/Airport Utility". Then it should automatically discover your base station. Click on the base station and then click the "Continue" button in the bottom right. When prompted choose "Assist me".&lt;br /&gt;&lt;br /&gt;Note: Do not confuse it with "Airport Admin Utility" this is the older software.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 5) Network/Base Station Name&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Select an appropriate network and base station name. Anything you like really.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 6) Country/Radio Mode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Choose your country (ie United Kingdom for Virgin Media) then set the Radio Mode. If you have any already Macs or PCs you may need to be 802.11a compatible.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 7) Security&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Set-up security, don't choose WEP as it is known to be insecure. Select WPA2 Personal and enter an appropriate password of your choice (make sure to check the "Remember password in Keychain option")&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 8) How do you connect to the Internet?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Select "I use a DSL or cable model with a static IP address or DHCP" then continue&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 9) Internet Setup&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now the fun begins. If it weren't that Virgin Media's customer service people were so incompetent this bit might not be such a pain, but in my experience they gave wildly different numbers for the primary and secondary DNS depending on who you spoke to. Anyway, enter the information as per the below:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;DNS Server:&lt;/span&gt; 62.253.162.237&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Domain Name:&lt;/span&gt; ntlworld&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;DHCP Client ID:&lt;/span&gt; (Your Virgin Media PID - phone them if you don't know what this is)&lt;br /&gt;&lt;br /&gt;Some Virgin Media reps stated you could leave the DHCP Client ID blank, but in my experience this didn't work when setting up both mine and my friends. Once you're done click "Continue"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 10) Enter a base station password&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Make sure you enter a "base station" password and then once you're done click the "Update" button.&lt;br /&gt;&lt;br /&gt;At this point your Apple router will reboot, but it is likely it will flash an Orange light and give several error messages relating to different things. So go back to "Airport Utility" and click on the router again and the "Continue". Now instead of "Assist Me" select "Manual Setup".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 11) Share a public IP address&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The router is probably set-up in bridge mode. This is problematic as it means you have to do the whole "NTL provisioning" thing for each machine in the house, a pain. So instead in the "Manual Setup" screen of "Airport Utility" select the "Internet" tab.&lt;br /&gt;&lt;br /&gt;Now at the "Connection Sharing" bit under the "Internet Connection" tab change the "Off (Bridge Mode)" setting to "Share a public IP address".&lt;br /&gt;&lt;br /&gt;You may also want to click on the "DHCP" tab at the top and change the lease time to a bit longer if you want to have the same IP for longer.&lt;br /&gt;&lt;br /&gt;Also in DNS Server(s) it only has a primary DNS server, enter "194.168.8.100" as the secondary DNS (in the second DNS Server field).&lt;br /&gt;&lt;br /&gt;Once you're done click the "Update" button again and wait for the router to reboot.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 12) Diagnosing problems&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If the router is still flashing orange go back into the "Manual Setup" bit and in the "Summary" screen click on the Orange icon next to the "Base Station Status" field.&lt;br /&gt;&lt;br /&gt;If you get the "Double NAT" problem ignore this for the moment as it is only because the router has been assigned the temporary provisioning IP address from Virgin.&lt;br /&gt;&lt;br /&gt;If however you have a "Internet Connection" problem, then unplug both the set-top box and the router then restart the set-top box wait for the lights on it to stop flashing then turn on the router. Once they've both rebooted you will probably still have a flashing orange light, but it should be related only to the "Double NAT" problem mentioned earlier&lt;br /&gt;&lt;br /&gt;If you go back into "Manual Setup" of your router and look at the "IP Address" field in of the "Summary" page your router should have an IP Address that starts 10.* etc. This is the private network of the Virgin provisioning system.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 13) Provisioning&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If the router is only saying it has a "Double NAT" problem and it has successfuly obtained an IP address starting 10.* and not 168.* then you are ready to start the provisioning step.&lt;br /&gt;&lt;br /&gt;Open up a browser and go to some common site like google. You will get redirected to a "NTL Provisioning" site that has a big "Start" button on it. Go through the steps. You will need your Virgin PID and password handy. If is not getting as far as the NTL Provisioning screen then try to quit the browser and start it up again then try again.&lt;br /&gt;&lt;br /&gt;If this STILL doesn't work then phone up Virgin by dialing 150 on your phone and ask them what the IP address of the NTL Provisioning site is (when we did it started with 173.* but this might change) and then enter the IP into your address bar.&lt;br /&gt;&lt;br /&gt;Once you have successfully registered the router with the "NTL Provisioning" system restart the router (turn it off at the wall and on again)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;General Advice&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When phoning Virgin Media don't mention the words "Apple", "Mac" or "Wireless". They will use any excuse to say they don't support it. Just saying you're setting up a generic router, and need help and they're more open. If they ask the make of the router, fabricate something like a "Belkin router". As I said they're just keen to get you off their backs than anything. Good luck!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-2710244428956095252?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/2710244428956095252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=2710244428956095252' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2710244428956095252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2710244428956095252'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/08/setting-up-apple-airport-exreme-router.html' title='Setting up an Apple Airport Exreme Router with Virgin Media set-top box'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-1385403213666511638</id><published>2007-08-04T22:48:00.000+01:00</published><updated>2007-08-04T22:51:10.325+01:00</updated><title type='text'>Grails Employment Oppurtunities</title><content type='html'>Couple of requests for &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; developers (yeh that means Java developers ;-) have appeared on the mailing list over the last couple of days:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.nabble.com/Grails-Groovy-Jobs-in-Halifax%2C-NS%2C-CANADA-tf4217724.html" framed_href="http://www.nabble.com/Grails-Groovy-Jobs-in-Halifax%2C-NS%2C-CANADA-tf4217724.html"&gt;Grails/Groovy Jobs in Halifax, NS, CANADA&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.nabble.com/forum/ViewPost.jtp?post=11959266&amp;framed=y" target="ViewPost" id="nabble.link11959266"&gt;Grails Developer Needed&lt;/a&gt; &lt;img id="nabble.flag11959266" src="http://www.nabble.com/images/icon_flagged.png" style="display: none;" border="0" height="15" width="15" /&gt; &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-1385403213666511638?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/1385403213666511638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=1385403213666511638' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1385403213666511638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1385403213666511638'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/08/grails-employment-oppurtunities.html' title='Grails Employment Oppurtunities'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-8279648206006770153</id><published>2007-08-03T11:19:00.000+01:00</published><updated>2007-08-03T11:41:44.719+01:00</updated><title type='text'>Grails more Productive than Rails? Surely not you say?</title><content type='html'>Software consultancy &lt;a href="http://alterlabs.com/technologies/java/grails-vs-rails-the-thrilla-in-manilla-a-study-on-grails-productivity/"&gt;ALTERthought&lt;/a&gt; posted an analysis of their discovery that &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; is more productive (for them) than Rails.  Queue outcry from the Rails crowd including the usual "You stupid Java guys, what the hell do you know" kind of commentry. All rather entertaining.&lt;br /&gt;&lt;br /&gt;Of course, having done my bit of Rails dev I don't actually believe that Grails or Rails are more productive than each other if you're using purely Groovy (in the case of Grails) or purely Ruby (in the case of Rails). In fact Rails might still have the edge here due to its greater maturity, nevertheless if you're mixing Java into the picture their is really only one winner. This is what the ALTERthought guys have discovered on their Fortune 200 Grails project.&lt;br /&gt;&lt;br /&gt;It is of course a growing trend. &lt;a href="http://relevancellc.com/2007/8/1/relevance-welcomes-jason-rudolph-as-principal-software-engineer"&gt;More&lt;/a&gt; and &lt;a href="http://alterlabs.com/technologies/java/grails-vs-rails-the-thrilla-in-manilla-a-study-on-grails-productivity/"&gt;more&lt;/a&gt; and &lt;a href="http://mnteractive.com/archive/mnteractive-profile-refactr/"&gt;more&lt;/a&gt; consultancies are discovering that Grails is easier to integrate with existing Java and legacy systems.  With Grails you can do things like:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Use an existing Hibernate domain model written in Java and still get the benefit of dynamic finders, persistence methods etc.&lt;/li&gt;&lt;li&gt;Re-use existing Spring services as Grails built entirely on Spring with all its enterprise application integration goodness&lt;/li&gt;&lt;li&gt;Leverage an array of enterprise proven technologies such as Sitemesh, Quartz, Lucene, Compass ... (this list could go on)&lt;/li&gt;&lt;li&gt;And in the upcoming 0.6 release, thanks to contributions from &lt;a href="http://jetbrains.com/"&gt;JetBrains&lt;/a&gt;, you can jointly compile Java &amp;amp; Groovy and have circular references between the Groovy and Java code (a Groovy class is just a Java class after all)&lt;/li&gt;&lt;/ol&gt;People of course automatically raise the JRuby on Rails argument, but as of this writing you can't do 1) or 4) of the above list whilst 2) requires some trickery.&lt;br /&gt;&lt;br /&gt;The other revelation that Java people are discovering is that they no longer need to abandon their existing Java knowledge to get RAD development. The Java platform now has its answer to Rails, why go else where?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-8279648206006770153?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/8279648206006770153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=8279648206006770153' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/8279648206006770153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/8279648206006770153'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/08/grails-more-productive-than-rails.html' title='Grails more Productive than Rails? Surely not you say?'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-7190295412553172237</id><published>2007-07-18T15:48:00.000+01:00</published><updated>2007-07-18T16:51:02.018+01:00</updated><title type='text'>Method missing in Groovy - Part 2</title><content type='html'>In my &lt;a href="http://graemerocher.blogspot.com/2007/07/dealing-with-method-missing-with.html"&gt;previous post&lt;/a&gt; I showed how to use invokeMethod to provide "method missing" behaviour in Groovy. Well, if you're prepared to live on the cutting edge and install the latest &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; 1.1 beta 3 code from &lt;a href="http://svn.groovy.codehaus.org/"&gt;SVN&lt;/a&gt; then you can try out Groovy's new "method missing" feature that will be more familiar to Ruby programmers.&lt;br /&gt;&lt;br /&gt;This came about after I had a productive discussion with &lt;a href="http://headius.blogspot.com/"&gt;Charles Nutter&lt;/a&gt; of JRuby, and in the spirit of cross pollination here is the example from my previous post using the new "method missing" feature of the upcoming Groovy 1.1 release:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;1 def dynamicMethods = [...]&lt;br /&gt;2 Book.metaClass.'static'.methodMissing = { String methodName, args -&gt;&lt;br /&gt;3   StaticMethodInvocation method =&lt;br /&gt;4           dynamicMethods.find { it.isMethodMatch(methodName) }&lt;br /&gt;5   if(method) {&lt;br /&gt;6        Book.metaClass.'static'."$methodName" = { Object[] varArgs -&gt;&lt;br /&gt;7            method.invoke(Book.class, methodName, varArgs)&lt;br /&gt;8        }&lt;br /&gt;9        result = method.invoke(Book.class, methodName, args)                                                                                                   &lt;br /&gt;10   }&lt;br /&gt;11   else {&lt;br /&gt;12       throw new MissingMethodException(methodName, Book.class, args)&lt;br /&gt;13   }&lt;br /&gt;14   result&lt;br /&gt;15 }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So what is the difference between this and invokeMethod? Well invokeMethod will deal with every method call and hence has a certain amount of overhead. The behaviour of invokeMethod is more useful for AOP type use cases where you need to intercept a method call and wrap behaviour around the invocation.&lt;br /&gt;&lt;br /&gt;The "method missing" approach will only take effect when a method is not found to invoke using the normal runtime and hence has no additional overhead plus the code is a bit more concise. Thanks for the help Charles! ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-7190295412553172237?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/7190295412553172237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=7190295412553172237' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/7190295412553172237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/7190295412553172237'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/07/method-missing-in-groovy-part-2.html' title='Method missing in Groovy - Part 2'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-6809075893780819860</id><published>2007-07-16T16:05:00.000+01:00</published><updated>2007-07-18T16:51:39.936+01:00</updated><title type='text'>Dealing with method missing with Groovy's MetaClass system</title><content type='html'>One of the new features coming up in &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; 1.1 to be released later this year is &lt;a href="http://groovy.codehaus.org/ExpandoMetaClass"&gt;ExpandoMetaClass&lt;/a&gt;. Its an elegant API to programatically extend a class' functionality with Groovy's Meta Object Protocol (MOP).&lt;br /&gt;&lt;br /&gt;An example of how we take advantage of this is &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt;' dynamic finders in &lt;a href="http://grails.org/GORM"&gt;GORM&lt;/a&gt;. Dynamic finders allow you to do things like Book.findByTitleAndAuthor("It", "Stephen King"). So how are these implemented in Grails?&lt;br /&gt;&lt;br /&gt;First we defined an interface that allows the matching of a method signature to a given method pattern. That interface goes something like this:&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;interface StaticMethodInvocation {&lt;br /&gt;   boolean isMethodMatch(String methodName)&lt;br /&gt;   Object invoke(Class theClass, String methodName, Object[] args)&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The implementation of this interface just uses regular expressions to match the method signature. Simple enough. So how do we use this from the MetaClass itself? Well, this is where the magic of ExpandoMetaClass comes in as it allows us to override a static "invokeMethod" in Groovy:&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;1 def dynamicMethods = [...]&lt;br /&gt;2 Book.metaClass.'static'.invokeMethod = { String methodName, args -&gt;&lt;br /&gt;3    def metaMethod = Book.metaClass.getStaticMetaMethod(methodName, args)&lt;br /&gt;4    def result&lt;br /&gt;5    if(metaMethod) {&lt;br /&gt;6         result = metaMethod.invoke(dc.clazz, args)&lt;br /&gt;7    }&lt;br /&gt;8    else {&lt;br /&gt;9         StaticMethodInvocation method =&lt;br /&gt;10                dynamicMethods.find { it.isMethodMatch(methodName) }&lt;br /&gt;11        if(method) {&lt;br /&gt;12            Book.metaClass.'static'."$methodName" = { Object[] varArgs -&gt;&lt;br /&gt;13               method.invoke(Book.class, methodName, varArgs)&lt;br /&gt;14            }&lt;br /&gt;15            result = method.invoke(Book.class, methodName, args)                                                                                                    &lt;br /&gt;16         }&lt;br /&gt;17         else {&lt;br /&gt;18             throw new MissingMethodException(methodName, Book.class, args)&lt;br /&gt;19         }&lt;br /&gt;20    }&lt;br /&gt;21    result&lt;br /&gt;22 }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So what is actually happening here? First we look to see if the method already exists&lt;br /&gt;on the line:&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;3    def metaMethod = Book.metaClass.getStaticMetaMethod(methodName, args)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If it does we simply invoke the method:&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;6    result = metaMethod.invoke(dc.clazz, args)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Otherwise we attempt to find a method that matches the method signature using a previously defined list of StaticMethodInvocation instances:&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;9    StaticMethodInvocation method =&lt;br /&gt;10          dynamicMethods.find { it.isMethodMatch(methodName) }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If the method exists we dynamically register a new method on the MetaClass so that the next time the method is invoked it doesn't have to go through the matching process and will simply dispatch like normal:&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;12    Book.metaClass.'static'."$methodName" = { Object[] varArgs -&gt;&lt;br /&gt;13         method.invoke(dc.clazz, methodName, varArgs)&lt;br /&gt;14    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Finally, we invoke the method itself, or if the method isn't matched we throw a MethodMissingException:&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;15    result = method.invoke(dc.clazz, methodName, args) &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Job done. As simple as that ;-)&lt;br /&gt;&lt;br /&gt;I'm doing a talk at the &lt;a href="http://grails-exchange.com/"&gt;Grails eXchange&lt;/a&gt; about the &lt;a href="http://grails.org/Plugins"&gt;Grails plug-in system&lt;/a&gt; and how we dynamically extend the behaviour of classes. See you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-6809075893780819860?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/6809075893780819860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=6809075893780819860' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6809075893780819860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6809075893780819860'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/07/dealing-with-method-missing-with.html' title='Dealing with method missing with Groovy&apos;s MetaClass system'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-3705772142481507878</id><published>2007-07-06T15:09:00.000+01:00</published><updated>2007-07-06T15:21:03.993+01:00</updated><title type='text'>Groovy 1.1 beta 2 out. Configuration made easy with ConfigSlurper</title><content type='html'>So we've put out the 1.1 beta 2 release of &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt;, which is a really significant milestone for the project. Guillaume has &lt;a href="http://glaforge.free.fr/weblog/index.php?itemid=219"&gt;the lowdown&lt;/a&gt; of all the new features in his blog.&lt;br /&gt;&lt;br /&gt;One of the things I worked on for this release was a new utility class called ConfigSlurper. It allows you to write configuration files as Groovy scripts in a Java properties file like format. What advantage does this give you?&lt;br /&gt;&lt;br /&gt;1) You get to take advantage of native Java types and not do type conversion from properties&lt;br /&gt;2) You can use "global variables" and write more DRY configurations&lt;br /&gt;3) You can take advantage of Groovy's advanced syntax for lists and maps to make config easier&lt;br /&gt;&lt;br /&gt;Here is an example of configuring log4j with a ConfigSlurper script:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;log4j.appender.stdout = "org.apache.log4j.ConsoleAppender"&lt;br /&gt;log4j.appender."stdout.layout"="org.apache.log4j.PatternLayout"&lt;br /&gt;log4j.rootLogger="error,stdout"&lt;br /&gt;log4j.logger.org.springframework="info,stdout"&lt;br /&gt;log4j.additivity.org.springframework=false&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Not that disimilar from standard Java properties files and you can convert to and from Java properties files, merge configurations and serialize them back to disk. To use this this script you can use the ConfigSlurper class to parse it:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def config = new ConfigSlurper().parse(new File('myconfig.groovy').toURL())&lt;br /&gt;&lt;br /&gt;assert "info,stdout" == config.log4j.logger.org.springframework&lt;br /&gt;assert false == config.log4j.additivity.org.springframework&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;We're using this as our primary means to deal with necessary configuration (not possible by convention in &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt;. Checkout some more examples of its usage &lt;a href="http://groovy.codehaus.org/ConfigSlurper"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-3705772142481507878?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/3705772142481507878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=3705772142481507878' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3705772142481507878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3705772142481507878'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/07/groovy-11-beta-2-out-configuration-made.html' title='Groovy 1.1 beta 2 out. Configuration made easy with ConfigSlurper'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-4468646442227857030</id><published>2007-07-06T14:56:00.000+01:00</published><updated>2007-07-06T15:04:45.740+01:00</updated><title type='text'>Getting JetGroovy up and running with IntelliJ IDEA</title><content type='html'>I've blogged about it before, but I can't express how impressed I am by the work &lt;a href="http://jetbrains.com"&gt;JetBrains&lt;/a&gt; have done on their &lt;a href="http://www.jetbrains.net/confluence/display/GRVY/Groovy+Home"&gt;Groovy plugin&lt;/a&gt;. Code completion, CTRL+click navigation from Groovy to Java and Java to Groovy, some refactoring support, joint compilation of Groovy and Java. JetGroovy really makes mixing Groovy &amp; Java in the same codebase completely seamless.&lt;br /&gt;&lt;br /&gt;How do you get setup? Follow these steps:&lt;br /&gt;&lt;br /&gt;1) Download and install the IDEA 7.0 EAP from &lt;a href="http://www.jetbrains.net/confluence/display/IDEADEV/Selena+EAP"&gt;here&lt;/a&gt;&lt;br /&gt;2) Download a stable binary of JetGroovy from &lt;a href="http://www.jetbrains.net/confluence/pages/viewpageattachments.action?pageId=27731"&gt;here&lt;/a&gt;&lt;br /&gt;3) Unzip the zip file into the IDEA_HOME/plugins directory&lt;br /&gt;4) Start IDEA&lt;br /&gt;5) Open up the JetGroovy preferences dialog in Settings/Groovy&amp;amp;Grails and point IDEA to your Groovy &amp;amp; Grails installs&lt;br /&gt;6) You're done&lt;br /&gt;&lt;br /&gt;Make sure you checkout the feature tour &lt;a href="http://www.jetbrains.net/confluence/display/GRVY/Groovy+Home"&gt;here&lt;/a&gt;. If you're not a IntelliJ user, don't forget their is also a lot of excellent work happening around the &lt;a href="http://groovy.codehaus.org/Eclipse+Plugin"&gt;Eclipse plugin&lt;/a&gt;. Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-4468646442227857030?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/4468646442227857030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=4468646442227857030' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4468646442227857030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4468646442227857030'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/07/getting-jetgroovy-up-and-running-with.html' title='Getting JetGroovy up and running with IntelliJ IDEA'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-2101073568633620102</id><published>2007-07-05T21:24:00.000+01:00</published><updated>2007-07-12T12:26:00.894+01:00</updated><title type='text'>5 More Misconceptions About Grails</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Update: &lt;/span&gt;&lt;a href="http://www.infoq.com"&gt;InfoQ&lt;/a&gt; have featured the two article's in a &lt;a href="http://www.infoq.com/news/2007/07/grails-misconceptions"&gt;Grails Misconceptions&lt;/a&gt; post. Discuss!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;committer&lt;/span&gt; Marc Palmer posted a &lt;a href="http://www.anyware.co.uk/2005/2007/07/02/10-common-misconceptions-about-grails/"&gt;nice entry&lt;/a&gt; expressing 10 common misconceptions about Grails and what it is about.&lt;br /&gt;&lt;br /&gt;This was linked to from another interesting post entitled &lt;a href="http://alterlabs.com/articles/blasphemy-the-case-against-ruby-on-rails/"&gt;Blasphemy: The case against Rails&lt;/a&gt;, which highlights the strength of Java and the how "Groovy/Grails is proving itself to be a formidable challenger".&lt;br /&gt;&lt;br /&gt;An interesting aspect of the above post however, was the reaction of Ruby/Rails users to the outrageous comment that Grails is a more realistic alternative in the enterprise.  Some of the comments including even more classic misconceptions and knee-jerk reactions which I will address in this post. My 5 misconceptions are a bit more long-winded than Marc's, but I think it is needed to address each one completely:&lt;br /&gt;&lt;br /&gt;1) "Who needs Grails when we have &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;JRuby&lt;/span&gt; on Rails?"&lt;br /&gt;&lt;br /&gt;This is a classic and is the foundations for one of the biggest misconceptions about what Grails is. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;JRuby&lt;/span&gt; on Rails is an excellent way to run Rails apps on a Java &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;EE&lt;/span&gt; container like &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;GlassFish&lt;/span&gt;. End of story. Grails has very different goals. It is not a port of Rails to the Groovy language. It is the act of bringing together solid industrial strength components like Spring, Hibernate, Quartz, Compass, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Sitemesh&lt;/span&gt; etc. and making them DRY by embracing convention-over-configuration.&lt;br /&gt;&lt;br /&gt;We're not re-inventing the wheel and because the vast majority of the core of Grails is Java it is more robust and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;performant&lt;/span&gt;. Grails is actually a Spring &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;MVC&lt;/span&gt; application at its core and is &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;deployable&lt;/span&gt; onto all major containers, not just &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Glassfish&lt;/span&gt;, including the big commercial ones such as &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;WebLogic&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;WebSphere&lt;/span&gt; and Oracle AS.&lt;br /&gt;&lt;br /&gt;2) "Why use Groovy 'the half-way house' instead of just going for Ruby?"&lt;br /&gt;&lt;br /&gt;This is another one that is often quoted all over the place. Why bother choosing Groovy when Ruby has the same features (some argue more)? Well this one misses the aims and goals of Groovy completely. Groovy IS NOT intended as a replacement for Java. Groovy (and Grails) are designed to be used symbiotically with Java.&lt;br /&gt;&lt;br /&gt;Java is a great programming language for many general tasks, don't let the zealots persuade you otherwise. In the same sense Groovy is excellent at what its good at. For example Java is great for writing complex business logic or low-level plumbing code. Groovy is better at a higher level. Groovy and Java are meant to be used &lt;span style="font-weight: bold;"&gt;together&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;This is starting to become more clear with the development of Groovy &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;IDE&lt;/span&gt; support. The &lt;a href="http://www.jetbrains.net/confluence/display/GRVY/Groovy+Home"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;JetGroovy&lt;/span&gt;&lt;/a&gt; plug-in from &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;IntelliJ&lt;/span&gt; allows you to have circular references between Groovy and Java code and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;ctrl&lt;/span&gt;-click navigate from Groovy classes/methods to Java and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;vica&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;versa&lt;/span&gt;. It is awesome stuff. Groovy developers use Groovy because we love Java, the language, the libraries and the platform.&lt;br /&gt;&lt;br /&gt;3) "Why is Grails more suitable than Rails for the enterprise?"&lt;br /&gt;&lt;br /&gt;A number of reasons. Two of the biggest ones are Spring &amp; Hibernate. As it stands to day a enormous number of organisations are using Spring &amp;amp; Hibernate. They have existing Spring context, existing Hibernate domain models, and so on.&lt;br /&gt;&lt;br /&gt;I was in this same situation before I started working in Grails. Grails is designed to integrate with these frameworks as seamlessly as possible. So for example you can drop a Hibernate domain model written in Java and mapping files into a Grails app and start using dynamic finders and &lt;a href="http://grails.org/GORM"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;GORM&lt;/span&gt;&lt;/a&gt; straight away.&lt;br /&gt;&lt;br /&gt;In addition Grails &lt;a href="http://grails.org/Controllers"&gt;controllers&lt;/a&gt; use standard &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;Servlet&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;API&lt;/span&gt; objects like request, response, session etc. and can sit alongside other &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;servlets&lt;/span&gt;. It is after all just a Spring &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;MVC&lt;/span&gt; application under the covers. Rails on the other hand is designed almost in a way &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;EJB&lt;/span&gt;2 was designed (shock, horror bear with me while I qualify this). In &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_24"&gt;other words&lt;/span&gt; you extend framework objects like &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;ActiveController&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;ActiveRecord&lt;/span&gt; etc. which bind you to the framework.&lt;br /&gt;&lt;br /&gt;There is also no such thing as a domain model in Rails. Rails models are database tables. This is all well and good, but in enterprises the same domain model is often re-used in multiple applications both desktop and web. This is effectively accomplished in Java by packaging the classes with the mapping files in a JAR.&lt;br /&gt;&lt;br /&gt;4) "Groovy/Grails are not a credible competitor to Ruby/Rails"&lt;br /&gt;&lt;br /&gt;This one is entertaining. Often the credibility of Grails is questioned because it is newer and has a smaller &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;userbase&lt;/span&gt;. However my view on this takes me back to the foundations of Grails. Grails is built on very credible technologies. This point was also addressed nicely in Marc's post.&lt;br /&gt;&lt;br /&gt;The other area to consider is the arenas that are being competed in. Grails has two goals primary goals. The first goal is to create a web application framework that is easy, elegant and DRY without sacrificing the platform, technologies and tools on which the Java community is built on. A framework that is suitable for enterprise scenarios (see above). &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;DHH&lt;/span&gt; was quite happy to dismiss the importance of the enterprise, we're not.&lt;br /&gt;&lt;br /&gt;The second goal is to lower the barrier of entry for Java web development. Make Java web development as easy as Ruby/Rails development. Now these are generally conflicting goals, but on the whole we've done a pretty good job at meeting both requirements up until now. Whether Grails will receive more adoption in one man shops and small companies is up for debate, personally I see it being adopted more in larger organisations.&lt;br /&gt;&lt;br /&gt;5) "Why bother with Groovy when Ruby is backed by Sun?"&lt;br /&gt;&lt;br /&gt;Sun were kind enough to lend a hand to the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;JRuby&lt;/span&gt; project in their hour of need and should be applauded for doing so. However my standard answer to this one is the best things rarely come directly from Sun (Spring, Hibernate etc. etc.).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-2101073568633620102?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/2101073568633620102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=2101073568633620102' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2101073568633620102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2101073568633620102'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/07/5-more-misconceptions-about-grails.html' title='5 More Misconceptions About Grails'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-3407034960895938541</id><published>2007-06-29T16:09:00.000+01:00</published><updated>2007-06-29T17:31:47.429+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy seam grails'/><title type='text'>Seam 2.0 beta with Groovy Support</title><content type='html'>Just wanted to say congrats to the Seam guys who have &lt;a href="http://www.infoq.com/news/2007/06/seam2beta"&gt;added Groovy support&lt;/a&gt; to the latest 2.0 beta. I know they (Gavin, Emmanuel etc.) have been putting a lot of hard work into making Seam easy to use whilst still trying to remain true to the Java EE standards and I think adding dynamic language support, in the shape of &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt;, is a great step in the right direction. &lt;br /&gt;&lt;br /&gt;I've said it before and I'll say it again, one of the reasons the Java eco-system is so fantastic is &lt;b&gt;you have a choice&lt;/b&gt;. Sometimes too much of a choice, but it is a wonderful space to be in.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-3407034960895938541?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/3407034960895938541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=3407034960895938541' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3407034960895938541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3407034960895938541'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/06/seam-20-beta-with-groovy-support.html' title='Seam 2.0 beta with Groovy Support'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-2139087679165570172</id><published>2007-06-27T16:03:00.000+01:00</published><updated>2007-06-27T18:01:17.900+01:00</updated><title type='text'>RE: Is Scala the new Groovy?</title><content type='html'>Well it looks like Alex Blewitt has taken the time to excrete &lt;a href="http://alblue.blogspot.com/2007/06/java-is-scala-new-groovy.html"&gt;some more&lt;/a&gt; complete and utter rubbish all over the blog-o-sphere. Clearly, Alex got &lt;a href="http://alblue.blogspot.com/2004/07/groovy-is-almost-here.html"&gt;screwed over&lt;/a&gt; big time by the Geronimo guys and is feeling rather, well, left out and hence has chosen to vent his anger on the projects that James Strachan has participated in. Like &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;His article is a complete and utter joke from start to finish. Where shall we begin. First using his clearly limited knowledge of Groovy he claims that it is interpreted. Here is a wake-up call Alex, no it isn't. Groovy is compiled down to byte-code. In fact its not even some weird proxy-like byte code, a Groovy class &lt;span style="font-weight: bold;"&gt;is&lt;/span&gt; a Java class.&lt;br /&gt;&lt;br /&gt;He then claims that you can run Groovy on a "cut-down VM". I mean what planet is this guy on? Groovy runs in the standard VM, Alex. Yeh seriously. He even can't get his JRuby facts straight, calling on all his knowledge to claim JRuby doesn't support all of C Ruby's semantics. I think Charles would have a word to say about that.&lt;br /&gt;&lt;br /&gt;He then claims that Groovy doesn't have a presence in the enterprise like Python and er.. Ruby? Alex, seriously, have you been in an enterprise lately? They run Java. No joke. Sometimes you get some C# on the client, but seriously Groovy has plenty of presence and there are multiple success stories on this area. In fact Groovy tends to be "just used", without justification obtained, its just another JAR after all.&lt;br /&gt;&lt;br /&gt;He claims the Groovy community has a "not-invented here" syndrome. Listen Alex, I'm quite happy to inform you that we based many of the ideas in Grails on Rails and even some of the ideas in GSP on JSP.  It seems to me with your Geronimo-envy that it is you that has the problem.&lt;br /&gt;&lt;br /&gt;Next-up, he shifts his all knowing, educated knowledge onto the topic of Scala, claiming its a dynamic language to rule all other dynamic languages. Scala is a great language and together Groovy and Scala are phenomenal additions to a Java programmers toolkit, but Alex Scala is not a dynamic language. You seriously need to do your research before writing such complete nonsense.&lt;br /&gt;&lt;br /&gt;Scala is a statically typed language with support for functional programming with anonymous functions and closures as well as type inference. It is not, however a dynamic language nor did the designers ever intend it to be.  It also has great support for parallel programming, so if you're a Java programmer check it out, but don't check it out because "it is the new Groovy" as Alex claims as you'll be sadly disappointed.&lt;br /&gt;&lt;br /&gt;Just to be clear, for the benefit of Alex, Groovy is a dynamic language that supports meta-programming and a Meta-Object Protocol (MOP) like Smalltalk, Ruby and to a certain extent Python.  Scala is a statically typed language that supports functional programming more like Haskell.&lt;br /&gt;&lt;br /&gt;In fact I should probably do another &lt;a href="http://graemerocher.blogspot.com/2007/06/grails-vs-rails-myth-1-grails-has.html"&gt;Myth #X &lt;/a&gt;post and just point it to his blog post with a big sign saying "read this and believe none of it". Hopefully, after a few more blog posts that rip into James' previous projects Alex will have exercised his demons and the blog-o-sphere can return to peace.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-2139087679165570172?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/2139087679165570172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=2139087679165570172' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2139087679165570172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2139087679165570172'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/06/re-is-scala-new-groovy.html' title='RE: Is Scala the new Groovy?'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-3781323261387580759</id><published>2007-06-22T18:05:00.000+01:00</published><updated>2007-06-22T19:10:51.335+01:00</updated><title type='text'>British Airways: The biggest shambles this side of the Atlantic</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Update: &lt;/span&gt;My flight has now been delayed until 22:03 since writing this article. It gets better. How they managed to estimate that time &lt;span style="font-weight: bold;"&gt;to the minute&lt;/span&gt; is beyond me. If BA were as good at arriving on time as they are at calculating how long their flights are delayed for we would be sorted.&lt;br /&gt;&lt;br /&gt;So I am sitting here in Glasgow Airport (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;yeh&lt;/span&gt; that would be Glasgow, Scotland) waiting for my &lt;a href="http://ba.com/"&gt;British Airways&lt;/a&gt; flight, which was due to depart at 19:40. However, much to my disgust it has been delayed to 21:20. Now it is not unusual for flights to be delayed, however this is the sixth time I have flown BA in the last 6 months and guess what? Every single flight has been delayed both going out and coming back.&lt;br /&gt;&lt;br /&gt;The first time I was like "Well, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;ok&lt;/span&gt;. Every airline has flight delays, even BA!". Then the next time I was "Oh, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;hmm&lt;/span&gt; this is really not good of BA, they're usually so reliable". The third time my demeanor slowly degraded "This is really &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;unacceptable&lt;/span&gt;, I can't believe an airline like BA can get it wrong so often". And today? Well I'm fuming. I am beyond angry at this steaming pile of the proverbial that calls itself our national airline.&lt;br /&gt;&lt;br /&gt;Due to BA I am instead sitting in Glasgow Airport's below par canteen for dinner instead of having a home cooked meal. Because of BA I am relegated to sneaking into my house in the middle of the night and tip toeing up to bed whilst the rest of my family sleep, instead of being able to be welcomed home at a decent hour. I am honestly disgusted.&lt;br /&gt;&lt;br /&gt;It is not like I have not used other airlines. I have flown on &lt;a href="http://ryanair.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Ryanair&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://easyjet.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;EasyJet&lt;/span&gt;&lt;/a&gt; and Iberia in the last 6 months and none of them have been delayed. How can BA claim it is a "superior" airline to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Ryanair&lt;/span&gt; and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;EasyJet&lt;/span&gt; when it can't even get the basics right? I mean seriously, on two previous occasions with BA they even managed to lose my flight details even though we had booked the flight and had evidence of doing so!&lt;br /&gt;&lt;br /&gt;Just to round the picture off when you actually do get on the flight the food is diabolical, at least on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;EasyJet&lt;/span&gt; and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Ryanair&lt;/span&gt; you pay for what you get. In all honesty BA are a sham, a complete disaster. They are worse than &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;EasyJet&lt;/span&gt; and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;Ryanair&lt;/span&gt;. In fact I would go as far as saying they are perpetuating false advertising with their marketing &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_12"&gt;campaigns&lt;/span&gt; that attempt to place them as a "quality" airline.&lt;br /&gt;&lt;br /&gt;The funny thing is if you tell someone who actually works for BA this, the first thing they do is blame the ground stuff at BAA. Now I'm sure that the ground staff are equally incompetent, but for heaven's sake the problem has to be corrected somewhere in the chain. Personally, I'm of the view now that there is no compelling reason to chose BA over a budget airline like &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;Ryanair&lt;/span&gt; or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;EasyJet&lt;/span&gt;. BA are quite simply awful, and unfortunately for them the leather seats don't make up for it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-3781323261387580759?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/3781323261387580759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=3781323261387580759' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3781323261387580759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3781323261387580759'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/06/british-airways-biggest-shambles-this.html' title='British Airways: The biggest shambles this side of the Atlantic'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-3167542465036490589</id><published>2007-06-21T14:41:00.000+01:00</published><updated>2007-06-21T14:58:24.810+01:00</updated><title type='text'>Grails vs Rails Myth #1: Grails has a fraction of what Rails has to offer</title><content type='html'>In this &lt;a href="http://info.michael-simons.eu/2007/06/21/ruby-on-rails-the-java-way-grails"&gt;post&lt;/a&gt; the author proclaims boldly that &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; has a "fraction of RoRs functionality". So in the spirit of &lt;a href="http://www.relevancellc.com/2007/6/6/ruby-vs-java-myth-5-it-s-a-zero-sum-game"&gt;Relevance&lt;/a&gt;'s myth series (I'm not sure I'll do more than one of these, we'll see) let me sum up my feelings on this.&lt;br /&gt;&lt;br /&gt;I would like to have jumped right onto the Rails bandwagon if it hadn't been for the fact that ActiveRecord offers only a fraction of what &lt;a href="http://hibernate.org"&gt;Hibernate&lt;/a&gt; does.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Where is the proper transaction &amp;amp; conversation support?&lt;/li&gt;&lt;li&gt;Why is it that it hits the db orders of magnitude harder that Hibernate does and is infinitely slower?&lt;/li&gt;&lt;li&gt;Where is the criteria support? What about distributed caching?&lt;/li&gt;&lt;/ul&gt;I would be Ruby maniac right now if Ruby didn't offer only a fraction of what is available in Java. From the reams of web frameworks, to the dozens of persistence engines, to distributed caches, enterprise integration tools and testing frameworks. Java has it all. There is literally a library for everything.&lt;br /&gt;&lt;br /&gt;And I would probably have said a long goodbye to Java, if it wasn't for the fantastic innovation that is happening in projects like &lt;a href="http://springframework.org"&gt;Spring&lt;/a&gt; and &lt;a href="http://hibernate.org"&gt;Hibernate&lt;/a&gt; and the libraries that integrate with them (Quartz, Sitemesh, Compass, Acegi, Webflow et al) which Grails is built on. Want an RMI, burlap, http, soap or DWR service? &lt;a href="http://grails.org/DWR+Plugin"&gt;Just&lt;/a&gt; &lt;a href="http://grails.org/Remoting+Plugin"&gt;expose&lt;/a&gt; &lt;a href="http://grails.org/XFire+plugin"&gt;one&lt;/a&gt;. Need advanced declarative security at the web and business layer level? Plug it &lt;a href="http://grails.org/AcegiSecurity+Plugin"&gt;right in&lt;/a&gt;. Job scheduling? Job &lt;a href="http://grails.org/Quartz+plugin"&gt;done&lt;/a&gt;. Search? Sure &lt;a href="http://grails.org/Searchable+Plugin"&gt;no problem&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Spring and all the projects that integrate with it, make the Java ecosystem a very happy place indeed. So no, Grails might not have RJS (yet), migrations (yet) or xyz feature from Rails, but it has plenty, thanks to the Java eco-system, to make up for it and then some.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-3167542465036490589?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/3167542465036490589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=3167542465036490589' title='24 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3167542465036490589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3167542465036490589'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/06/grails-vs-rails-myth-1-grails-has.html' title='Grails vs Rails Myth #1: Grails has a fraction of what Rails has to offer'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>24</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-2390905114109134727</id><published>2007-06-14T08:25:00.000+01:00</published><updated>2007-06-14T08:38:27.549+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apple safari google'/><title type='text'>Open Letter to Google: Fix Gmail on Safari</title><content type='html'>Dear Google,&lt;br /&gt;&lt;br /&gt;I'm a regular Gmail user on the Mac. I love Gmail, but I'm torn because I love Safari too. Now that Safari 3 beta is out I feel particularily left out because Gmail is so fundamentally broken on Safari. Maybe there are some deep technical reasons why Gmail doesn't work in Safari 2, but I hope that they can be addressed on Safari 3. So Google, please, please address the following issues so I don't have to keep using Camino for Gmail:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The back button - this is the most annoying and it is fundamentally broken on Safari. It keeps taking you back to the loading screen. Please fix this it makes Gmail on Safari unusable&lt;/li&gt;&lt;li&gt;Google Chat - this simply disappears on Safari. Please enable this feature as it too cripples Gmail&lt;/li&gt;&lt;/ul&gt;With these two problems recitified I would have entered Gmail on Mac nirvana and with Apple and Google's apparent close working relationship these issues should really be addressed otherwise Steve's claim of Safari being the best browser in the world (although this is clearly part of the Jobs reality distortion field) just doesn't hold true and neither does Google's commitment to Apple.&lt;br /&gt;&lt;br /&gt;Regards,&lt;br /&gt;Graeme Rocher&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-2390905114109134727?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/2390905114109134727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=2390905114109134727' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2390905114109134727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2390905114109134727'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/06/open-letter-to-google-fix-gmail-on.html' title='Open Letter to Google: Fix Gmail on Safari'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-7847962224994577680</id><published>2007-06-01T18:00:00.000+01:00</published><updated>2007-06-01T19:35:15.441+01:00</updated><title type='text'>Dynamic Groovy: Groovy's Equivalent to Ruby Open Classes</title><content type='html'>A lot of hype has been made of Ruby's open classes, and for good reason as they're pretty darn cool.  Since &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; classes compile down to byte code (ie a Groovy class is a Java class) it has always been a little more problematic to add dynamic features to classes you don't have control over.&lt;br /&gt;&lt;br /&gt;If you're the class implementor for example you could override invokeMethod and getProperty, but if you're not your only option was &lt;a href="http://docs.codehaus.org/display/GROOVY/Groovy+Categories"&gt;Groovy categories&lt;/a&gt;, which aren't nearly as elegant, or implementing your own custom &lt;a href="http://groovy.codehaus.org/api/groovy/lang/MetaClass.html"&gt;MetaClass&lt;/a&gt; which exposed you to Groovy internals and wasn't very fun.&lt;br /&gt;&lt;br /&gt;However, this is all changing because I've just committed major improvements and written the documentation for Groovy's dynamic meta class mechanism, the &lt;a href="http://groovy.codehaus.org/ExpandoMetaClass"&gt;ExpandoMetaClass&lt;/a&gt;.  This is the system I discussed with &lt;a href="http://memeagora.blogspot.com/"&gt;Neal Ford&lt;/a&gt; at JavaOne who felt, prior to our discussion, that Ruby had the upper hand because of open classes. After our discussion and a short demo of what ExpandoMetaClass is capable of, Neal changed his mind and upgraded Groovy's rating on his language scale.&lt;br /&gt;&lt;br /&gt;So in the next beta release, you'll see a new improved version of ExpandoMetaClass with features such as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The ability to &lt;a href="http://groovy.codehaus.org/ExpandoMetaClass+-+Interfaces"&gt;add methods onto interfaces&lt;/a&gt;&lt;/li&gt;&lt;li&gt;The ability to &lt;a href="http://groovy.codehaus.org/ExpandoMetaClass+-+GroovyObject+Methods"&gt;override invokeMethod, getProperty and setProperty&lt;/a&gt; to provide "missing method" behaviour&lt;/li&gt;&lt;li&gt;The ability to &lt;a href="http://groovy.codehaus.org/ExpandoMetaClass+-+Borrowing+Methods"&gt;"borrow" methods from other classes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;The ability to &lt;a href="http://groovy.codehaus.org/ExpandoMetaClass+-+Dynamic+Method+Names"&gt;dynamically construct method property names&lt;/a&gt; at runtime&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Improvements to thread safety whilst performing MetaClass modifications&lt;/li&gt;&lt;/ul&gt;Here is a little example:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;String.metaClass.swapCase = {-&gt;&lt;br /&gt;   def sb = new StringBuffer()&lt;br /&gt;   delegate.each {&lt;br /&gt;        sb &lt;&lt; (Character.isUpperCase(it as char) ?                    &lt;br /&gt;               Character.toLowerCase(it as char) :                     &lt;br /&gt;               Character.toUpperCase(it as char))       &lt;br /&gt;   }       &lt;br /&gt;   sb.toString() &lt;br /&gt;}  &lt;br /&gt;assert "UpAndDown" == "uPaNDdOWN".swapCase() &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;ExpandoMetaClass has been at the heart of &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; for a while, so is completely production ready. Now its time to bring it to the masses with the next beta release of Groovy targeted for the end of June.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-7847962224994577680?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/7847962224994577680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=7847962224994577680' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/7847962224994577680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/7847962224994577680'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/06/dynamic-groovy-groovys-equivalent-to.html' title='Dynamic Groovy: Groovy&apos;s Equivalent to Ruby Open Classes'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-111676359243256861</id><published>2007-05-17T15:29:00.000+01:00</published><updated>2007-05-17T17:31:18.063+01:00</updated><title type='text'>Grails + Wicket: The Wonders of the Grails Plug-in system</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Update: &lt;/span&gt;A shorter Wicket plug-in installation guide has been added &lt;a href="http://grails.org/Wicket+Plugin?nc"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A few people have been asking me recently to integrate the &lt;a href="http://wicket.sourceforge.net/"&gt;Wicket&lt;/a&gt; project as a view technology for &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt;. What is Wicket? It is a component oriented framework kind of like JSF, but unlike JSF it uses convention-over-configuration and doesn't require you to edit reams of XML. So in this sense its aims are more inline with Grails' aims.&lt;br /&gt;&lt;br /&gt;So the question was how do we integrate these two frameworks? Well I thought it couldn't be that difficult and as it turns out, it isn't. So what I did was create a plug-in with "grails create-plugin wicket". The next thing I needed were some jars, so I got Wicket 1.2.6, Wicket Extensions 1.2.6 jar and the Wicket Spring integration jars for 1.2.6 and put them in the plug-ins lib directory.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_3pq3YXk6Asw/RkyDH10lLyI/AAAAAAAAAA4/1YwtbAYtXOc/s1600-h/Picture+7.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_3pq3YXk6Asw/RkyDH10lLyI/AAAAAAAAAA4/1YwtbAYtXOc/s320/Picture+7.png" alt="" id="BLOGGER_PHOTO_ID_5065567851614908194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Job done, now we need to set-up a convention that makes sense for both Grails and Wicket:&lt;br /&gt;&lt;br /&gt;1) Since controllers are essentially roughly analogous to the Wicket Application object I decided that the convention would be to have a WebApplication.groovy file in the grails-app/controllers directory.&lt;br /&gt;2) Wickets HTML components are like the views, so they can live in the grails-app/views directory&lt;br /&gt;&lt;br /&gt;So to follow the HelloWorld example on the Wicket page we end up with something like this being the structure:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3pq3YXk6Asw/RkxpGV0lLwI/AAAAAAAAAAo/TE11GB0RcUY/s1600-h/Picture+3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_3pq3YXk6Asw/RkxpGV0lLwI/AAAAAAAAAAo/TE11GB0RcUY/s320/Picture+3.png" alt="" id="BLOGGER_PHOTO_ID_5065539238542782210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So just for clarify the WebApplication.groovy file looks like this:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;import wicket.Page;&lt;br /&gt;import wicket.spring.*;&lt;br /&gt;&lt;br /&gt;public class WebApplication extends SpringWebApplication&lt;br /&gt;{&lt;br /&gt;public Class getHomePage()&lt;br /&gt;{&lt;br /&gt;return HelloWorld.class;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Whilst HelloWorld.groovy looks like this:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;import wicket.markup.html.WebPage;&lt;br /&gt;import wicket.markup.html.basic.Label;&lt;br /&gt;&lt;br /&gt;public class HelloWorld extends WebPage&lt;br /&gt;{&lt;br /&gt;public HelloWorld()&lt;br /&gt;{&lt;br /&gt;   add(new Label("message", "Hello World!"))&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Finally, the HelloWorld.html file looks like this:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;span wicket:id="message"&gt;Message goes here&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Ok so with that done, let's take advantage of the conventions we have in place here. When I created the plug-in with "grails create-plugin" it also created me a WicketGrailsPlugin.groovy file in the root of the plugin project. Since the normal controller mechanism no longer makes sense we modify the plug-in to "evict" the controllers plug-in when installed:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class WicketGrailsPlugin {&lt;br /&gt;def version = 0.1&lt;br /&gt;def dependsOn = [:]&lt;br /&gt;def evicts = ['controllers'] // evict the controllers plugin&lt;br /&gt; ...&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;With that done we now need to configure the Wicket "applicationBean" in Spring. To do this we're going to use the GrailsApplication object and find a class that is an instance of a Wicket Application. This class just happens to be the one we defined earlier in grails-app/controllers:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import wicket.*&lt;br /&gt;class WicketGrailsPlugin {&lt;br /&gt;...&lt;br /&gt;def doWithSpring = {&lt;br /&gt;def applicationClass = application&lt;br /&gt;                                   .allClasses&lt;br /&gt;                                   .find { Application.class.isAssignableFrom(it) }&lt;br /&gt;&lt;br /&gt;if(applicationClass) {&lt;br /&gt;applicationBean(applicationClass) // defines the spring bean&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;We're of course using the Spring &lt;a href="http://grails.org/Spring+Bean+Builder"&gt;BeanBuilder&lt;/a&gt; here to define the bean definition if the Spring context. Ok job done.&lt;br /&gt;&lt;br /&gt;Now we need to modify web.xml.. but wait. In Grails even web.xml is created on the fly so other plugins can participate in its generation. So we can do this in the plug-in file again:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import wicket.*&lt;br /&gt;class WicketGrailsPlugin {&lt;br /&gt;...&lt;br /&gt;def doWithWebDescriptor = { xml -&gt;&lt;br /&gt;   def &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;servlets&lt;/span&gt; = &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;xml&lt;/span&gt;.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;servlet&lt;/span&gt;[0]&lt;br /&gt;&lt;br /&gt;   &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;servlets&lt;/span&gt; + {&lt;br /&gt;       &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;servlet&lt;/span&gt; {&lt;br /&gt;           '&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;servlet&lt;/span&gt;-name'('wicket')&lt;br /&gt;           'servlet-class'('wicket.protocol.http.WicketServlet')&lt;br /&gt;           '&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;init&lt;/span&gt;-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;param&lt;/span&gt;' {&lt;br /&gt;               '&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;param&lt;/span&gt;-name'('&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;applicationFactoryClassName&lt;/span&gt;')&lt;br /&gt;               'param-value'('wicket.spring.SpringWebApplicationFactory')&lt;br /&gt;           }&lt;br /&gt;           'load-on-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;startup&lt;/span&gt;'(1)&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   def mappings = &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;xml&lt;/span&gt;.'&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;servlet&lt;/span&gt;-mapping'[0]&lt;br /&gt;   mappings + {&lt;br /&gt;     '&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;servlet&lt;/span&gt;-mapping' {&lt;br /&gt;           '&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;servlet&lt;/span&gt;-name'('wicket')&lt;br /&gt;           '&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;url&lt;/span&gt;-pattern'('/app/*')&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here we use &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;Groovy's&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;XmlSlurper&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;DSL&lt;/span&gt; to modify and the XML simply by using the + operator and some Groovy mark-up. We again use the Wicket Spring integration support to get it all working, so when Wicket loads it will actually look for the bean created by the Grails plug-in. And that's it, to test the plug-in we can type "grails run-app" and navigate to http://localhost:8080/grails-wicket/app and we see:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3pq3YXk6Asw/Rkxtcl0lLxI/AAAAAAAAAAw/UlBMSrZNi30/s1600-h/Picture+5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_3pq3YXk6Asw/Rkxtcl0lLxI/AAAAAAAAAAw/UlBMSrZNi30/s320/Picture+5.png" alt="" id="BLOGGER_PHOTO_ID_5065544018841382674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Not hugely impressive I know, but what it does show is Wicket running as the view tech in Grails which means that Wicket components and applications can use &lt;a href="http://grails.org/GORM"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;GORM&lt;/span&gt;&lt;/a&gt; to simplify the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;ORM&lt;/span&gt; layer of Wicket applications and other features of Grails like &lt;a href="http://grails.org/Services"&gt;Services&lt;/a&gt; and Jobs. This took me all of 20 minutes to write, in fact I've spent longer writing this article than the plug-in. Not that it is complete of course, things left to do are to add reloading support to the Groovy files that Wicket users. Advice from the Wicket community on how to do that would be appreciated. And of course I haven't tested it against any more complex examples yet.&lt;br /&gt;&lt;br /&gt;Now of course it wouldn't be a plug-in if it couldn't be installed into other apps. To do this we package it up with "grails package-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;plugin&lt;/span&gt;" which will create a zip. I've placed in plug-in at &lt;a href="http://dist.codehaus.org/grails-plugins/"&gt;http://dist.codehaus.org/grails-plugins/&lt;/a&gt; so in any Grails application you can now do:&lt;br /&gt;&lt;br /&gt;grails install-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;plugin&lt;/span&gt; Wicket 0.1&lt;br /&gt;&lt;br /&gt;or directly from the URL:&lt;br /&gt;&lt;br /&gt;grails install-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;plugin&lt;/span&gt; &lt;a href="http://dist.codehaus.org/grails-plugins/grails-Wicket-0.1.zip"&gt;http://dist.codehaus.org/grails-plugins/grails-Wicket-0.1.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And it will install this version of the plug-in.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Note: &lt;/span&gt;The plug-in doesn't work with the Grails URL mapping mechanism in 0.5 so you need to delete any grails-app/conf/*UrlMappings.groovy files otherwise you'll get an exception.&lt;br /&gt;&lt;br /&gt;Plug-in sources can be found here: &lt;a href="http://svn.grails-plugins.codehaus.org/browse/grails-plugins/grails-wicket/trunk"&gt;http://svn.grails-plugins.codehaus.org/browse/grails-plugins/grails-wicket/trunk&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-111676359243256861?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/111676359243256861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=111676359243256861' title='33 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/111676359243256861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/111676359243256861'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/05/grails-wicket-wonders-of-grails-plug-in.html' title='Grails + Wicket: The Wonders of the Grails Plug-in system'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3pq3YXk6Asw/RkyDH10lLyI/AAAAAAAAAA4/1YwtbAYtXOc/s72-c/Picture+7.png' height='72' width='72'/><thr:total>33</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-6574372166201885756</id><published>2007-05-16T20:43:00.000+01:00</published><updated>2007-05-16T21:50:10.930+01:00</updated><title type='text'>RE: Groovy and Grails: Three Worries</title><content type='html'>I had the pleasure of meeting and having dinner (at a wondefully steriotypical American diner) with &lt;a href="http://www.relevancellc.com/"&gt;Stuart Halloway&lt;/a&gt; along with other NFJS guys like Ted Neward and Brian Goetz at JavaOne. Since then Stuart took the time to write a &lt;a href="http://www.relevancellc.com/2007/5/15/groovy-and-grails-ten-pleasant-surprises"&gt;nice entry&lt;/a&gt; with a few pleasantries that he discovered about Groovy &amp; Grails (Thanks Stuart!). &lt;br /&gt;&lt;br /&gt;In a follow-up post entitled &lt;a href="http://www.relevancellc.com/2007/5/16/groovy-and-grails-three-worries"&gt;Groovy &amp; Grails: Three Worries&lt;/a&gt; he raises a few concerns which I commented on, but would like to take the time to address here too.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1. Lack of Open Classes in Groovy&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;His first concern centers around the fact that Ruby has an open class system whilst Groovy does not. The reasons for this are simply Groovy compiles into byte code directly and there is a one-to-one mapping between a Groovy class and a class file. This is unlike JRuby where you need to to use &lt;a href="http://www.almaer.com/blog/archives/001488.html"&gt;proxying trickys&lt;/a&gt; in order to do things like call Ruby from Java.&lt;br /&gt;&lt;br /&gt;So essentially Groovy can't modify classes directly because as far as the JVM is concerned once a class is loaded it cannot be changed. Of course this is completely sensible as the Java platform has the concept of threading. Changing class definitions at runtime in a multi-threaded environment would be rather problematic from the JVMs perspective. Since Ruby has no concept of threading at this time of writing the language and runtime has no such concerns.&lt;br /&gt;&lt;br /&gt;So given these constraints in Groovy we have a different way of doing things. Stuart presented the following example:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class Person { &lt;br /&gt;  def firstName; &lt;br /&gt;}&lt;br /&gt;p = new Person();&lt;br /&gt;class Person {&lt;br /&gt;  def lastName;&lt;br /&gt;}&lt;br /&gt;p.lastName = 'Halloway'&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In Groovy (with the upcoming 1.1 release) this would be implemented as:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class Person { &lt;br /&gt;  def firstName; &lt;br /&gt;}&lt;br /&gt;p = new Person();&lt;br /&gt;p.metaClass.lastName = 'Halloway'&lt;br /&gt;&lt;br /&gt;p.lastName = "Rocher"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This uses Groovy's ExpandoMetaClass mechanism. Since in Groovy we can't change classes, we instead have a MetaClass for each java.lang.Class. The MetaClass defines the behaviour of the actual class. You change the MetaClass you change the class. So Groovy might not have "open" classes, but it has an equivalent mechanism for achieving the same thing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. OMG! Grails is not written in 100% Groovy!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Yes that is right Grails is around 80% Java and 20% Groovy. The reasons for this are several. Firstly, Java still makes a great language for writing low-level plumbing code. For dealing with all the complexities that the users of the higher level interface (Grails users) don't have to deal with. Secondly, since Grails is written in Java we get the performance benefits of this. Grails is between 50 and 300% faster than Rails depending on the test. Rails might be implemented in 100% Ruby, but it has very well documented performance troubles because of this.&lt;br /&gt;&lt;br /&gt;Do we eat our own dog food? Hell yeah, we have a &lt;a href="http://grails.org/Plugins"&gt;plug-in system&lt;/a&gt; where plugins are all written in Groovy. All of our custom tag libraries are written in Groovy. Groovy Server Pages (GSP), our view technologies, is all Groovy. So we eat plenty of it trust me. Finally, the Groovy community has never been the one to cry out and tell everyone to ditch Java. No, our philosophy is to choose the right tool for the job, and Java is still a great tool in my toolbox just as Groovy is another. The fact that they work so seamlessly together is what makes the pairing so special.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;3. The old static typing debate&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So is static typing useful anyway? Well yes, it has been useful for a number of things for us such as enabling us to implement more intelligent scaffolding based on the types (java.util.Date, java.lang.String) etc. Also we could implement things like &lt;a href="http://grails.org/Command+objects+and+Form+Validation"&gt;command objects&lt;/a&gt; which using static type information.&lt;br /&gt;&lt;br /&gt;In addition at the moment the tool support just is not there yet to use either Ruby or Groovy for  large complicated applications. Static typing analysis and the features that it brings to modern IDEs like refactoring and code navigation are just in a different league in Java. I hope this will change in time and since Groovy supports both static and dynamic typing I believe the tools vendors will have an easier time creating quality tools for it.&lt;br /&gt;&lt;br /&gt;This is also where Grails fits quite nicely into the picture as it allows you to mix Groovy for the simple to medium complex stuff and Java to do the heavy lifting. IMO Groovy gets the balance here just right.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-6574372166201885756?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/6574372166201885756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=6574372166201885756' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6574372166201885756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6574372166201885756'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/05/re-groovy-and-grails-three-worries.html' title='RE: Groovy and Grails: Three Worries'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-1385713207725811993</id><published>2007-05-14T11:54:00.000+01:00</published><updated>2007-05-14T12:03:21.344+01:00</updated><title type='text'>The lone ramblings of a JRuby developer in denial</title><content type='html'>Jeremy Rayner has a &lt;a href="http://javanicus.com/blog2/items/208-index.html"&gt;nice summary&lt;/a&gt; of all the positive and negative feedback dished out to Groovy at JavaOne the overwhelming majority of which is positive. It is entertaining to see that the most vocal and negative comments come from none other than a JRuby committer &lt;a href="http://ola-bini.blogspot.com/2007/05/javaone-keynote-and-groovy-session.html"&gt;Ola Bini&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I can imagine the picture now of Ola sitting in a Groovy session with his fingers in his ears and eyes shut going "nah nah nah I'm not listening!!". Unfortunately Ola, as demonstrated by the vast array of positive feedback and the &lt;a href="http://java.sun.com/javaone/sf/2007/articles/bookstorebestsellers.jsp"&gt;book sales&lt;/a&gt;, really there is only one winner this year: &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nevermind, there is always next year ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-1385713207725811993?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/1385713207725811993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=1385713207725811993' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1385713207725811993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1385713207725811993'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/05/lone-ramblings-of-jruby-developer-in.html' title='The lone ramblings of a JRuby developer in denial'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-3120479274359822280</id><published>2007-05-11T00:23:00.000+01:00</published><updated>2007-05-11T00:36:38.916+01:00</updated><title type='text'>The Grails US Tour: JavaOne Day 3 + Back to London</title><content type='html'>Well this is where JavaOne ends for me. This morning I met up with &lt;a href="http://blogs.sun.com/geertjan/"&gt;Geertjan&lt;/a&gt; (famous NetBeans guys from Sun) and his colleague Martin Adamek who were both extremely enthusiastic about &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; &amp; &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; support in &lt;a href="http://netbeans.org"&gt;NetBeans&lt;/a&gt; IDE. It was great chatting to them and hearing their excitment, it will be great to have Geertjan (and hopefully Martin) over at the &lt;a href="http://grails-exchange.com"&gt;Grails eXchange 2007&lt;/a&gt; in October.&lt;br /&gt;&lt;br /&gt;After that I went to Rod Cope's (the twice voted JavaOne Rockstar!) talk on "Advanced Groovy", which was awesome. Again a fairly full room (although not packed out like Guillaume and Dierk's Groovy talk) with around 300 people. The demos he did were fantastic, involving XML-RPC, ActiveX automation and all sorts. Very well put together, I imagine he has a chance for a hatrick of Rockstar nominations.&lt;br /&gt;&lt;br /&gt;Now its back to the UK, with my flight leaving tonight. I'm looking forward to seeing my family and returning to some sense of normality, but it has been a blast. Thanks go out to the &lt;a href="http://nofluffjuststuff.com"&gt;No Fluff&lt;/a&gt; guys, the &lt;a href="http://jetbrains.com"&gt;JetBrains&lt;/a&gt; guys and of course Sun for letting me do the half day Groovy/Grails talk which was very enjoyable.&lt;br /&gt;&lt;br /&gt;Overall the conference has been a great success with so much excitment about Groovy and Grails. Hopefully we've impressed enough people to encourage greater adoption of Groovy as &lt;span style="font-weight:bold;"&gt;the&lt;/span&gt; major dynamic language platform for the JVM.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-3120479274359822280?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/3120479274359822280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=3120479274359822280' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3120479274359822280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/3120479274359822280'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/05/grails-us-tour-javaone-day-3-back-to.html' title='The Grails US Tour: JavaOne Day 3 + Back to London'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-9186091765341064514</id><published>2007-05-10T07:13:00.000+01:00</published><updated>2007-05-10T07:27:51.895+01:00</updated><title type='text'>The Grails US Tour: JavaOne Day 2</title><content type='html'>So I just finished my BOF on &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; + Spring &amp; Hibernate. It went ok, I'm a little disappointed actually. My talk was at 9:55pm which is like the graveyard shift with fewer people than other sessions and tiredness had really started to set in for me after all my talks at NFJS, JavaU and then all the parties and dinners. &lt;br /&gt;&lt;br /&gt;I fear I grossly overestimated the audiences' potential knowledge of Groovy &amp; Grails, a schoolboy error of course. It was a fairly advanced talk showing mixing Java entities and Grails domain classes in the same codebase and using remote Spring services. I fear it may well have been more effective to have done a similar introductory talk as last years JavaOne.&lt;br /&gt;&lt;br /&gt;I could kind of gage this from the audiences' blank looks as I was doing the talk which made me rush through some parts to avoid some of the complexity leaving the talk shorter than it should have been. I fear I left the audience thinking that Grails is complicated when in fact what I was trying to demonstrate was Grails is simple when you need it to be and flexible (spring+hibernate integration) when you need it to be.&lt;br /&gt;&lt;br /&gt;Oh well, you win some you lose some, I'm trying not to be too down beat as it has still been very worthwhile as the buzz I got from the NFJS and JavaU talks plus the Groovy talk by Dierk and Guillaume was totally different. And we received some awesome news about the book sales. On day one the Groovy book sold out by 4pm and the Grails book was 4th on the &lt;a href="http://java.sun.com/javaone/sf/2007/articles/bookstorebestsellers.jsp"&gt;best seller list&lt;/a&gt;. Check &lt;a href="http://java.sun.com/javaone/sf/2007/articles/bookstorebestsellers.jsp"&gt;it out&lt;/a&gt; Groovy &amp; Grails has proven really popular this year so its been awesome.&lt;br /&gt;&lt;br /&gt;So much cause for celebration, even if my talk was not what I hoped it to be...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-9186091765341064514?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/9186091765341064514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=9186091765341064514' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/9186091765341064514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/9186091765341064514'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/05/grails-us-tour-javaone-day-2.html' title='The Grails US Tour: JavaOne Day 2'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-6165710436651031543</id><published>2007-05-09T07:47:00.000+01:00</published><updated>2007-05-09T07:59:56.982+01:00</updated><title type='text'>The Grails US Tour: JavaOne Day 1</title><content type='html'>Another eventful day at JavaOne is winding to a close. It was another great day from a Groovy perspective with the &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; session filling up with around 600 people in it with the rest losing out. &lt;a href="http://glaforge.free.fr/weblog/"&gt;Guillaume&lt;/a&gt; and Dierk did an awesome session about Groovy with some neat demos, which the audience really enjoyed. We then all went to a book signing at the Digital Guru bookshop, which was enjoyable.&lt;br /&gt;&lt;br /&gt;The big news of the day was of course &lt;a href="https://openjfx.dev.java.net/"&gt;JavaFX&lt;/a&gt;. I've looked over the samples and can't really see why a new language is needed as it can be done with an almost identical syntax in Groovy's SwingBuilder. The only "feature" that seems to differentiate it is that you can bind multiple references to the same value. The result here is that if you change the value if changes all references to it. This of course can be achieved with Groovy closure's too. Nevertheless, it is too early to tell, I haven't had a chance to look at it in any detail so maybe I'm missing something.&lt;br /&gt;&lt;br /&gt;Later in the day we had dinner with the &lt;a href="http://jetbrains.com"&gt;JetBrains&lt;/a&gt; and the &lt;a href="http://www.nofluffjuststuff.com/"&gt;No Fluff&lt;/a&gt; guys and it was great to see so many people getting together and being enthusiastic about &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; and &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt;. Onto Day 2....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-6165710436651031543?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/6165710436651031543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=6165710436651031543' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6165710436651031543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6165710436651031543'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/05/grails-us-tour-javaone-day-1.html' title='The Grails US Tour: JavaOne Day 1'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-4631170604030278154</id><published>2007-05-08T16:00:00.000+01:00</published><updated>2007-05-09T07:43:11.650+01:00</updated><title type='text'>The Grails US Tour: JavaOne Day 0 + G2One</title><content type='html'>Well its the morning of &lt;a href="http://java.sun.com/javaone/sf/"&gt;JavaOne&lt;/a&gt; Day 1 and now for my Java University report. So basically I did a half day &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; &amp; &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; talk at the Java University and the response was brilliant. There were a 150 people and doing a half day event really gave me the time to get into the detail of Groovy &amp; Grails and do some good demos. The audience were mostly blown away by the awesome things you could do with Groovy &amp; Grails and it was fantastic to hear the response. After hearing that some of the other talks were a disappointment it was good to hear mine got a tick in the box.&lt;br /&gt;&lt;br /&gt;Next up was No Fluff Just Stuff's &lt;a href="http://www.nofluffjuststuff.com/groovygrailsmeetup/registration/register"&gt;G2One&lt;/a&gt; event which was good too. I wish though I had had more time to do a longer more interactive session as 30 minutes felt to short to get my points across, but it was good fun and I met some interesting people who were interested in Groovy &amp; Grails as over 200 people showed up for the event which is a great turnout. Ted Neward conducted a panel discussion featuring myself, Guillaume, Dierk, Neal Ford, Andy Glover and Jason Rudolph (who I finally got to meet) that was great fun.&lt;br /&gt;&lt;br /&gt;The attendees asked some of the typical questions such as IDE support, JRuby vs Groovy and of course "When is Grails going to support Maven!". I believe we were able to answer most of them in an effective way. Most Java people are still a little afraid to leave the comfort of their trusty IDE which is understandable.&lt;br /&gt;&lt;br /&gt;After the event I stumbled across &lt;a href="http://macstrac.blogspot.com/"&gt;James Strachan&lt;/a&gt; who I had yet to meet, it was late in the evening and James was a little on the merry side, so we didn't really have a chance to chat much, but made the introductions and hopefully we will during the conference.&lt;br /&gt;&lt;br /&gt;I also met Alex Tchakman of &lt;a href="http://jetbrains.com"&gt;JetBrains&lt;/a&gt; who is leading the effort to develop a Groovy/Grails plug-in for IntelliJ IDEA. It was fantastic to hear how excited he is about IntelliJ and the future of the Groovy/Grails plug-in for it. I can't wait for October when it will be unveiled to the public.&lt;br /&gt;&lt;br /&gt;Finally, I woke up this morning to the news that we have been &lt;a href="http://www.bileblog.org/?p=328"&gt;biled&lt;/a&gt;. What did Rod Johnson say? "You haven't made it until you've been biled". Groovy and Grails rock :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-4631170604030278154?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/4631170604030278154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=4631170604030278154' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4631170604030278154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4631170604030278154'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/05/grails-us-tour-javaone-day-0-g2one.html' title='The Grails US Tour: JavaOne Day 0 + G2One'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-8921518726981695880</id><published>2007-05-07T07:33:00.000+01:00</published><updated>2007-05-07T08:01:42.552+01:00</updated><title type='text'>The Grails US Tour: Arrived to San Francisco + NFJS Denver Report</title><content type='html'>So I'm sitting here in my hotel room having just arrived to San Francisco after the 2 and bit hour flight from Denver. The &lt;a href="http://www.nofluffjuststuff.com/show_view.jsp?showId=82"&gt;No Fluff Just Stuff show in Denver&lt;/a&gt; was really fantastic and I was amazed to see so many passionate Java developers coming together on their weekend to talk techie. I met some great people including a few of the regular No Fluffers such as &lt;a href="http://memeagora.blogspot.com"&gt;Neal Ford&lt;/a&gt;, &lt;a href="http://blogs.tedneward.com/"&gt;Ted Neward&lt;/a&gt; and &lt;a href="http://davisworld.org"&gt;Scott Davis&lt;/a&gt;. And of course I had the pleasure of meeting the man himself, Jay Zimmerman.&lt;br /&gt;&lt;br /&gt;I also managed to take in a couple of sessions and saw Seam demo'ed properly for the first time. My thoughts? Well it certainly papers over the warts of JSF, but it is still a lonnnngggg way away from the claimed "Ruby-on-Rails like" productivity. What summed it up perfectly for me was a moment in David Geary's talk where he created a CRUD app and claimed "it only took 40 lines of config and a 100 lines of Java!". I was tempted to stand up and say well I could have done that in about 10 lines of Grails code with scaffolding and no config, but thought better of it.&lt;br /&gt;&lt;br /&gt;Of course Seam will get its users because of the whole "standards" approach that it has, but in terms of developer experience it is miles from Rails or Grails. Moving on, at the conference I did three talks on Grails covering Spring/Hibernate integration, GORM and plug-ins that were all completely packed out and the response was superb. &lt;br /&gt;&lt;br /&gt;However, the moment that pleased me the most was near the end where the majority of the 250 attendees gather in the main presentation room and Jay asked them who would be using the various technologies presented. When asked about JRuby about 10 people raised their hands, when asked about Seam around 15 did, when asked about Groovy &amp; Grails the majority of the audience raised their hands, far too many to count anyway. My (and Scott's) work here is done. Next...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-8921518726981695880?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/8921518726981695880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=8921518726981695880' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/8921518726981695880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/8921518726981695880'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/05/grails-us-tour-arrived-to-san-francisco.html' title='The Grails US Tour: Arrived to San Francisco + NFJS Denver Report'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-6621753273500439103</id><published>2007-05-04T09:50:00.000+01:00</published><updated>2007-05-04T10:02:30.311+01:00</updated><title type='text'>The Grails US Tour: NFJS Denver &amp; JavaOne</title><content type='html'>Today begins my week long tour of the US doing various talks about &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; &amp; &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt;. First up I'm heading to Denver to do 3 talks on Grails at No Fluff Just Stuff's &lt;a href="http://www.nofluffjuststuff.com/show_view.jsp?showId=82"&gt;Rocky Mountain Software Symposium&lt;/a&gt;, which should be fun. I then get a connecting flight to San Francisco where I'll be doing a half day Groovy/Grails Java University talk at &lt;a href="http://java.sun.com/javaone/sf/"&gt;JavaOne&lt;/a&gt; next week Monday. Also on Monday there is the Groovy/Grails &lt;a href="http://www.nofluffjuststuff.com/groovygrailsmeetup/registration/register"&gt;G2One&lt;/a&gt; event I mentioned the other day which is also organised again by the NFJS guys. &lt;br /&gt;&lt;br /&gt;Hopefully I'll then have time to take in some sessions before doing a couple of talks, first a Intro to Grails talks at the &lt;a href="http://oracle.com"&gt;Oracle&lt;/a&gt; booth followed on Wednesday by my &lt;a href="http://www28.cplan.com/cc158/sessions_catalog.jsp?ilc=158-1&amp;ilg=english&amp;isort=&amp;isort_type=&amp;is=yes&amp;icriteria1=+&amp;icriteria2=+&amp;icriteria7=+&amp;icriteria9=BOF-6133&amp;icriteria8=grails&amp;icriteria3="&gt;BOF&lt;/a&gt;. The schedule looks challenging, I imagine jetlag will kick in promptly, I'm going to miss my wife and kids like crazy, but it should be good fun. See you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-6621753273500439103?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/6621753273500439103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=6621753273500439103' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6621753273500439103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6621753273500439103'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/05/grails-us-tour-nfjs-denver-javaone.html' title='The Grails US Tour: NFJS Denver &amp; JavaOne'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-433134499343120149</id><published>2007-05-02T09:12:00.000+01:00</published><updated>2007-05-02T09:24:54.897+01:00</updated><title type='text'>G2One at JavaOne: A Special Groovy/Grails Event</title><content type='html'>Looks like this years &lt;a href="http://java.sun.com/javaone/sf/"&gt;JavaOne&lt;/a&gt; in San Francisco is going to be an even more exciting event than expected with a new Groovy/Grails specific event organised by Jay Zimmerman of No Fluff Just Stuff called &lt;a href="http://www.nofluffjuststuff.com/groovygrailsmeetup/registration/register"&gt;G2One&lt;/a&gt;. Its a great oppurtunity to meet up with some of the people behind &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; &amp; &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt;, but you have to pre-register! Only 250 places available and registration is free. With this event, all the other No Fluff activity in the US and Skills Matter's upcoming &lt;a href="http://grails-exchange.com"&gt;Grails eXchange 2007&lt;/a&gt; conference, it seems Groovy &amp; Grails are very well respresented in the conference stakes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-433134499343120149?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/433134499343120149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=433134499343120149' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/433134499343120149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/433134499343120149'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/05/g2one-at-javaone-special-groovygrails.html' title='G2One at JavaOne: A Special Groovy/Grails Event'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-6752466090311605483</id><published>2007-05-01T18:04:00.000+01:00</published><updated>2007-05-01T18:15:14.360+01:00</updated><title type='text'>Grails 0.5 Shipping!</title><content type='html'>A few days before we all converge on &lt;a href="http://java.sun.com/javaone/sf/"&gt;JavaOne 07&lt;/a&gt; and &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; 0.5 is out! This is an awesome milestone for Grails and represents a significant improvement over Grails 0.4. Well over 200 JIRA issues have been tackled and Grails is now 40-50% faster than previously published &lt;a href="http://docs.codehaus.org/display/GRAILS/Grails+vs+Rails+Benchmark"&gt;benchmarks&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We got round to tackling some great new features such as our DSL for URL mapping, command objects, more codecs and huge improvements to GORM. Take a look at the &lt;a href="http://docs.codehaus.org/display/GRAILS/0.5+Release+Notes"&gt;release notes&lt;/a&gt; for more info. All in all I feel Grails is coming along nicely and we are still &lt;a href="http://grails.org/Roadmap"&gt;on target&lt;/a&gt; to ship 1.0 by autumn. See you at JavaOne 07!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-6752466090311605483?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/6752466090311605483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=6752466090311605483' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6752466090311605483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6752466090311605483'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/05/grails-05-shipping.html' title='Grails 0.5 Shipping!'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-2693956122008488693</id><published>2007-04-18T16:09:00.000+01:00</published><updated>2007-04-18T16:11:28.066+01:00</updated><title type='text'>Groovy &amp; Grails at JavaOne 07 University</title><content type='html'>As well as a BOF at JavaOne I'll also be doing a half-day course at the JavaOne university on Groovy &amp; Grails. Check it out &lt;a href="http://java.sun.com/javaone/sf/javauniversity.jsp#A4"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-2693956122008488693?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/2693956122008488693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=2693956122008488693' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2693956122008488693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2693956122008488693'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/04/groovy-grails-at-javaone-07-university.html' title='Groovy &amp; Grails at JavaOne 07 University'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-2017858545815363862</id><published>2007-04-18T10:26:00.000+01:00</published><updated>2007-04-18T10:35:01.647+01:00</updated><title type='text'>Neal Ford: "I would rather write Groovy code in VI than Java code in IDEA"</title><content type='html'>Interesting and &lt;a href="http://aboutgroovy.com/item/show/172"&gt;entertaining interview&lt;/a&gt; with Neal Ford of ThoughtWorks fame. He has lots of nice things to say about &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; and Ruby.&lt;br /&gt;&lt;br /&gt;The only point I disagree with is his assertion that in Groovy you can only do 80% of what you can do in Ruby in terms of DSL programming. I've never seen a Ruby DSL that couldn't be done in Groovy with a similar conciseness in the syntax. It would be nice if Neal could elaborate on this point.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-2017858545815363862?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/2017858545815363862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=2017858545815363862' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2017858545815363862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/2017858545815363862'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/04/neal-ford-i-would-rather-write-groovy.html' title='Neal Ford: &quot;I would rather write Groovy code in VI than Java code in IDEA&quot;'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-1975561841880581695</id><published>2007-04-17T09:12:00.000+01:00</published><updated>2007-04-17T16:06:55.736+01:00</updated><title type='text'>Contrasting Grails SpringBuilder vs JRuby Spring DSL vs Guice</title><content type='html'>An interesting post by &lt;a href="http://jroller.com/page/habuma?entry=making_your_spring_configuration_more"&gt;Craig Walls&lt;/a&gt; that I hadn't noticed before shows how you can create Spring configs with a little JRuby DSL:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;DAOS = [ :ZoneDAO, :EmailDomainDAO, :DayDAO, :PreferenceDAO,&lt;br /&gt;                 :WhatEverDao... ]&lt;br /&gt;DAOS.each do |dao|&lt;br /&gt;    bean(dao, "daos.hibernate.#{dao}Hibernate")&lt;br /&gt;      {|b| b.new("sonarSession")}&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The Groovy version with Grails' &lt;a href="http://grails.org/Spring+Bean+Builder"&gt;SpringBuilder&lt;/a&gt; would look like:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def DAOS = [ZoneDAO, EmailDomainDAO, DayDAO, PreferenceDAO, WhateverDAO]&lt;br /&gt;DAOs.each { dao -&gt;&lt;br /&gt;   "${dao}"("daos.hibernate.${dao.simpleName}Hibernate") {&lt;br /&gt;       sessionFactory = ref("sonarSession")&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Another important difference between the two is that &lt;a href="http://code.trampolinesystems.com/springy"&gt;Springy&lt;/a&gt;, the JRuby version, serializes the JRuby code into XML and then reads the beans from that. We used to do this in Grails, but it had serious performance implications for load time, &lt;a href="http://grails.org"&gt;Grails'&lt;/a&gt; &lt;a href="http://grails.org/Spring+Bean+Builder"&gt;BeanBuilder&lt;/a&gt; constructs the ApplicationContext programmatically on the fly.&lt;br /&gt; &lt;br /&gt;Bob Lee also offered his alternative using Guice:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Class[] daos = { ZoneDao.class, EmailDomainDao.class, PreferenceDao.class... };&lt;br /&gt;for (Class dao : daos)&lt;br /&gt;bind(dao).to(Class.forName("daos.hibernate.Hibernate" + dao.getSimpleName())); &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Since &lt;a href="http://glaforge.free.fr/weblog/index.php?itemid=208"&gt;Groovy does annotations&lt;/a&gt; it is possible to make this code even Groovier:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def daos = [ZoneDao, EmailDomainDao, PreferenceDao...]&lt;br /&gt;daos.each { bind(it).to(Class.forName("daos.hibernate.Hibernate${it.simpleName}") }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-1975561841880581695?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/1975561841880581695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=1975561841880581695' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1975561841880581695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1975561841880581695'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/04/contrasting-grails-springbuilder-vs.html' title='Contrasting Grails SpringBuilder vs JRuby Spring DSL vs Guice'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-7227505245757311922</id><published>2007-03-24T15:56:00.000Z</published><updated>2007-03-24T16:03:44.893Z</updated><title type='text'>Updated Grails vs Rails Benchmark</title><content type='html'>So after a &lt;a href="http://www.jaredrichardson.net/blog/2007/03/23/#grails_vs_rails"&gt;couple&lt;/a&gt; of &lt;a href="http://www.groovyblogs.org/entries/jump/4709"&gt;people&lt;/a&gt; pointed out my naivety in configuring Rails, I decided to re-run the tests. What I did was configure Rails with a 10 mongrel cluster and the Pound load balancer as per &lt;a href="http://www.jaredrichardson.net/blog/2007/03/23/#grails_vs_rails"&gt;Jared's recommendation&lt;/a&gt;.  However, to make things more equal I reduced the Grails Tomcat server's thread pool down to 10 by setting maxThreads=10 in Tomcat's server.xml.&lt;br /&gt;&lt;br /&gt;The result was that Rails' performance degraded in all except the long running query test, whilst Grails' performance significantly improved in all except the same test. Clearly, since I have only dual core's on my MacBook giving Rails or Grails more processes doesn't necessarily improve things for the shorter tasks. Check out the updated &lt;a href="http://docs.codehaus.org/display/GRAILS/Grails+vs+Rails+Benchmark"&gt;benchmarks&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Again, I'm no Rails performance tuning wizard so if any Rails expert can suggest improvements to the Rails configuration please don't hesitate to shout.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-7227505245757311922?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/7227505245757311922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=7227505245757311922' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/7227505245757311922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/7227505245757311922'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/03/updated-grails-vs-rails-benchmark.html' title='Updated Grails vs Rails Benchmark'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-4475858161107531306</id><published>2007-03-23T00:05:00.000Z</published><updated>2007-03-23T00:13:07.283Z</updated><title type='text'>Grails vs. Rails Benchmark</title><content type='html'>This article: &lt;a onclick="return top.js.OpenExtLink(window,event,this)" href="http://thoughtmining.blogspot.com/2007/03/where-are-all-groovy-andor-grails.html" target="_blank"&gt;http://thoughtmining.blogspot&lt;wbr&gt;.com/2007/03/where-are-all&lt;wbr&gt;-groovy-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;andor&lt;/span&gt;-grails.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Prompted me to do this:&lt;br /&gt;&lt;a onclick="return top.js.OpenExtLink(window,event,this)" href="http://docs.codehaus.org/display/GRAILS/Grails+vs+Rails+Benchmark" target="_blank"&gt;http://docs.codehaus.org&lt;wbr&gt;/display/GRAILS/Grails+vs&lt;wbr&gt;+Rails+Benchmark&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Feedback welcome.&lt;br /&gt;&lt;br /&gt;I must stress this is not meant to be a flame war inciting benchmark, it has been done merely to allay the aforementioned &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;bloggers&lt;/span&gt; fear that he expresses in this comment:&lt;br /&gt;&lt;br /&gt;"Surely someone close to the respective projects has asked these hard questions of themselves?&lt;br /&gt;&lt;br /&gt;Because I know the previous paragraph has to, &lt;span style="font-style: italic;"&gt;has to&lt;/span&gt;, be true, then I can only assume one thing: someone has done this as an exercise...and the results were depressing. Why else would the results not be published? If Groovy or Grails was faster, even slightly so, then you can bet it would trumpeted far and wide. The fact that it's not leaves an unsettling feeling."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-4475858161107531306?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/4475858161107531306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=4475858161107531306' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4475858161107531306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/4475858161107531306'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/03/grails-vs-rails-benchmark.html' title='Grails vs. Rails Benchmark'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-7041129239956242162</id><published>2007-03-22T10:08:00.000Z</published><updated>2007-03-22T10:21:17.637Z</updated><title type='text'>Groovy &amp; Grails at Sun Tech Days - The Report</title><content type='html'>I've been meaning to write up a report of how my &lt;a href="http://uk.sun.com/sunnews/events/2007/mar/revolution/techdays07/grails.html"&gt;workshop&lt;/a&gt; on &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; &amp;amp; &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; at Sun Tech Days went, so here it is. First off, I would like to say a big thanks to the guys at Sun for hosting me, it was great gesture and thankfully we'll see more of it at JavaOne.&lt;br /&gt;&lt;br /&gt;As far as the workshop went, I really wanted to deliver something of value and probably ended up overdoing it as a I had over 160 slides (death by keynote!). Fortunately, the audience were extremely enthusiastic with the only hiccup being a gentlemen who was running a p3 450mhz machine with 256mb of RAM and Windows 98 (with MS-DOS!) not being able to get the Grails command line scripts running.&lt;br /&gt;&lt;br /&gt;Interestingly, the majority of attendees were from either the banking or insurance industries, which reflects Grails' growth in the enterprise market space. There were many wow moments, and some concepts which were difficult to grok for a group of Java developers. Explaining closures was particularly fun.&lt;br /&gt;&lt;br /&gt;Overall, the attendees seemed to enjoy the workshop and left brimming with ideas of how to integrate Grails into their existing systems. Job done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-7041129239956242162?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/7041129239956242162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=7041129239956242162' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/7041129239956242162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/7041129239956242162'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/03/groovy-grails-at-sun-tech-days-report.html' title='Groovy &amp; Grails at Sun Tech Days - The Report'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-8445344846773442449</id><published>2007-03-20T09:10:00.000Z</published><updated>2007-03-20T09:12:46.451Z</updated><title type='text'>Grails Interview on Groovy.org.es</title><content type='html'>The nice chaps at &lt;a href="http://groovy.org.es"&gt;Groovy.org.es&lt;/a&gt; were kind enough to take the time to interview me. For those who want to improve their Spanish and learn what's going on in the Groovy/Grails world &lt;a href="http://groovy.org.es/home/story/14"&gt;check it out&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-8445344846773442449?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/8445344846773442449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=8445344846773442449' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/8445344846773442449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/8445344846773442449'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/03/grails-interview-on-groovyorges.html' title='Grails Interview on Groovy.org.es'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-5066299828873744627</id><published>2007-03-13T13:57:00.000Z</published><updated>2007-03-13T14:59:39.468Z</updated><title type='text'>JRuby, Groovy &amp; Java Integration</title><content type='html'>As a follow-up to yesterdays article, I would like to point out the following article written by Ola Bini on the &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt; team: &lt;a href="http://ola-bini.blogspot.com/2007/03/jruby-regular-expressions.html"&gt;JRuby Regular Expressions&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This article represents everything that differs in the mentality between the &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; &amp;amp; the JRuby teams. In essence, the JRuby team are planning on ditching java.util.regex and implementing their own regex parser to match the Ruby regex semantics.&lt;br /&gt;&lt;br /&gt;Regardless as to whether this is a good thing or not,  and regardless as to whether you can change the default implementation this is the essence of the debate over Java integration. So whenever you drop out of Java and into Ruby-land you need to remember that the semantics differ between regex implementations. To be clear: Java integration means more than just being able to call a method on a Java class.&lt;br /&gt;&lt;br /&gt;To quote Dierk Koenig, author of Groovy in Action, who posted this comment yesterday:&lt;br /&gt;&lt;br /&gt;"I would like to add that there is a fundamental difference between the two types of languages for the Java platform: type A, which are languages designed specifically for that platform (Groovy, Scala, etc.), and type B, which are ports of a foreign language (Jython, JRuby, Kawa, Bistro, and the likes).&lt;br /&gt;&lt;br /&gt;While type B languages can achieve a decent level of interoperability, only type A languages can truly integrate with Java. This is because foreign languages not only have their own libraries, APIs, and such but more important, they come with their own object model, threading architecture, security concept, performance and debugging hooks, and last not least their own runtime architecture that can be fundamentally different from Java. Any type B language has to overcome this impedance mismatch breaking either Java's or the foreign language's behavior.&lt;br /&gt;&lt;br /&gt;The acid test for integration is to replace any given Java class (be it abstract, or in the middle of an inheritance chain, or having overloaded methods, or using annotations) and replace it with an implementation in your language. This is what only type A languages can possibly achieve."&lt;br /&gt;&lt;br /&gt;In other words, this is another example of how the JRuby developers have to make a hard choice in order to support C Ruby compatibility. Unfortunately on this occasion, it is Java integration that suffers.&lt;br /&gt;&lt;br /&gt;In Groovy the expression ~/pattern/ results in an instance of java.util.regex.Pattern therefore the semantics are the same, you can call all the regular JDK methods on the object and the object can be passed to a Java object to hook into other frameworks and tools.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-5066299828873744627?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/5066299828873744627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=5066299828873744627' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/5066299828873744627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/5066299828873744627'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/03/jruby-groovy-java-integration.html' title='JRuby, Groovy &amp; Java Integration'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-1666676409559661401</id><published>2007-03-12T09:33:00.000Z</published><updated>2007-03-12T14:55:40.370Z</updated><title type='text'>The Charles Nutter Ruby on Grails story</title><content type='html'>Back in December Charles Nutter and I had a discussion at &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;JavaPolis&lt;/span&gt; about collaborating and the potential to leverage &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; as a platform for multiple languages.&lt;br /&gt;&lt;br /&gt;Now Charles has actually l&lt;a href="http://headius.blogspot.com/2007/03/ruby-on-grails-why-hell-not.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;ooked&lt;/span&gt; at the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;codebase&lt;/span&gt;&lt;/a&gt;, and would even like a further extended tour (Charles - give me a shout if you're interested, I'd be happy to). His conclusion? Lets make Ruby on Grails. I don't find it &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;particularily&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;suprising&lt;/span&gt; he has come to this conclusion. His estimates of Java-to-Groovy are actually way off. I would say if you take away the unit tests and sample apps, Grails is more like 85% Java. There are a few things that should be pointed out here:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Not only is it very possible to support other languages, it is feasible now, thanks to the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;plugin&lt;/span&gt; system and Grails' well thought out, as Charles puts it, "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;interfacified&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;injectificated&lt;/span&gt;, and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;abstractilicious&lt;/span&gt;" design.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The benefits of leveraging all of the existing dominant libraries in the Java &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;eco&lt;/span&gt;-system (Spring, Hibernate, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;SiteMesh&lt;/span&gt;, Quartz) is becoming more clear. There is no doubt that the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;codebase&lt;/span&gt; and libraries being in Java provide a significant performance improvement over Rails (100% Ruby) in my view.  Grails is a mere Groovy facade onto a well integrated set of libraries, I've been saying this at ever presentation I've given about Grails since day one.  This is one assertion Charles is most certainly correct on.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;We also see these same benefits for people who need a reasonable migration path. Questions like "how can I use my existing Hibernate domain model?", "Can I continue to use Spring &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;MVC&lt;/span&gt; controllers?", and "Can I inject and re-use Java services?" all have a clear and well defined answer in Grails making it much easier (although still challenging) to sell into enterprise organisations.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;So back to the original question then, the answer is a most resounding "yes!" we could most certainly support multiple languages. But, before we get too excited lets get back to reality. Creating simple web frameworks is simple, creating tightly integrating, elegant, user-friendly frameworks is hard.&lt;br /&gt;&lt;br /&gt;With Grails we've embraced the Groovy language idioms like builders, closures and meta-programming in a big way. We've pushed the boundaries of what Groovy is capable of doing. Now say we decided to support &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;JRuby&lt;/span&gt;,  and maybe JavaScript could we create as elegant a framework by making compromises to support all language &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_14"&gt;idioms&lt;/span&gt;? Actually, in this case yes we probably could because Ruby for example as Charles says in his typically "language neutral" way "everything you can do in Groovy you can do in Ruby (plus more)". But how long would that take?&lt;br /&gt;&lt;br /&gt;Then there is the Java integration story, which I believe Charles is only getting half of the picture here. Java integration is not just about being able to invoke a method on a Java object. Java integration is about &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;mindshare&lt;/span&gt; integration, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;API&lt;/span&gt; integration, syntax integration, object model integration. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;JRuby&lt;/span&gt; has only just managed to solve object model integration, it won't ever be able to solve &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;API&lt;/span&gt;, syntax or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;mindshare&lt;/span&gt; integration. What I mean by this is when i create a File, it should be a java.io.File, what about Streams do I forget about those? And the Collections &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;API&lt;/span&gt;? Out the window with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;JRuby&lt;/span&gt;. Hang on, when I'm in "Ruby-land" a string isn't a java.lang.String?  Telling an organisation that they're going to have to send their entire development team on weeks and weeks of training to understand Ruby and Rails is a hard sell. As Chad Fowler said recently at &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;RailsConf&lt;/span&gt;, Ruby is not for "stupid programmers", which effectively means you need well trained people.&lt;br /&gt;&lt;br /&gt;And of course then there is Agile and scalable application complexity. Dynamic languages are only useful for small to medium complex applications. This is also "fact". Having supported a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;multi&lt;/span&gt;-tier Perl system for a number of years I would rather die than have to write a complex banking system completely in Groovy or Ruby. But, I would be quite happy to write parts of it in either. If you take this approach you get what I call scalable complexity. The ability to start off in a dynamic language and when things get tricky implement certain parts in Java.&lt;br /&gt;&lt;br /&gt;The problem here is that to take this approach you need two languages (one dynamically-typed, one statically-typed) that work seamlessly together. Why? In Agile one of the activities known to reduce productivity is task switching. Read any book on Lean Thinking and Agile and they'll tell you to eliminate waste by eliminating task switching. Switching language idioms is task switching and in this sense the Java-to-Groovy story is just so much stronger. A developer can easily switch between using Java and using Groovy without having to start thinking in a completely different way. This is simply not the case with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;JRuby&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;On the practicality front, Grails 1.0 will be out by Autumn (&lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_25"&gt;that's&lt;/span&gt; Fall for those on the other side of the pond) or maybe even sooner. By supporting all these languages we'd end up in a situation like &lt;a href="https://phobos.dev.java.net/"&gt;Phobos&lt;/a&gt;, which is basically going nowhere and does not do a quarter of what Grails or Rails is capable of.&lt;br /&gt;&lt;br /&gt;So does all this mean I don't want to support Ruby on Grails? Hell, I would love if we could! Choice is a good thing and with the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;JVM&lt;/span&gt; this is completely possible, its just down to the old conundrum: Resources. So maybe Sun should, instead of wasting their time with &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_27"&gt;dead end&lt;/span&gt; projects like Phobos, step up to the plate and commit resources to projects that do matter now. Like Grails.&lt;br /&gt;&lt;br /&gt;So why should Sun do this? Well, Grails is beginning to win the battle for the hearts of minds of Java developers looking for the next big web framework. How can I justify this claim?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;We have had a huge surge in popularity, Groovy in Action is the number one best selling book at &lt;a href="http://www.amazon.com/gp/new-releases/books/3610/ref=pd_nr_c_th_more/103-8873196-8700622"&gt;Amazon&lt;/a&gt; "Java Books"&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There are 12 sessions featuring Groovy and/or Grails at &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;JavaOne&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Grails is the &lt;a href="http://graemerocher.blogspot.com/2007/03/grails-popularity-surges.html"&gt;most popular project&lt;/a&gt; at &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;Codehaus&lt;/span&gt;.org by a long way.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Over at &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;JBoss&lt;/span&gt; they're &lt;a href="http://blog.emmanuelbernard.com/2007/01/activerecord-pattern-so-what.html"&gt;scrambling around&lt;/a&gt; attending &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;GroovyDevCon&lt;/span&gt; meetings and looking to get Groovy incorporated in Seam to bring the same level of elegance to Seam as we have now in Grails. Still, I believe &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;JBoss&lt;/span&gt; are on to a good thing, keep up the good work guys ;-)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;JRuby&lt;/span&gt; on Rails is being talked about, and noise is being made, but where is the real world use cases? Who is actually deploying &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;JRuby&lt;/span&gt; on Rails now? No one. fact. With Grails we have people using and deploying real worlds Grails applications all over the place. In the Java space, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;JRuby&lt;/span&gt; on Rails is playing catchup to Grails and not the other way round. And now we have &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;JRuby&lt;/span&gt; on Grails being suggested. How the tables are turning ;-)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Then we have poor old Phobos, which has managed 38 posts on the user mailing list since June last year. As Charles says, you guys are "damn smart" Sun engineers, so do the smart thing and give up guys, this is going nowhere. On one side of the fence you're saying "use &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;JSF&lt;/span&gt; and forget about Javascript!" and now you want people to write it on the Server-side? I love JavaScript, but there are far more elegant languages to include on the server-side. My advice? Join Grails and help make it better and support other languages. We have solutions to most of the problems you're trying to solve now. Why duplicate effort?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;People &lt;a href="http://blogs.bytecode.com.au/glen"&gt;all&lt;/a&gt; &lt;a href="http://mnteractive.com/archive/mnteractive-profile-refactr/"&gt;over&lt;/a&gt; &lt;a href="http://refactr.com/blog/2007/03/02/minnesota-just-got-groovier/"&gt;the&lt;/a&gt; &lt;a href="http://groovy.org.es/"&gt;place&lt;/a&gt; &lt;a href="http://xytang.blogspot.com/search/label/Grails"&gt;are&lt;/a&gt; discovering and enjoying Grails. It provides a solution now, everyone else is just talking about a solution.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Call me "opinionated", but one thing is for sure I said it at the end of last year and I'll say it again now. This is going to be one hell of a year for Groovy &amp;amp; Grails. So no Charles, you're not wrong, you are indeed right. Its just a matter of time and resources, and whether Sun are willing to to waste their time (Phobos) or commit to something special (Grails).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-1666676409559661401?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/1666676409559661401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=1666676409559661401' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1666676409559661401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/1666676409559661401'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/03/charles-nutter-ruby-on-grails-story.html' title='The Charles Nutter Ruby on Grails story'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20633170.post-6210052965956698830</id><published>2007-03-09T14:48:00.000Z</published><updated>2007-03-09T14:54:36.003Z</updated><title type='text'>Grails Session accepted at JavaOne</title><content type='html'>So here's some additional good news. As well as the &lt;a href="http://uk.sun.com/sunnews/events/2007/mar/revolution/techdays07/grails.html"&gt;Grails event&lt;/a&gt; at Sun Tech Days my session submission has passed &lt;a href="http://www.jroller.com/page/fate?entry=what_makes_for_a_good"&gt;Hani&lt;/a&gt; and the JavaOne panel's strict acceptance criteria and there will be a Grails session at &lt;a href="http://java.sun.com/javaone/sf/index.jsp"&gt;JavaOne&lt;/a&gt;! See in San Francisco in May!&lt;br /&gt;&lt;br /&gt;PS There may well be something else special Grails related happening at JavaOne, stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20633170-6210052965956698830?l=graemerocher.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://graemerocher.blogspot.com/feeds/6210052965956698830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20633170&amp;postID=6210052965956698830' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6210052965956698830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20633170/posts/default/6210052965956698830'/><link rel='alternate' type='text/html' href='http://graemerocher.blogspot.com/2007/03/grails-session-accepted-at-javaone.html' title='Grails Session accepted at JavaOne'/><author><name>Graeme Rocher</name><uri>http://www.blogger.com/profile/12301973191113958910</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry></feed>
