<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<channel>
<title>javanicus</title>
<link>http://javanicus.com/blog2/</link>
<description>Jeremy Rayner on java and other stuff.</description>
<admin:generatorAgent rdf:resource="http://javanicus.com/blogmento"/>
<item>
        <title>Lightning Groovy</title>
        <link>http://javanicus.com/blog2/items/210-index.html</link>
        <description>center&gt;&lt;script type="text/javascript" src="http://blip.tv/scripts/pokkariPlayer.js"&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://blip.tv/syndication/write_player?skin=js&amp;posts_id=245436&amp;source=3&amp;autoplay=true&amp;file_type=flv&amp;player_width=&amp;player_height="&gt;&lt;/script&gt;&lt;div id="blip_movie_content_245436"&gt;&lt;a href="http://blip.tv/file/get/Jez-LightningGroovy899.mov" onclick="play_blip_movie_245436(); return false;"&gt;&lt;img src="http://blip.tv/file/get/Jez-LightningGroovy899.mov.jpg" border="0" title="Click To Play" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blip.tv/file/get/Jez-LightningGroovy899.mov" onclick="play_blip_movie_245436(); return false;"&gt;Click To Play&lt;/a&gt;&lt;/div&gt;&lt;/center&gt;&lt;div class="blip_description"&gt;&lt;p&gt;My 6 minute elevator pitch for the Groovy language.&lt;br /&gt;&lt;br /&gt;Recorded at Google offices in London on 24 May 2007, &lt;br /&gt;as part of the Open Source Code Jam 3&lt;/p&gt;&lt;p&gt;&amp;#194;&amp;#160;Presented and Edited by me ( Jeremy Rayner )&lt;br /&gt;&lt;/p&gt;&lt;/div</description>
        <dc:subject>Groovy</dc:subject>
        <dc:date>2007-05-25T15:19:20+0100</dc:date>
</item>
<item>
        <title>Groovy at JavaOne 2007</title>
        <link>http://javanicus.com/blog2/items/208-index.html</link>
        <description>Here is a round up of bloggers feedback about Groovy from JavaOne2007

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;b&gt;Positive&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;a href="http://bernarding.blogspot.com/2007/05/ah-yes-netbeans-day.html"&gt;Bernard Ng&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href="http://blog.saush.com/?p=183"&gt;Sausheong&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;Ben Teese &lt;a href="http://blog.shinetech.com/?p=18"&gt;[1]&lt;/a&gt;, &lt;a href="http://blog.shinetech.com/?p=32"&gt;[2]&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;Charles Ditzel &lt;a href="http://cld.blog-city.com/groovy_and_grails_on_a_roll.htm"&gt;[1]&lt;/a&gt;, &lt;a href="http://cld.blog-city.com/javaone_2007__groovy_ts1742_presentation_available.htm"&gt;[2]&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href="http://demian0311.blogspot.com/2007/05/java-one-day-before.html"&gt;Demian&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href="http://javathehutt.blogspot.com/2007/05/javaone-day-3-my-groovy-redux.html"&gt;Michael Kovacs&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;Andres Almiray &lt;a href="http://jroller.com/page/aalmiray?entry=javaone_day_1"&gt;[1]&lt;/a&gt;,
&lt;a href="http://jroller.com/page/aalmiray?entry=what_happened_at_g2one"&gt;[2]&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href="http://jroller.com/page/peter_pilgrim?entry=javaone_2007_day_3_thursday"&gt;Peter Pilgrim&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href="http://cloudcomputing.blogspot.com/2007/05/hello-world-from-javaone-2007.html"&gt;Chirag Mehta&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;Matt Stine &lt;a href="http://mattatjavaone2007.blogspot.com/2007/05/and-then-it-was-over.html"&gt;[1]&lt;/a&gt;,
&lt;a href="http://mattatjavaone2007.blogspot.com/2007/05/it-seems-to-be-year-of-dynamicscripting.html"&gt;[2]&lt;/a&gt;,
&lt;a href="http://mattatjavaone2007.blogspot.com/2007/05/java-university-rapid-web-site.html"&gt;[3]&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;Jason &lt;a href="http://qd-javaone.blogspot.com/2007/05/day-1.html"&gt;[1]&lt;/a&gt;,
&lt;a href="http://qd-javaone.blogspot.com/2007/05/end-of-thursday.html"&gt;[2]&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href="http://ramapajama.com/blog/?p=94"&gt;Maryland Pok Guy&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;Lucas Jellema &lt;a href="http://technology.amis.nl/blog/?p=1944"&gt;[1]&lt;/a&gt;,
&lt;a href="http://technology.amis.nl/blog/?p=1945"&gt;[2]&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href="http://www.michaelyuan.com/blog/2007/05/09/jboss-seam-book-makes-the-javaone-official-best-seller-list/"&gt;Michael Yuan&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href="http://www.tbatchelli.org/2007/05/10/at-javaone-2007/"&gt;Antoni Batchelli&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;/td&gt;
&lt;td&gt;

&lt;dl&gt;
&lt;dt&gt;&lt;b&gt;Neutral&lt;/b&gt;&lt;/d2&gt;
&lt;dd&gt;&lt;a href="http://abstractfinal.blogspot.com/2007/05/javaone-day-1-scripting-everywhere.html"&gt;Keyur Shah&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href="http://javaone4psg.blogspot.com/2007/05/javaone-day-4.html"&gt;Tony&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href="http://jroller.com/page/cpurdy/20070508"&gt;Cameron Purdy&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href="http://lifeintechnoland.blogspot.com/2007/05/javaone.html"&gt;Frank Coyle&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href="http://net3x.blogspot.com/2007/05/javaone-day-4-toy-show-comparing-grails.html"&gt;Igor Minar&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href="http://www.opencurly.com/dev/javaone-2007-a-vendors-perspective"&gt;Brendon Humphreys&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;br&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;b&gt;Negative&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;Ola Bini &lt;a href="http://ola-bini.blogspot.com/2007/05/javaone-day-4-final-friday.html"&gt;[1]&lt;/a&gt;,
&lt;a href="http://ola-bini.blogspot.com/2007/05/javaone-keynote-and-groovy-session.html"&gt;[2]&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;Cay Horstmann &lt;a href="http://weblogs.java.net/blog/cayhorstmann/archive/2007/05/java_one_day_0.html"&gt;[1]&lt;/a&gt;,
&lt;a href="http://weblogs.java.net/blog/cayhorstmann/archive/2007/05/java_one_day_2.html"&gt;[2]&lt;/a&gt;,
&lt;a href="http://weblogs.java.net/blog/cayhorstmann/archive/2007/05/java_one_day_3.html"&gt;[3]&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href="http://www.bileblog.org/?p=328"&gt;Hani Suleiman&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;

&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;b&gt;Friends&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;a href="http://blogs.sun.com/geertjan/entry/javaone_day_three"&gt;Geertjan Wielenga&lt;/a&gt; (Netbeans plugin)&lt;/dd&gt;

&lt;dd&gt;Graeme Rocher &lt;a href="http://graemerocher.blogspot.com/2007/05/grails-us-tour-javaone-day-0-g2one.html"&gt;[1]&lt;/a&gt;,
&lt;a href="http://graemerocher.blogspot.com/2007/05/grails-us-tour-javaone-day-1.html"&gt;[2]&lt;/a&gt;,
&lt;a href="http://graemerocher.blogspot.com/2007/05/grails-us-tour-javaone-day-2.html"&gt;[3]&lt;/a&gt;,
&lt;a href="http://graemerocher.blogspot.com/2007/05/grails-us-tour-javaone-day-3-back-to.html"&gt;[4]&lt;/a&gt; (Grails Lead)&lt;/dd&gt;

&lt;dd&gt;Jason Rudolph &lt;a href="http://jasonrudolph.com/blog/2007/05/08/javaone-day-0-san-francisco-gets-groovy/"&gt;[1]&lt;/a&gt;
&lt;a href="http://jasonrudolph.com/blog/2007/05/12/javaone-day-3-part-2-groove-on"&gt;[2]&lt;/a&gt;
&lt;a href="http://jasonrudolph.com/blog/2007/05/13/javaone-day-4-part-1-where-do-standards-come-from/"&gt;[3]&lt;/a&gt;&lt;/dd&gt;

&lt;dd&gt;&lt;a href="http://www.infoq.com/news/2007/05/cool-things-with-groovy"&gt;Ian Roughley&lt;/a&gt; (InfoQ)&lt;/dd&gt;
&lt;/dl&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;b&gt;JavaFx&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;a href="http://beust.com/weblog/archives/000446.html"&gt;Cedric Beust&lt;/a&gt; + comments&lt;/dd&gt;
&lt;dd&gt;&lt;a href="http://shemnon.com/speling/2007/05/javaone-and-javafx-i-think-ive.html"&gt;Danno Ferrin&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href="http://weblogs.java.net/blog/ronhitchens/archive/2007/05/javaone_2007_i.html"&gt;Ron Hitchens&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href="http://www.giolist.com/2007/05/javafx-and-groovy.html"&gt;Steve Giovannetti&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;


