<?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-6917071644715743308</id><updated>2012-01-05T09:03:17.081-08:00</updated><category term='p2'/><category term='Indigo'/><category term='OSGi'/><category term='refactoring'/><category term='Helios'/><category term='JDT'/><category term='Mylyn'/><category term='PDE'/><category term='Java'/><category term='Groovy'/><category term='AJDT'/><category term='Galileo'/><category term='AJDT AspectJ Roo Eclipse'/><category term='egit'/><category term='AspectJ'/><category term='Scala'/><category term='Equinox'/><category term='Maven'/><category term='Eclipse'/><category term='GMaven'/><category term='Grails'/><category term='SpringIDE'/><category term='Spring'/><category term='Ant'/><category term='Groovy-Eclipse'/><category term='EclipseCon'/><title type='text'>Contraptions for programming</title><subtitle type='html'>This is a blog about some of the nifty things I have been working on.  Mostly, I talk about Eclipse, Groovy, and AspectJ.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>45</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-5058995939782093497</id><published>2011-11-16T20:42:00.001-08:00</published><updated>2011-11-16T21:01:26.983-08:00</updated><title type='text'>First ever Vancouver Eclipse Hackathon...success!</title><content type='html'>Last night we had our first Vancouver Eclipse Hackathon.  It was a wonderful night, and we had 20 Eclipse hackers showing up with all kinds of experience.  The goal of the evening was to introduce some programmers to Eclipse-based open source projects, to help them collaborate and learn about the project, and maybe even contribute some code.  Some hackers had written Eclipse plugins before, others knew nothing about Eclipse (other than it being a great Java IDE), and a few didn't even know Java.  It was a good range of people and we spent almost six hours working on our bugs.  &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-E11CnZj87iI/TsSQGNSSqOI/AAAAAAAAAHg/kRZeaogB0yk/s1600/photo%2B%25283%2529.JPG" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="239" width="320" src="http://1.bp.blogspot.com/-E11CnZj87iI/TsSQGNSSqOI/AAAAAAAAAHg/kRZeaogB0yk/s320/photo%2B%25283%2529.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;Working on quick-assists inside of Groovy-Eclipse&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-nNRWc4jQTPs/TsSQMP-6UvI/AAAAAAAAAHs/QrgTyaI2gLQ/s1600/photo%2B%25284%2529.JPG" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="239" width="320" src="http://1.bp.blogspot.com/-nNRWc4jQTPs/TsSQMP-6UvI/AAAAAAAAAHs/QrgTyaI2gLQ/s320/photo%2B%25284%2529.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;Team working on mark-occurrences in the Groovy editor.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-mqenjiL5VQw/TsSTKifP9YI/AAAAAAAAAIE/R7OmrV7Tp3c/s1600/photo4.JPG" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="240" width="320" src="http://4.bp.blogspot.com/-mqenjiL5VQw/TsSTKifP9YI/AAAAAAAAAIE/R7OmrV7Tp3c/s320/photo4.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;Some Mylyn Hackers working together.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-_f1OfVkDk2M/TsSTbzeRs4I/AAAAAAAAAIQ/qCZAaquOHPM/s1600/photo5.JPG" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="240" width="320" src="http://3.bp.blogspot.com/-_f1OfVkDk2M/TsSTbzeRs4I/AAAAAAAAAIQ/qCZAaquOHPM/s320/photo5.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;More hacking.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-RgnR58-El9o/TsSQP6W_Q5I/AAAAAAAAAH4/G-41ebB3Zh0/s1600/photo%2B%25285%2529.JPG" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="239" width="320" src="http://1.bp.blogspot.com/-RgnR58-El9o/TsSQP6W_Q5I/AAAAAAAAAH4/G-41ebB3Zh0/s320/photo%2B%25285%2529.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;Almost complete silence in the room as everyone concentrates on their bugs.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-mIwaIzUsyu8/TsSTpvajFgI/AAAAAAAAAIc/ZB5jjkHntmc/s1600/photo8.JPG" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="240" width="320" src="http://4.bp.blogspot.com/-mIwaIzUsyu8/TsSTpvajFgI/AAAAAAAAAIc/ZB5jjkHntmc/s320/photo8.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;Happy birthday, Eclipse!&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;And here are the results of the evening:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;20 hackers (including two project leads)&lt;/li&gt;&lt;li&gt;6 hours of hacking&lt;/li&gt;&lt;li&gt;24 bottles of beer drunk&lt;/li&gt;&lt;li&gt;6 pizzas eaten&lt;/li&gt;&lt;li&gt;Half of an Eclipse 10 year birthday cake eaten&lt;/li&gt;&lt;li&gt;3 Eclipse-based projects worked on: Mylyn, AJDT, and Groovy-Eclipse&lt;/li&gt;&lt;li&gt;12 bugs worked on&lt;/li&gt;&lt;li&gt;3 patches submitted&lt;/li&gt;&lt;li&gt;2 more patches in process&lt;/li&gt;&lt;li&gt;Fun had by all&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;It was encouraging to see the dedication of all the hackers.  We will definitely be hosting another one soon.  However, we did learn a few things about organizing hackathons that we will do differently next time:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Make it easy for hackers to set up their dev environments. Put up instructions a few days before so hackers can get ready before the hackathon and they don't have to spend 90 minutes setting up before starting.&lt;/li&gt;&lt;li&gt;Internet connections can be unreliable and slow.  Have USB sticks available with Eclipse SDK tarballs for different environments.  Also, have some workspaces set up with the source code of the projects checked out.&lt;/li&gt;&lt;li&gt;Try to have more projects and more project leads available.  This time, we only had three projects and two project leads, but more variety would have been nicer.  We were originally expecting more leads to show up, but they had to cancel.&lt;/li&gt;&lt;li&gt;Have a very concise list of bugs for hackers to work on.  Be very specific about how to get started working on them.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Also, a huge thanks to the other co-organizers of this event Ducky Sherwood and Zoe Jong from &lt;a href="http://tasktop.com"&gt;Tasktop Technologies&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you want to organize a hackathon in your area, drop me a line and I can help you get started.  It is a fun time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-5058995939782093497?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/5058995939782093497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/11/first-ever-vancouver-eclipse.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/5058995939782093497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/5058995939782093497'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/11/first-ever-vancouver-eclipse.html' title='First ever Vancouver Eclipse Hackathon...success!'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-E11CnZj87iI/TsSQGNSSqOI/AAAAAAAAAHg/kRZeaogB0yk/s72-c/photo%2B%25283%2529.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-8416593080700161751</id><published>2011-09-22T20:00:00.000-07:00</published><updated>2011-09-22T20:00:03.445-07:00</updated><title type='text'>Using Grails 2.0.0.M2, Cloud Foundry and the SpringSource Tool Suite</title><content type='html'>There are a lot of details in my &lt;a href="http://www.meetup.com/VanDev/events/29040211/"&gt;VanDev talk&lt;/a&gt; tonight.  Since most of what I showed you was from versions of our software not yet officially released, you are going to need to cobble together a few things to get everything working properly.  Here are some instructions and links.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;First, here is a detailed guide on &lt;a href="http://static.springsource.org/sts/docs/2.7.0/reference/html/grails/grails20.html"&gt;using Grails 2.0.0 from inside STS&lt;/a&gt;.  It was written for M1, but it is essentially the same.  Below, I'll summarize.&lt;/i&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.springsource.com/landing/best-development-tool-enterprise-java"&gt;Download STS 2.8.0.M1&lt;/a&gt;.  To see 2.8.0.M1, you need to click on &lt;i&gt;Other downloads&lt;/i&gt;.&lt;/i&gt;&lt;br /&gt;&lt;li&gt;After downloading and unzipping/installing STS, you will need to install Groovy-Eclipse and Grails Tooling.  &lt;b&gt;Do not&lt;/b&gt; install Groovy-Eclipse or Grails from the  dashboard since that only points to older releases.  Instead, go to the Install manager (Help -&gt; Install new software...), and add the nightly update sites for Groovy-Eclipse and Grails Tooling:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Nightly Grails Tooling update site:&lt;br /&gt;&lt;b&gt;http://dist.springsource.com/snapshot/TOOLS/nightly/e3.7&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Nightly Groovy-Eclipse update site.  Make sure to also install the Groovy 1.8 compiler:&lt;br /&gt;&lt;b&gt;http://dist.codehaus.org/groovy/distributions/greclipse/snapshot/e3.7/&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;/ul&gt;Use these sites to install the software.&lt;/i&gt;&lt;li&gt;Next, &lt;a href="http://grails.org/Download"&gt;download Grails 2.0.0.M2&lt;/a&gt;.&lt;/i&gt;&lt;br /&gt;&lt;li&gt;Once downloaded and unzipped, you can install the Grails distribution into STS.&lt;/i&gt;&lt;br /&gt;&lt;/ol&gt;If you want to play around with Cloud Foundry:  &lt;ol&gt;&lt;li&gt;First install the CloudFoundry tools from the STS dashboard.&lt;/i&gt;&lt;br /&gt;&lt;li&gt;Then sign up for a &lt;a href="http://cloudfoundry.com/"&gt;CloudFoundry account&lt;/a&gt;.&lt;/i&gt;&lt;br /&gt;&lt;li&gt;There's lots of information on the cloudfoundry.com site as well as the &lt;a href="http://cloudfoundry.org."&gt;community site&lt;/a&gt;.  Here's more on using &lt;a href="http://blog.springsource.com/2011/04/13/using-cloud-foundry-from-sts/"&gt;Cloud Foundry in STS&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;&lt;/ol&gt;Here is some more information on &lt;a href="http://blog.springsource.com/2011/05/08/better-dsl-support-in-groovy-eclipse/"&gt;DSL Descriptors&lt;/a&gt; in Groovy-Eclipse, and also a general description of our approach to &lt;a href="http://blog.springsource.com/2009/07/30/a-groovier-eclipse-experience/"&gt;integrating the Groovy and Java compilers&lt;/a&gt; inside of Groovy-Eclipse.&lt;h3&gt;Support&lt;/h3&gt;If you have any questions of problems with STS or Groovy-Eclipse, &lt;a href="http://forum.springsource.org/forumdisplay.php?32-SpringSource-Tool-Suite"&gt;please visit the forum&lt;/a&gt;.  However, Groovy-Eclipse questions may be answered more quickly on &lt;a href="http://xircles.codehaus.org/lists/eclipse-plugin-user@groovy.codehaus.org"&gt;the mailing list&lt;/a&gt;.  Bugs can be reported here: &lt;a href="http://jira.codehaus.org/browse/GRECLIPSE"&gt;Groovy-Eclipse&lt;/a&gt; and &lt;a href="https://issuetracker.springsource.com/browse/STS"&gt;STS&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-8416593080700161751?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/8416593080700161751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/09/using-grails-200m2-cloud-foundry-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/8416593080700161751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/8416593080700161751'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/09/using-grails-200m2-cloud-foundry-and.html' title='Using Grails 2.0.0.M2, Cloud Foundry and the SpringSource Tool Suite'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-8543502712959686292</id><published>2011-06-29T12:30:00.000-07:00</published><updated>2011-06-29T12:30:23.892-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AJDT'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Indigo'/><title type='text'>AJDT 2.1.3 Released</title><content type='html'>The AJDT team is proud to release AJDT 2.1.3.  This release is the first one targeting Indigo (Eclipse 3.7) and it contains &lt;a href="http://eclipse.org/aspectj/doc/released/README-1612.html"&gt;AspectJ 1.6.12.M1&lt;/a&gt;.  The update sites are here:&lt;br /&gt;&lt;br /&gt;For Indigo:&lt;br /&gt;&lt;code&gt;http://download.eclipse.org/tools/ajdt/37/update&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;For Helios:&lt;br /&gt;&lt;code&gt;http://download.eclipse.org/tools/ajdt/36/update&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Please send any feedback to one of the mailing lists or raise an issue&lt;br /&gt;on &lt;a href="http://bugs.eclipse.org/"&gt;Bugzilla&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-8543502712959686292?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/8543502712959686292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/06/ajdt-213-released.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/8543502712959686292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/8543502712959686292'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/06/ajdt-213-released.html' title='AJDT 2.1.3 Released'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-7527873646810145688</id><published>2011-06-29T11:15:00.000-07:00</published><updated>2011-06-29T11:15:04.631-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy-Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='Indigo'/><title type='text'>Groovy-Eclipse 2.5.1 Released</title><content type='html'>The Groovy-Eclipse team is proud to release Groovy-Eclipse 2.5.1.  This release is now available for install using the update sites here:&lt;br /&gt;&lt;br /&gt;for Eclipse Indigo:&lt;br /&gt;&lt;pre&gt;http://dist.springsource.org/release/GRECLIPSE/e3.7/&lt;/pre&gt;&lt;br /&gt;for Eclipse Helios:&lt;br /&gt;&lt;pre&gt;http://dist.springsource.org/release/GRECLIPSE/e3.6/&lt;/pre&gt;&lt;br /&gt;In this release, we have continued to work on our DSLD support (and we&lt;br /&gt;ship with some useful DSLD scripts).  Additionally, we have a GA&lt;br /&gt;release of the groovy-eclipse-compiler-plugin for Maven.  Now that&lt;br /&gt;Indigo has been released, the 3.7 stream of Groovy-Eclipse will become&lt;br /&gt;the main development branch.  For now, we will continue to support the&lt;br /&gt;3.6 stream of Groovy-Eclipse and will put out at least one more&lt;br /&gt;release.&lt;br /&gt;&lt;br /&gt;You can find all the details at our &lt;a href="http://groovy.codehaus.org/Groovy-Eclipse+2.5.1+New+and+Noteworthy"&gt;New &amp; Noteworthy page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Please send feedback here or raise an issue on our &lt;a href="http://jira.codehaus.org/browse/GRECLIPSE"&gt;issuetracker&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-7527873646810145688?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/7527873646810145688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/06/groovy-eclipse-251-released.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/7527873646810145688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/7527873646810145688'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/06/groovy-eclipse-251-released.html' title='Groovy-Eclipse 2.5.1 Released'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-5520429395575130757</id><published>2011-06-24T11:42:00.000-07:00</published><updated>2011-06-24T14:01:29.678-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy-Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='Indigo'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Vancouver Eclipse Demo Camp 2011</title><content type='html'>In honor of the &lt;a href="http://eclipse.org/indigo/"&gt;Indigo release of Eclipse&lt;/a&gt;, I will be hosting the annual Eclipse Demo camp in Vancouver on Monday, June 27.  The demo camp is co-sponsored by the &lt;a href="http://eclipse.org"&gt;Eclipse Foundation&lt;/a&gt;, &lt;a href="http://vmware.com"&gt;VMWare&lt;/a&gt;, and &lt;a href="http://tasktop.com"&gt;Tasktop&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We're expecting a full house as well as lots of exciting talks, including one on Groovy/Grails support in Eclipse and the SpringSource Tool Suite, a talk from Tasktop, and a talk about the &lt;a href="http://eclipse.org/emf"&gt;Eclipse Modelling Framework&lt;/a&gt; from Ed Merks, the project lead.&lt;br /&gt;&lt;br /&gt;If you are in the Vancouver area and interested in attending, please add your name to the wiki:&lt;br /&gt;&lt;br /&gt;http://wiki.eclipse.org/index.php?title=Eclipse_DemoCamps_Indigo_2011/Vancouver&lt;br /&gt;&lt;br /&gt;Alternatively, contact me directly (or on this blog) and I'll add you myself.  Hope to see you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-5520429395575130757?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/5520429395575130757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/06/vancouver-eclipse-demo-camp-2011.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/5520429395575130757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/5520429395575130757'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/06/vancouver-eclipse-demo-camp-2011.html' title='Vancouver Eclipse Demo Camp 2011'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-1030432546456025262</id><published>2011-05-24T20:52:00.000-07:00</published><updated>2011-05-24T20:54:51.938-07:00</updated><title type='text'>Slides from Gr8conf Europe 2011</title><content type='html'>Here are the slides from my &lt;a href="http://www.eu2011.gr8conf.org/talk/sts"&gt;Gr8Conf Europe presentation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_8090287"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/werdnagreb/better-dsl-support-for-groovyeclipse" title="Better DSL Support for Groovy-Eclipse"&gt;Better DSL Support for Groovy-Eclipse&lt;/a&gt;&lt;/strong&gt; &lt;iframe src="http://www.slideshare.net/slideshow/embed_code/8090287" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt; &lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/werdnagreb"&gt;Andrew Eisenberg&lt;/a&gt; &lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Unfortunately, the animations didn't make the conversion to SlideShare, but these slides will give you an idea of what I talked about.  I can also post the sample projects that I showed during the talk.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-1030432546456025262?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/1030432546456025262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/05/slides-from-gr8conf-europe-2011.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/1030432546456025262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/1030432546456025262'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/05/slides-from-gr8conf-europe-2011.html' title='Slides from Gr8conf Europe 2011'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-7820884977644042739</id><published>2011-05-12T09:19:00.000-07:00</published><updated>2011-05-13T13:30:48.347-07:00</updated><title type='text'>Groovy-Eclipse 2.5.0 Released</title><content type='html'>The SpringSource Tools Team is proud to release Groovy-Eclipse 2.5.0.  In this release, we are most proud of our new &lt;a href="http://blog.springsource.com/2011/05/08/better-dsl-support-in-groovy-eclipse/"&gt;DSL Descriptors&lt;/a&gt; (DSLDs) feature, which provides scriptable support for custom Domain Specific Languages in the Groovy Editor.  Additionally, this release includes Groovy 1.8 as an optional add on, better content assist and type inferencing, and a Groovier outline view.  &lt;br /&gt;&lt;br /&gt;See all details on the &lt;a href="http://docs.codehaus.org/display/GROOVY/Groovy-Eclipse+2.5.0+New+and+Noteworthy"&gt;New and Noteworthy page&lt;/a&gt;, and please send your comments to &lt;a href="http://xircles.codehaus.org/manage_email/eclipse-plugin-user@groovy.codehaus.org"&gt;the mailing list&lt;/a&gt;.  Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-7820884977644042739?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/7820884977644042739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/05/groovy-eclipse-250-released.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/7820884977644042739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/7820884977644042739'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/05/groovy-eclipse-250-released.html' title='Groovy-Eclipse 2.5.0 Released'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-925532556114054216</id><published>2011-05-09T10:41:00.000-07:00</published><updated>2011-05-09T10:41:35.765-07:00</updated><title type='text'>Better DSL Support for Groovy-Eclipse</title><content type='html'>What have I been doing lately?  Mostly working on Groovy-Eclipse's new DSLD feature to support custom Groovy DSLs more easily.  See my post about that on the &lt;a href="http://blog.springsource.com/2011/05/08/better-dsl-support-in-groovy-eclipse/"&gt;SpringSource blog&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-925532556114054216?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/925532556114054216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/05/better-dsl-support-for-groovy-eclipse.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/925532556114054216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/925532556114054216'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/05/better-dsl-support-for-groovy-eclipse.html' title='Better DSL Support for Groovy-Eclipse'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-7808139344993295995</id><published>2011-04-08T21:11:00.000-07:00</published><updated>2011-04-08T21:11:19.624-07:00</updated><title type='text'>Next month at the GR8 conference</title><content type='html'>The nice folks organizing the GR8 Conference 2011 Europe have posted an interview they did with me.  You can read it &lt;a href="http://www.gr8conf.org/blog/2011/04/06/92"&gt;here&lt;/a&gt;.  The GR8 conference focusses on the Groovy eco-system including Grails, Gradle, and Griffon.&lt;br /&gt;&lt;br /&gt;I'll be talking about Groovy-Eclipse, Grails tooling, and our new Gradle support for Eclipse.  More on this soon...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-7808139344993295995?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/7808139344993295995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/04/next-month-at-gr8-conference.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/7808139344993295995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/7808139344993295995'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/04/next-month-at-gr8-conference.html' title='Next month at the GR8 conference'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-8855222924704510679</id><published>2011-03-18T09:25:00.000-07:00</published><updated>2011-03-18T09:29:24.841-07:00</updated><title type='text'>Groovy-Eclipse and AJDT simultaneous releases</title><content type='html'>Today, we have just release Groovy-Eclipse 2.1.2 and AJDT 2.1.2.  By coincidence, they both have the same version number.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Groovy-Eclipse&lt;/h3&gt;&lt;br /&gt;We've made lots of improvements to Groovy-Eclipse including inline renaming support, mark/find occurrences as you type, and type inferencing improvements.  You can find all the details at the &lt;a href="http://docs.codehaus.org/display/GROOVY/Groovy-Eclipse+2.1.1RC1+New+and+Noteworthy"&gt;New and Noteworthy&lt;/a&gt; page.&lt;br /&gt;&lt;br /&gt;The update site for installation on Eclipse 3.6 is here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dist.springsource.org/milestone/GRECLIPSE/e3.6/"&gt;http://dist.springsource.org/milestone/GRECLIPSE/e3.6/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We are also now releasing a Groovy-Eclipse for Eclipse 3.7 (Indigo).  The update site is here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dist.codehaus.org/groovy/distributions/greclipse/snapshot/e3.7/"&gt;http://dist.codehaus.org/groovy/distributions/greclipse/snapshot/e3.7/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As always, please raise bug reports and enhancement requests at our &lt;a href="http://jira.codehaus.org/browse/GRECLIPSE"&gt;Codehaus issue tracker&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We expect to release Groovy 1.8 support shortly.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;AJDT&lt;/h3&gt;&lt;br /&gt;Our enhancements for AJDT have mostly centered around supporting Intertype Inner Types. a new AspectJ language feature.  You can read about it at the &lt;a href="http://eclipse.org/ajdt/whatsnew212"&gt;AJDT New and Noteworthy&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;An AJDT release for Eclipse 3.7 is available at this update site:&lt;br /&gt;&lt;br /&gt;&lt;a href="download.eclipse.org/tools/ajdt/37/dev/update/"&gt;download.eclipse.org/tools/ajdt/37/dev/update/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Please raise bugs and feature requests at &lt;a href="https://bugs.eclipse.org/bugs/"&gt;Eclipse's bugzilla&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-8855222924704510679?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/8855222924704510679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/03/groovy-eclipse-and-ajdt-simultaneous.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/8855222924704510679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/8855222924704510679'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/03/groovy-eclipse-and-ajdt-simultaneous.html' title='Groovy-Eclipse and AJDT simultaneous releases'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-2282629631949754589</id><published>2011-03-07T20:03:00.000-08:00</published><updated>2011-03-07T20:23:05.768-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='egit'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='SpringIDE'/><title type='text'>eGit in practice</title><content type='html'>I like Git in theory. Distributed version control has many advantages over non-distributed including local branching, easier task switching, and easier offline work. &amp;nbsp;However, as an Eclipse user, I find it highly disruptive to drop down to the command line whenever I need to perform any git commands. &amp;nbsp;Despite its advantages, using git instead of CVS or SVN has felt like a big step backward because of its lack of Eclipse tooling.&lt;br /&gt;&lt;br /&gt;Until now, I have only been using git occasionally, and so I could live with the inconvenience. &amp;nbsp;However, it looks like some of my major projects will be moving to git and so I need to figure out what to do. &amp;nbsp;I have been eagerly awaiting the &lt;a href="http://eclipse.org/egit"&gt;eGit&lt;/a&gt; tooling to reach a reasonable level of maturity. &amp;nbsp;I decided to try it out and see how far along it is.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Install and setup&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;I installed eGit 0.11.3 from the public repository (&lt;a href="http://download.eclipse.org/egit/updates"&gt;http://download.eclipse.org/egit/updates&lt;/a&gt;) into my SpringSource Tool Suite. &amp;nbsp;And as expected, the Git Repository perspective was initially empty. &amp;nbsp;So far so good.&lt;br /&gt;&lt;br /&gt;I thought I'd start by cloning the &lt;a href="http://marketplace.eclipse.org/content/spring-ide"&gt;SpringIDE project&lt;/a&gt;. &amp;nbsp;Initially, I tried right clicking in the &lt;em&gt;Git repositories&lt;/em&gt; view, and expected that I'd be able to pasted the repository URL directly. &amp;nbsp;That didn't work. &amp;nbsp;There is only one option: to paste an existing repository path:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-I8ZlVEUKg_U/TXWna0rBbhI/AAAAAAAAAD4/K3aMNFWn3yk/s1600/cant_clone.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="177" src="https://lh6.googleusercontent.com/-I8ZlVEUKg_U/TXWna0rBbhI/AAAAAAAAAD4/K3aMNFWn3yk/s320/cant_clone.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Instead, I used the "clone repositories" command button. &amp;nbsp;I was able to do what I wanted to, but it was slightly less intuitive than I would have hoped. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Using eGit&lt;/h3&gt;&lt;br /&gt;After cloning, Git placed the entire repository on my hard drive, which is nice because checking out, exploring, and comparing is much faster than using a traditional VCS. &amp;nbsp;Performing these operations within Eclipse is just as speedy as doing things like comparing local history. &amp;nbsp;At this point, I was very impressed.&lt;br /&gt;&lt;br /&gt;Then I made a single change to a file and things started going downhill. &amp;nbsp;After the change, I had to wait about 30 seconds for the '&amp;gt;' to appear in the package explorer next to the changed file (whereas with &lt;a href="http://eclipse.org/subversive"&gt;Subversive&lt;/a&gt; and the CVS tooling, this happens what seems like instantaneously):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-00XfNHZmu-A/TXWoclpuvuI/AAAAAAAAAD8/3hF80LbFuhI/s1600/file_change.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://lh6.googleusercontent.com/-00XfNHZmu-A/TXWoclpuvuI/AAAAAAAAAD8/3hF80LbFuhI/s1600/file_change.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Then I started playing around... I right-clicked on the file I had just changed and selected &lt;em&gt;Assume unchanged&lt;/em&gt;. &amp;nbsp;Uh-oh! &amp;nbsp;&lt;a href="http://pastebin.com/bzxaeEnx"&gt;ClassCastException&lt;/a&gt;. &amp;nbsp;Now, click &lt;em&gt;Assume changed&lt;/em&gt;. &amp;nbsp;&lt;a href="http://pastebin.com/fUk7j46b"&gt;IOException&lt;/a&gt;. &amp;nbsp;Apparently, though something worked and I was able to continue with the commit and then view the commit in history.&lt;br /&gt;&lt;br /&gt;Next problem: I moved back to the Git Repositories perspective, and I had lost all of the git repositories in the git repositories view. &amp;nbsp;Re-importing them would not work. &amp;nbsp;It looked more like the UI had crashed than any data had been lost:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-h6JxY8mbGII/TXWppcmcX4I/AAAAAAAAAEE/h5BZf_UYxTI/s1600/missing_repos.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="120" src="https://lh3.googleusercontent.com/-h6JxY8mbGII/TXWppcmcX4I/AAAAAAAAAEE/h5BZf_UYxTI/s320/missing_repos.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I restarted Eclipse and everything seemed back to normal:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-GM5wXQTqIcI/TXWppL8OloI/AAAAAAAAAEA/YF7Y4YyaZ48/s1600/repo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="123" src="https://lh4.googleusercontent.com/-GM5wXQTqIcI/TXWppL8OloI/AAAAAAAAAEA/YF7Y4YyaZ48/s320/repo.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Despite its problems, eGit has a good UI. &amp;nbsp;The project is clearly following the &lt;a href="http://wiki.eclipse.org/User_Interface_Guidelines"&gt;Eclipse User Interface Guidelines&lt;/a&gt;, and I was able to easily transfer my familiarity with Eclipse's CVS and SVN tools to working with git. &amp;nbsp;This is a strong indicator to me that the project is headed in the right direction even if it is not quite there yet. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;And so...&lt;/h3&gt;&lt;br /&gt;The basic features that I need exist, but after 20 minutes of using, I hit several obstacles. &amp;nbsp;None of them were insurmountable and the project is usable. &amp;nbsp;Despite this, I do expect that future releases will be significantly more solid. &amp;nbsp;I will likely be using eGit for my day to day work, but for now this will be largely for repository and history exploration, rather than for commit and branch management, which I'll probably use the command line for.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;b&gt;EDIT:&lt;/b&gt; I raised &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=339158"&gt;Bug 339158&lt;/a&gt; and &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=339159"&gt;Bug 339159&lt;/a&gt; to track some of the problems I found.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-2282629631949754589?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/2282629631949754589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/03/egit-in-practice.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/2282629631949754589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/2282629631949754589'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2011/03/egit-in-practice.html' title='eGit in practice'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh6.googleusercontent.com/-I8ZlVEUKg_U/TXWna0rBbhI/AAAAAAAAAD4/K3aMNFWn3yk/s72-c/cant_clone.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-3382859312653628186</id><published>2010-10-22T11:12:00.000-07:00</published><updated>2010-10-22T11:12:50.983-07:00</updated><title type='text'>AJDT 2.1.1 Released</title><content type='html'>I am pleased to announce the release of &lt;a href="http://eclipse.org/ajdt/whatsnew211"&gt;AJDT 2.1.1&lt;/a&gt;.  In this release, we have focussed on &lt;a href="http://eclipse.org/aspectj"&gt;AspectJ&lt;/a&gt;-aware searching and refactoring.  This release also includes AspectJ 1.6.10.&lt;br /&gt;&lt;br /&gt;Please see the &lt;a href="http://www.eclipse.org/ajdt/whatsnew211/"&gt;New &amp; Noteworthy&lt;/a&gt; for more details, including a list of refactorings that are currently known to work in AspectJ files.&lt;br /&gt;&lt;br /&gt;AJDT 2.1.1 will be available in the upcoming &lt;a href="http://www.springsource.com/developer/sts"&gt;SpringSource Tool Suite&lt;/a&gt; 2.5.0 release, or you can install it from one of the following update sites:&lt;br /&gt;&lt;br /&gt;Eclipse 3.6: &lt;a href="http://download.eclipse.org/tools/ajdt/36/update"&gt;http://download.eclipse.org/tools/ajdt/36/update&lt;/a&gt;&lt;br /&gt;Eclipse 3.5: &lt;a href="http://download.eclipse.org/tools/ajdt/35/update"&gt;http://download.eclipse.org/tools/ajdt/35/update&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-3382859312653628186?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/3382859312653628186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/10/ajdt-211-released.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/3382859312653628186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/3382859312653628186'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/10/ajdt-211-released.html' title='AJDT 2.1.1 Released'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-7464640753778256730</id><published>2010-10-07T15:17:00.000-07:00</published><updated>2010-10-07T15:17:56.644-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy-Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='GMaven'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Maven'/><title type='text'>More on Groovy-Eclipse and Maven</title><content type='html'>I've had a few requests for the source code for the Groovy-Eclipse integration for maven, as well as a sample project that uses it.  You can get both the &lt;a href="http://docs.codehaus.org/download/attachments/182255869/groovy-eclipse-for-maven.zip"&gt;sample project and groovy-eclipse compiler plugin for maven&lt;/a&gt;.  &lt;br /&gt;&lt;br /&gt;They are packaged as two &lt;a href="http://m2eclipse.sonatype.org/"&gt;m2eclipse&lt;/a&gt; projects, and it is recommended (although not necessary) to import them into Eclipse to use them.&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;groovy-eclipse-compiler&lt;/code&gt; project contains the compiler integration.  It is a single Java class that calls into the Groovy-enhanced JDT compiler.  This maven plugin uses &lt;a href="http://plexus.codehaus.org/"&gt;plexus&lt;/a&gt; to hook into maven's compiler plugin.&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;groovy-eclipse-maven-tests&lt;/code&gt; project is a very simple maven project that has a few Groovy and Java classes that interact with each other.  If you want to create your own project using the Groovy-Eclipse maven integration, I would recommend starting with this sample project.&lt;br /&gt;&lt;br /&gt;Please let me know if you have any problems.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-7464640753778256730?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/7464640753778256730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/10/more-on-groovy-eclipse-and-maven.html#comment-form' title='26 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/7464640753778256730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/7464640753778256730'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/10/more-on-groovy-eclipse-and-maven.html' title='More on Groovy-Eclipse and Maven'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>26</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-8153633241983230925</id><published>2010-09-13T15:50:00.000-07:00</published><updated>2010-09-13T15:50:00.632-07:00</updated><title type='text'>Better debug support for Groovy-Eclipse</title><content type='html'>A short while ago, I wrote about the new &lt;a href="http://contraptionsforprogramming.blogspot.com/2010/08/debuggable-gsps-in-springsource-tool.html"&gt;debug support&lt;/a&gt; for GSP files inside the SpringSource Tool Suite.  What I didn't describe is that this has coincided with enhanced debug support in Groovy-Eclipse.&lt;br /&gt;&lt;br /&gt;There are a few tricks that you can do inside of Eclipse to vastly improve your debugging experience.  Much of this is now automatically configured for you when you install the latest snapshot of Groovy-Eclipse, available at this update site: &lt;a href="http://dist.codehaus.org/groovy/distributions/greclipse/snapshot/e3.6/"&gt;http://dist.codehaus.org/groovy/distributions/greclipse/snapshot/e3.6/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Step filters&lt;/h4&gt;&lt;br /&gt;The Eclipse Java Development Tools supports the concept of step filters that enable a user to specify regular expressions of type names that should be ignored by the debugger.  By this I mean that using any of the &lt;em&gt;step&lt;/em&gt; commands (step into, step over, step out of...), the debugger falls through any types that match a filter.&lt;br /&gt;&lt;br /&gt;This is particularly useful for stepping through Groovy MOP stack frames, including most stack frames that start &lt;code&gt;org.codehaus.groovy.*&lt;/code&gt;, and many of the &lt;code&gt;sun.reflect.*&lt;/code&gt; frames as well.&lt;br /&gt;&lt;br /&gt;Groovy Eclipse now configures a reasonable set of default step-filters for you.  These defaults can be viewed and edited in your Eclipse preferences:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_V6EKdLYBFpg/TI6CMcOdDDI/AAAAAAAAACk/SVA1PN0dMSA/s1600/step_filter.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/_V6EKdLYBFpg/TI6CMcOdDDI/AAAAAAAAACk/SVA1PN0dMSA/s400/step_filter.png" width="380" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Note that it is still possible to stop at a breakpoint set inside of a filtered type, but the next step-* command will step through to the first unfiltered type.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Show Logical Structure&lt;/h4&gt;&lt;br /&gt;At runtime, closure parameters are wrapped in &lt;code&gt;groovy.lang.Reference&lt;/code&gt; objects.  This makes for a bit of an annoyance when debugging and trying to browse variables.  Take for example this simplified, but common debugging situation.  You are debugging inside of a closure and you are using the variables view to explore the current value of your closure parameter:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_V6EKdLYBFpg/TI6PZd95qsI/AAAAAAAAACs/Rh87qj7ApF0/s1600/no_logical_structure.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="268" src="http://3.bp.blogspot.com/_V6EKdLYBFpg/TI6PZd95qsI/AAAAAAAAACs/Rh87qj7ApF0/s400/no_logical_structure.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Unfortunately as you can see, you have to dig 3 levels deep to see the contents of the list.&lt;br /&gt;&lt;br /&gt;Again, Eclipse offers a solution.  You can select the &lt;em&gt;Show Logical Structure&lt;/em&gt; button &lt;img border="0" src="http://1.bp.blogspot.com/_V6EKdLYBFpg/TI6QLgzCPyI/AAAAAAAAAC0/ZM6WxmvA0cM/s320/show_logical_structure_button.png" /&gt;.  The result is a significantly more concise way to browse your variables:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_V6EKdLYBFpg/TI6Qzc3AdsI/AAAAAAAAAC8/sm_cQxYOFxE/s1600/logical_structure.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="270" src="http://2.bp.blogspot.com/_V6EKdLYBFpg/TI6Qzc3AdsI/AAAAAAAAAC8/sm_cQxYOFxE/s400/logical_structure.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Groovy-Eclipse has added a custom logical structure for &lt;code&gt;Reference&lt;/code&gt; objects so that they are automatically dereferenced inside of the variables view.  You can edit existing and add new logical structures in your Java Debug preferences:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_V6EKdLYBFpg/TI6Rm_4gm-I/AAAAAAAAADE/L2_nCuIr9js/s1600/logical_structure_settings.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="193" src="http://4.bp.blogspot.com/_V6EKdLYBFpg/TI6Rm_4gm-I/AAAAAAAAADE/L2_nCuIr9js/s400/logical_structure_settings.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h4&gt;Stack frame emphasis&lt;/h4&gt;&lt;br /&gt;Another common complaint about debugging Groovy code is that the extra stack frames from Groovy's MOP hides the application stack frames from view.  As an exercise, try to find the application stack frames in the following code (hint: the name of the script is &lt;em&gt;Script.groovy&lt;/em&gt;):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_V6EKdLYBFpg/TI6clLw3mtI/AAAAAAAAADM/pFk--zDHtvo/s1600/stackframes_no_grey.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="319" src="http://4.bp.blogspot.com/_V6EKdLYBFpg/TI6clLw3mtI/AAAAAAAAADM/pFk--zDHtvo/s320/stackframes_no_grey.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;On second thought...don't try. &amp;nbsp;Groovy-Eclipse automatically greys-out MOP and related stack frames, making it easy to see application stack frames (without actually hiding Groovy magic):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_V6EKdLYBFpg/TI6dI-2de3I/AAAAAAAAADU/TlrMhzlok8w/s1600/stackframes_grey.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="320" src="http://1.bp.blogspot.com/_V6EKdLYBFpg/TI6dI-2de3I/AAAAAAAAADU/TlrMhzlok8w/s320/stackframes_grey.png" width="318" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This feature, combined with step filtering above makes stepping through Groovy code significantly more efficient.&lt;br /&gt;&lt;br /&gt;By default, Groovy-Eclipse de-emphasizes some of the most common MOP stack frames, but this can be changed in the Eclipse preferences:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 2px solid #fff; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_V6EKdLYBFpg/TI6fJWlkRiI/AAAAAAAAADo/Tbl00kJeJ_M/s1600/stackframe_settings.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="192" src="http://2.bp.blogspot.com/_V6EKdLYBFpg/TI6fJWlkRiI/AAAAAAAAADo/Tbl00kJeJ_M/s400/stackframe_settings.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h4&gt;What's next?&lt;/h4&gt;&lt;br /&gt;Two of the most requested debugging features are Groovy-aware hotswapping (so that Groovy code can be edited, compiled, and loaded without needing to restart a debugging session) and a Groovy-aware Display view (so that Groovy snippets can be executed in the context of a paused application).&lt;br /&gt;&lt;br /&gt;We've had some &lt;a href="http://andrewclement.blogspot.com/2010/03/groovy-eclipse-groovy-hotswap-support.html"&gt;success with hotswapping&lt;/a&gt;, but more work needs to be done before it can be generally useful.  Specifically, we've hit some limitations due to the class files produced by groovyc and are awaiting a fix for &lt;a href="http://jira.codehaus.org/browse/GROOVY-4152"&gt;GROOVY-4152&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A Groovy-aware display view is something that we need to work on and I hope to have initial support for this for the 2.1.0 release in late October.&lt;br /&gt;&lt;br /&gt;Clearly, we have work to do, but the existing debug support provides significant improvements over what was available even a few months ago.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-8153633241983230925?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/8153633241983230925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/09/better-debug-support-for-groovy-eclipse.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/8153633241983230925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/8153633241983230925'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/09/better-debug-support-for-groovy-eclipse.html' title='Better debug support for Groovy-Eclipse'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_V6EKdLYBFpg/TI6CMcOdDDI/AAAAAAAAACk/SVA1PN0dMSA/s72-c/step_filter.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-3423631104386646006</id><published>2010-09-06T21:04:00.000-07:00</published><updated>2010-10-08T08:08:52.462-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy-Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Ant'/><category scheme='http://www.blogger.com/atom/ns#' term='GMaven'/><category scheme='http://www.blogger.com/atom/ns#' term='Maven'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Where are all my stubs?</title><content type='html'>&lt;style type="text/css"&gt;pre {  font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace;   color: #000000;  background-color: #eee;  font-size: 12px;  border: 1px dashed #999999;  line-height: 14px;  padding: 5px;  overflow: auto;  width: 100%}&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;Update:&lt;/b&gt;&lt;/span&gt; you must also include a &lt;code&gt;pluginRepositories&lt;/code&gt; section.  See below for XML snippet.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;Update:&lt;/b&gt;&lt;/span&gt; See &lt;a href="http://contraptionsforprogramming.blogspot.com/2010/10/more-on-groovy-eclipse-and-maven.html"&gt;here&lt;/a&gt; for a sample project and the source code of the compiler integration.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The standard way of compiling joint Groovy-Java code outside of Eclipse has always been through the use of stubs:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Generate Java stub files for the Groovy files&lt;/li&gt;&lt;li&gt;Compile the Java files using the stubs to compile against&lt;/li&gt;&lt;li&gt;Compile the Groovy files&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Although this works reasonably well in many situations, there are some complications and problems with this approach, most of which have already been described recently in detail on the groovy-dev mailing list &lt;a href="http://groovy.329449.n5.nabble.com/Groovy-s-stub-generator-clearly-broken-tp2267109p2267109.html"&gt;here&lt;/a&gt; and &lt;a href="http://groovy.329449.n5.nabble.com/Groovy-needs-better-Maven-support-td1842298.html#a1842353"&gt;here&lt;/a&gt;, so I won't go into them in this post.&lt;br /&gt;&lt;br /&gt;About a year ago, we introduced &lt;a href="http://blog.springsource.com/2009/07/30/a-groovier-eclipse-experience/"&gt;Groovy-Eclipse 2.0&lt;/a&gt;, which compiles Groovy code by plugging into the JDT compiler and does not need to generate stub files.   And as Andy Clement &lt;a href="http://andrewclement.blogspot.com/2010/02/running-groovy-eclipse-joint-compiler.html"&gt;describes&lt;/a&gt;, it is possible to run the compiler in batch mode on the command line.&lt;br /&gt;&lt;br /&gt;And now, with a little bit of glue code required, I have released a snapshot of the compiler with both ant and maven integration. Although, this is still early work, I do hope that this approach will solve many of the problems that Groovy programmers are having with stub generation.  I'll describe below how they both work.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Ant integration for Groovy-Eclipse&lt;/h2&gt;&lt;br /&gt;Ant integration for the batch compiler is fairly simple.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Download the &lt;a href="http://codehaus.org/~werdna/groovy-eclipse-batch-0.5.0.jar"&gt;groovy-eclipse-batch-0.5.0.jar&lt;/a&gt; from its temporary location.&lt;/li&gt;&lt;li&gt;Add this jar to your &lt;code&gt;~/.ant/lib&lt;/code&gt; directory.&lt;/li&gt;&lt;li&gt;Once you have that, you need to set the &lt;code&gt;build.compiler&lt;/code&gt; property to &lt;code&gt;org.codehaus.groovy.eclipse.ant.GroovyCompilerAdapter&lt;/code&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;This will cause ant's &lt;a href="http://www.jajakarta.org/ant/ant-1.6.1/docs/en/manual/CoreTasks/javac.html"&gt;javac task&lt;/a&gt; to delegate the Groovy-Eclipse compiler for the actual compilation.  This means that it is possible to pass any combination of Groovy and Java files to the compiler and most parameters applicable for javac are still available when using the compiler adapter.&lt;br /&gt;&lt;br /&gt;A very simple script that uses the Groovy compiler adapter looks like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;target name="compile"&amp;gt;&lt;br /&gt;  &amp;lt;property name="build.compiler"&lt;br /&gt;           value="org.codehaus.groovy.eclipse.ant.GroovyCompilerAdapter"&amp;gt;&lt;br /&gt;  &amp;lt;javac srcdir="src" destdir="bin"/&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;/pre&gt;&lt;br /&gt;This script sets compiler adapter and compiles all source files in &lt;code&gt;src&lt;/code&gt;, placing the resulting class files in &lt;code&gt;bin&lt;/code&gt;.  Both &lt;code&gt;*.java&lt;/code&gt; files and &lt;code&gt;*.groovy&lt;/code&gt; files are included in the compilation.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Maven integration for Groovy-Eclipse&lt;/h2&gt;&lt;br /&gt;Groovy-Eclipse can now also be used from maven.   To do so, add the following to your pom.xml.&lt;br /&gt;&lt;br /&gt;The artifacts are currently in the SpringSource snapshot maven repo.  You must add it as a regular repository:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;repositories&amp;gt;&lt;br /&gt;  &amp;lt;repository&amp;gt;&lt;br /&gt;  &amp;lt;id&amp;gt;springsource&amp;lt;/id&amp;gt;&lt;br /&gt;  &amp;lt;url&amp;gt;http://maven.springframework.org/snapshot&amp;lt;/url&amp;gt;&lt;br /&gt;  &amp;lt;releases&amp;gt;&amp;lt;enabled&amp;gt;true&amp;lt;/enabled&amp;gt;&amp;lt;/releases&amp;gt;&lt;br /&gt;  &amp;lt;snapshots&amp;gt;&amp;lt;enabled&amp;gt;true&amp;lt;/enabled&amp;gt;&amp;lt;/snapshots&amp;gt;&lt;br /&gt;  &amp;lt;/repository&amp;gt;&lt;br /&gt;&amp;lt;/repositories&amp;gt;&lt;/pre&gt;&lt;br /&gt;as well as a plugin repository:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;pluginRepositories&amp;gt;&lt;br /&gt;  &amp;lt;pluginRepository&amp;gt;&lt;br /&gt;  &amp;lt;id&amp;gt;springsource&amp;lt;/id&amp;gt;&lt;br /&gt;  &amp;lt;url&amp;gt;http://maven.springframework.org/snapshot&amp;lt;/url&amp;gt;&lt;br /&gt;  &amp;lt;/pluginRepository&amp;gt;&lt;br /&gt;&amp;lt;/pluginRepositories&amp;gt;&lt;/pre&gt;&lt;br /&gt;And in your plugin section, you must change the compiler used by the maven-compiler-plugin.  Like the javac ant task, the maven-compiler-plugin does not actually compile, but rather delegates the compilation to a different artifact:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;build&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;plugins&amp;gt;&lt;br /&gt;  &amp;lt;plugin&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;2.3.1&amp;lt;/version&amp;gt;&lt;br /&gt;    &amp;lt;configuration&amp;gt;&lt;br /&gt;      &amp;lt;compilerId&amp;gt;groovy-eclipse-compiler&amp;lt;/compilerId&amp;gt;&lt;br /&gt;      &amp;lt;verbose&amp;gt;true&amp;lt;/verbose&amp;gt;&lt;br /&gt;    &amp;lt;/configuration&amp;gt;&lt;br /&gt;    &amp;lt;dependencies&amp;gt;&lt;br /&gt;      &amp;lt;dependency&amp;gt;&lt;br /&gt;        &amp;lt;groupId&amp;gt;org.codehaus.groovy&amp;lt;/groupId&amp;gt;&lt;br /&gt;        &amp;lt;artifactId&amp;gt;groovy-eclipse-compiler&amp;lt;/artifactId&amp;gt;&lt;br /&gt;        &amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt;&lt;br /&gt;      &amp;lt;/dependency&amp;gt;&lt;br /&gt;    &amp;lt;/dependencies&amp;gt;&lt;br /&gt;  &amp;lt;/plugin&amp;gt;&lt;br /&gt;  ...&lt;br /&gt;&amp;lt;/plugins&amp;gt;&lt;br /&gt;&amp;lt;/build&amp;gt;&lt;/pre&gt;&lt;br /&gt;This will allow Groovy files to be compiled.  The maven-compiler-plugin prefers all source files to be in &lt;code&gt;src/main/java&lt;/code&gt; and &lt;code&gt;src/test/java&lt;/code&gt;, but if you prefer you can use the standard Groovy convention and keep your files in &lt;code&gt;src/main/groovy&lt;/code&gt; and &lt;code&gt;src/test/groovy&lt;/code&gt;.  You can do so by adding the following plugin to your build section of the pom:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;build-helper-maven-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;1.5&amp;lt;/version&amp;gt;&lt;br /&gt;  &amp;lt;executions&amp;gt;&lt;br /&gt;    &amp;lt;execution&amp;gt;&lt;br /&gt;      &amp;lt;id&amp;gt;add-source&amp;lt;/id&amp;gt;&lt;br /&gt;      &amp;lt;phase&amp;gt;generate-sources&amp;lt;/phase&amp;gt;&lt;br /&gt;      &amp;lt;goals&amp;gt;&lt;br /&gt;        &amp;lt;goal&amp;gt;add-source&amp;lt;/goal&amp;gt;&lt;br /&gt;      &amp;lt;/goals&amp;gt;&lt;br /&gt;      &amp;lt;configuration&amp;gt;&lt;br /&gt;        &amp;lt;sources&amp;gt;&lt;br /&gt;          src/main/groovy&lt;br /&gt;          src/test/groovy&lt;br /&gt;        &amp;lt;/sources&amp;gt; &lt;br /&gt;      &amp;lt;/configuration&amp;gt;&lt;br /&gt;    &amp;lt;/execution&amp;gt;&lt;br /&gt;  &amp;lt;/executions&amp;gt;&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;/pre&gt;&lt;br /&gt;This approach is still in an alpha state and has not been widely tested.  It was hard to find reasonably large Groovy-Java projects that use maven for me to try this on.  The largest project I have compiled in this way is the &lt;a href="http://gpars.codehaus.org/"&gt;GPars project&lt;/a&gt; (GPars uses gradle for its build, but I adapted its build.gradle to a pom.xml and successfully ran maven on it).  This project includes 168 Java and Groovy files in main as well as 338 Groovy files in test.  In a not particularly scientific manner, I did a few runs of building the main and test classes using both Groovy-Eclipse and GMaven and the results are that Groovy-Eclipse is reasonably faster than GMaven for this project:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Time to compile main and test classes using GMaven: 36s&lt;/li&gt;&lt;li&gt; Time to compile main and test classes using Groovy-Eclipse: 28s&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;In addition to being largely untested in the wild, there are a few caveats when using Groovy-Eclipse:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Since stubs are not generated, GroovyDoc and any other artifacts that rely on stubs cannot be generated.&lt;/li&gt;&lt;li&gt;This only supports Groovy 1.7.&lt;/li&gt;&lt;li&gt;Third (ant only), your project must have at least one Java file in it (this can be an empty stub), or else ant will finish without compiling anything.  There is a patch for this (&lt;a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=48829"&gt;Bug 48829&lt;/a&gt;), but I am waiting for it to be contributed back to ant.&lt;/li&gt;&lt;li&gt;Fourth (maven only), your maven project must have at least one groovy file or else compilation will not occur.  (Though, if your project &lt;em&gt;doesn't&lt;/em&gt; have any Groovy files, then why are you using a Groovy compiler?)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;There is still some work to be done, but it is ready enough for people to start trying it out.  Feedback is greatly appreciated.  You can reply to this blog post, send a message to the &lt;a href="http://xircles.codehaus.org/lists/eclipse-plugin-user@groovy.codehaus.org"&gt;mailing list&lt;/a&gt;, or &lt;a href="http://jira.codehaus.org/browse/GRECLIPSE"&gt;raise an issue on jira&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-3423631104386646006?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/3423631104386646006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/09/where-are-all-my-stubs.html#comment-form' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/3423631104386646006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/3423631104386646006'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/09/where-are-all-my-stubs.html' title='Where are all my stubs?'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-5910177632861270118</id><published>2010-08-24T12:24:00.000-07:00</published><updated>2010-08-30T10:48:43.807-07:00</updated><title type='text'>Debuggable GSPs in SpringSource Tool Suite</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;A basic trick of Groovy Server Page debugging that seasoned Grails developers know is that by adding &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;?showSource=true&lt;/span&gt;&amp;nbsp;to a URL for any of your GSPs you can view the Groovy translation of your GSP code. &amp;nbsp;For example, the vanilla create GSP (&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;http://localhost:8080/TripPlanner/trip/create.gsp&lt;/span&gt;)&amp;nbsp;gets rendered like this in the browser:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_V6EKdLYBFpg/THQR-x57CDI/AAAAAAAAAB0/ZliT6RC3GJE/s1600/create-browser.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/_V6EKdLYBFpg/THQR-x57CDI/AAAAAAAAAB0/ZliT6RC3GJE/s200/create-browser.png" width="176" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;And altering the URL to this: &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;http://localhost:8080/TripPlanner/trip/create.gsp?showSource=true&lt;/span&gt;, you can see the translated source:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_V6EKdLYBFpg/THQSXUwxUsI/AAAAAAAAAB8/n0zp6kEVqM0/s1600/create-showSource.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_V6EKdLYBFpg/THQSXUwxUsI/AAAAAAAAAB8/n0zp6kEVqM0/s320/create-showSource.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;There is a mapping between lines of code of the original GSP and the lines of code of the Groovy translation. &amp;nbsp;In fact, if you are using Grails 1.3.4 or above, and scroll to the bottom of the translation, you will see something like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;nbsp;82: @org.codehaus.groovy.grails.web.transform.LineNumber(&lt;br /&gt;&amp;nbsp;&amp;nbsp;83: &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;lines = [3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 6, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 11, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 17, 17, 18, 18, 19, 19, 20, 21, 23, 23, 23, 23, 25, 25, 26, 35, 35, 35, 35, 37, 37, 37, 39, 39, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],&lt;br /&gt;&amp;nbsp;&amp;nbsp;84: &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;sourceName = "create.gsp"&lt;br /&gt;&amp;nbsp;&amp;nbsp;85: )&lt;br /&gt;&amp;nbsp;&amp;nbsp;86: class ___LineNumberPlaceholder { }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This is the line mapping information and each element of the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;lines&lt;/span&gt; array maps a line from the translation (the array index) to a line in the original source code (the value at that index). &amp;nbsp;This is not particularly useful to humans, but it is to the SpringSource Tool Suite.&lt;br /&gt;&lt;br /&gt;Using this information, STS is finally able to provide some debugging support for GSP files. &amp;nbsp;You can set a breakpoint at a line in your GSP editor, and the debugger will pause at that line when it is reached while rendering the page:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_V6EKdLYBFpg/THQU9nkvaEI/AAAAAAAAACE/enRFJt1LSuk/s1600/create-debug.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="197" src="http://4.bp.blogspot.com/_V6EKdLYBFpg/THQU9nkvaEI/AAAAAAAAACE/enRFJt1LSuk/s400/create-debug.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;At this point, your GSP can be interacted with like any Groovy file. &amp;nbsp;For example, you can inspect the current state of variables in your page binding:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_V6EKdLYBFpg/THQWmwR7XjI/AAAAAAAAACM/neENn0IgKf8/s1600/variables-pane.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="163" src="http://1.bp.blogspot.com/_V6EKdLYBFpg/THQWmwR7XjI/AAAAAAAAACM/neENn0IgKf8/s640/variables-pane.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;And you can execute values in the display view (using Java syntax only for now):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_V6EKdLYBFpg/THQZr9e084I/AAAAAAAAACU/Oyjdy1Iqpr0/s1600/display-pane.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="60" src="http://2.bp.blogspot.com/_V6EKdLYBFpg/THQZr9e084I/AAAAAAAAACU/Oyjdy1Iqpr0/s640/display-pane.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This feature has been fun to implement since it was my first foray into Eclipse's Java debug interface, but I am not sure how useful it is going to be. &amp;nbsp;Lines in a GSP are not executed sequentially. &amp;nbsp;Rather, many are executed out of order through closures inside of an &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;invokeTag&lt;/span&gt;&amp;nbsp;method call. &amp;nbsp;Also, I have not completely worked out how to determine if a breakpoint is at a valid location if Grails is not already running. &amp;nbsp;So, at this point it is possible to set a breakpoint on any blank line, but these breakpoints are only valid if they are set on a line containing a GSP tag or some other kinds of things.&lt;br /&gt;&lt;br /&gt;But, I do hope this is useful to you and if you are interested in trying this new feature out, then you can &lt;a href="http://www.springsource.com/developer/sts"&gt;download STS 2.5.0M3&lt;/a&gt;&amp;nbsp;and install the latest version of Grails tool support. &amp;nbsp;Enjoy!&lt;br /&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/6917071644715743308-5910177632861270118?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/5910177632861270118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/08/debuggable-gsps-in-springsource-tool.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/5910177632861270118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/5910177632861270118'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/08/debuggable-gsps-in-springsource-tool.html' title='Debuggable GSPs in SpringSource Tool Suite'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_V6EKdLYBFpg/THQR-x57CDI/AAAAAAAAAB0/ZliT6RC3GJE/s72-c/create-browser.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-3153689402208531975</id><published>2010-08-07T15:30:00.000-07:00</published><updated>2010-08-07T15:32:00.105-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy-Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='PDE'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Groovy-PDE Redux</title><content type='html'>Up until recently, doing any PDE work with Groovy has been a bit of a kludge.  First, you had to create a &lt;code&gt;customCallBack.xml&lt;/code&gt; script.  Inside this script you had to call out to a special &lt;code&gt;groovy.jdtcompile&lt;/code&gt; ant task, using a magic set of classpath references.  When this approach worked, it did so by first compiling your Java code (with errors of course since your groovy code is not touched), and then re-compiling all your code using the joint compiler provided by Groovy-Eclipse.&lt;br /&gt;&lt;br /&gt;Not so pretty.  It works for Groovy-Eclipse, but that is only because I know exactly what its limitations are and how to work around them.&lt;br /&gt;&lt;br /&gt;A short while ago, I wrote about how we &lt;a href="http://contraptionsforprogramming.blogspot.com/2010/03/ajdt-pde-builds-redux.html"&gt;re-implemented PDE build for projects that use the AspectJ compiler&lt;/a&gt;.  I've recently done the same for plugin projects that use Groovy.&lt;br /&gt;&lt;br /&gt;Here's how it works:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Install the latest dev snapshot of Groovy-Eclipse for Helios (you can write plugins that target Galileo (Eclipse 3.5), but you must use the Helios PDE builder to create the plugins).&lt;/li&gt;&lt;li&gt;For each of your plugin projects, add the following to your &lt;code&gt;build.properties&lt;/code&gt; file:&lt;br /&gt;&lt;pre&gt;sourceFileExtensions=*.java, *.groovy&lt;br /&gt;compilerAdapter=org.codehaus.groovy.eclipse.ant.GroovyCompilerAdapter&lt;br /&gt;compilerAdapter.useLog=true  # this ensures that exceptions are logged to the proper log file.&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Now you can run your PDE export (either headless or from within a running Eclipse using one of the Export wizards).&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;The only caveat is that each plugin project must contain at least one &lt;code&gt;.java&lt;/code&gt; file or else the PDE builder will ignore that plugin.  The problem is described in &lt;a href="https://bugs.eclipse.org/318951"&gt;Bug 318951&lt;/a&gt;.  Before this can be addressed, I need a patch committed to the javac task, described here: &lt;a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=48829"&gt;Apache Bug 48829&lt;/a&gt; (please vote the bug up if you want to see this fixed!).&lt;br /&gt;&lt;br /&gt;With that, creating Groovy-based Eclipse plugins now requires much, much less black magic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-3153689402208531975?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/3153689402208531975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/08/groovy-pde-redux.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/3153689402208531975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/3153689402208531975'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/08/groovy-pde-redux.html' title='Groovy-PDE Redux'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-3058423767733650038</id><published>2010-07-05T19:48:00.000-07:00</published><updated>2010-07-05T19:48:08.838-07:00</updated><title type='text'>AJDT 2.1.0 Released</title><content type='html'>I am pleased to announce the 2.1.0 release of the AspectJ Development Tools for Eclipse.  &lt;br /&gt;&lt;br /&gt;In addition to including AspectJ 1.6.9, this release includes a number of new features for making intertype declarations (ITDs) first class citizens in the editor.  Java search now includes references and declarations of ITDs.  Rename refactorings are now ITD-aware.  And we have introduced the new &lt;em&gt;pull-out&lt;/em&gt; refactoring, that can pull out your Java fields, methods, and constructors into an Aspect and convert them into an intertype declaration (this refactoring is the converse of the &lt;a href="http://contraptionsforprogramming.blogspot.com/2009/05/push-in-refactoring-for-ajdt.html"&gt;push-in&lt;/a&gt; refactoring that was introduced in 2.0.0.&lt;br /&gt;&lt;br /&gt;AJDT 2.1.0 is available for Eclipse 3.5 and 3.6 from the following update sites:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;a href="http://download.eclipse.org/tools/ajdt/36/update"&gt;http://download.eclipse.org/tools/ajdt/36/update&lt;/a&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;a href="http://download.eclipse.org/tools/ajdt/35/update"&gt;http://download.eclipse.org/tools/ajdt/35/update&lt;/a&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;For more details on the new features, please see the &lt;a href="http://www.eclipse.org/ajdt/whatsnew210/"&gt;new and noteworthy&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-3058423767733650038?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/3058423767733650038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/07/ajdt-210-released.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/3058423767733650038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/3058423767733650038'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/07/ajdt-210-released.html' title='AJDT 2.1.0 Released'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-4841803313707735275</id><published>2010-06-30T21:55:00.000-07:00</published><updated>2010-06-30T21:55:46.195-07:00</updated><title type='text'>Vancouver Eclipse Demo Camp 2010</title><content type='html'>Last night, 31 Eclipse developers from the Vancouver, BC area met up, listened to a few great talks, went for some beers, and had a great time.  We had 8 speakers who surprisingly all stayed within their allotted time of 8 minutes (maybe it was a threat of a nerf gun that did it...I don't know).  The pace was brisk and we heard lots of good things from lots of great developers from around Vancouver.&lt;br /&gt;&lt;br /&gt;This year's Demo camp was sponsored by the &lt;a href="http://www.eclipse.org/org/"&gt;Eclipse Foundation&lt;/a&gt;, &lt;a href="http://springsource.com"&gt;SpringSource&lt;/a&gt; (a division of &lt;a href="http"//vmware.com"&gt;VMWare&lt;/a&gt;), and &lt;a href="http://tasktop.com"&gt;TaskTop&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Mik Kersten, &lt;a href="http://tasktop.com"&gt;Tasktop&lt;/a&gt;, Welcome and Eclipse Ecosystem Overview&lt;/h3&gt;&lt;br /&gt;Mik Kersten started the evening off with a brief introduction to some new features in the new Helios release.  In addition to modernizing SWT to integrate better with Windows 7, and new Mylyn connectors, the most interesting new feature he described was the Eclipse Market Place.  In the past, finding new content to install into your Eclipse installation required users to go to an external browser, find a link to an update site, and copy it into your update manager.  Now, all this can be done transparently through the market place client from within Eclipse.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Kris De Volder, &lt;a href="http://springsource.com"&gt;SpringSource&lt;/a&gt;, &lt;a href="http://eclipse.org/aspectj"&gt;AspectJ&lt;/a&gt; and &lt;a href="http://eclipse.org/ajdt"&gt;AJDT&lt;/a&gt;&lt;/h3&gt;&lt;br /&gt;Next up was Kris De Volder, a new colleague of mine that we snatched from the Computer Science Department at the University of British Columbia (&lt;a href="http://cs.ubc.ca"&gt;UBC&lt;/a&gt;).  He demoed some of his new work on AJDT, specifically the new Pull-Out refactoring that allows users to pull-out fields and methods from classes and convert them into intertype declarations.  This will be available in the upcoming 2.1.0 release of AJDT.&lt;br /&gt;&lt;br /&gt;He also demoed the Push-In refactoring, the converse of Pull-Out, which takes existing intertype declarations and pushes them into their target types.  This is work that I did a short while ago and is described &lt;a href="http://contraptionsforprogramming.blogspot.com/2009/05/push-in-refactoring-for-ajdt.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Emerson Murphy-Hill, &lt;a href="http://cs.ubc.ca"&gt;UBC&lt;/a&gt;, How Are People Using Eclipse?&lt;/h3&gt;&lt;br /&gt;Emerson showcased some of his research at UBC on how Eclipse is being used, or not used by developers.  Some of the most surprising results of his research, in my opinion, are how little all of the various refactorings are used inside of Eclipse.  And how the ones that are popular are not the ones that I personally use.&lt;br /&gt;&lt;br /&gt;My personal favorites are rename (field, method, type, etc), extract (local, constant, and method), and convert local variable to field.  Apparently, not many people use the last one.  But (oddly, in my opinion),  inline method seems to be quite popular---something I've never used.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;David Dossot, &lt;a href="http://www.mulesoft.com/"&gt;MuleSoft&lt;/a&gt;, &lt;a href="http://www.mulesoft.org/documentation/display/MULEIDE/Home"&gt;MuleSoft Tool Suite&lt;/a&gt;&lt;/h3&gt;&lt;br /&gt;David gave a brief tour of MuleIDE, which provides tool support for creating and managing your MuleSoft projects in Eclipse.  David used MuleIDE to access road work data from the city of Vancouver and built a simple application to determine how many kilometers of roadwork are currently underway in Vancouver.  Not bad for 8 minutes!&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Alex Bradley, &lt;a href="http://cs.ubc.ca"&gt;UBC&lt;/a&gt;, Source Code History at Your Fingertips&lt;/h3&gt;&lt;br /&gt;Do you use the "Show annotations" feature of CVS or SVN?  I actually didn't know about this. Using "Show anotations" will add gutter markers on lines changed by recent commits to the source repository.  Hovering over the annotations will provide extra information.  &lt;br /&gt;&lt;br /&gt;Alex showed his enhancements to the Java editor, which converted these annotations into semi-transparent overlays that co-exist with the source code. This is work that Alex has done for his master's thesis at UBC.  I liked how his enhancements made version changes more explicit in the editor.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Nieraj Sing, &lt;a href="http://springsource.com"&gt;SpringSource&lt;/a&gt;, &lt;a href="http://groovy.codehaus.org"&gt;Groovy language&lt;/a&gt; and &lt;a href="http://grails.org"&gt;Grails&lt;/a&gt; Support in the &lt;a href="http://www.springsource.com/products/sts"&gt;SpringSource Tool Suite&lt;/a&gt;&lt;/h3&gt;&lt;br /&gt;Nieraj is another new colleague of mine at SpringSource.  He's a summer student from the University of Victoria.  Nieraj showed his recent enhancements of Grails support in the SpringSource Tool Suite.  He showed the Grails explorer view, which allows developers to view their Grails projects organized in a way that emphasizes  artifacts and structure specific to Grails projects.  He also showed his work on the Grails Plugin Manager, which allows developers to view, install, update, and uninstall Grails plugins into their projects.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Luke Evans, &lt;a href="http://www.indicee.com/"&gt;Indicee&lt;/a&gt;&lt;/h3&gt;&lt;br /&gt;Luke introduced the  &lt;a href="http://openquark.org/"&gt;CAL programming language&lt;/a&gt;, a lazy-functional language developed by him and others when he worked at Business Objects (now SAP).  He showed how programmers can use CAL to quickly and easily compose functions to manipulate streams of data in complex ways.  It is this language that forms the core of the business reporting tool produced by his company, &lt;a href="http://www.indicee.com/"&gt;Indicee&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Bjorn Gustafsson, &lt;a href="http://www.projectkoach.com/"&gt;ProjectKoach&lt;/a&gt;&lt;/h3&gt;&lt;br /&gt;Finally, Bjorn showed ProjectKoach, an RCP application that brings agile planning into Eclipse.  He showed how you can create sprints, manage tasks, integrate with version control, and integrate with bug trackers through Mylyn.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-4841803313707735275?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/4841803313707735275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/06/vancouver-eclipse-demo-camp-2010.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/4841803313707735275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/4841803313707735275'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/06/vancouver-eclipse-demo-camp-2010.html' title='Vancouver Eclipse Demo Camp 2010'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-3908070121766193906</id><published>2010-06-27T19:40:00.000-07:00</published><updated>2010-06-27T19:53:51.715-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PDE'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>No more handles?</title><content type='html'>I manage 4 Eclipse &lt;a href="http://eclipse.org/pde/"&gt;PDE builds&lt;/a&gt; on two different build servers.  Three days ago, I started getting this same exception when running the JUnit tests for all 4 of the builds:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;org.eclipse.swt.SWTError: No more handles [gtk_init_check() failed]&lt;br /&gt; at org.eclipse.swt.SWT.error(SWT.java:3910)&lt;br /&gt; at org.eclipse.swt.widgets.Display.createDisplay(Display.java:863)&lt;br /&gt; at org.eclipse.swt.widgets.Display.create(Display.java:851)&lt;br /&gt; at org.eclipse.swt.graphics.Device.&lt;init&gt;(Device.java:152)&lt;br /&gt; at org.eclipse.swt.widgets.Display.&lt;init&gt;(Display.java:479)&lt;br /&gt; at org.eclipse.swt.widgets.Display.&lt;init&gt;(Display.java:470)&lt;br /&gt; at org.eclipse.ui.internal.Workbench.createDisplay(Workbench.java:532)&lt;br /&gt; at org.eclipse.ui.PlatformUI.createDisplay(PlatformUI.java:161)&lt;br /&gt; at org.eclipse.ui.internal.ide.application.IDEApplication.createDisplay(IDEApplication.java:143)&lt;br /&gt; at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:88)&lt;br /&gt; at org.eclipse.test.UITestApplication.runApplication(UITestApplication.java:138)&lt;br /&gt; at org.eclipse.test.UITestApplication.run(UITestApplication.java:60)&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I was pulling my hair out trying to figure out why all four builds would be failing in the same exact way even though they span Eclipse versions (Galileo and Helios), and servers.  All links I could track down seemed to imply that the root cause are SWT resources that are not properly disposed.  &lt;br /&gt;&lt;br /&gt;It turns out that solution was a bit more banal than that.  There were no leaks in my code.  Instead, this exception occurred because there was no virtual display available on the build servers for running the UI tests.  &lt;a href=http://en.wikipedia.org/wiki/Xvfb"&gt;Xvfb&lt;/a&gt; had shut down.  After a restart of Xvfb, the tests are now running as expected.&lt;br /&gt;&lt;br /&gt;Now, why Xvfb would happen to shut down on both servers at the same time still befuddles me, but the problem is fixed.  I just hope that the next person who sees this problem doesn't also immediately think there is a resource leak, and pull their hair out to find it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-3908070121766193906?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/3908070121766193906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/06/no-more-handles.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/3908070121766193906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/3908070121766193906'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/06/no-more-handles.html' title='No more handles?'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-641442165179609779</id><published>2010-05-15T20:55:00.000-07:00</published><updated>2010-05-15T21:22:51.900-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy-Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Extending Groovy-Eclipse for use with Domain-Specific Languages Part II</title><content type='html'>A while ago, I wrote an article about how to &lt;a href="http://contraptionsforprogramming.blogspot.com/2009/12/extending-groovy-eclipse-for-use-with.html"&gt;extend Groovy-Eclipse for domain specific languages&lt;/a&gt;.  It was always my intention to write a follow-up that included an example project.  Thanks to some &lt;a href="http://archive.jaxen.codehaus.org/lists/org.codehaus.groovy.eclipse-plugin-dev/msg/a55951f543554edcead6e846d7900f177194cac6.20100510214542@archive.codehaus.org"&gt;prodding on the mailing list&lt;/a&gt;, here it is, 5 months later. I finally have an example Groovy-Eclipse extension project available.&lt;br /&gt;&lt;br /&gt;The code mostly speaks for itself, so if you are interested in how to extend Groovy-Eclipse, first read &lt;a href="http://contraptionsforprogramming.blogspot.com/2009/12/extending-groovy-eclipse-for-use-with.html"&gt;part I of this article&lt;/a&gt;, and then download the example project.&lt;br /&gt;&lt;br /&gt;Here is the &lt;a href="http://docs.codehaus.org/download/attachments/149454954/extension-example.zip"&gt;example plugin project&lt;/a&gt; that extends Groovy-Eclipse. Import this plugin into your Eclipse development workspace. &lt;br /&gt;&lt;br /&gt;And here is a &lt;a href="http://docs.codehaus.org/download/attachments/149454954/extension-example-runtime.zip"&gt;simple runtime project&lt;/a&gt; that uses all of the extensions provided in the plugin project.  Import this project into your Eclipse runtime workspace.  If you want to create your own project that uses this example, be sure to add the following project nature to your .project file:&lt;br /&gt;&lt;pre&gt;&lt;nature&gt;org.codehaus.groovy.eclipse.example.nature&lt;/nature&gt;&lt;/pre&gt;Once again, the code speaks for itself, so there is nothing more that I need to say about it.  Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-641442165179609779?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/641442165179609779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/05/extending-groovy-eclipse-for-use-with.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/641442165179609779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/641442165179609779'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/05/extending-groovy-eclipse-for-use-with.html' title='Extending Groovy-Eclipse for use with Domain-Specific Languages Part II'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-5944039682465936570</id><published>2010-05-10T19:58:00.000-07:00</published><updated>2010-05-10T20:02:54.350-07:00</updated><title type='text'>Vancouver Eclipse Demo Camp 2010</title><content type='html'>The Vancouver Eclipse DemoCamp is on once again! This year, it is sponsored&lt;br /&gt;by the Eclipse foundation ( http://eclipse.org ), Tasktop Technologies (&lt;br /&gt;http://tasktop.com ), and others (see p.s.).   This June 29 come out and showcase your Eclipse&lt;br /&gt;based products/tools/research to a crowd of local enthusiasts in a casual&lt;br /&gt;environment. If you are interested in giving a short (10min) presentation,&lt;br /&gt;please send us an email and add yourself to the &lt;a href="ttp://wiki.eclipse.org/Eclipse_DemoCamps_Helios_2010/Vancouver"&gt;wiki&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Those who just want to stop by for a beer and see what cool new Eclipse&lt;br /&gt;based technology is being developed in your home town, please register by&lt;br /&gt;adding your name to the wiki as well.&lt;br /&gt;&lt;br /&gt;Date: June 29th 6:30pm&lt;br /&gt;Location: TBD  (Likely Robson Square as usual)&lt;br /&gt;After party: 8:00 (location TBD)&lt;br /&gt;Keep an eye on the &lt;a href="ttp://wiki.eclipse.org/Eclipse_DemoCamps_Helios_2010/Vancouver"&gt;wiki page&lt;/a&gt; to see the finalized schedule&lt;br /&gt;&lt;br /&gt;Last year, we had a great turnout with over 50 attendees and some amazing&lt;br /&gt;demos.  It's an excellent opportunity to get to know the local Eclipse&lt;br /&gt;community.  Hope to see you there!&lt;br /&gt;&lt;br /&gt;Thanks,&lt;br /&gt;&lt;br /&gt;Robert (&lt;a href="http://tasktop.com"&gt;Tasktop&lt;/a&gt;) and Andrew (&lt;a href="http://springsource.com"&gt;SpringSource&lt;/a&gt;, a division of &lt;a href="http://vmware.com"&gt;VMWare&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;p.s. - In previous years, the event was fully funded by the Eclipse foundation, but&lt;br /&gt;this year (in part, due to the world-wide success of these events), the&lt;br /&gt;foundation no longer has the budget to provide the same level of funding. &lt;br /&gt;We are therefore looking sponsorship from the community. If your&lt;br /&gt;company would like to foster the Vancouver Eclipse community, provide extra&lt;br /&gt;branding for the event, and a dedicated speaker slot, please contact us. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-5944039682465936570?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/5944039682465936570/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/05/vancouver-eclipse-demo-camp-2010.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/5944039682465936570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/5944039682465936570'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/05/vancouver-eclipse-demo-camp-2010.html' title='Vancouver Eclipse Demo Camp 2010'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-6260823371785709146</id><published>2010-04-12T20:14:00.001-07:00</published><updated>2010-06-30T20:36:41.436-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy-Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Helios'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Groovy-Eclipse for Helios</title><content type='html'>Today we released our first snapshot of a Groovy-Eclipse build for Eclipse 3.6 (Helios).  We haven't set the continuous build system up yet, so for now if you are looking to try it out, you can download the zip here:&lt;br /&gt;&lt;br /&gt;&lt;del&gt;http://dist.codehaus.org/groovy/distributions/greclipse/snapshot/e3.6/groovy-update-site-e36.zip&lt;/del&gt;&lt;br /&gt;&lt;br /&gt;And then point your p2 installer to the downloaded archive.  You will then be able to install Groovy-Eclipse.  We have only tested on 3.6 M6 and we will continue to ensure that it works on later milestones as they come out.&lt;br /&gt;&lt;br /&gt;As always, your feedback is appreciated!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;EDIT (June 30, 2010):&lt;/strong&gt; the zip above is outdated and so I removed it.  Please use the update site below instead:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;http://dist.codehaus.org/groovy/distributions/greclipse/snapshot/e3.6/&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-6260823371785709146?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/6260823371785709146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/04/groovy-eclipse-for-helios.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/6260823371785709146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/6260823371785709146'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/04/groovy-eclipse-for-helios.html' title='Groovy-Eclipse for Helios'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-8402542001433058503</id><published>2010-03-26T10:49:00.001-07:00</published><updated>2010-03-26T10:49:54.131-07:00</updated><title type='text'>AJDT-PDE builds Redux</title><content type='html'>AspectJ-aware PDE builds in AJDT have always been a bit of a kludge.  So, I'm happy to say that as of Eclipse 3.6 (Helios), things will be changing for the better and AJDT will rely on a different mechanism to perform PDE builds.&lt;br /&gt;&lt;br /&gt;PDE, or the Plugin Development Environment, is the tool set that helps developers build plugins for the Eclipse platform itself.  In Eclipse 3.5 and earlier, AJDT shipped with its own version of the PDE tools (AJDT-PDE) that were largely a copy of Eclipse's PDE, but with a few key changes so that a different compiler could be plugged in.  It is an understatement to say that this was inefficient.  The AJDT-PDE had to be re-created for each point release of Eclipse so that it could be re-based off of the new version of PDE.  This process was fallible and inevitably, some features of PDE were missing or broken in AJDT-PDE.&lt;br /&gt;&lt;br /&gt;I have been working with the PDE team to create a more sustainable solution to AspectJ-aware PDE builds.  From AJDT for Eclipse 3.6 and onwards, the AJDT-PDE will be removed. The AspectJ-aware export wizards will be deprecated and the &lt;code&gt;org.eclipse.ajdt.pde.build&lt;/code&gt; plugin will be redundant.  Instead, users can use the standard PDE build, with the following changes to the &lt;code&gt;build.properties&lt;/code&gt; file of your plugin project:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# required&lt;br /&gt;compilerAdapter=org.eclipse.ajdt.core.ant.AJDT_AjcCompilerAdapter&lt;br /&gt;sourceFileExtensions=*.java, *.aj&lt;br /&gt;&lt;br /&gt;# optional&lt;br /&gt;compilerArg=-aspectpath other.jar&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The first line specifies that the AspectJ compiler should be used instead of the Java compiler.  The second line specifies what file types should be considered source files.  And optionally, you can specify a number of command line arguments using the &lt;code&gt;compilerArg&lt;/code&gt; property.  Only AspectJ-specific arguments like &lt;code&gt;inpath&lt;/code&gt; and &lt;code&gt;aspectpath&lt;/code&gt; need to be specified here.  For all standard Java options, like &lt;code&gt;source&lt;/code&gt; and &lt;code&gt;target&lt;/code&gt; you can use the standard PDE-Java options &lt;code&gt;javacSource&lt;/code&gt; and &lt;code&gt;javacTarget&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;From here, you can use the standard PDE export wizards or PDE headless build scripts to build your project.  That's it.  There is now nothing special needed for AspectJ-aware PDE builds.  &lt;br /&gt;&lt;br /&gt;Furthermore, it is possible to create your own compiler adapter so that you can use your own custom compiler for your own JVM language (and avoid using javac).  You need to do the following:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Implement &lt;code&gt;org.apache.tools.ant.taskdefs.compilers.CompilerAdapter&lt;/code&gt; and delegate to the compiler of your choice&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Ensure that this new compiler adapter is on the ant classpath.  I recommend using a &lt;code&gt;org.eclipse.ant.core.extraClasspathEntries&lt;/code&gt; extension point so that your plugin automatically contributes the classpath to Eclipse's ant runtime.  But, you could also specify it in your global ant classpath properties page.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In your build.properties file, fill in the proper values for the compilerAdapter, the sourceFileExtensions, and the compilerArg properties.&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;That's really all there is to it.  For all the gory details on how this works see &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=303960"&gt;Bug 303960&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-8402542001433058503?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/8402542001433058503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/03/ajdt-pde-builds-redux.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/8402542001433058503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/8402542001433058503'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/03/ajdt-pde-builds-redux.html' title='AJDT-PDE builds Redux'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-6953491892401271016</id><published>2010-03-19T15:31:00.000-07:00</published><updated>2010-03-19T15:42:32.122-07:00</updated><title type='text'>Groovy-Eclipse 2.0.1 Released and see you at EclipseCon!</title><content type='html'>We are proud to release to announce the release of Groovy-Eclipse 2.0.1.  This release is primarily a service refresh of 2.0, but there are a couple of interesting new features including debug stack frame filtering and Eclipse 3.5.2 support.  You can read the &lt;a href="http://docs.codehaus.org/display/GROOVY/Groovy-Eclipse+2.0.1+New+and+Noteworthy"&gt;New and Noteworthy&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The update site for the release is here:&lt;pre&gt;  http://dist.springsource.org/release/GRECLIPSE/e3.5/&lt;/pre&gt;This is also a good time to promote my talk at &lt;a href="http://www.eclipsecon.org/2010/"&gt;EclipseCon&lt;/a&gt;.  I will be speaking about Groovy-Eclipse on Wednesday, March 24 at 2pm.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.eclipsecon.org/2010/sessions/?page=sessions&amp;id=1340"&gt;&lt;strong&gt;Getting Groovy with Eclipse: Next Generation Tool Support for Dynamic Languages&lt;/strong&gt;&lt;/a&gt;.  Come hear how Groovy-Eclipse has extended the JDT compiler to provide deep integration between Groovy and Java.  Also hear about how Groovy-Eclipse provides editing support for Groovy's dynamicism through type inferencing.&lt;br /&gt;&lt;br /&gt;See you at EclipseCon!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-6953491892401271016?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/6953491892401271016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/03/groovy-eclipse-201-released-and-see-you.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/6953491892401271016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/6953491892401271016'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/03/groovy-eclipse-201-released-and-see-you.html' title='Groovy-Eclipse 2.0.1 Released and see you at EclipseCon!'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-7626806531291384956</id><published>2010-03-17T20:19:00.000-07:00</published><updated>2010-03-17T20:33:47.084-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Helios'/><category scheme='http://www.blogger.com/atom/ns#' term='AJDT'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>AJDT for Helios now available</title><content type='html'>Just a quick note to let you know that AJDT targeting Helios (Eclipse 3.6) is now available from the following update site:&lt;br /&gt; &lt;pre&gt;  http://download.eclipse.org/tools/ajdt/36/dev/update&lt;/pre&gt;AspectJ-aware PDE export facilities are currently broken.  I am not planning on fixing it.  Instead, I have been working with the PDE team on an alternative solution.  See &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=303960"&gt;Ability to override javac task during pde builds (Bugzilla)&lt;/a&gt;.  I'll write more about this later, but the solution is much more elegant than what is currently available in AJDT for 3.5 and earlier.&lt;br /&gt;&lt;br /&gt;Also, as a bonus, this version includes intertype declaration (ITD) -aware Java search.  Finally, ITDs are completely first-class citizens in the workspace.  I'll write more about this later, too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-7626806531291384956?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/7626806531291384956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/03/ajdt-for-helios-now-available.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/7626806531291384956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/7626806531291384956'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/03/ajdt-for-helios-now-available.html' title='AJDT for Helios now available'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-5787699528310005741</id><published>2010-03-05T09:25:00.000-08:00</published><updated>2010-03-05T11:32:28.881-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AJDT AspectJ Roo Eclipse'/><title type='text'>Intertype Declaration support in Java projects</title><content type='html'>A user recently had a problem with &lt;a href="http://www.springsource.org/roo"&gt;Roo&lt;/a&gt; and &lt;a href="http://eclipse.org/aspectj"&gt;AspectJ.&lt;/a&gt;  This particular user had a Roo project being referenced by a regular Java project.  Roo is a rapid application development tool for Java.  It makes heavy use of AspectJ's &lt;a href="http://www.eclipse.org/aspectj/doc/next/progguide/language-interType.html"&gt;Intertype Declarations&lt;/a&gt; (ITDs).  So, all Roo projects re AspectJ projects.  And here is where the problem is.  When an AspectJ project makes use of ITDs, Java projects that reference it cannot reference the ITDs without errors.  Well actually, the Java projects compile and run correctly, but there are spurious error messages that appear in the editor, and ITDs do not appear in content assist.&lt;br /&gt;&lt;br /&gt;A simplified version of this problem is below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4409216516/" title="Fail"&gt;&lt;img src="http://farm3.static.flickr.com/2736/4409216516_6df0ebd44d_o.jpg" width="793" height="405" alt="fail" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here, there are two projects, an AspectJ project and a Java project.  The AspectJ project has an aspect that declares an ITD on a Java class.  This Java class and its ITD is then referenced in the Java project.  Even though the Java project compiles and runs correctly, an error appears in the editor.&lt;br /&gt;&lt;br /&gt;Thankfully, there is a simple fix to this.  Open up the &lt;tt&gt;.project&lt;/tt&gt; file for the Java project and add the following line to the n&lt;tt&gt;natures&lt;/tt&gt; element:&lt;br /&gt;&lt;pre&gt;  &amp;lt;nature&amp;gt;org.eclipse.ajdt.ui.ajnature&amp;lt;/nature&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;(Note: this line should be the first nature if you want the &lt;em&gt;AJ&lt;/em&gt; decorator to appear on the project icon.)&lt;br /&gt;&lt;br /&gt;What this does is tell AJDT that this project should be treated like an AspectJ project, but it does not change the compiler, so the Java compiler is still used.  The result is that ITDs are now correctly recognized in the editor:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4408448359/" title="Success"&gt;&lt;img src="http://farm5.static.flickr.com/4019/4408448359_be85721650_o.jpg" width="806" height="746" alt="success" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In the future, I'll probably add a quick fix or some other automated way of doing this in future releases of AJDT, but for now this manual process is a reasonable workaround.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-5787699528310005741?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/5787699528310005741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/03/intertype-declaration-support-in-java.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/5787699528310005741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/5787699528310005741'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/03/intertype-declaration-support-in-java.html' title='Intertype Declaration support in Java projects'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-2857553315594216408</id><published>2010-02-24T20:29:00.000-08:00</published><updated>2010-02-24T20:30:00.589-08:00</updated><title type='text'>Approaches to Extending JDT</title><content type='html'>As most of you who have already read my blog know, I write a lot about extending Eclipse's Java Development Tools (JDT) for use with Java-like languages such as AspectJ and Groovy.  The problem, as I've mentioned before, is that while the JDT is very good at providing tool support for Java in Eclipse, it provides no support for Java-like languages.  To date, I've taken two approaches to addressing this problem.  Now, there is a third approach, &lt;a href="http://www.eclipse.org/objectteams/"&gt;Object Teams&lt;/a&gt;, that has recently made a home at Eclipse.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;JDT Weaving&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;With &lt;a href="http://eclipse.org/ajdt"&gt;AJDT&lt;/a&gt;, the &lt;a href="http://eclipse.org/AspectJ"&gt;AspectJ&lt;/a&gt; development tools, I developed JDT Weaving.  This approach uses &lt;a href="http://www.eclipse.org/equinox/incubator/aspects/index.php"&gt;Equinox Weaving&lt;/a&gt; to weave into the JDT plugins.  Yes, we are eating our own dog food here and using AspectJ to implement AJDT.  But, this approach has worked well for AJDT since AJDT only requires a small number of well-defined hooks into JDT to get its tight integration.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Feature patches&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;For &lt;a href="http://groovy.codehaus.org/Eclipse+Plugin"&gt;Groovy-Eclipse&lt;/a&gt;, our tool support for the &lt;a href="http://groovy.codehaus.org/"&gt;Groovy language&lt;/a&gt;, the JDT Weaving approach was not feasible since we needed a larger number of hooks into JDT.  And the nature of these hooks made it difficult to use AspectJ to advise them.  So, instead we are using a &lt;a href="http://help.eclipse.org/galileo/index.jsp?topic=/org.eclipse.pde.doc.user/guide/tools/project_wizards/new_feature_patch.htm"&gt;feature patch&lt;/a&gt;.  This means that Groovy-Eclipse ships its own (slightly modified and heavily tested) version of the JDT core plugin.  This also means that Groovy-Eclipse needs to be re-released for each new version of JDT Core (however, this turns out not to be much of a problem since our release cycle is much shorter than JDT's).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Object Teams&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Now, Object Teams is a third approach, which I find very exciting (actually, this approach has been around for several years, but it has only recently moved to Eclipse.org).  Object Teams is itself an Aspect-Oriented extension to Java, with a component, &lt;a href="http://trac.objectteams.org/ot/wiki/OtEquinox"&gt;O/T Equinox&lt;/a&gt;, that provides integration with Eclipse's Equinox OSGi framework.  O/T Equinox has been further adapted to provide easy extensibility to JDT.  The O/T blog has a slick &lt;a href="http://blog.objectteams.org/2010/02/ide-for-your-own-language-embedded-in-java-part-1/"&gt;example&lt;/a&gt; of this approach.  I'm looking forward to exploring this approach more.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;So what?&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Although it's great that we have been able to get around JDT's shortcomings and there are multiple ways of doing this, but this proliferation of approaches is a little scary.  There is no guarantee that these approaches will play nicely with each other.  For a while, Eclipse installs with Groovy-Eclipse &lt;a href="http://jira.codehaus.org/browse/GRECLIPSE-404"&gt;would break the Scala plugin&lt;/a&gt; (the Scala plugin uses a variant of JDT weaving).  Although this problem has now been fixed, we need to be especially careful that a similar problem does not happen in the future.  Similarly, the Object Teams tool support and Groovy-Eclipse are incompatible because they both ship with feature patches for JDT Core.&lt;br /&gt;&lt;br /&gt;Of course, the best solution would be to push our changes into JDT Core itself, we have been &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=36939"&gt;unsuccessful as of yet&lt;/a&gt;.  Until then, we need open communication between all JDT hackers to make sure that we are working towards the same goal.&lt;br /&gt;&lt;br /&gt;If you're interested in learning more or have some ideas of your own, come have a chat with me at &lt;a href="http://www.eclipsecon.org/2010/"&gt;EclispeCon&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-2857553315594216408?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/2857553315594216408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/02/approaches-to-extending-jdt.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/2857553315594216408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/2857553315594216408'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2010/02/approaches-to-extending-jdt.html' title='Approaches to Extending JDT'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-5356065512075572741</id><published>2009-12-24T10:56:00.000-08:00</published><updated>2009-12-28T20:24:12.832-08:00</updated><title type='text'>Extending Groovy-Eclipse for use with Domain-Specific Languages</title><content type='html'>One of the great things about Groovy is how easy it is to use the language to create domain specific languages (DSLs).  And one of the great things about Eclipse is extensibility through its plugin architecture.  Within Groovy-Eclipse, we are using the second to leverage the first.  We have created a set of Eclipse extension points that allow Groovy programmers to create tool support for their own custom Groovy DSL.  In this post, I will walk you through the extension points we created and show you how we use them to implement Grails support in STS.&lt;br /&gt;&lt;br /&gt;We provide three extension points, one for adding new smarts to the inferencing engine: one for adding new content assist proposals, and one for adding new highlighting rules to the editor.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Extending Syntax Highlighting&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;The simplest way to extend Groovy-Eclipse is through the &lt;tt&gt;org.codehaus.groovy.eclipse.ui.syntaxHighlightingExtension&lt;/tt&gt; extension point.&lt;br /&gt;&lt;br /&gt;Here is what STS does to use the extension point:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;extension&lt;br /&gt;      point=&amp;quot;org.codehaus.groovy.eclipse.ui.syntaxHighlightingExtension&amp;quot;&amp;gt;&lt;br /&gt;   &amp;lt;highlightingExtender&lt;br /&gt;         extender=&amp;quot;com.springsource.sts.grails.editor.groovy.GrailsSyntaxHighlighting&amp;quot;&lt;br /&gt;         natureID=&amp;quot;com.springsource.sts.grails.core.nature&amp;quot;&amp;gt;&lt;br /&gt;   &amp;lt;/highlightingExtender&amp;gt;&lt;br /&gt;&amp;lt;/extension&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As you can see, an &lt;tt&gt;extender&lt;/tt&gt; class (&lt;tt&gt;com.springsource.sts.grails.editor.groovy.GrailsSyntaxHighlighting&lt;/tt&gt;) is associated with a project nature (&lt;tt&gt;com.springsource.sts.grails.core.nature&lt;/tt&gt;).  And now, whenever a Groovy Editor is opened for a Grails project, all of the syntax highlighting rules from the extender class is added to the Groovy Editor.  For Grails, the extension is simple:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;public class GrailsSyntaxHighlighting implements IHighlightingExtender {&lt;br /&gt;&lt;br /&gt;    public List&lt;String&gt; getAdditionalGJDKKeywords() {&lt;br /&gt;        return Arrays.asList(&lt;br /&gt;                // domain fields&lt;br /&gt;                "constraints", "belongsTo", "hasMany", "nullable", "belongsTo", "mapping",&lt;br /&gt;                "hasMany", "embedded", "transients", "id", "tablePerHierarchy", "version",&lt;br /&gt;                // domain methods&lt;br /&gt;                "list", "save", "delete", "get",&lt;br /&gt;                // controller fields&lt;br /&gt;                "log", "actionName", "actionUri", "controllerName", "controllerUri",&lt;br /&gt;                "flash", "log", "params", "request", "response", "session", &lt;br /&gt;                "servletContext",&lt;br /&gt;                // controller methods&lt;br /&gt;                "render", "redirect"&lt;br /&gt;                );&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public List&lt;IRule&gt; getAdditionalRules() {&lt;br /&gt;        return null;&lt;br /&gt;    }&lt;br /&gt;    public List&lt;String&gt; getAdditionalGroovyKeywords() {&lt;br /&gt;        return null;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;New GJDK keywords are added and nothing else.  Also, note that &lt;tt&gt;GrailsSyntaxHighlighting&lt;/tt&gt; implements &lt;tt&gt;IHighlightingExtender&lt;/tt&gt;.  And here is what the additional syntax highlighting can give you:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4210934661/" title="syntax_highlighting by werdnagreb, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4052/4210934661_1168f62a8f_o.gif" width="494" height="670" alt="syntax_highlighting" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Notice that the special Grails domain class fields such as belongsTo and mapping are highlighted, and below in the controller class, keywords like params and render are highlighted.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Extending the inferencing engine&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://contraptionsforprogramming.blogspot.com/2009/11/how-type-inferencing-for-groovy-in.html"&gt;Groovy-Eclipse inferencing engine&lt;/a&gt; is used to infer the types of expressions within a Groovy file.  Because of its dynamic nature, determining the types of all Groovy expressions in a file is undecidable.  The good news is that most programs are well-behaved and follow a simple set of rules through which we can infer the types of most expressions.  Meta-programming in Groovy can add new members to Groovy objects and classes.  This is a feature used by most Groovy DSLs.&lt;br /&gt;&lt;br /&gt;Groovy-Eclipse allows DSL programmers to specify the meta-programming through the &lt;tt&gt;org.eclipse.jdt.groovy.core.typeLookup&lt;/tt&gt; extension point.  Here is what the extension point looks like in the Grails tool support in STS:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;extension&lt;br /&gt;       point=&amp;quot;org.eclipse.jdt.groovy.core.typeLookup&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;lookup lookup=&amp;quot;com.springsource.sts.grails.editor.groovy.types.GrailsTypeLookup&amp;quot;&amp;gt;&lt;br /&gt;      &amp;lt;appliesTo projectNature=&amp;quot;com.springsource.sts.grails.core.nature&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;/lookup&amp;gt;&lt;br /&gt;&amp;lt;/extension&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here the class &lt;tt&gt;com.springsource.sts.grails.editor.groovy.types.GrailsTypeLookup&lt;/tt&gt; is defined to be a type lookup for projects that have the &lt;tt&gt;com.springsource.sts.grails.core.nature&lt;/tt&gt; (i.e., this lookup is only activated for Grails projects).&lt;br /&gt;&lt;br /&gt;Let's take a look at the &lt;tt&gt;GrailsTypeLookup&lt;/tt&gt; class:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;public class GrailsTypeLookup extends AbstractSimplifiedTypeLookup implements ITypeLookup {&lt;br /&gt;    &lt;br /&gt;    private IGrailsElement element;&lt;br /&gt;    private GrailsProject gp;&lt;br /&gt;&lt;br /&gt;    public void initialize(GroovyCompilationUnit unit,&lt;br /&gt;            VariableScope topLevelScope) {&lt;br /&gt;        gp = GrailsCore.get().getGrailsProjectFor(unit);&lt;br /&gt;        if (gp != null) {&lt;br /&gt;            element = gp.getGrailsElement(unit);&lt;br /&gt;            element.initializeTypeLookup(topLevelScope);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    protected TypeAndDeclaration lookupTypeAndDeclaration(&lt;br /&gt;            ClassNode declaringType, String name, VariableScope scope) {&lt;br /&gt;        IGrailsElement declaringElt = gp.getGrailsElement(declaringType);&lt;br /&gt;        return declaringElt.lookupTypeAndDeclaration(declaringType, name, scope);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;According to the extension point specification, &lt;tt&gt;GrailsTypeLookup&lt;/tt&gt; must extend &lt;tt&gt;ITypeLookup&lt;/tt&gt; and we choose to let it extend &lt;tt&gt;AbstractSimplifiedTypeLookup&lt;/tt&gt; in order to reduce the amount of coding required.&lt;br /&gt;&lt;br /&gt;The &lt;tt&gt;initialize&lt;/tt&gt; method is called when type inferencing is starting for a Groovy file.  Here, it is possible to stuff things into the top level scope (such as global variables). For Grails, we determine what kind of Grails element we are performing inference on (e.g., a domain class, controller class, taglib, etc) and modify the top level scope appropriately.&lt;br /&gt;&lt;br /&gt;More magic happens in the &lt;tt&gt;lookupTypeAndDeclaration&lt;/tt&gt; method.  Again, the type lookup delegates to the specific Grails element to determine what the type is.&lt;br /&gt;&lt;br /&gt;Now, let's take a look at what this can do for us.  Notice that hovering over Grails keywords will bring up a JavaDoc of the inferred type of that keyword:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4211699268/" title="hovers_in_controller by werdnagreb, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4046/4211699268_6bac7148d9_o.gif" width="359" height="67" alt="hovers_in_controller" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The Grails &lt;tt&gt;response&lt;/tt&gt; field in controller classes is of type &lt;tt&gt;HttpServletResponse&lt;/tt&gt;.  Similarly, this allows us to get &lt;tt&gt;HttpServletResponse&lt;/tt&gt; aware content assist proposals:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4211699338/" title="content_assist1 by werdnagreb, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2489/4211699338_11bf9928ff_o.gif" width="596" height="186" alt="content_assist1" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Extending Content Assist&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;The final step is to hook extensible content assist into the DSL.  This can be tricky.  For example, in Grails, there are certain fields that if defined have special meaning.  There is the &lt;tt&gt;constraints&lt;/tt&gt; field where constraints for domain classes are defined, and the &lt;tt&gt;mapping&lt;/tt&gt; field where object-relational mappings are defined.  The closure attached to each of these fields have special keywords that they expect.&lt;br /&gt;&lt;br /&gt;This is possible to control through the &lt;tt&gt;org.codehaus.groovy.eclipse.codeassist.completion.completionProposalProvider&lt;/tt&gt; extension point.  Here is how it is used in STS:&lt;br /&gt;&lt;pre&gt;&amp;lt;extension&lt;br /&gt;  point=&amp;quot;org.codehaus.groovy.eclipse.codeassist.completion.completionProposalProvider&amp;quot;&amp;gt;&lt;br /&gt;   &amp;lt;proposalProvider  &lt;br /&gt;    proposalProvider=&lt;br /&gt;      &amp;quot;com.springsource.sts.grails.editor.groovy.contentassist.GrailsProposalProvider&amp;quot;&amp;gt;&lt;br /&gt;      &amp;lt;appliesTo projectNature=&amp;quot;com.springsource.sts.grails.core.nature&amp;quot;/&amp;gt;&lt;br /&gt;   &amp;lt;/proposalProvider&amp;gt;&lt;br /&gt;&amp;lt;/extension&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This extension point wires a &lt;tt&gt;com.springsource.sts.grails.editor.groovy.contentassist.GrailsProposalProvider&lt;/tt&gt; to the Grails project nature.  And so (as with the other extension points), theis extra content logic will only occur when inside a Grails project.&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;com.springsource.sts.grails.editor.groovy.contentassist.GrailsProposalProvider&lt;/tt&gt; implements &lt;tt&gt;org.codehaus.groovy.eclipse.codeassist.processors.IProposalProvider&lt;/tt&gt;.  This interface has three methods to implement:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;&lt;tt&gt;getNewFieldProposals&lt;/tt&gt;: Return a list of fields that can be defined at the content assist location.  For example, here is where all special fields available in Grails domain classes are proposed.  This method is only called when content assist is invoked when inside a class body (i.e., only where it is appropriate to define new fields).&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;tt&gt;getNewMethodProposals&lt;/tt&gt;: Return a list of new methods that can be defined at the invocation location.  As with the new fields method, this method is only called when content assist is invoked in a location that is possible to define new methods.&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;tt&gt;getStatementAndExpressionProposals&lt;/tt&gt;: This method returns all possible special content assist proposals when in the context of an expression or statement.  For example, here is where special controller class fields like &lt;tt&gt;params&lt;/tt&gt;, &lt;tt&gt;request&lt;/tt&gt;, and &lt;tt&gt;response&lt;/tt&gt; are inserted.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Let's take a look at what this can do.  In this screenshot, you can see that when performing content assist on a reference to a Grails domain class, you can access Grails specific methods like &lt;tt&gt;count&lt;/tt&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4210934881/" title="extra_content_assist by werdnagreb, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2604/4210934881_ed5d6c4cd8_o.gif" width="351" height="173" alt="extra_content_assist" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And when inside the constraints block (and only when within that block) content assist is augmented with possible constraints to add:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4211699388/" title="content_assist_constraints by werdnagreb, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4059/4211699388_f47be3d87d_o.gif" width="539" height="218" alt="content_assist_constraints" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;We have worked hard to make sure that Groovy-Eclipse is extensible.  It is already being used by some DSLs such as &lt;a href="http://code.google.com/p/easyb/wiki/InstallingEclipsePlugin"&gt;EasyB&lt;/a&gt; and by &lt;a href="http://www.bonitasoft.com/"&gt;BonitaSoft&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;These extension points and APIs are still a work in progress if you have any questions, or require some changes to anything, please raise a &lt;a href="http://jira.codehaus.org/browse/GRECLIPSE"&gt;bug&lt;/a&gt; or send a message to the &lt;a href="http://xircles.codehaus.org/manage_email/eclipse-plugin-user@groovy.codehaus.org"&gt;mailing list&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-5356065512075572741?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/5356065512075572741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/12/extending-groovy-eclipse-for-use-with.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/5356065512075572741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/5356065512075572741'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/12/extending-groovy-eclipse-for-use-with.html' title='Extending Groovy-Eclipse for use with Domain-Specific Languages'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-3355499037140519251</id><published>2009-12-14T16:45:00.000-08:00</published><updated>2009-12-14T21:31:17.941-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy-Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='GMaven'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Maven'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Getting GMaven to play nicely with Groovy-Eclipse</title><content type='html'>There has been a lot of talk on the Groovy mailing list lately about how to get GMaven working with Groovy-Eclipse and coincidentally I saw my friend Mike last night who works at boats.com and he told me that his office has solved this problem.  Here is what he told me:&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;Okay, the first things you will need in your POM file are the GMaven mojo and the GMaven runtime. The dependencies for the mojo seem to be a big buggered out of the box, so you will have to tweak the  GMaven runtime dependencies. Here is how you do it:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;org.codehaus.groovy.maven&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;gmaven-mojo&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;  &amp;lt;exclusions&amp;gt;&lt;br /&gt;    &amp;lt;exclusion&amp;gt;&lt;br /&gt;      &amp;lt;groupId&amp;gt;org.codehaus.groovy&amp;lt;/groupId&amp;gt;&lt;br /&gt;      &amp;lt;artifactId&amp;gt;groovy-all-minimal&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;/exclusion&amp;gt;&lt;br /&gt;    &amp;lt;exclusion&amp;gt;&lt;br /&gt;      &amp;lt;groupId&amp;gt;org.codehaus.groovy.maven.runtime&amp;lt;/groupId&amp;gt;&lt;br /&gt;      &amp;lt;artifactId&amp;gt;gmaven-runtime-1.5&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;/exclusion&amp;gt;&lt;br /&gt;  &amp;lt;/exclusions&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;org.codehaus.groovy.maven.runtime&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;gmaven-runtime-1.6&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;/dependencies&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Next is your build configuration. Eclipse will need to be able to find your Groovy source files, so you will need to add your Groovy source as an explicit resource directory.&lt;br /&gt;&lt;br /&gt;The mvn:eclipse plugin will also need to add the Groovy nature to your project.&lt;br /&gt;&lt;br /&gt;You will also need to add directives for the GMaven plugin. This is where you will have to do a manual tweak: when using mvn to build your project, gmaven generates some stubs for your groovy code before the java code compiles, so that any java-&gt;groovy dependencies will be fulfilled. The Groovy code is then compiled and will overwrite the .class files from the previous step. This breaks things in eclipse, since if you attempt to execute code in your workbench, eclipse sees the stubs and somehow their .class files are what end up in your binary output directory.&lt;br /&gt;&lt;br /&gt;Therefore, if you want to execute a gmaven project from Eclipse, you simply need to comment out the stub generation directive and delete any generated stub classes.  This is what it looks like:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;build&amp;gt;&lt;br /&gt;  &amp;lt;resources&amp;gt;&lt;br /&gt;    &amp;lt;resource&amp;gt;&lt;br /&gt;      &amp;lt;directory&amp;gt;src/main/groovy&amp;lt;/directory&amp;gt;&lt;br /&gt;    &amp;lt;/resource&amp;gt;&lt;br /&gt;  &amp;lt;/resources&amp;gt;&lt;br /&gt;  &amp;lt;plugins&amp;gt;&lt;br /&gt;    &amp;lt;plugin&amp;gt;&lt;br /&gt;      &amp;lt;artifactId&amp;gt;maven-eclipse-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;      &amp;lt;configuration&amp;gt;&lt;br /&gt;        &amp;lt;additionalProjectnatures&amp;gt;&lt;br /&gt;          &amp;lt;projectnature&amp;gt;&lt;br /&gt;            org.eclipse.jdt.groovy.core.groovyNature&lt;br /&gt;             &amp;lt;/projectnature&amp;gt;&lt;br /&gt;        &amp;lt;/additionalProjectnatures&amp;gt;&lt;br /&gt;      &amp;lt;/configuration&amp;gt;&lt;br /&gt;    &amp;lt;/plugin&amp;gt;&lt;br /&gt;    &amp;lt;plugin&amp;gt;&lt;br /&gt;      &amp;lt;groupId&amp;gt;org.codehaus.groovy.maven&amp;lt;/groupId&amp;gt;&lt;br /&gt;      &amp;lt;artifactId&amp;gt;gmaven-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;      &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;      &amp;lt;executions&amp;gt;&lt;br /&gt;        &amp;lt;execution&amp;gt;&lt;br /&gt;          &amp;lt;goals&amp;gt;&lt;br /&gt;            &amp;lt;!--&lt;br /&gt;             &amp;lt;goal&amp;gt;generateStubs&amp;lt;/goal&amp;gt;&lt;br /&gt;             --&amp;gt;&lt;br /&gt;            &amp;lt;goal&amp;gt;compile&amp;lt;/goal&amp;gt;&lt;br /&gt;            &amp;lt;!--&lt;br /&gt;             &amp;lt;goal&amp;gt;generateTestStubs&amp;lt;/goal&amp;gt;&lt;br /&gt;             --&amp;gt;&lt;br /&gt;            &amp;lt;goal&amp;gt;testCompile&amp;lt;/goal&amp;gt;&lt;br /&gt;          &amp;lt;/goals&amp;gt;&lt;br /&gt;        &amp;lt;/execution&amp;gt;&lt;br /&gt;      &amp;lt;/executions&amp;gt;&lt;br /&gt;    &amp;lt;/plugin&amp;gt;&lt;br /&gt;  &amp;lt;/plugins&amp;gt;&lt;br /&gt;&amp;lt;/build&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The result is a groovy/java project that can be managed with maven but can be transparently developed (and more importantly, debugged!) in Eclipse.&lt;br /&gt;&lt;br /&gt;There is one minor issue that has come up however: GMaven 1.6 stub generation is broken for enums: it generates public constructors, which do not compile. I submitted an issue to codehaus (&lt;a href="http://jira.codehaus.org/browse/GMAVEN-51"&gt;GMAVEN-51&lt;/a&gt;), and apparently the workaround is to use the gmaven 1.7 runtime. I haven't tried it yet, since things are working okay for us thus far.&lt;br /&gt;&lt;br /&gt;Mike&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;So, it does seem like there is a bit of a problem with stubs being recognized by Groovy-Eclipse when they should not be.  The solution would be to generate the stubs in a directory that is not seen by Eclipse, rather than in the default output directory.  But not knowing much about GMaven (or Maven for that matter) works, I don't know how feasible this is. Can anyone think of a better solution?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-3355499037140519251?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/3355499037140519251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/12/getting-gmaven-to-play-nicely-with.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/3355499037140519251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/3355499037140519251'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/12/getting-gmaven-to-play-nicely-with.html' title='Getting GMaven to play nicely with Groovy-Eclipse'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-6598057338153251548</id><published>2009-11-27T09:01:00.000-08:00</published><updated>2009-11-27T09:57:06.716-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='refactoring'/><title type='text'>New cross-language refactoring support for Groovy-Eclipse plugin</title><content type='html'>Thanks to the work of Michael Klenk and his students at the &lt;a href="http://ifs.hsr.ch/"&gt;Institute for Software&lt;/a&gt; in Switzerland, the Groovy-Eclipse plugin now has cross-language refactoring support for renaming.  Its use is seamless.  Let me give you an example.&lt;br /&gt;&lt;br /&gt;Let's start with a simple Java file and a simple Groovy file:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4138843358/" title="before by werdnagreb, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2570/4138843358_d4b1aa039c_o.gif" width="480" height="518" alt="before" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can rename the field in the Java class:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4138843402/" title="during1 by werdnagreb, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2647/4138843402_412b48c499_o.gif" width="477" height="517" alt="during1" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This will perform the standard Java refactoring on all Java classes in your projects.  Additionally, the refactoring will be performed on your groovy classes.  If there are any ambiguous references to the Java field, the following dialog will open up allowing you to choose which references should be refactored:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4138843426/" title="choose by werdnagreb, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2547/4138843426_7fc5e4589e_o.gif" width="560" height="660" alt="choose" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And the result is what you would expect:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4138078423/" title="after by werdnagreb, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2723/4138078423_c0c2502a60_o.gif" width="475" height="516" alt="after" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The refactoring can be initiated from the Groovy side as well:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4138843500/" title="groovyrefactor_menu by werdnagreb, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2539/4138843500_c22509bf8d_o.gif" width="488" height="98" alt="groovyrefactor_menu" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As you can see, &lt;span style="font-style:italic;"&gt;extract method&lt;/span&gt; an &lt;span style="font-style:italic;"&gt;inline method&lt;/span&gt; are two other refactorings supported in Groovy code. &lt;br /&gt;&lt;br /&gt;This functionality is currently available in the latest snapshot build of Groovy-Eclipse for Eclipse 3.5, available from the following update site:&lt;br /&gt;&lt;pre&gt;   http://dist.codehaus.org/groovy/distributions/greclipse/snapshot/e3.5/&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Please send any questions or problems to t&lt;a href="http://xircles.codehaus.org/manage_email/eclipse-plugin-user@groovy.codehaus.org"&gt;he mailing list&lt;/a&gt;.  We're happy to help.  Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-6598057338153251548?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/6598057338153251548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/11/new-cross-language-refactoring-support.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/6598057338153251548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/6598057338153251548'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/11/new-cross-language-refactoring-support.html' title='New cross-language refactoring support for Groovy-Eclipse plugin'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-5371046026962224841</id><published>2009-11-19T08:30:00.000-08:00</published><updated>2009-11-19T08:35:26.837-08:00</updated><title type='text'>Getting AspectJ Pointcut matching timer information in AJDT</title><content type='html'>Andy Clement has just added &lt;a href="http://andrewclement.blogspot.com/2009/11/aspectj-profiling-pointcut-matching.html"&gt;pointcut match timing information to AspectJ&lt;/a&gt;.   A number of people have been asking to have this included in AJDT, and so I did a little work and made it available in the latest dev builds of AJDT for 3.4 and 3.5.&lt;br /&gt;&lt;br /&gt;Here's how to display timing information:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Select  &lt;em&gt;Verbose&lt;/em&gt; and &lt;em&gt;Pointcut matching timers&lt;/em&gt; from the AspectJ compiler preferences page (this can be either globally from Eclipse preferences or for a specific project from the project properties page):&lt;br/&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4117037827/" title="compiler_prefs by werdnagreb, on Flickr"&gt;&lt;img border="1" src="http://farm3.static.flickr.com/2708/4117037827_2f6e0b64ec_o.gif" width="585" height="231" alt="compiler prefs" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In the AJDT Event Trace View, ensure that you have &lt;em&gt;Compiler / Task list messages&lt;/em&gt; selected:&lt;br/&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4117037871/" title="event trace by werdnagreb, on Flickr"&gt;&lt;img border="1" src="http://farm3.static.flickr.com/2522/4117037871_42ab26bc45_o.png" width="665" height="373" alt="event trace" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;And now on every project build (incremental or full), you will see pointcut matching times spit out to the event trace:&lt;br/&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4117037945/" title="output by werdnagreb, on Flickr"&gt;&lt;img border="1" src="http://farm3.static.flickr.com/2552/4117037945_51e31b92ae_o.gif" width="1094" height="441" alt="output" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!  Questions can be sent to the &lt;a href="https://dev.eclipse.org/mailman/listinfo/ajdt-dev"&gt;AJDT developer's mailing list&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-5371046026962224841?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/5371046026962224841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/11/getting-aspectj-pointcut-matching-timer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/5371046026962224841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/5371046026962224841'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/11/getting-aspectj-pointcut-matching-timer.html' title='Getting AspectJ Pointcut matching timer information in AJDT'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-3491164495678211552</id><published>2009-11-16T12:59:00.000-08:00</published><updated>2009-11-16T15:46:00.786-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JDT'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>How type inferencing for Groovy in Eclipse is leading to all sorts of Groovy goodness</title><content type='html'>Of all of the recent improvements of Groovy-Eclipse since M1 has been released, the groovy type inferencing engine is the most pervasive and powerful.  This inferencing engine is able to take a groovy file or code snippet and infer the type of any or all of its expressions.  It now forms the core of several of the most prominent features of Groovy-Eclipse.  Everything that I describe here is currently available in the latest snapshot release of Groovy-Eclipse for Eclipse 3.5 and the update site is here:&lt;br /&gt;&lt;pre&gt;http://dist.codehaus.org/groovy/distributions/greclipse/snapshot/e3.5&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In this post, I am going to describe how the inferencing engine is currently used in Groovy-Eclipse and then I will dive a deep and describe how it is implemented.  I'll end the post by describing our plans for immediate the future.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;What type inferencing is used for&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Underlining statically indeterminate references&lt;/h3&gt;&lt;br /&gt;The Groovy editor now underlines all references that cannot be determined while editing.  This happens in a background thread while you type.  So, the following code (notice the mispelling of asImmutable):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def aList = []&lt;br /&gt;def otherList = aList.asImmutabl()&lt;br /&gt;otherList.asImmutable()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;...will appear in the editor like this...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4110470080/" title="underline by werdnagreb, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2620/4110470080_8a8cf6f7a7_o.gif" width="243" height="49" alt="underline" border="1"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;...and when the typo is fixed, the underlines go away...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4109706667/" title="nounderline by werdnagreb, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2695/4109706667_01c1e9bf1b_o.gif" width="268" height="46" alt="nounderline" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Code is re-analyzed after every keystroke (well, actually, it is after every keystroke that is followed by 500ms of no keystrokes).  The type of every reference in the file is looked up using the inferencing engine.  Every reference that cannot be found is considered to be unknown and will be underlined.&lt;br /&gt;&lt;br /&gt;Of course, Groovy being a dynamic language, not all references can be statically linked to a type (other than Object).  This is especially the case when working with DSLs (such as Grails) that use metaprogramming to add new methods and fields to existing types.  Later, I'll describe our plans for extensibility.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Search&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Inferencing is used for Java Search as well.  Using the search short cut (CTRL-Shift-G or CMD-Shift-G on Mac) or running search from the Java Search dialog, references from and to Groovy code snippets can be located.  However, there are some difficulties here.  Compared to Java, Groovy is quite a bit more flexible in the ways that fields and methods can be referenced.  For example, this field is assigned a closure and referenced as if it were a method:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Foo {&lt;br /&gt;  def x = { print it }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;x("Hello!")&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And this method is referenced in a way that is statically indistinguishable from a field:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Foo {&lt;br /&gt;  def x() {  print "Hello!" }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;x&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Furthermore, the spread operator and the use of default parameters makes the Java way of determining which method or field is referenced impossible.  So, Groovy search is significantly more liberal than Java search in what it considers a search match.  If a reference corresponds to any field, method, or property in the declaring type (regardless of parameter count and whether it is accessed as a field or method), then the match is considered successful.  This leads to the following scenarios.&lt;br /&gt;&lt;br /&gt;1. Performing search on the field declaration finds field references here:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4109706725/" title="searchForField by werdnagreb, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2527/4109706725_bfc2bc77e5_o.gif" width="273" height="279" alt="searchForField" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. Performing search on the method declaration finds exactly the same references:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4109706789/" title="searchForMethod by werdnagreb, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2715/4109706789_4c7a968d5e_o.gif" width="270" height="331" alt="searchForMethod" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And, notice that references attached to the wrong type are not considered a match.&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4110490950/" title="searchNoResults by werdnagreb, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2508/4110490950_837049e7e8_o.gif" width="227" height="280" alt="searchNoResults" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Content Assist&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Most of the internals of Groovy-Eclipse has been rewritten since the previous 1.5.7 release.  The most recent rewrite is of content assist.  Although the previous version worked (usually), there was always a noticeable lag while waiting for the content assist window to appear.  This previous implementation of content assist used a combination of Java classloading and Groovy AST matching in order to find all completion proposals available at a given location, which was both messy and slow.  Now, we have hooked into the inferencing engine and have completely rewritten proposal generation with extensibility in mind.  And we have made some remarkable improvements in performance.&lt;br /&gt;&lt;br /&gt;Using the following code snippet I performed content assist 5 times under the old implementation and the new and took the average of the last 3 of each:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def x&lt;br /&gt;x.hasProperty("foo").&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;Old implementation&lt;/td&gt;&lt;td&gt;2315 milliseconds&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;New implementation&lt;/td&gt;&lt;td&gt;8 milliseconds&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;That's right...there is a 3 orders of magnitude speed up under the new implementation, making content assist a much more pleasant feature to use.  But please note that this is just the time for calculation of the proposals and it does not include the time required to actually pop up the window.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Open declaration&lt;/h3&gt;&lt;br /&gt;The implementation of open declaration (or &lt;em&gt;code select&lt;/em&gt; as it is called in JDT because it is a general mechanism to determine what the current selection refers to and is also used for things like calculating hovers) also uses inferencing.  Pressing F3 whenever the selection is any form of "navigateToMe" in the following code, the expected declaration will open:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4110470268/" title="navigateBefore by werdnagreb, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2739/4110470268_6b06a89dbb_o.gif" width="253" height="140" alt="navigateBefore" /&gt;&lt;/a&gt;  ---&gt; &lt;a href="http://www.flickr.com/photos/werdnagreb/4110470320/" title="navigateAfter by werdnagreb, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2606/4110470320_b32544c6ff_o.gif" width="250" height="136" alt="navigateAfter" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Although Groovy-Eclipse M1 used type inferencing for code select, it was using the inferencing from content assist and was subject to the same mistakes, duplicate answers, and slowness that content assist had.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;How it works&lt;/h2&gt;&lt;br /&gt;The inferencing engine has unified the implementation of several of Groovy-Eclipse's most widely used features.  With this unification, we have been able to significantly reduce the amount of duplicated code, improve performance, and plan for extensibility.&lt;br /&gt;&lt;br /&gt;There are four interacting components of the inferencing engine:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;The Abstract Syntax Tree (or AST):&lt;/strong&gt; this is an abstract representation of the syntax of a groovy file expressed hierarchically.  The code to work on can be obtained either from the disk, or it can be the latest in memory.  The AST is generated by the Groovy compiler based on the current state of the editor whenever Eclipse is otherwise idle.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;The type inferencing visitor:&lt;/strong&gt; this visitor walks the AST (i.e., uses a visitor pattern to visit every AST node) and delegates to the type lookups and the requestor described below.  A new visitor is created for each call to the inferencing engine.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;The type lookups:&lt;/strong&gt; these objects lookup the type information of a particular expression using whatever mechanism they require.  They can store and retrieve information about types in a way that all other lookups can use.  In this way, each lookup can do what it can and coordinate with other lookups where required.  Several default lookups are provided including a simple lookup, an inferencing lookup (that stores information about types via assignment expressions), and a category lookup (that looks up types in Groovy categories).  Type lookups are created from a registry on each call to the inferencing engine.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;The requestor:&lt;/strong&gt; this is the object that collects the type information determined by the lookups.  The requestor is general and can be used as a way to store the types of all expressions, lookup the type of a particular expression, or look for expressions with unknown types (just to name a few uses).  The requestor is created by client code and past to the visitor to start the inferencing process.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;The following diagram shows process and how the different pieces work together:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/werdnagreb/4110469952/" title="arch by werdnagreb, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2530/4110469952_45fc615b3b_d.jpg" alt="arch" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;The visitor visits an AST expression node&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The visitor sends this expression to the type lookups.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt; each lookup responds with a type and its confidence in that type (ie, exact, potential, inferred...), or null, if it cannot find a type&lt;/li&gt;&lt;br /&gt;  &lt;li&gt; a lookup may additionally store information in a scope object that is passed around to other lookups so that information can be shared between them&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The result of the lookup is sent to the requestor&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The requestor processes the result and may choose to end the visit or continue.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;If required, the visitor will continue to visit the rest of the abstract syntax of the Groovy file&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;What's next&lt;/h2&gt;&lt;br /&gt;One of the core design goals of the inferencing engine is extensibility.  The inferencing engine must be extensible in two ways.  First, it must be usable to help support new features such as quick fixes and refactoring.  Also, DSLs, (most notably Grails) must be able to extend inferencing with their own type lookups. It should be apparent through the description of the variety of ways that the engine is currently used that it versatile and can become the core implementation of any number of new Groovy-Eclipse features.  As for DSL extensibility, that has not yet been implemented, but the stubs are available.  Other DSLs will need to implement their own type lookup, but there is currently no way for these new lookups to be plugged in.  Fortunately, it will be possible to use Eclipse's plugin architecture here and this will be the subject of my next blog post (after it gets implemented).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-3491164495678211552?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/3491164495678211552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/11/how-type-inferencing-for-groovy-in.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/3491164495678211552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/3491164495678211552'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/11/how-type-inferencing-for-groovy-in.html' title='How type inferencing for Groovy in Eclipse is leading to all sorts of Groovy goodness'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-7331342238811123115</id><published>2009-10-03T12:41:00.000-07:00</published><updated>2009-10-03T12:57:09.127-07:00</updated><title type='text'>AJDT 2.0.1 is released!</title><content type='html'>&lt;h2&gt;Overview&lt;/h2&gt;In this service release of AJDT, we have included a number of performance enhancements, as well as a few new features.  This is the last scheduled release of the AJDT stream targeting 3.4.  The next release, in early 2010, will be targeting the 3.5 stream only.  And our second 2010 release will target 3.5.  At the same time, we will also release an early development version of AJDT targeting Eclipse 3.6 in time for EclipseCon 2010.&lt;br /&gt;&lt;br /&gt;AJDT is available from the following update sites for Eclipse 3.5 and 3.4 respectively:&lt;br /&gt;&lt;pre&gt;http://download.eclipse.org/tools/ajdt/35/update&lt;br /&gt;http://download.eclipse.org/tools/ajdt/34/update&lt;/pre&gt;&lt;h2&gt;Export Feature With AspectJ&lt;/h2&gt;A new wizard is available to export features with AspectJ support.  This wizard can be initiated from the &lt;code&gt;File -&gt; Export...&lt;/code&gt; command:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.eclipse.org/ajdt/whatsnew201/img/export_feature.gif" border="1" /&gt;&lt;br /&gt; &lt;br /&gt;This wizard supports all of the options that the standard export feature supports.  The only difference is that the AspectJ compiler is used to compile the projects instead of the Java compiler:&lt;br /&gt;&lt;img src="http://www.eclipse.org/ajdt/whatsnew201/img/export_feature2.gif" border="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;AJDT support for passing aop.xml file&lt;/h2&gt;AJDT now provides UI support to pass aop.xml files to the compiler.  AspectJ &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124460"&gt;bug 124460&lt;/a&gt; describes how the AspectJ compiler can use aop.xml files for compile time weaving.  And now AJDT provides UI support in the following way.&lt;br /&gt;&lt;br /&gt;In project properties of your AspectJ project, select &lt;em&gt;aop.xml management&lt;/em&gt;.  Here you add and remove aop.xml files that will be sent to the compiler.  Note that these files are highlighted using a special icon.  Also, note that the name &lt;em&gt;aop.xml&lt;/em&gt; is optional.  Any xml file can be sent to the compiler in this way.  See the following screenshot for an example&lt;br /&gt; &lt;img src="http://www.eclipse.org/ajdt/whatsnew201/img/aop_xml.gif" border="1" /&gt;&lt;br /&gt; &lt;br /&gt;In order to use aop.xml files for compile-time configuring of the weaver, you must add the &lt;code&gt;-xmlConfigured&lt;/code&gt; option under &lt;em&gt;Non-Standard Compiler Options&lt;/em&gt; in the project's AspectJ Compiler options. This work is described in &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=287459"&gt;bug 287459&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This work is still experimental.  We hope to receive some feedback so that compile time XML configuration of the weaver can be improved.  Please send all comments to the&lt;a href="http://eclipse.org/aspectj/userlists.php"&gt;AspectJ mailing list&lt;/a&gt;, or to &lt;a href="https://bugs.eclipse.org/bugs/"&gt;bugzilla&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;AspectJ 1.6.6&lt;/h2&gt;AJDT 2.0.1 contains AspectJ 1.6.6 and this version is &lt;a href="http://eclipse.org/aspectj/downloads.php"&gt;available for download&lt;/a&gt; separately.  See the &lt;a href="http://eclipse.org/aspectj/doc/released/README-166.html"&gt;release notes here&lt;/a&gt;.&lt;br /&gt;&lt;h2&gt;Bug Fixes&lt;/h2&gt;Thirty-four bugs have been addressed in this release.  See &lt;a href="http://tinyurl.com/yazj5du"&gt;Bugzilla&lt;/a&gt; for the full report.&lt;br /&gt;&lt;h2&gt;Thanks!&lt;/h2&gt;Thanks to those of you who have submitted patches, bug reports, and contributed to the mailing list for this release. We appreciate your help.  Specifically, in this release:&lt;br /&gt; &lt;ul&gt;&lt;li&gt;Ivica Loncar on bugs &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=268667"&gt;268667&lt;/a&gt;, &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=282391"&gt;282391&lt;/a&gt;, &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=285825"&gt;285825&lt;/a&gt;, and &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=288020"&gt;288020&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Konstantin Titorenkoon on bug &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=285188"&gt;285188&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Previous Releases&lt;/h2&gt;See &lt;a href="http://www.eclipse.org/ajdt/whatsnew200/index.html"&gt;here&lt;/a&gt; for information on the new features in AJDT 2.0.0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-7331342238811123115?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/7331342238811123115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/10/ajdt-201-is-released.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/7331342238811123115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/7331342238811123115'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/10/ajdt-201-is-released.html' title='AJDT 2.0.1 is released!'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-2962352097201143497</id><published>2009-09-29T20:18:00.000-07:00</published><updated>2009-09-29T21:31:13.359-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='p2'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='Galileo'/><title type='text'>Groovy-Eclipse plugin now supports Eclipse 3.5.1</title><content type='html'>The Groovy-Eclipse plugin can now be installed into Eclipse 3.5.1.  As always, the update site is here:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;http://dist.codehaus.org/groovy/distributions/greclipse/snapshot/e3.5/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can stop reading here if you don't care how I got this to work, or why I am a little bit surprised by this.&lt;br /&gt;&lt;br /&gt;The Groovy-Eclipse plugin uses a feature patch on the JDT core bundle in order to achieve a high level of integration with JDT.  Typically, feature patches can only apply to a specific version of a feature (e.g., &lt;span style="font-family:courier new;"&gt;3.5.0.v20090527-2000-7r88FEeFJePyvYeA33DjZ_c1&lt;/span&gt; or some ugliness).  This means that Groovy-Eclipse, until recently could only install in a specific version of Eclipse, the one that ships the JDT feature version &lt;span style="font-family:courier new;"&gt;3.5.0.v20090527-2000-7r88FEeFJePyvYeA33DjZ_c1&lt;/span&gt;.  However, &lt;a href="http://aniefer.blogspot.com/2009/06/patching-features-part-2.html"&gt;Andrew Niefer&lt;/a&gt; describes how to get around this by editing the content.xml file to widen the range that the patch applies to.   Excellent stuff, and lucky for me, because I didn't want to branch the Groovy-Eclipse code base every time a new service release of Eclipse comes out.&lt;br /&gt;&lt;br /&gt;Unfortunately, his instructions were not entirely accurate.  Andrew mentions that the &lt;span style="font-family:courier new;"&gt;range&lt;/span&gt; attribute in the &lt;span style="font-family:courier new;"&gt;&amp;lt;patchscope&amp;gt;&lt;/span&gt; element needs to be widened in order allow the patch to be installable on multiple versions. I tried exactly what he suggested, but could not get my patch to install in both 3.5.0 and 3.5.1. After a little bit of exploration, I found that&lt;patchscope&gt; I also needed to change the &lt;span style="font-family:courier new;"&gt;range&lt;/span&gt; attribute in the &lt;span style="font-family:courier new;"&gt;&amp;lt;lifecycle&amp;gt;&lt;/span&gt; element.&lt;br /&gt;&lt;br /&gt;All this meant was adding a single line to my ant script, to be executed after the p2 repository is generated:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    &lt;br /&gt;    &amp;lt;replace file="${updateSiteDir}/content.xml" &lt;br /&gt;             summary="yes" token="${orig.jdt.feature.version.range}" &lt;br /&gt;             value="${new.jdt.feature.version.range}"/&amp;gt;&lt;/pre&gt;&lt;br /&gt;And this turned out to be very simple.  Thanks for the hint!&lt;br /&gt;&lt;br /&gt;&lt;/patchscope&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-2962352097201143497?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/2962352097201143497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/09/groovy-eclipse-plugin-now-supports.html#comment-form' title='26 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/2962352097201143497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/2962352097201143497'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/09/groovy-eclipse-plugin-now-supports.html' title='Groovy-Eclipse plugin now supports Eclipse 3.5.1'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>26</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-8025286511124718121</id><published>2009-06-25T13:23:00.000-07:00</published><updated>2009-06-25T13:37:20.033-07:00</updated><title type='text'>AJDT 2.0.0 is released!</title><content type='html'>We have just released AJDT 2.0.0 for Eclipse 3.5 and 3.4.&lt;br /&gt;&lt;br /&gt;Get it now from the update sites:&lt;br /&gt;For Eclipse 3.5: &lt;code&gt;http://download.eclipse.org/tools/ajdt/35/update&lt;/code&gt;&lt;br /&gt;For Eclipse 3.4: &lt;code&gt;http://download.eclipse.org/tools/ajdt/34/update&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;In addition to a new &lt;a href="http://contraptionsforprogramming.blogspot.com/2009/05/push-in-refactoring-for-ajdt.html"&gt;Push In refactoring&lt;/a&gt; and ITD-aware navigation and Javadocs, you can find out about what's included in this release at our &lt;a href="http://eclipse.org/ajdt/whatsnew200/"&gt;New &amp;amp; Noteworthy&lt;/a&gt; page.&lt;br /&gt;&lt;br /&gt;AJDT 2.0.0 will also be available in the upcoming &lt;a href="http://www.springsource.com/products/sts"&gt;SpringSource Tool Suite&lt;/a&gt; 2.1.0.&lt;br /&gt;&lt;br /&gt;This release would not have been possible with out help from the AspectJ and AJDT community.  So, thank you for your bug reports, patches, discussions and being warm and welcoming to newcomers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-8025286511124718121?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/8025286511124718121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/06/ajdt-200-is-released.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/8025286511124718121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/8025286511124718121'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/06/ajdt-200-is-released.html' title='AJDT 2.0.0 is released!'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-1075921488303432658</id><published>2009-06-03T22:02:00.000-07:00</published><updated>2009-06-03T22:07:10.178-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JDT'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Update on Greclipse 2.0 (Groovy support in Eclipse)</title><content type='html'>Today, I decided to run &lt;a href="http://www.eclemma.org/"&gt;EclEmma&lt;/a&gt; on the Groovy-&lt;a href="http://groovy.codehaus.org/Eclipse+Plugin"&gt;Eclipse plugin test&lt;/a&gt; suite.  Shockingly, I found that JUnit support, content assist, and code navigation are completely test-fress.  So, I took a stab at creating a solid and flexible test infrastructure that makes it easy to write plugin tests, especially ones that exercise the Java model.&lt;br /&gt;&lt;br /&gt;How did I do this?  I did it by hooking into existing JDT functionality, just like I have been doing for the rest of my work on Greclipse.  I downloaded the JDT core tests from CVS and used what I needed.  Now, I can write extremely concise tests that exercise the code I want it to.  For example, I wrote the following test case that tests code selection on a closure in a groovy script (i.e., this is the code that is executed when you perform &lt;em&gt;Open Declaration&lt;/em&gt; in an editor):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public void testCodeSelectClosure() throws Exception {&lt;br /&gt;     IPath projectPath = createGenericProject();&lt;br /&gt;     IPath root = projectPath.append("src");&lt;br /&gt;     String contents = &lt;br /&gt;          "def x = {\n"+&lt;br /&gt;               "t -&gt; print t\n"+&lt;br /&gt;          "}\n"+&lt;br /&gt;          "x('hello')\n";&lt;br /&gt;     env.addGroovyClass(root, "Script", contents);&lt;br /&gt;     GroovyCompilationUnit unit = getGroovyCompilationUnit(root, "Script.groovy");&lt;br /&gt;     IJavaElement[] elts = unit.codeSelect(contents.lastIndexOf('x'), 1);&lt;br /&gt;     assertEquals("Should have found a selection", 1, elts.length);&lt;br /&gt;     assertEquals("Should have found local variable 'x'", "x", elts[0].getElementName());&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I have written many tests for JUnit support (or is that GUnit?), and some for code selection.  I still need to work on content assist.  So, I can now be confident that as we make changes towards the 2.0 release, we are not sliding back in functionality.  There is a lot of good work that has already been put into the plugin (including groovy-aware type inference for content assist) and we need to make sure that this does not regress as we go forward.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-1075921488303432658?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/1075921488303432658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/06/update-on-greclipse-20-groovy-support.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/1075921488303432658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/1075921488303432658'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/06/update-on-greclipse-20-groovy-support.html' title='Update on Greclipse 2.0 (Groovy support in Eclipse)'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-6185095742834409240</id><published>2009-05-27T20:08:00.000-07:00</published><updated>2009-05-27T20:38:25.207-07:00</updated><title type='text'>Push in refactoring for AJDT</title><content type='html'>I just finished implementing the new &lt;b&gt;Push In&lt;/b&gt; refactoring for the AJDT plugin, available in the latest dev build.&lt;br /&gt;&lt;br /&gt;Essentially, the refactoring &lt;em&gt;pushes&lt;/em&gt; intertype declarations into their target types. So, when a push in refactoring is applied to the following aspect and class:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;aspect Foo {&lt;br /&gt;  int Bar.x;&lt;br /&gt;  declare parents : Bar implements I;&lt;br /&gt;  declare @type : Bar : @Baz;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class Bar { }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;the result is:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;@Baz&lt;br /&gt;  class Bar implements I {&lt;br /&gt;  int x;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The Foo aspect is deleted because it is empty.&lt;br /&gt;&lt;br /&gt;It is simple to use.  Select the ITDs or set of ITDs that you want to push in.  You can select an entire project, source folder, or package to push all of its ITDs into the target types:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2433/3572357728_15733c8838.jpg?v=0"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px; height: 300px;" src="http://farm3.static.flickr.com/2433/3572357728_15733c8838.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And then follow the wizard:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3313/3571552815_9284196d0c_o.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 803px; height: 480px;" src="http://farm4.static.flickr.com/3313/3571552815_9284196d0c_o.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;...and...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3379/3571552899_fb27fcaea6_o.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 707px; height: 680px;" src="http://farm4.static.flickr.com/3379/3571552899_fb27fcaea6_o.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The result is that all ITDs have been successfully pushed in and all aspects that are made empty because of this refactoring have been deleted.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2464/3571552755_bd1919c5da_o.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 311px; height: 388px;" src="http://farm3.static.flickr.com/2464/3571552755_bd1919c5da_o.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And undo works, too:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2437/3571552753_746e91f596_o.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 331px; height: 657px;" src="http://farm3.static.flickr.com/2437/3571552753_746e91f596_o.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It is also possible to execute the refactoring from an editor.  Just select all or part of the ITD you want to push in.  However, the command itself is in a different sub-menu:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3613/3572357668_fbf367a39f_o.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 688px; height: 99px;" src="http://farm4.static.flickr.com/3613/3572357668_fbf367a39f_o.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Please try it out and let me know if it works for you.  We are working on adding more refactorings to AJDT.  Next on the list is the analogous refactoring &lt;em&gt;pull-out&lt;/em&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-6185095742834409240?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/6185095742834409240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/05/push-in-refactoring-for-ajdt.html#comment-form' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/6185095742834409240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/6185095742834409240'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/05/push-in-refactoring-for-ajdt.html' title='Push in refactoring for AJDT'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-2064250655883915567</id><published>2009-05-17T05:43:00.000-07:00</published><updated>2009-05-17T05:57:04.510-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JDT'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Is it Groovy or is it Java?  Do we really care?</title><content type='html'>Well, I care, but the editor doesn't.  Following up on the work that &lt;a href="http://andrewclement.blogspot.com/"&gt;Andy Clement&lt;/a&gt;  has done to &lt;a href="http://andrewclement.blogspot.com/2009/05/modifying-eclipse-jdt-to-joint-compile.html"&gt;modify the JDT compiler&lt;/a&gt; so that it can process Groovy as well as Java, I've spent the last few weeks working on editor support for Groovy in Eclipse.  Yes, there is already an &lt;a href="http://groovy.codehaus.org/Eclipse+Plugin"&gt;Eclipse plugin for Groovy&lt;/a&gt;, but this particular plugin is tied to a split compiler (JDT for Java files and Groovy compiler for Groovy files).  And I wanted to see if we could use the joint compiler to drive Groovy tool support.&lt;br /&gt;&lt;br /&gt;So far, with minimal changes it seems that it is possible.  I've been able to implement much of the standard Java editing support for Groovy files (e.g., open declaration, search, syntax highlighting, content assist, etc) as long as the editor is passed the right kind of structure.&lt;br /&gt;&lt;br /&gt;Let's recap what Andy &lt;a href="http://andrewclement.blogspot.com/2009/05/modifying-eclipse-jdt-to-joint-compile.html"&gt;has done so far&lt;/a&gt;...&lt;br /&gt;&lt;blockquote&gt;After getting a little intro to groovy joint compilation (and groovy compiler structure) from Jochen Theodorou, I wondered how hard it would be to go about things slightly differently. Let the Eclipse JDT compiler take control of building a mixed code base but whenever it needed to deal with groovy - call the groovy compiler. If JDT could take control I could see all sorts of things 'just working' in Eclipse, problems upon which we are still expending large amounts of efforts to try and solve for AspectJ. If I could just plug groovy type reference resolution and classfile generation into JDT correctly then references between java and groovy artifacts would work and JDT would ensure incremental compilation worked, even across restarts of eclipse (this latter problem still hasn't been solved for AspectJ).&lt;br /&gt;&lt;/blockquote&gt;So originally, this worked great for joint compilation,  but as soon as you try to open this in an editor, things just don't behave correctly...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3628/3538895658_d7f8bfbd1c.jpg?v=0"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px; height: 265px;" src="http://farm4.static.flickr.com/3628/3538895658_d7f8bfbd1c.jpg?v=0" alt="" border="1" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The outline view is out of order, problems and errors don't show up where you expect them to, and source code navigation is broken.&lt;br /&gt;&lt;br /&gt;After a bit of mucking around, I found that there is a single root to this problem: source locations.  The JDT tooling and the editor is very specific about the source locations that it requires.  JDT requires the start and end locations of identifiers, method and type bodies, and all declarations. However, the Groovy compiler (which builds its AST from antlr), only provides line and column information for AST nodes.  Although it is possible to translate from line/column to file offset, offsets for identifiers are lost.&lt;br /&gt;&lt;br /&gt;And, with a little bit of hacking, I was able to recreate source offsets for field, method, and class names and declarations.  It turns out that this is enough to spring to like much of your favorite editor functionality:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2110/3538895648_ef5c90876c.jpg?v=0"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px; height: 258px;" src="http://farm3.static.flickr.com/2110/3538895648_ef5c90876c.jpg?v=0" alt="" border="1" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Same program, same error as before, but now the outline view is correct, the error marker is in the proper location,* "Open Declaration" and searches navigate to the proper location.   And even source hovers work:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2422/3538895640_94ec972aa1.jpg?v=0"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 271px; height: 120px;" src="http://farm3.static.flickr.com/2422/3538895640_94ec972aa1.jpg?v=0" alt="" border="1" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So, let's take a deeper look at how this works.&lt;br /&gt;&lt;br /&gt;The JDT uses three representations of abstract syntax of a Java file.  There is the compiler AST, which is used to generate byte code and perform analysis.  There is DOM (document object model) AST, which is used for refactoring and source code manipulation.  And, there is the model (the IJavaElement hierarchy), which is more abstract, and is used for navigation and in places like the Package Explorer and Outline views.&lt;br /&gt;&lt;br /&gt;There is also support to translate from the compiler AST to either of the other two ASTs.  Earlier, I described (or rather Andy described) the way JDT can be used to drive the joint compilation of Groovy source code.  The result is a JDT compiler AST with (crucially) the right source code offsets.  This, when translated to the right kind of AST at the right time, can be fed to the different parts of JDT that require it.  And, thereby, things just work.&lt;br /&gt;&lt;br /&gt;A few caveats, of course.  Right now, we are only generating a minimal compiler AST (class, method and field declarations only---method bodies are ignored for now).  This, however, does seem to be enough for this basic functionality.  Also, there are some major differences between Groovy and Java syntax (closures, regular expressions, and lists operations).  We are currently sidestepping this problem by ignoring method bodies, statements and expressions.&lt;br /&gt;&lt;br /&gt;At some point, however, we are going to have to tackle these loose ends.  We will need to be more complete about our ASTs and fill in method bodies (this part is *just* lots of coding).  And also, we will need to figure out how to translate Groovy-specific syntax into JDT AST, probably by sub-classing the existing API (this will require some thorough design work *and* lots of coding).  So, there is still a lot of work to be done.&lt;br /&gt;&lt;br /&gt;What does this mean? Well for one thing it means that the implementation of the Groovy editor is just this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public class GroovyEditor extends CompilationUnitEditor {&lt;br /&gt;  private GroovyImageDecorator decorator = new GroovyImageDecorator();&lt;br /&gt;  &lt;br /&gt;  @Override&lt;br /&gt;  public Image getTitleImage() {&lt;br /&gt;    return decorator.decorateImage(null, getEditorInput().getAdapter(IFile.class));&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Yes, it is just a minimal subclass of the standard CompilationUnitEditor that merely ensures that the icon in the title bar indicates Groovy, not Java.&lt;br /&gt;&lt;br /&gt;So, who cares if it's Groovy or Java?  Certainly not the editor.&lt;br /&gt;&lt;br /&gt;* There are currently Groovy compiler limitations with error reporting in that error locations only include the character or two of the error.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-2064250655883915567?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/2064250655883915567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/05/is-it-groovy-or-is-it-java-do-we-really.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/2064250655883915567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/2064250655883915567'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/05/is-it-groovy-or-is-it-java-do-we-really.html' title='Is it Groovy or is it Java?  Do we really care?'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-1812002264893471507</id><published>2009-03-17T09:53:00.000-07:00</published><updated>2009-03-17T10:23:03.205-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><category scheme='http://www.blogger.com/atom/ns#' term='AJDT'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Mylyn'/><category scheme='http://www.blogger.com/atom/ns#' term='EclipseCon'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>Aspects Everywhere: Using Equinox Aspects to Provide Language Developers with Deep Eclipse Integration...</title><content type='html'>...and other EclipseCon talks.&lt;br /&gt;&lt;br /&gt;To shamelessly self promote, I wanted to mention my EclispeCon talk entitled &lt;a href="http://www.eclipsecon.org/2009/sessions?id=648"&gt;&lt;span style="font-style: italic;"&gt;Aspects Everywhere: Using Equinox Aspects to Provide Language Developers with Deep Eclipse Integration&lt;/span&gt;&lt;/a&gt;.  It is about how we (the &lt;a href="http://eclipse.org/ajdt"&gt;AJDT&lt;/a&gt; team) have used AspectJ and Equinox Aspects to overcome the limitations of JDT and make it more extensible to third parties.&lt;br /&gt;&lt;br /&gt;You may want to check this out if:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You use AspectJ or AJDT&lt;/li&gt;&lt;li&gt;You are interested in using Equinox Aspects and want to find out how it can be used&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You are a language developer who wants to integrate tooling support into Eclipse and JDT&lt;/li&gt;&lt;/ul&gt;No knowledge of AspectJ is required for this talk.&lt;br /&gt;&lt;br /&gt;And if you are interested in anything Spring or AspectJ, please join us for our Bof: &lt;a href="https://www.eclipsecon.org/submissions/2009/view_talk.php?id=798"&gt;Spring on Eclipse: AspectJ, STS, and SpringIDE&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Some other talks that I am planning on attending are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a style="" href="http://www.eclipsecon.org/2009/sessions?id=280"&gt;What's New in Equinox Aspects&lt;/a&gt; (unfortunately, this one is running concurrently with my talk, but we're trying to change that)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.eclipsecon.org/2009/sessions?id=313"&gt;Mylyn: Redefining the “I” of the IDE&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.eclipsecon.org/2009/sessions?id=296"&gt;Scala Modules - Ease the OSGi development with a Scala DSL&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;There are so many excellent talks that it is difficult to choose what to go to.  It is going to be a great conference.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-1812002264893471507?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/1812002264893471507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/03/aspects-everywhere-using-equinox.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/1812002264893471507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/1812002264893471507'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/03/aspects-everywhere-using-equinox.html' title='Aspects Everywhere: Using Equinox Aspects to Provide Language Developers with Deep Eclipse Integration...'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-3028168861024408212</id><published>2009-03-02T13:47:00.000-08:00</published><updated>2009-03-02T14:06:57.852-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='AJDT'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>AJDT 1.7 pre-release for Eclipse 3.5</title><content type='html'>In time for &lt;a href="http://eclipsecon.org/2009"&gt;EclipseCon&lt;/a&gt;, we have made a pre-release of &lt;a href="http://eclipse.org/ajdt"&gt;AJDT&lt;/a&gt; 1.7 for Eclipse 3.5 available to install.  You can find it at the following update site:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;  http://download.eclipse.org/tools/ajdt/35/dev/update&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Currently, AJDT 1.7 is largely the same as AJDT 1.6, with the exception of the changes required so that it will run on Eclispe 3.5.  The two versions will continue to be developed in unison until well after the final release of AJDT 1.7, which will coincide with the Galileo release.&lt;br /&gt;&lt;br /&gt;Please report any issues you have here or on bugzilla.  Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-3028168861024408212?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/3028168861024408212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/03/ajdt-17-pre-release-for-eclipse-35.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/3028168861024408212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/3028168861024408212'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/03/ajdt-17-pre-release-for-eclipse-35.html' title='AJDT 1.7 pre-release for Eclipse 3.5'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-1522717493983808077</id><published>2009-02-18T20:07:00.000-08:00</published><updated>2009-02-19T08:14:07.444-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JDT'/><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='Equinox'/><category scheme='http://www.blogger.com/atom/ns#' term='AJDT'/><title type='text'>Extending JDT Part II</title><content type='html'>In &lt;a href="http://contraptionsforprogramming.blogspot.com/2009/02/extending-jdt-part-i.html"&gt;my previous post&lt;/a&gt;, I described how we have been able to use AspectJ to make JDT more friendly to other Java-like languages such as &lt;a href="http://eclipse.org/aspectj"&gt;AspectJ&lt;/a&gt; itself and &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;.  In this post, I am going to go into a little more detail as to how this happens.  This post will be brief because there's really not much more to it.&lt;br /&gt;&lt;br /&gt;(If you are unsure about what AspectJ and aspect-oriented programming are, there are plenty of places to learn about it.  For an excellent long introduction to AspectJ and aspect-oriented programming, see Ramnivas's &lt;a style="font-style: italic;" href="http://www.javaworld.com/javaworld/jw-01-2002/jw-0118-aspect.html"&gt;I want my AOP&lt;/a&gt;, and for an excellent two paragraph introduction to AspectJ see Adrian Colyer's &lt;a style="font-style: italic;" href="http://www.aspectprogrammer.org/blogs/adrian/2004/05/the_ted_neward.html"&gt;AOP without the buzzwords)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We've implemented the Eclipse weaving service on top of &lt;a href="http://www.eclipse.org/equinox/incubator/aspects/index.php"&gt;Equinox Aspects&lt;/a&gt; (EA).  Eclipse is highly dynamic and uses different classloaders for each plugin/bundle.  For this reason, regular compile-time and load-time weaving will not work. We need something that can hook into the Equinox OSGi framework and perform weaving as bundles are loaded into the framework.  This is exactly how EA works: EA provides a weaving hook that inspects each bundle as it is being loaded to determine if it requires any weaving.  If the bundle does, it is sent off to the AspectJ load-time weaver.  Actually, it is a little more fine-grained than this since classes are only sent to the weaver as they are loaded.&lt;br /&gt;&lt;br /&gt;The benefit of using EA is that it helps us stay robust through different Eclipse versions because we are not shipping woven code or feature patches.  Currently, the Eclipse weaving service is available for Eclipse 3.4, 3.4.1, 3.4.2, and (soon to be released) 3.5M5.&lt;br /&gt;&lt;br /&gt;&lt;div onload="prettyPrint()"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-1522717493983808077?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/1522717493983808077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/02/extending-jdt-part-ii.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/1522717493983808077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/1522717493983808077'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/02/extending-jdt-part-ii.html' title='Extending JDT Part II'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-4813216983427810101</id><published>2009-02-12T20:22:00.000-08:00</published><updated>2009-02-12T20:58:29.216-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JDT'/><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='Equinox'/><category scheme='http://www.blogger.com/atom/ns#' term='AJDT'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>Extending JDT Part I</title><content type='html'>In my last post, I described some limitations of JDT, and how it is Java-centric and does not support other Java-like languages such as AspectJ, Scala, and Groovy that compile to Java byte code.  In this post, I will show you how the AJDT project has made JDT more extensible by using AspectJ to weave into the Eclipse framework in a way that is elegant, generic, and Eclipse-friendly.&lt;br /&gt;&lt;br /&gt;I will start by describing a particular limitation of JDT: that Java-like languages are not able to plug in their own variants of the &lt;code&gt;ICompilationUnit&lt;/code&gt; class.  Then I will describe the how AJDT uses AspectJ and some factory methods to produce custom &lt;code&gt;ICompilationUnit&lt;/code&gt;s for AspectJ files. Finally, I will describe how we packaged up this functionality in an extension point so in a way that is generic and consumable by other development tools.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;ICompilationUnit&lt;/h2&gt;&lt;br /&gt;An &lt;code&gt;ICompilationUnit&lt;/code&gt; "represents an entire Java compilation unit", according to its &lt;a href="http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/ICompilationUnit.html"&gt;JavaDocs&lt;/a&gt;.  It is part of the IJavaElement hierarchy.  An &lt;a href="http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/ICompilationUnit.html"&gt;IJavaElement supplies&lt;/a&gt; a "common protocol for all elements provided by the Java model."  The last lines of both JavaDocs for these elements are crucial: "&lt;code&gt;@noimplement&lt;/code&gt; This interface is not intended to be implemented by clients."  &lt;code&gt;ICompilationUnit&lt;/code&gt;s are starting point for much of JDT's functionality, including refactoring, content assist, indexing, and eager parsing.&lt;br /&gt;&lt;br /&gt;This leaves us in a quandry: Java-like languages must plug into the Java model through creating custom &lt;code&gt;ICompilationUnit&lt;/code&gt;s if they are to be compatible with JDT, but &lt;code&gt;ICompilationUnit&lt;/code&gt; is not allowed to be sub-classed.&lt;br /&gt;&lt;br /&gt;Well, just because the JavaDoc &lt;em&gt;says&lt;/em&gt; &lt;code&gt;@noimplement&lt;/code&gt;, doesn't mean that we &lt;em&gt;can't&lt;/em&gt; implement.  It really just means that we do so at our own risk, and this is something that AJDT has been doing for years in the AJCompilationUnit class.  The problem is not the difficulty of implementing ICompilationUnit.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The Real Problem&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;The real problem is the lack of control over instantiation of ICompilationUnits.  ICompilationUnits are instantiated deep within the framework, in ways that are opaque to third party plugins.  What we really want is to have some kind of factory that provides the correct kind of ICompilationUnit for each file.  For our purpose, it is sufficient that *.aj files correspond to AJCompiltionUnit and *.java files correspond to CompilationUnit.&lt;br /&gt;&lt;br /&gt;This sounds like a job for AspectJ!  AspectJ allows us to intercept creations of CompilationUnit objects and determine if a different kind of object should be created instead.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The Solution&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;As a first pass, we wrote this code:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;pointcut compilationUnitCreations(PackageFragment parent, String name, WorkingCopyOwner owner) :&lt;br /&gt;       call(public CompilationUnit.new(PackageFragment, String, WorkingCopyOwner)) &amp;amp;&amp;amp;&lt;br /&gt;       within(org.eclipse.jdt..*) &amp;amp;&amp;amp;&lt;br /&gt;       args(parent, name, owner);&lt;br /&gt;&lt;br /&gt;CompilationUnit around(PackageFragment parent, String name, WorkingCopyOwner owner) :&lt;br /&gt;   compilationUnitCreations(parent, name, owner) {&lt;br /&gt;  &lt;br /&gt;   String extension = findExtension(name);&lt;br /&gt;   if (extension.equals(".aj") {&lt;br /&gt;       return new AJCompilationUnitProvider().create(parent, name, owner);&lt;br /&gt;   }       &lt;br /&gt;   return proceed(parent, name, owner);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Don't worry if you are unfamiliar with AspectJ, what this snippet does is fairly straight forward.  The &lt;code&gt;compilationUnitCreations&lt;/code&gt; pointcut identifies a set of points in the execution of the program.  In this case, &lt;code&gt;compilationUnitCreations&lt;/code&gt; identifies all locations where &lt;code&gt;CompilationUnit&lt;/code&gt; objects are constructed.  Beneath that, is an &lt;code&gt;around&lt;/code&gt; advice declaration.  It describes what to do at the pointcut instead of creating a &lt;code&gt;CompilationUnit&lt;/code&gt; object.  If the file extension is *.aj, then an &lt;code&gt;AJCompilationUnit&lt;/code&gt; object is created.  Otherwise, a standard &lt;code&gt;CompilationUnit&lt;/code&gt; is created.&lt;br /&gt;&lt;br /&gt;This is very nice.  Using this AspectJ code, the creation of &lt;code&gt;CompilationUnit&lt;/code&gt;s has been delegated to the aspect, which can now inject AspectJ elements into the Java model.  This opens up a world of functionality to AJDT that had been closed.  For example, with this simple aspect, the renaming, moving, organize imports, and other kinds of code clean up and refactorings just work.  No more ugly exceptions when you try to do these kinds of things.&lt;br /&gt;&lt;br /&gt;However, there are still a couple of considerations with this implementation:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;It is now our responsibility (i.e., AJDT's) to ensure that the pointcut matches through future versions.  For example, a later version of Eclipse may add an argument to the &lt;code&gt;CompilationUnit&lt;/code&gt; constructor.  AJDT needs to stay on top of this.  Not a problem.  Unit tests are your friends.  We have tests for each of our aspects that ensure they continue to provide the expected functionality as Eclipse evolves.  This is no different from the rest of our test suite which helps ensure that AJDT's use of internal Eclipse APIs doesn't break in new versions of Eclipse.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;This implementation works for AJDT, but what about other Java-like languages that require the same kind of JDT integration?  For this, we can utilize one of the Eclipse platform's strengths$mdash;its extensible plug-in architecture.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Our second (and current) implementation of this aspect is as follows:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;pointcut compilationUnitCreations(PackageFragment parent, String name, WorkingCopyOwner owner) : &lt;br /&gt;        call(public CompilationUnit.new(PackageFragment, String, WorkingCopyOwner)) &amp;&amp;&lt;br /&gt;        within(org.eclipse.jdt..*) &amp;&amp;&lt;br /&gt;        args(parent, name, owner);&lt;br /&gt;&lt;br /&gt;CompilationUnit around(PackageFragment parent, String name, WorkingCopyOwner owner) : &lt;br /&gt;    compilationUnitCreations(parent, name, owner) {&lt;br /&gt;    &lt;br /&gt;    if (inWeavableProject(parent)) {&lt;br /&gt;        String extension = findExtension(name);&lt;br /&gt;        ICompilationUnitProvider provider = &lt;br /&gt;                CompilationUnitProviderRegistry.getInstance().getProvider(extension);&lt;br /&gt;        if (provider != null) {&lt;br /&gt;            try {&lt;br /&gt;                return provider.create(parent, name, owner);&lt;br /&gt;            } catch (Throwable t) {&lt;br /&gt;                JDTWeavingPlugin.logException(t);&lt;br /&gt;            }&lt;br /&gt;    }        &lt;br /&gt;    return proceed(parent, name, owner);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The AspectJ part of the snippet is the same as before.  The difference is in the advice body.  Instead of calling the &lt;code&gt;AJCompilationUnitProvider&lt;/code&gt; factory method directly, there is a call to the &lt;code&gt;CompilationUnitProviderRegistry&lt;/code&gt;, which has a mapping from file extensions to &lt;code&gt;ICompilationUnitProvider&lt;/code&gt;s.  A plugin can register its own &lt;code&gt;ICompilationUnitProvider&lt;/code&gt; by using the &lt;code&gt;org.eclipse.contribution.weaving.jdt.cuprovider&lt;/code&gt; extension point.  It looks like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3440/3276074854_807c70a2fc_o_d.gif"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 676px; height: 152px;" src="http://farm4.static.flickr.com/3440/3276074854_807c70a2fc_o_d.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;One benefit of this implementation is that it extends JDT behavior in a way that uses common Eclipse mechanisms—the extension point.  This allows other plug-ins to extend in a well-defined and structured manner.  This is the approach that the &lt;a href="http://www.scala-lang.org/node/94"&gt;Scala development tools&lt;/a&gt; has chosen to follow, and other language development tools are on the way.&lt;br /&gt;&lt;br /&gt;A second of the benefit of this approach is that the consumer of the &lt;code&gt;org.eclipse.contribution.weaving.jdt.cuprovider&lt;/code&gt; extension point does not need to be aware of the underlying aspect-oriented implementation.  From the consumer's point of view, this extension point can be extended just like any other extension point.  No understanding of AspectJ or AOP is required to actually use this extension point.&lt;br /&gt;&lt;br /&gt;This is how it is possible to make JDT extensible to other languages in a simple and structured way.  However, experienced AspectJ programmers may be confused at this point.  Eclipse is built on an OSGi framework.  Compile time weaving is not possible because JDT is already installed on a user's machine by the time AJDT is installed.  And load time weaving is not possible because it cannot handle an OSGi environment.  In a future post, I will describe the Eclipse Weaving Service, which is built on top of Equinox Aspects, that allows plugins to weave into Eclipse.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-4813216983427810101?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/4813216983427810101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/02/extending-jdt-part-i.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/4813216983427810101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/4813216983427810101'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/02/extending-jdt-part-i.html' title='Extending JDT Part I'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-6100317342991079691</id><published>2009-02-04T21:22:00.000-08:00</published><updated>2009-02-04T21:38:42.917-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JDT'/><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='AJDT'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>JDT won't do that!</title><content type='html'>AspectJ is a language that is very close to Java, but it isn't Java. One might expect that since AspectJ is an extension of Java, Eclipse tooling for AspectJ would just be an extension of the Java Development Tools.  But it's not that easy.  This post describes the problems that we have faced when integrating AspectJ tooling into Eclipse, and motivates a solution that I will elaborate on in future posts.&lt;br /&gt;&lt;br /&gt;JDT has not been engineered to be extensible, and rightly so.  It is a set of tools that are finely tuned towards making the Java development experience as smooth and convenient as possible.  Focusing on extensibility would be to the detriment of the JDT users who program in Java only.&lt;br /&gt;&lt;br /&gt;However, this makes life difficult for us tool developers.  Users expect high quality tooling for Java-like languages (i.e., languages that run on the JVM) because that is the bar set by JDT.  Furthermore, they want tooling that integrates seamlessly with Java tooling.  But, JDT won't do that!  So, how can we provide good programmer experience in AJDT?&lt;br /&gt;&lt;br /&gt;We want to make editing AspectJ look and feel as much like editing Java where it makes sense, and at the same time provide additional functionality so that the user is aware of AspectJ-specific issues.  Up until AJDT 1.6.2, there have been limited options to integrate with JDT.&lt;br /&gt;&lt;br /&gt;One example of successful integration is the AspectJEditor, which behaves mostly like JDT's CompilationUnitEditor, providing eager error detection, syntax highlighting, content assist, some refactoring support, etc.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3303/3255153102_7d05cdf82f_o.gif"&gt;&lt;img src="http://farm4.static.flickr.com/3303/3255153102_7d05cdf82f_o.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The AspectJEditor &lt;i&gt;should&lt;/i&gt; be a subclass of the CompilationUnitEditor,  But the CompilationUnitEditor is not public API and AJDT really &lt;i&gt;shouldn't&lt;/i&gt; be touching it.  Or, at least, the responsibility is on us to maintain compatibility in future versions.  In addition to using private APIs, the AspectJEditor uses some reflection to access private fields of its super class and copies some code, where reflection isn't practical.  Through this combination of techniques, we have been able to largely implement JDT's behavior in AJDT.  But, there is some functionality that we want AJDT to provide, but is not possible using private APIs, reflection, or code copying.&lt;br /&gt;&lt;br /&gt;Let's take a look at the Open Type Dialog.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3434/3254323801_334ce88394.jpg?v=0"&gt;&lt;img src="http://farm4.static.flickr.com/3434/3254323801_334ce88394.jpg?v=0" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;We would really like to see our aspect types in the standard Java Open Type Dialog.    But this is unfortunately not possible.  There is no API (public or private) that we can use to do this.  Even the use of reflection or code copying will not help.  What we really need is to gain access to JDT's Java indexer and somehow convince it to index aspect files.&lt;br /&gt;&lt;br /&gt;This is a &lt;b&gt;big&lt;/b&gt; problem, and one that we have run into many times during our development of AJDT.  JDT is not engineered to be compatible with Java-like languages.  But, tools for languages such as &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;, &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;, and &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt; are gaining in popularity and require the same kind of JDT integration that is just not available.  There is a long standing &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=36939"&gt;JDT bug&lt;/a&gt; to address this, but it does not seem like it will be fixed any time soon.&lt;br /&gt;&lt;br /&gt;However, there is a solution!  Since AJDT 1.6.2, we have been able to provide deep integration with JDT by using AspectJ on JDT itself.  We are using Equinox Aspects to weave into the platform and expose functionality in a structured way through the use of Eclipse extension points.  In future posts, I will describe how we have designed our JDT weaving service to expose otherwise inaccessible functionality in JDT and how this weaving service is generic enough to be used by tool developers for other languages.&lt;br /&gt;&lt;br /&gt;You can also hear more about this at my EclipseCon talk: &lt;a href="http://www.eclipsecon.org/2009/sessions?id=648"&gt;Aspects Everywhere: Using Equinox Aspects to Provide Language Developers with Deep Eclipse Integration&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-6100317342991079691?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/6100317342991079691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/02/jdt-wont-do-that.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/6100317342991079691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/6100317342991079691'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/02/jdt-wont-do-that.html' title='JDT won&apos;t do that!'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6917071644715743308.post-5382398399783958235</id><published>2009-02-03T09:17:00.000-08:00</published><updated>2009-02-03T09:35:01.270-08:00</updated><title type='text'>Contraptions for programming</title><content type='html'>Hello Planet Eclipse!&lt;br /&gt;&lt;br /&gt;I wanted to introduce my new blog, where I will be talking about the &lt;a href="http://eclipse.org/ajdt"&gt;AJDT&lt;/a&gt; and &lt;a href="http://eclipse.org/aspectj"&gt;AspectJ&lt;/a&gt; projects, aspect-oriented programming, OSGi, and all the nifty tools we are making so that these technologies can work better together.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6917071644715743308-5382398399783958235?l=contraptionsforprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://contraptionsforprogramming.blogspot.com/feeds/5382398399783958235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/02/contraptions-for-programming.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/5382398399783958235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6917071644715743308/posts/default/5382398399783958235'/><link rel='alternate' type='text/html' href='http://contraptionsforprogramming.blogspot.com/2009/02/contraptions-for-programming.html' title='Contraptions for programming'/><author><name>Andrew Eisenberg</name><uri>http://www.blogger.com/profile/07897697507691706588</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_V6EKdLYBFpg/S3R7wBUcokI/AAAAAAAAABM/8y7AlwE3Lp4/S220/beeker.jpg'/></author><thr:total>3</thr:total></entry></feed>