It looks like we managed to enthuse some people about Groovy and we even
made it to the best seller list (&lt;a href="http://java.sun.com/javaone/sf/2007/articles/bookstorebestsellers.jsp"&gt;#5&lt;/a&gt;)
&lt;p&gt;
Special thanks to &lt;a href="http://www28.cplan.com/cc158/speaker_details.jsp?isid=285742&amp;ilocation_id=158-1&amp;ilanguage=english&amp;icontact_id=25335"&gt;Guillaume Laforge&lt;/a&gt;,
&lt;a href="http://www28.cplan.com/cc158/speaker_details.jsp?isid=285742&amp;ilocation_id=158-1&amp;ilanguage=english&amp;icontact_id=38395"&gt;Dierk König&lt;/a&gt;,
&lt;a href="http://www28.cplan.com/cc158/speaker_details.jsp?isid=286720&amp;ilocation_id=158-1&amp;ilanguage=english&amp;icontact_id=16373"&gt;Rod Cope&lt;/a&gt;,
&lt;a href="http://www28.cplan.com/cc158/speaker_details.jsp?isid=286720&amp;ilocation_id=158-1&amp;ilanguage=english&amp;icontact_id=16373"&gt;Vladimir Vivien&lt;/a&gt;
&lt;a href="http://www28.cplan.com/cc158/speaker_details.jsp?isid=286133&amp;ilocation_id=158-1&amp;ilanguage=english&amp;icontact_id=24686"&gt;Graeme Rocher&lt;/a&gt;
and anyone else who talked about Groovy at JavaOne, either on stage, or in the corridors. Nice one.


</description>
        <dc:subject>Groovy</dc:subject>
        <dc:date>2007-05-14T11:34:06+0100</dc:date>
</item>
<item>
        <title>Third Groovy Developers Conference</title>
        <link>http://javanicus.com/blog2/items/205-index.html</link>
        <description> &lt;center&gt;&lt;script type="text/javascript" src="http://blip.tv/scripts/pokkariPlayer.js"&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://blip.tv/syndication/write_player?skin=js&amp;posts_id=145238&amp;source=3&amp;autoplay=false&amp;file_type=flv&amp;player_width=480&amp;player_height=308"&gt;&lt;/script&gt;&lt;div id="blip_movie_content_145238"&gt;&lt;a href="http://blip.tv/file/get/Jez-GroovyDevelopersConferenceParis2007361.flv" onclick="play_blip_movie_145238(); return false;"&gt;&lt;img src="http://blip.tv/file/get/Jez-GroovyDevelopersConferenceParis2007361.flv.jpg" border="0" title="Click To Play" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blip.tv/file/get/Jez-GroovyDevelopersConferenceParis2007361.flv" onclick="play_blip_movie_145238(); return false;"&gt;Click To Play&lt;/a&gt;&lt;/div&gt;&lt;script type="text/javascript"&gt;play_blip_movie_145238();&lt;/script&gt;&lt;/center</description>
        <dc:subject>Groovy</dc:subject>
        <dc:date>2007-02-01T09:46:15+0000</dc:date>
</item>
<item>
        <title>Groovy 1.0 released!</title>
        <link>http://javanicus.com/blog2/items/204-index.html</link>
        <description> &lt;a href="http://groovy.codehaus.org"&gt;Groovy 1.0&lt;/a&gt; has finally been &lt;a href="http://docs.codehaus.org/display/GROOVY/2007/01/02/Groovy+1.0+is+there"&gt;released&lt;/a&gt;.
&lt;p&gt;
It has been a long road, lasting over three years,
but at last I can recommend Groovy as a stable,
production proven and well documented programming 
language for the Java platform. 
(not to mention a very helpful and large &lt;a href="http://www.nabble.com/groovy---user-f11867.html"&gt;user community&lt;/a&gt;)
&lt;p&gt;
This release coincides with the launch of the Manning
book &lt;a href="http://groovy.canoo.com/gina"&gt;Groovy in Action&lt;/a&gt;,
which gives an in depth reference to Groovy 1.0&lt;p&gt;
&lt;i&gt;[Full Disclosure: I'm a core committer for Groovy and I was a technical reviewer for this book]&lt;/i&gt;
&lt;p&gt;
Groovy 1.0 Highlights:
&lt;ul&gt;
&lt;li&gt;A formal syntax based closely on Java 1.5, with added Groovy bits.&lt;/li&gt;
&lt;li&gt;Groovy can easily run source from the command line, ant, embedded in code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(simply place &lt;a href="http://dist.codehaus.org/groovy/jars/groovy-all-1.0.jar"&gt;groovy-all-1.0.jar&lt;/a&gt; in your classpath)&lt;/li&gt;
&lt;li&gt;Close ties with Spring, Lucene and other real world Java products.&lt;/li&gt;
&lt;li&gt;Fantastic for reducing the verbosity of common tasks in Java&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;b&gt;quick start&lt;/b&gt;: example installation to /usr/local
&lt;pre&gt;
$ cd /usr/local
$ wget http://dist.codehaus.org/groovy/distributions/groovy-1.0.tar.gz
$ tar xvfz groovy-1.0.tar.gz
$ export GROOVY_HOME=/usr/local/groovy-1.0
$ export PATH=${GROOVY_HOME}/bin:$PATH
$ groovy -e "println 'hello world'"
&lt;/pre&gt;
&lt;p&gt;
To coincide with this release, I have also &lt;a href="http://grash.javanicus.com/grash"&gt;released version 0.0.2&lt;/a&gt; of the JVM command line interpreter &lt;a href="http://grash.javanicus.com/grash"&gt;Grash&lt;/a&gt;.
&lt;p&gt;
I'll be giving &lt;a href="http://www.skillsmatter.com/groovy-grails-ug"&gt;a Talk about the Groovy Compiler&lt;/a&gt; on 25 Jan 2007 in London, please come along to that, and the pub afterwards, to discuss all things Groovy.
&lt;p&gt;
I will be at the &lt;a href="http://javanicus.com/blog2/items/191-index.html"&gt;Groovy Developers Conference&lt;/a&gt; in Paris (starts 29 Jan 2007)
to discuss the future direction of Groovy, in particular enhanced &lt;a href="http://groovy.codehaus.org/Eclipse+Plugin"&gt;IDE support&lt;/a&gt;.
&lt;p&gt;
In May 2007 there will be a three day &lt;a href="http://skillsmatter.com/grailsexchange"&gt;Groovy and Grails conference&lt;/a&gt; at the Barbican, which will be perfect for anyone interested in this language to meet the core developers, and discover the cutting edge progress in Groovy.
&lt;p&gt;
But most of all, Groovy 1.0 would not be where it is today without the work of the open source community.  I'd like to thank each person for their work in making Groovy a fantastic language:&lt;br&gt;
&lt;b&gt;Committers&lt;/b&gt;:&lt;br&gt;
    &lt;a href="http://glaforge.free.fr/weblog/"&gt;Guillaume Laforge&lt;/a&gt; (glaforge), &lt;a href="http://blackdragsview.blogspot.com/"&gt;Jochen Theodorou&lt;/a&gt; (blackdrag), &lt;a href="http://javanicus.com/blog2"&gt;Jeremy Rayner&lt;/a&gt; (jez),
    &lt;a href="http://eek.ook.org/"&gt;John Wilson&lt;/a&gt; (tug), &lt;a href="http://www.russel.org.uk/"&gt;Russel Winder&lt;/a&gt; (russel), &lt;a href="http://radio.weblogs.com/0112098/"&gt;James Strachan&lt;/a&gt; (jstrachan),
    &lt;a href="http://www.javapolis.com/confluence/pages/viewpage.action?pageId=27085"&gt;Dierk Koenig&lt;/a&gt; (dierk), &lt;a href="http://www.google.co.uk/search?q=Christian+Stein+groovy&amp;hl=en&amp;lr=&amp;client=firefox-a&amp;rls=org.mozilla:en-GB:official&amp;hs=iUM&amp;start=10&amp;sa=N"&gt;Christian Stein&lt;/a&gt; (cstein), &lt;a href="http://www.google.co.uk/search?hl=en&amp;client=firefox-a&amp;rls=org.mozilla%3Aen-GB%3Aofficial&amp;hs=cWM&amp;q=Paul+King+groovy&amp;btnG=Search&amp;meta="&gt;Paul King&lt;/a&gt; (paulk),
    &lt;a href="http://64.233.183.104/search?q=cache:azPm2_Xb1O4J:joe.truemesh.com/+walnes&amp;hl=en&amp;gl=uk&amp;ct=clnk&amp;cd=1&amp;client=firefox-a"&gt;Joe Walnes&lt;/a&gt; (joe), &lt;a href="http://opensource.thoughtworks.com/people/chrisstevenson.html"&gt;Chris Stevenson&lt;/a&gt; (skizz), &lt;a href="http://www.google.co.uk/search?q=Jamie+McCrindle&amp;ie=utf-8&amp;oe=utf-8&amp;rls=org.mozilla:en-GB:official&amp;client=firefox-a"&gt;Jamie McCrindle&lt;/a&gt; (jamiemc),
    &lt;a href="http://blog.foemmel.com/"&gt;Matt Foemmel&lt;/a&gt; (mattf),  &lt;a href="http://www.sampullara.com/"&gt;Sam Pullara&lt;/a&gt; (spullara),  &lt;a href="http://docs.codehaus.org/display/~kasper"&gt;Kasper Nielsen&lt;/a&gt; (kasper),
    &lt;a href="http://www.google.co.uk/search?hl=en&amp;client=firefox-a&amp;rls=org.mozilla%3Aen-GB%3Aofficial&amp;hs=McM&amp;q=Travis+Kay+java&amp;btnG=Search&amp;meta="&gt;Travis Kay&lt;/a&gt; (travis), &lt;a href="http://www.myfriendthedeveloper.com/interviews/2005/03/zohar_melamed.html"&gt;Zohar Melamed&lt;/a&gt; (zohar),  &lt;a href="http://codehaus.org/"&gt;Bob McWhirter&lt;/a&gt; (bob),
    &lt;a href="http://dreaming.org/~cpoirier/"&gt;Chris Poirier&lt;/a&gt; (cpoirier), &lt;a href="http://www.google.co.uk/search?hl=en&amp;client=firefox-a&amp;rls=org.mozilla%3Aen-GB%3Aofficial&amp;hs=x11&amp;q=Christiaan+Klooster&amp;btnG=Search&amp;meta="&gt;Christiaan ten Klooster&lt;/a&gt; (ckl), &lt;a href="http://www.google.co.uk/search?hl=en&amp;client=firefox-a&amp;rls=org.mozilla%3Aen-GB%3Aofficial&amp;hs=OiM&amp;q=Steve+Goetze+groovy&amp;btnG=Search&amp;meta="&gt;Steve Goetze&lt;/a&gt; (goetze),
    &lt;a href="http://www.google.co.uk/search?q=java+bing+ran&amp;ie=utf-8&amp;oe=utf-8&amp;rls=org.mozilla:en-GB:official&amp;client=firefox-a"&gt;Bing Ran&lt;/a&gt; (bran),  &lt;a href="http://www.google.co.uk/search?hl=en&amp;client=firefox-a&amp;rls=org.mozilla%3Aen-GB%3Aofficial&amp;hs=WPh&amp;q=John+Stump+java&amp;btnG=Search&amp;meta="&gt;John Stump&lt;/a&gt; (jstump), &lt;a href="http://www.pilhokim.com/index.php?title=Main_Page"&gt;Pilho Kim&lt;/a&gt; (phk), &lt;a href="http://www.eecis.udel.edu/~carroll/homepage.html"&gt;Mark Chu-Carroll&lt;/a&gt; (markcc),
    &lt;a href="http://www.bright-green.com/blog/"&gt;Alan Green&lt;/a&gt; (alang), &lt;a href="http://www.google.co.uk/search?q=Edward+Povazan&amp;ie=utf-8&amp;oe=utf-8&amp;rls=org.mozilla:en-GB:official&amp;client=firefox-a"&gt;Edward Povazan&lt;/a&gt; (emp), &lt;a href="http://www.google.co.uk/search?q=Franck+Rasolo&amp;ie=utf-8&amp;oe=utf-8&amp;rls=org.mozilla:en-GB:official&amp;client=firefox-a"&gt;Franck Rasolo&lt;/a&gt; (fraz),
    &lt;a href="http://blogs.sun.com/jrose/"&gt;John Rose&lt;/a&gt; (jrose), &lt;a href="http://graemerocher.blogspot.com/"&gt;Graeme Rocher&lt;/a&gt; (graeme), &lt;a href="http://www.javapolis.com/confluence/display/JP06/Guillaume+Alleon"&gt;Guillaume Alleon&lt;/a&gt; (galleon),
    &lt;a href="http://www.google.co.uk/search?q=+Antti+Karanta&amp;ie=utf-8&amp;oe=utf-8&amp;rls=org.mozilla:en-GB:official&amp;client=firefox-a"&gt;Antti Karanta&lt;/a&gt; (akaranta), &lt;a href="http://www.google.co.uk/search?hl=en&amp;client=firefox-a&amp;rls=org.mozilla%3Aen-GB%3Aofficial&amp;hs=PC2&amp;q=%22Dave+Kerber%22+java&amp;btnG=Search&amp;meta="&gt;Dave Kerber&lt;/a&gt; (davekerber), &lt;a href="http://www.ux.uis.no/~meling/"&gt;Hein Meling&lt;/a&gt; (hmeling), 
    &lt;a href="http://www.google.co.uk/search?q=Joachim+Baumann+java&amp;ie=utf-8&amp;oe=utf-8&amp;rls=org.mozilla:en-GB:official&amp;client=firefox-a"&gt;Joachim Baumann&lt;/a&gt; (jbaumann), &lt;a href="http://www.google.co.uk/search?hl=en&amp;client=firefox-a&amp;rls=org.mozilla%3Aen-GB%3Aofficial&amp;hs=oYh&amp;q=James+E.+Ervin+java&amp;btnG=Search&amp;meta="&gt;James E. Ervin&lt;/a&gt; (jervin),  &lt;a href="http://codehaus.org/~jshickey/"&gt;Scott Hickey&lt;/a&gt; (jshickey),
    &lt;a href="http://www.martincmartin.com/"&gt;Martin C. Martin&lt;/a&gt; (mcspanky), &lt;a href="http://www.google.co.uk/search?hl=en&amp;client=firefox-a&amp;rls=org.mozilla%3Aen-GB%3Aofficial&amp;hs=UH2&amp;q=Marc+Guillemot+java&amp;btnG=Search&amp;meta="&gt;Marc Guillemot&lt;/a&gt; (mguillem), &lt;a href="http://opensource.thoughtworks.com/people/aslakhellesoy.html"&gt;Aslak Hellesoy&lt;/a&gt; (rinkrank),
    &lt;a href="http://skillsmatter.com/menu/403"&gt;Steven Devijver&lt;/a&gt; (sdevijver), &lt;a href="http://www.google.co.uk/search?hl=en&amp;client=firefox-a&amp;rls=org.mozilla%3Aen-GB%3Aofficial&amp;hs=Veh&amp;q=Scott+Stirling+java&amp;btnG=Search&amp;meta="&gt;Scott Stirling&lt;/a&gt; (sstirling), &lt;a href="http://springone.wiki-neon.adaptavist.com/display/SpringOne06/Yuri+Schimke"&gt;Yuri Schimke&lt;/a&gt; (yuri)

&lt;br&gt;&lt;b&gt;Contributors&lt;/b&gt;:&lt;br&gt;
    Joern Eyrich, Robert Kuzelj, Rod Cope,
    James Birchfield, Robert Fuller, Sergey Udovenko
    Hallvard Traetteberg, Peter Reilly, Brian McCallister
    Richard Monson-Haefel, Brian Larson, Artur Biesiadowski
    Ivan Z. Ganza, Arjun Nayyar, Mark Turansky, Jean-Louis Berliet, 
    Graham Miller, Marc Palmer, Tugdual Grall, and many many
    many other contributors and organisations.
&lt;p&gt;
Thankyou All (and apologies if I missed anyone, so many people...) :-)
&lt;p&gt;
P.S. an improved &lt;a href="http://javanicus.com/blog2/items/203-index.html"&gt;java2groovy&lt;/a&gt; is now in the core distribution of groovy 1.0 :-)</description>
        <dc:subject>Groovy</dc:subject>
        <dc:date>2007-01-03T06:34:16+0000</dc:date>
</item>
<item>
        <title>java2groovy</title>
        <link>http://javanicus.com/blog2/items/203-index.html</link>
        <description>Having just finished the first full run through of a groovy pretty printer,
I thought I'd flex it's muscles by creating a useful command line program...

&lt;pre&gt;
 &lt;b&gt;java2groovy [file ...]&lt;/b&gt;

&lt;i&gt;Description:&lt;/i&gt;
    The java2groovy tool reads class and interface definitions, written in the
    Java programming language, and converts them into groovy source files.
&lt;/pre&gt;

to do this...

&lt;ul&gt;
&lt;li&gt; I took the original java.g grammar which groovy.g is based upon&lt;/li&gt;
&lt;li&gt;amended it to remove Java features not implemented in groovy.g
 ("do" keyword, Array Initialisers etc)&lt;/li&gt;
&lt;li&gt; Created a Java2GroovyMain which takes Java files and parses into a
Java like source AST&lt;/li&gt;
&lt;li&gt;Converted the Java like source AST into a one for one Groovy equivalant&lt;/li&gt;
&lt;li&gt; Applied a Groovifier, which applies common simplification tasks to
the AST (e.g. don't need public keyword if you have other modifiers)&lt;/li&gt;
&lt;li&gt; Then the resultant groovy AST is output using the "pretty printer"&lt;/li&gt;
&lt;/ul&gt;
&lt;i&gt;(not in subversion yet RC3? post 1.0?)&lt;/i&gt;

&lt;p&gt;
So... job done, what's next :-)
&lt;/p&gt;
&lt;p&gt;
Seriously though...
&lt;ul&gt;
&lt;li&gt; java.g needs to be amended some more to use create() instead of #[],
otherwise line/col nums are lost&lt;/li&gt;
&lt;li&gt; Groovifier.java is an interesting step, lots of tiny refactorings,
at the source AST level, very powerful...
&lt;pre&gt;
//----
// (e.g. don't need public keyword if you have other modifiers)
//
if (t.getType() == MODIFIERS) {
   GroovySourceAST publicNode = t.childOfType(LITERAL_public);
       if (t.getNumberOfChildren() &gt; 1 &amp; publicNode != null) {
       // has more than one modifier, and one of them is public
           // delete 'public' node
           publicNode.setType(EXPR);
}
//----
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt; some minor changes to things like string literals (get a double double-quote each time at mo...)&lt;/li&gt;
&lt;li&gt; all pretty printer issues apply (no comments on AST etc)&lt;/li&gt;
&lt;/ul&gt;

java2groovy is now included in Groovy 1.0 (download &lt;a href="http://dist.codehaus.org/groovy/distributions/groovy-1.0.tar.gz"&gt;here&lt;/a&gt;)&lt;br&gt;
(very very beta) NO DOCS, NO WARRANTIES etc etc
&lt;p&gt;
Oh yes... a sample...

&lt;pre&gt;
&lt;b&gt;$ java2groovy src/test/groovy/lang/MockWriter.java&lt;/b&gt;

/*
 Automatically Converted from Java Source

 by java2groovy v0.0.1   Copyright Jeremy Rayner 2007

 !! NOT FIT FOR ANY PURPOSE !!
 'java2groovy' cannot be used to convert one working program into another
*/

package groovy.lang
class MockWriter

   {

   private String output

   String getOutput() {
       String answer = output
       output = null
       return answer
   }


   void setOutput(String
        output) {
   }


   void println() {
       setOutput(""println()"")
   }


   void println(Object
        object) {
       setOutput(""println("" + object + "")"")
   }


   void print(Object
        object) {
       setOutput(""print("" + object + "")"")
   }
}
&lt;/pre&gt;
</description>
        <dc:subject>Groovy</dc:subject>
        <dc:date>2006-12-29T19:23:24+0000</dc:date>
</item>
<item>
        <title>Second Groovy Conference</title>
        <link>http://javanicus.com/blog2/items/191-index.html</link>
        <description> &lt;p&gt;
  Starting out on a chilly November morning, with just a Burger King
breakfast for company, I found myself checking in for the Eurostar
to Paris.  I boarded the train, and found I had two hours of my
own time (a rare thing these days) and therefore decided to bring
some of my projects up to speed with the latest &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; release
(JSR-04)
&lt;/p&gt;&lt;p&gt;
  First off was my pet wiki server called &lt;a href="http://biscuit.javanicus.com"&gt;biscuit&lt;/a&gt;, which was a
simple affair needing changes only to variables not initialized
with a type or the 'def' keyword.  As I finish this task before
arriving at the channel tunnel I decided to sink my teeth into
a meatier topic, and look into providing tab completion for my
Groovy shell called &lt;a href="http://grash.javanicus.com"&gt;grash&lt;/a&gt;.  The excellent &lt;a href="http://jline.sourceforge.net/"&gt;jline&lt;/a&gt; library hooks
for completion, so I quickly hook this up to the 'ls' function
in grash and feel great as I navigate my object tree using
the same nifty functionality I know in my favourite unix shells.
&lt;br&gt;  I then started bringing grash up to the latest Groovy release,
but after the initial 'def' updates, I quickly realise that
something else is afoot.  It appears that providing user defined
commands and attaching them to objects has broken. A quick debugging
session shows that for some reason the GroovyClassLoader is being
told to load two versions of the reflector for the same script.
&lt;br&gt;  At this point I get a phone call from &lt;a href="http://radio.weblogs.com/0112098/"&gt;James Strachan&lt;/a&gt;, it appears
that he caught the train by the skin of his teeth, and after fighting
his way down the carriages we meetup, just as we pull into Paris.
&lt;/p&gt;&lt;p&gt;
  As we stand in the queue for the taxis, James and myself discuss
the &lt;a href="www.xbean.org"&gt;xbean&lt;/a&gt; project and how to best integrate Groovy closures into
Springs &lt;a href="http://www.springframework.org/docs/reference/jdbc.html"&gt;template callback&lt;/a&gt; mechanisms.  In order to prevent writing
wrapper classes over the top of every spring template, James suggests
adding functionality to groovy to allow single method interfaces to
be automatically implemented by Closures, in much the same way as
Listeners are implementable by Closures today.  As James pulls out
his laptop and starts showing me where these hooks would reside, I
can tell that this is going to be a good JSR meeting, and one which
would justify using two days of my own holiday and the excessive 
eurostar fares which I paid for.
&lt;/p&gt;&lt;p&gt;
  We arrive, after a hairy taxi ride around the 'Arc de Triumphe'
at the Sun offices in Paris.  Guillaume excitedly takes us up
to the 'Jupiter' room on the third floor, where I finally get
to meet blackdrag, our debugger extraordinaire, and Dierk who
has been writing Groovy in Action.  We are delighted to find that
Sun have provided an internet connection, and Guillaume has
already uploaded photos to &lt;a href="http://www.flickr.com/photos/tags/jsr241"&gt;flickr&lt;/a&gt; for the watching world to see.
&lt;br&gt;
&lt;img src="http://static.flickr.com/27/67860054_5c227f9dcb_m.jpg"&gt;&lt;img src="http://static.flickr.com/30/67860055_501759ea50_m.jpg"&gt;
&lt;br&gt;  Having missed the morning session due to our travel, we are quickly
brought up to speed.  Finally we will get to talk about name resolution
and scoping.  The topic for the first day appears to be name resolution,
with most of the discussion centring around how best to cope with vanilla
names. &lt;br&gt;
&lt;img src="http://static.flickr.com/30/67861910_54728e7699_m.jpg"&gt;
&lt;img src="http://static.flickr.com/25/67861911_3892963137_m.jpg"&gt;
&lt;br&gt; After a lunch paid for, very kindly, by Dierk, the discussion
soon turns into a heated debate over the treatment of vanilla names.

&lt;pre&gt;
class MyScript {
  String toString(){
    return "foo"
  }

  void run() {
    myList.each{
      // does this call MyScript.toString() or myList.toString() ?
      println(toString())  
  }
}
&lt;/pre&gt;

  I believe that... Tug argues the enclosing object instance should
listen for and consume names prior to the lexical scope. (i.e. above
example would call myList.toString())
&lt;br&gt;  James argues that the default should be lexically bound to the current
context (i.e. above example would call myScript.toString()), and if
the object instance was needed to be referred to that some form of syntax
could be constructed to allow this, e.g. $toString() would be a dynamic
name that could be interpreted differently.
 &lt;br&gt; At least, with my laptop pointing at the wiki, and up on the
projector, I ensure that the &lt;a href="http://docs.codehaus.org/pages/viewpage.action?pageId=39000"&gt;examples and minutes&lt;/a&gt; are being captured
in the wiki and not on the whiteboard.
&lt;br&gt;
&lt;img src="http://static.flickr.com/29/67861912_21cbc3d003_m.jpg"&gt;&lt;img src="http://static.flickr.com/24/67862207_f2779fed05_m.jpg"&gt;
&lt;/p&gt;&lt;p&gt;
&lt;br&gt;  We appear not to reach a resolution as &lt;a href="http://blogs.codehaus.org/people/vmassol/"&gt;Vincent Massol&lt;/a&gt; arrives to
bring us to the Chinese restaurant for the evening.  We all potter
down to the Metro, Guillaume and tug have kindly arranged metro tickets
for us delegates too laden with bags, and soon we arrive across town.
There we meet &lt;a href="http://www.xwiki.org/xwiki/bin/view/Main/WebHome"&gt;Xwiki's&lt;/a&gt; Ludovic Dubost and Erwan Arzur and Benjamin Mestrallet from &lt;a href="http://www.exoplatform.com/portal/faces/public/exo"&gt;eXoPlatform&lt;/a&gt;.
&lt;br&gt;
&lt;img src="http://static.flickr.com/30/67861913_dcb54a76d1_m.jpg"&gt;&lt;img src="http://static.flickr.com/26/67861914_9ebd7083cc_m.jpg"&gt;
&lt;br&gt;
A very entertaining evening ensues, with chatter ranging from XWiki through
to 'flaming drunk prawns', and we all end up at Ludovics apartment nearby,
where Erwan introduces us to a bottle of Calvados that he had stowed
away for such occasions.  At about 12:30 we stumble back on the last
metro and finally check in to our sleepy hotel.  I feel glad to find
a towel in the room, and settle down to a restless Parisian slumber.
(thanks so much to Bob at Codehaus for funding the room)
&lt;/p&gt;&lt;p&gt;
  I awake 5 hours later to the sound of my Blackberry playing 'The
Entertainer', and discover the delights of hot chocolate for breakfast
(no sign of tea, I think coffee is more popular here).  We stumble back
to the Sun offices, again Guillaume and tug have the metro sorted.
&lt;/p&gt;&lt;/p&gt;
  Day Two starts out more productive, with discussion about opening
up the DefaultGroovyMethods for the layman and we get some agreement about the
'use' keyword and my 'enhances' proposal.  However the discussion soon
gets round to the topic of Builders (a.k.a. Markup) and again the name
resolution and scoping bear comes up to bite us again.
&lt;br&gt;
&lt;img src="http://static.flickr.com/35/67862206_dd357a04d0_m.jpg"&gt;&lt;img src="http://static.flickr.com/35/67861915_c8ec86e29a_m.jpg"&gt;
&lt;br&gt;  We have Tug and Guillaume firmly on the side of Builders being in charge
of everything defined within the markup delimiters.  James argues that
markup is fundamentally broken and some kind of syntactic clue that
we are suddenly entering a different 'markup world' where normal
resolution and scoping doesn't apply.  For some reason, that I cannot
fathom, Tug and Guillaume both seem vehemently opposed to any indication
in the code that we are in a Builder section.  This includes both
the suggestion of a 'with' keyword or .{ notation to indicate to the
reader of the code that something different is about to occur.

&lt;pre&gt;

String toString() {
  return "foo"
}
  
swingBuilder.frame() {
  panel() {
    button(toString())
  }
}
&lt;/pre&gt;

  We were all fairly happy that the Builder could be responsible for
name resolution inside it's own block (e.g. the swingBuilder instance
would be responsible for how it treats toString() inside), but what
seemed to really be a sticking point was the important fact that
due to the dynamic nature of the name resolution/scoping within this
block, some visual clue to the reader of the program was necessary.
&lt;br&gt;  James argued for, and I agree that, the use of some kind of syntactic
indication was vital to ensure that the Groovy language was sane,
predictable and maintainable.  The above example would look something
like this... (note the .{ syntax indicating a different lexical construct)

&lt;pre&gt;
swingBuilder.frame().{
  panel() {
    button(toString())
  }
}
&lt;/pre&gt;
or the even clearer...
&lt;pre&gt;
with (swingBuilder.frame()) {
  panel() {
    button(toString())
  }
}
&lt;/pre&gt;

  Thus implying to any compiler, IDE, or human reader that the block
of code was not a true lexical closure, but some other construct
which was dynamic in it's very nature, and thus warnings, code completion
and everything else specification related did not apply, as the
responsibility would lie with the implementation of the builder.
&lt;br&gt;  I'm sad to report that no agreement was reached on this matter.  
Not so much which syntax would be useful, but actually whether we
should have any syntax denoting the difference between a true
lexical Closure and one of these Builder blocks. The
historical reasons go back to Builder blocks looking just like
Closures, and I'm afraid this long standing mistake must be
removed from the language before any true progress can be made, as
no sensible specification rules can be applied while the dichotomy
exists.
&lt;br&gt;  I headed back to London with a very disappointed James Strachan,
the language which has some of the finest minds, and most exciting
ideas now faces a pivotal point in its life, and I'll do everything
I can to ensure that clarity over dynamism wins the day.
&lt;/p&gt;&lt;p&gt;
  My many thanks go to Guillaume for the meeting arrangements, to
Sun for the facilities, to XWiki,eXoPlatform and Vincent Massol for the
Chinese, Dierk for the Lunch, and Bob/GoogleAds for the hotel room.
&lt;/p</description>
        <dc:subject>Groovy</dc:subject>
        <dc:date>2005-11-28T09:03:58+0000</dc:date>
</item>
<item>
        <title>Lucene and Groovy example</title>
        <link>http://javanicus.com/blog2/items/178-index.html</link>
        <description> &lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://www.lucenebook.com"&gt;&lt;img src="http://www.lucenebook.com/lia_3d.jpg" border="0" alt="Lucene in Action"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;I've just got hold of a copy of the &lt;a href="http://www.lucenebook.com/"&gt;Lucene in Action&lt;/a&gt; book by &lt;a href="http://www.blogscene.org/erik"&gt;Erik Hatcher&lt;/a&gt; and &lt;a href="http://www.jroller.com/page/otis"&gt;Otis Gospodnetic&lt;/a&gt; and thought it would
be fun to see what the examples of basic &lt;a href="http://lucene.apache.org/"&gt;Lucene&lt;/a&gt; usage would look like 
in &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;.
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;
The Groovy code is used in the following manner, with my example 
using some free classic books from &lt;a href="http://www.gutenberg.org/browse/scores/top"&gt;Project Gutenberg&lt;/a&gt;
to search inside.
&lt;br&gt;
&lt;p&gt;
&lt;div align="center"&gt;&lt;center&gt;
&lt;table border="0" cellpadding="10" width="450"&gt;
&lt;tr&gt;
&lt;td valign="top" bgcolor="#ccffff"&gt;
&lt;small&gt;
$ &lt;b&gt;mkdir bookIndex&lt;/b&gt;&lt;br&gt;
$ &lt;b&gt;groovy -cp lucene-1.4.3.jar Indexer bookIndex ~/gutenberg&lt;/b&gt;&lt;br&gt;
Indexing~/gutenberg/Bram Stoker/Dracula.txt&lt;br&gt;
Indexing ~/gutenberg/H. G. Wells/The War of the Worlds.txt&lt;br&gt;
Indexing ~/gutenberg/Mark Twain/Adventures of Tom Sawyer.txt&lt;br&gt;
Indexing ~/gutenberg/Oscar Wilde/The Picture of Dorian Gray.txt&lt;br&gt;
Indexing 4 files took 2320 milliseconds&lt;br&gt;
$ &lt;b&gt;groovy -cp lucene-1.4.3.jar Searcher bookIndex indefatigable&lt;/b&gt;&lt;br&gt;
Found 1 document(s) (in 30 milliseconds) that matched query 'indefatigable':&lt;br&gt;
/Users/j6wbs/gutenberg/H. G. Wells/The War of the Worlds.txt&lt;br&gt;
$&lt;br&gt;
&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/center&gt;&lt;/div&gt;

&lt;p&gt;
The first example is a script that will build an &lt;a href="http://www.nist.gov/dads/HTML/invertedIndex.html"&gt;inverted index&lt;/a&gt; 
from text files on your hard disc.
&lt;p&gt;
&lt;div align="center"&gt;&lt;center&gt;
&lt;table border="0" cellpadding="10" width="450"&gt;
&lt;tr&gt;
&lt;td valign="top" bgcolor="#ffffcc"&gt;
&lt;small&gt;
Usage: &lt;b&gt;groovy -cp lucene-1.4.3.jar Indexer &amp;lt;index.dir&amp;gt; &amp;lt;text.files.dir&amp;gt;&lt;/b&gt;
&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/center&gt;&lt;/div&gt;
&lt;p&gt;
&lt;a href="http://cvs.groovy.codehaus.org/viewrep/~raw,r=MAIN/groovy/groovy/groovy-core/src/examples/searchEngine/Indexer.groovy"&gt;Indexer.groovy (download)&lt;/a&gt;

&lt;div class="code"&gt;&lt;pre&gt;&lt;span class="java&amp;#45;keyword"&gt;import&lt;/span&gt; org.apache.lucene.analysis.standard.StandardAnalyzer
&lt;span class="java&amp;#45;keyword"&gt;import&lt;/span&gt; org.apache.lucene.document.Document
&lt;span class="java&amp;#45;keyword"&gt;import&lt;/span&gt; org.apache.lucene.document.Field
&lt;span class="java&amp;#45;keyword"&gt;import&lt;/span&gt; org.apache.lucene.index.IndexWriter&lt;p class="paragraph"/&gt; &lt;span class="java&amp;#45;comment"&gt;/&amp;#42;&amp;#42;
 &amp;#42; Indexer: traverses a file system and indexes .txt files
 &amp;#42;
 &amp;#42; @author Jeremy Rayner &amp;#60;groovy@ross&amp;#45;rayner.com&amp;#62;
 &amp;#42; based on examples in the wonderful 'Lucene in Action' book
 &amp;#42; by Erik Hatcher and Otis Gospodnetic ( &lt;span class="nobr"&gt;&lt;a href="http://www.lucenebook.com"&gt;&amp;#104;ttp://www.lucenebook.com&lt;/a&gt;&lt;/span&gt; )
 &amp;#42;
 &amp;#42; requires a lucene&amp;#45;1.x.x.jar from &lt;span class="nobr"&gt;&lt;a href="http://lucene.apache.org"&gt;&amp;#104;ttp://lucene.apache.org&lt;/a&gt;&lt;/span&gt;
 &amp;#42;/&lt;/span&gt;&lt;p class="paragraph"/&gt;&lt;span class="java&amp;#45;keyword"&gt;if&lt;/span&gt; (args.size() != 2 ) &amp;#123;
    &lt;span class="java&amp;#45;keyword"&gt;throw&lt;/span&gt; &lt;span class="java&amp;#45;keyword"&gt;new&lt;/span&gt; Exception(
    &lt;span class="java&amp;#45;quote"&gt;"Usage: groovy &amp;#45;cp lucene&amp;#45;1.4.3.jar Indexer &amp;#60;index dir&amp;#62; &amp;#60;data dir&amp;#62;"&lt;/span&gt;)
&amp;#125;
def indexDir = &lt;span class="java&amp;#45;keyword"&gt;new&lt;/span&gt; File(args&amp;#91;0&amp;#93;) &lt;span class="java&amp;#45;comment"&gt;// Create Lucene index in  this directory&lt;/span&gt;
def dataDir = &lt;span class="java&amp;#45;keyword"&gt;new&lt;/span&gt; File(args&amp;#91;1&amp;#93;)  &lt;span class="java&amp;#45;comment"&gt;// Index files in this directory&lt;/span&gt;&lt;p class="paragraph"/&gt;def start = &lt;span class="java&amp;#45;keyword"&gt;new&lt;/span&gt; Date().time
def numIndexed = index(indexDir, dataDir)
def end = &lt;span class="java&amp;#45;keyword"&gt;new&lt;/span&gt; Date().time&lt;p class="paragraph"/&gt;println &lt;span class="java&amp;#45;quote"&gt;"Indexing $numIndexed files took $&amp;#123;end &amp;#45; start&amp;#125; milliseconds"&lt;/span&gt;&lt;p class="paragraph"/&gt;&lt;p class="paragraph"/&gt;def index(indexDir, dataDir) &amp;#123;
    &lt;span class="java&amp;#45;keyword"&gt;if&lt;/span&gt; (!dataDir.exists() || !dataDir.directory) &amp;#123;
        &lt;span class="java&amp;#45;keyword"&gt;throw&lt;/span&gt; &lt;span class="java&amp;#45;keyword"&gt;new&lt;/span&gt; IOException(&lt;span class="java&amp;#45;quote"&gt;"$dataDir does not exist or is not a directory"&lt;/span&gt;)
    &amp;#125;
    def writer = &lt;span class="java&amp;#45;keyword"&gt;new&lt;/span&gt; IndexWriter(
        indexDir, &lt;span class="java&amp;#45;keyword"&gt;new&lt;/span&gt; StandardAnalyzer(), &lt;span class="java&amp;#45;keyword"&gt;true&lt;/span&gt;)  &lt;span class="java&amp;#45;comment"&gt;// Create Lucene index&lt;/span&gt;
    writer.useCompoundFile = &lt;span class="java&amp;#45;keyword"&gt;false&lt;/span&gt;&lt;p class="paragraph"/&gt;    dataDir.eachFileRecurse &amp;#123;
        &lt;span class="java&amp;#45;keyword"&gt;if&lt;/span&gt; (it.name =~ /.txt$/) &amp;#123;  &lt;span class="java&amp;#45;comment"&gt;// Index .txt files only&lt;/span&gt;
            indexFile(writer,it)
        &amp;#125;
    &amp;#125;
    def numIndexed = writer.docCount()
    writer.optimize()
    writer.close()  &lt;span class="java&amp;#45;comment"&gt;// Close index&lt;/span&gt;
    &lt;span class="java&amp;#45;keyword"&gt;return&lt;/span&gt; numIndexed
&amp;#125;&lt;p class="paragraph"/&gt;void indexFile(writer, f) &amp;#123;
    &lt;span class="java&amp;#45;keyword"&gt;if&lt;/span&gt; (f.hidden || !f.exists() || !f.canRead() || f.directory) &amp;#123; &lt;span class="java&amp;#45;keyword"&gt;return&lt;/span&gt; &amp;#125;&lt;p class="paragraph"/&gt;    println &lt;span class="java&amp;#45;quote"&gt;"Indexing $f.canonicalPath"&lt;/span&gt;
    def doc = &lt;span class="java&amp;#45;keyword"&gt;new&lt;/span&gt; Document()&lt;p class="paragraph"/&gt;     &lt;span class="java&amp;#45;comment"&gt;// Construct a Field that is tokenized and indexed, 
    // but is not stored in the index verbatim.&lt;/span&gt;
    doc.add(Field.Text(&lt;span class="java&amp;#45;quote"&gt;"contents"&lt;/span&gt;, &lt;span class="java&amp;#45;keyword"&gt;new&lt;/span&gt; FileReader(f)))&lt;p class="paragraph"/&gt;     &lt;span class="java&amp;#45;comment"&gt;// Construct a Field that is not tokenized, but is indexed and stored.&lt;/span&gt;
    doc.add(Field.Keyword(&lt;span class="java&amp;#45;quote"&gt;"filename"&lt;/span&gt;,f.canonicalPath))&lt;p class="paragraph"/&gt;    writer.addDocument(doc)  &lt;span class="java&amp;#45;comment"&gt;// Add document to Lucene index&lt;/span&gt;
&amp;#125;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
The second example builds upon the first by providing a command line tool to search the index of text files.
&lt;p&gt;
&lt;div align="center"&gt;&lt;center&gt;
&lt;table border="0" cellpadding="10" width="450"&gt;
&lt;tr&gt;
&lt;td valign="top" bgcolor="#ffffcc"&gt;
&lt;small&gt;
Usage: &lt;b&gt;groovy -cp lucene-1.4.3.jar Searcher &amp;lt;index.dir&amp;gt; &amp;lt;your.query&amp;gt;&lt;/b&gt;
&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/center&gt;&lt;/div&gt; 
&lt;p&gt;
&lt;a href="http://cvs.groovy.codehaus.org/viewrep/~raw,r=MAIN/groovy/groovy/groovy-core/src/examples/searchEngine/Searcher.groovy"&gt;Searcher.groovy (download)&lt;/a&gt;



&lt;div class="code"&gt;&lt;pre&gt;&lt;span class="java&amp;#45;keyword"&gt;import&lt;/span&gt; org.apache.lucene.analysis.standard.StandardAnalyzer
&lt;span class="java&amp;#45;keyword"&gt;import&lt;/span&gt; org.apache.lucene.queryParser.QueryParser
&lt;span class="java&amp;#45;keyword"&gt;import&lt;/span&gt; org.apache.lucene.search.IndexSearcher
&lt;span class="java&amp;#45;keyword"&gt;import&lt;/span&gt; org.apache.lucene.store.FSDirectory&lt;p class="paragraph"/&gt; &lt;span class="java&amp;#45;comment"&gt;/&amp;#42;&amp;#42;
 &amp;#42; Searcher: searches a Lucene index &lt;span class="java&amp;#45;keyword"&gt;for&lt;/span&gt; a query passed as an argument
 &amp;#42;
 &amp;#42; @author Jeremy Rayner &amp;#60;groovy@ross&amp;#45;rayner.com&amp;#62;
 &amp;#42; based on examples in the wonderful 'Lucene in Action' book
 &amp;#42; by Erik Hatcher and Otis Gospodnetic ( &lt;span class="nobr"&gt;&lt;a href="http://www.lucenebook.com"&gt;&amp;#104;ttp://www.lucenebook.com&lt;/a&gt;&lt;/span&gt; )
 &amp;#42;
 &amp;#42; requires a lucene&amp;#45;1.x.x.jar from &lt;span class="nobr"&gt;&lt;a href="http://lucene.apache.org"&gt;&amp;#104;ttp://lucene.apache.org&lt;/a&gt;&lt;/span&gt;
 &amp;#42;/&lt;/span&gt;&lt;p class="paragraph"/&gt;&lt;span class="java&amp;#45;keyword"&gt;if&lt;/span&gt; (args.size() != 2) &amp;#123;
    &lt;span class="java&amp;#45;keyword"&gt;throw&lt;/span&gt; &lt;span class="java&amp;#45;keyword"&gt;new&lt;/span&gt; Exception(
    &lt;span class="java&amp;#45;quote"&gt;"Usage: groovy &amp;#45;cp lucene&amp;#45;1.4.3.jar Searcher &amp;#60;index dir&amp;#62; &amp;#60;query&amp;#62;"&lt;/span&gt;)
&amp;#125;
def indexDir = &lt;span class="java&amp;#45;keyword"&gt;new&lt;/span&gt; File(args&amp;#91;0&amp;#93;)  &lt;span class="java&amp;#45;comment"&gt;// Index directory create by Indexer&lt;/span&gt;
def q = args&amp;#91;1&amp;#93;  &lt;span class="java&amp;#45;comment"&gt;// Query string&lt;/span&gt;&lt;p class="paragraph"/&gt;&lt;span class="java&amp;#45;keyword"&gt;if&lt;/span&gt; (!indexDir.exists() || !indexDir.directory) &amp;#123;
    &lt;span class="java&amp;#45;keyword"&gt;throw&lt;/span&gt; &lt;span class="java&amp;#45;keyword"&gt;new&lt;/span&gt; Exception(&lt;span class="java&amp;#45;quote"&gt;"$indexDir does not exist or is not a directory"&lt;/span&gt;)
&amp;#125;&lt;p class="paragraph"/&gt;def fsDir = FSDirectory.getDirectory(indexDir, &lt;span class="java&amp;#45;keyword"&gt;false&lt;/span&gt;)
def is = &lt;span class="java&amp;#45;keyword"&gt;new&lt;/span&gt; IndexSearcher(fsDir)  &lt;span class="java&amp;#45;comment"&gt;// Open index&lt;/span&gt;&lt;p class="paragraph"/&gt;def query = QueryParser.parse(q, &lt;span class="java&amp;#45;quote"&gt;"contents"&lt;/span&gt;, &lt;span class="java&amp;#45;keyword"&gt;new&lt;/span&gt; StandardAnalyzer())  &lt;span class="java&amp;#45;comment"&gt;// Parse query&lt;/span&gt;
def start = &lt;span class="java&amp;#45;keyword"&gt;new&lt;/span&gt; Date().time
def hits = is.search(query)  &lt;span class="java&amp;#45;comment"&gt;// Search index&lt;/span&gt;
def end = &lt;span class="java&amp;#45;keyword"&gt;new&lt;/span&gt; Date().time&lt;p class="paragraph"/&gt;println &lt;span class="java&amp;#45;quote"&gt;"Found $&amp;#123;hits.length()&amp;#125; document(s) "&lt;/span&gt;
println &lt;span class="java&amp;#45;quote"&gt;"(in $&amp;#123;end &amp;#45; start&amp;#125; milliseconds) that matched query '$q':"&lt;/span&gt;&lt;p class="paragraph"/&gt;&lt;span class="java&amp;#45;keyword"&gt;for&lt;/span&gt; ( i in 0 ..&amp;#60; hits.length() ) &amp;#123;
    println(hits.doc(i)&amp;#91;&lt;span class="java&amp;#45;quote"&gt;"filename"&lt;/span&gt;&amp;#93;)  &lt;span class="java&amp;#45;comment"&gt;// Retrieve matching document and display filename&lt;/span&gt;
&amp;#125;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
Further improvements to these scripts could be made in the future by providing groovy wrappers around common Lucene activities.
This would allow you to supply the domain specific work inside a closure to convenience methods, e.g. &lt;span class="java&amp;#45;comment"&gt;lucene.write(dir) {...}&lt;/span&gt;
Here is an idea of what it could look like (the following will not work... yet)
&lt;div class="code"&gt;&lt;pre&gt;...
def index(indexDir, dataDir) &amp;#123;
    &lt;span class="java&amp;#45;keyword"&gt;if&lt;/span&gt; (!dataDir.exists() || !dataDir.directory) &amp;#123;
        &lt;span class="java&amp;#45;keyword"&gt;throw&lt;/span&gt; &lt;span class="java&amp;#45;keyword"&gt;new&lt;/span&gt; IOException(&lt;span class="java&amp;#45;quote"&gt;
          "$dataDir does not exist or is not a directory"&lt;/span&gt;)
    &amp;#125;
    def lucene = Lucene.newInstance()
    def numIndexed = lucene.write(indexDir) &amp;#123;writer&amp;#45;&amp;#62;
        dataDir.eachFileRecurse &amp;#123;file&amp;#45;&amp;#62;
            &lt;span class="java&amp;#45;keyword"&gt;if&lt;/span&gt; (file.name =~ /.txt$/) &amp;#123; &lt;span class="java&amp;#45;comment"&gt;// Index .txt files only&lt;/span&gt;
                indexFile(writer,file)
            &amp;#125;
        &amp;#125;
    &amp;#125;
    &lt;span class="java&amp;#45;keyword"&gt;return&lt;/span&gt; numIndexed
&amp;#125;
...&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
My thanks to &lt;a href="http://www.blogscene.org/erik"&gt;Erik&lt;/a&gt; and &lt;a href="http://www.jroller.com/page/otis"&gt;Otis&lt;/a&gt; for allowing me to make their examples more Groovy.</description>
        <dc:subject>Groovy</dc:subject>
        <dc:date>2005-04-22T10:13:07+0100</dc:date>
</item>
<item>
        <title>Turn your build.xml into a pretty picture using Groovy</title>
        <link>http://javanicus.com/blog2/items/168-index.html</link>
        <description>Inspired by Sam Newman (&lt;a href="http://www.magpiebrain.com/archives/2004/12/02/antgui"&gt;magpiebrain&lt;/a&gt;), I decided to see if it was possible to do a quick XSLT style transform using &lt;a href="http://groovy.codehaus.org"&gt;groovy&lt;/a&gt; on an &lt;a href="http://ant.apache.org"&gt;ant&lt;/a&gt; build.xml file, so that it could be loaded up in &lt;a href="http://freemind.sourceforge.net/"&gt;FreeMind&lt;/a&gt;.
&lt;p&gt;
The example diagram below is the result of running &lt;b&gt;groovy antmap.g &amp;gt; build.mm&lt;/b&gt; over the &lt;a href="http://cvs.javanicus.com:5908/viewrep/grash/grash/build.xml?r=1.6"&gt;build.xml&lt;/a&gt; for my groovy shell called &lt;a href="http://grash.javanicus.com"&gt;grash&lt;/a&gt;
&lt;p&gt;
&lt;center&gt;
&lt;a href="http://freemind.sourceforge.net/"&gt;&lt;img src="http://grash.javanicus.com/grash-build-mind-map.gif" alt="mindmap of grash build file"&gt;&lt;/a&gt;
&lt;/center&gt;
&lt;p&gt;
A code snippet is below, which I've added to the &lt;a href="http://cvs.groovy.codehaus.org/viewrep/groovy/groovy/groovy-core/src/examples"&gt;groovy examples bundle&lt;/a&gt; (which is full of cool stuff b.t.w.)
&lt;p&gt;
&lt;pre&gt;
#!/bin/env groovy
# 
# convert an ant build file into a format 
#     suitable for http://sf.net/projects/freemind
#
# by Jeremy Rayner - 2 Dec 2004
# inspired by Sam Newman 
#    ( http://www.magpiebrain.com/archives/2004/12/02/antgui )
#
# usage:   groovy antmap.g &amp;gt; build.mm

import groovy.util.XmlParser
import java.io.File

buildFileName = "build.xml"  // default

// handle command line params
if (args.length &amp;gt; 0) {
buildFileName = args[0]
}

// header
println "&amp;lt;map version='0.7.1'&amp;gt;"
project = new XmlParser().parse(buildFileName)
name = project['@name']
println "&amp;lt;node TEXT='${name}'&amp;gt;"
level = 0

printChildren(project,level)



def void printChildren(node,level) {
level++
node.each {
name = huntForName(it)
if (name != null) {
if (level &amp;gt; 1) {
println "&amp;lt;node TEXT='${name}' POSITION='right'&amp;gt;"
} else if (it.name() == 'property' || it.name() == 'path' ) {
if (it.children().size() &amp;gt; 0) {
println "&amp;lt;node TEXT='${name}' POSITION='left' FOLDED='true'&amp;gt;"
} else {
println "&amp;lt;node TEXT='${name}' POSITION='left'&amp;gt;"
}
} else if (it.children().size() &amp;gt; 0) {
println "&amp;lt;node TEXT='${name}' POSITION='right' FOLDED='true'&amp;gt;"
} else {
println "&amp;lt;node TEXT='${name}' POSITION='right'&amp;gt;"
}
}
if (it.children().size() &amp;gt; 0) printChildren(it,level)
if (name!=null)println "&amp;lt;/node&amp;gt;"
}
}

// footer
println "&amp;lt;/node&amp;gt;&amp;lt;/map&amp;gt;"


def String huntForName(node) {
preferNodeNames = ["junitreport"]
if (node == null) return null
if (preferNodeNames.contains(node.name())) return node.name()
if (node['@name'] != null) return node['@name']
if (node['@todir'] != null) return node['@todir']
if (node['@dir'] != null) return node['@dir']
if (node['@refid'] != null) return node['@refid']
return node.name()
}
&lt;/pre&gt;
&lt;p</description>
        <dc:subject>Groovy</dc:subject>
        <dc:date>2004-12-02T20:29:42+0000</dc:date>
</item>
<item>
        <title>Some more Groovy notes</title>
        <link>http://javanicus.com/blog2/items/166-index.html</link>
        <description>Here are some more notes from GC1 (Groovy Conference no.1), some of them might be inaccurate, subsequently changed or just plain wrong, but I might as well share what notes I did take...

&lt;h2&gt;Ideas for the specification&lt;/h2&gt;

&lt;p&gt;&lt;b&gt;whitespace?&lt;/b&gt;&lt;br&gt;
whitespace is significant, but it is significant as it applies to 'no dumb expression statement (NDES)' rule

&lt;p&gt;&lt;b&gt;macros?&lt;/b&gt;&lt;br&gt;
macros are going to be implemented under the covers, but may not be exposed to user in first syntax spec, indeed 'while' might even be implemented as a macro under the covers...

&lt;p&gt;&lt;b&gt;builders?&lt;/b&gt;&lt;br&gt;
builders have turned into lovely things :-)
builders are now intended to be included within the EBNF
this seems to have been achieved by changing the words around :-)
&lt;pre&gt;
with (MyBuilder) { myPanel { myThing }}
&lt;/pre&gt;
or something

&lt;p&gt;&lt;b&gt;parens?&lt;/b&gt;&lt;br&gt;
parens are optional, but again before you leave the planet... only on simple statements, not on expressions

&lt;p&gt;&lt;b&gt;escaping nested closures?&lt;/b&gt;&lt;br&gt;
escaping nested closures involved break / return keywords
break without label would break out of tightest closure
break with label would treat closure just like while statement break (+ same with continue)
return would always return from the method (that the closure was called from?)
not sure I remember discussions about breaking with a value..?
&lt;p&gt;
I have published jstrachan's scribblings &lt;a href="http://groovy.javanicus.com/nov2004meet/wiki/"&gt;here&lt;/a&gt;
&lt;p&gt;
here are a few of my favourite things...

&lt;p&gt;&lt;b&gt;'with' keyword&lt;/b&gt;&lt;br&gt;
&lt;pre&gt;
with myFoo.bar.mooky { wibble = 12; wobble = 13}
&lt;/pre&gt;
equiv to...
&lt;pre&gt;
myFoo.bar.mooky.wibble = 12; myFoo.bar.mooky.wobble=13;
&lt;/pre&gt;
and reused for builder syntax
&lt;pre&gt;
with myFoo { bar { mooky {new Weeble()}}}
&lt;/pre&gt;
(syntax probably not quite like that)

&lt;p&gt;&lt;b&gt;'?.' operator&lt;/b&gt;&lt;br&gt;
&lt;pre&gt;
foo?.bar
&lt;/pre&gt;
equiv to
&lt;pre&gt;
(foo != null) ? foo.bar : null
&lt;/pre&gt;
the question mark indicates that foo is questionable, i.e. it could be null, it could be any type etc... (i.e. no compile time errors if property bar doesn't exist on foo)
&lt;p&gt;
Anyway, just gives you an idea of some of the topics under discussion, none of it is set in stone.  Look forward to comments :-)</description>
        <dc:subject>Groovy</dc:subject>
        <dc:date>2004-11-17T16:49:14+0000</dc:date>
</item>
<item>
        <title>First Groovy Conference</title>
        <link>http://javanicus.com/blog2/items/165-index.html</link>
        <description>  I've just got back from a very interesting two day conference held to
discuss both the Groovy language and &lt;a href="http://www.jcp.org/en/jsr/detail?id=241"&gt;JSR 241&lt;/a&gt; which is aiming to
standardize the language.
&lt;p&gt;
&lt;img src="http://flickr.com/photos/1510105_336d3dd4df.jpg" alt="jez, pmuellr, jstrachan, jrose, rob, guillaume"&gt;
&lt;p&gt;
  James spent the first morning outlining his original vision for Groovy
and the direction in which he'd like to take it forward.  ( &lt;a href="http://groovy.javanicus.com/jstrachan"&gt;mp3&lt;/a&gt;, &lt;a href="http://docs.codehaus.org/download/attachments/2715/groovyone.ppt?version=1"&gt;powerpoint&lt;/a&gt;)
&lt;p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="http://flickr.com/photos/1510106_4e875697e3.jpg" alt="James Strachan"&gt;
&lt;/td&gt;&lt;td&gt;
&lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; is trying to provide a high level language (like Ruby, Python or Dylan) 
that maps cleanly to Java bytecode. 
It needs to works with Java objects, and the root of all the object trees is
java.lang.Object.
The syntax will be Java friendly, but doesn't have to be backwards compatible.
Groovy will sit on top of J2SE
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;
After lunch I walked everyone through the story so far, from the conception
of Groovy back in Aug 2003, up till the present day. (&lt;a href="http://docs.codehaus.org/download/attachments/2715/abhog.ppt?version=1"&gt;powerpoint&lt;/a&gt;)
&lt;p&gt;
Guillaume then took us through the user feedback we collected, including the main issues of the moment (&lt;a href="http://docs.codehaus.org/download/attachments/2715/Groovy-Feedback.ppt?version=1"&gt;powerpoint&lt;/a&gt;) which appear to be optionals, documentation, visibility, scoping, debugging, class loading, speed and security.
&lt;p&gt;
We then dicussed the roadmap for the Groovy JSR, particularly which key deliverables are
necessary to reach a community release of Groovy.
&lt;p&gt;
&lt;b&gt;Key Deliverables for Groovy JSR Community Release&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;Specification
  &lt;ul&gt;
    &lt;li&gt;A formal grammar (using similar to &lt;a href="http://www.cl.cam.ac.uk/~mgk25/iso-ebnf.html"&gt;EBNF&lt;/a&gt;)&lt;/li&gt;
    &lt;li&gt;GLS - semantic rules expressed as a diff of the &lt;a href="http://java.sun.com/docs/books/jls"&gt;Java Language Specification&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;Limited references to groovy.* interfaces&lt;/li&gt;
  &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Reference Implementation&lt;/li&gt;
  &lt;ul&gt;
    &lt;li&gt;Based upon work at &lt;a href="http://groovy.codehaus.org"&gt;groovy.codehaus.org&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;li&gt;Test Compatiblity Kit
  &lt;ul&gt;
    &lt;li&gt;Test cases following the GLS chapter by chapter&lt;/li&gt;
    &lt;li&gt;A subset of the JCK:Java 'language' tests or similar (e.g. &lt;a href="http://www-124.ibm.com/developerworks/oss/cvs/jikes/~checkout~/jacks/jacks.html"&gt;Jacks&lt;/a&gt;)
  &lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;img src="http://flickr.com/photos/1510107_474e02efc4.jpg" alt="one of the discussions"&gt;
&lt;p&gt;
We have so much material from the two days (I recorded 15 hours of audio), it's going to take a while for all the details to surface.</description>
        <dc:subject>Groovy</dc:subject>
        <dc:date>2004-11-16T06:51:56+0000</dc:date>
</item>
</channel>
</rss>
