<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Kaptain on ... stuff</title>
	<atom:link href="http://www.kellyrob99.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kellyrob99.com/blog</link>
	<description>Tales of development, life and the folly that goes along with both</description>
	<lastBuildDate>Mon, 01 Mar 2010 05:42:34 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Developing Faster with the Atlassian IntelliJ Connector</title>
		<link>http://www.kellyrob99.com/blog/2010/02/21/developing-faster-with-the-atlassian-intellij-connector/</link>
		<comments>http://www.kellyrob99.com/blog/2010/02/21/developing-faster-with-the-atlassian-intellij-connector/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 19:53:38 +0000</pubDate>
		<dc:creator>TheKaptain</dc:creator>
				<category><![CDATA[Cool Toys]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Atlassian]]></category>
		<category><![CDATA[Atlassian IntelliJ Connector]]></category>
		<category><![CDATA[Bamboo]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Fisheye]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Integrated development environment]]></category>
		<category><![CDATA[JBoss Seam]]></category>
		<category><![CDATA[Jira]]></category>
		<category><![CDATA[Jira Studio]]></category>
		<category><![CDATA[kellyrob99]]></category>
		<category><![CDATA[theKaptain]]></category>

		<guid isPermaLink="false">http://www.kellyrob99.com/blog/?p=1051</guid>
		<description><![CDATA[Once upon a time I used Eclipse as a development environment. It had a lot of things going for it: free(as in beer), rich community involvement, a plethora of plugins and probably my favorite feature: Mylyn. The problem was that it seemed everytime I wanted to upgrade to a newer version, inevitably half of the [...]


Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2010/01/02/atlassian-here-be-dragons/' rel='bookmark' title='Permanent Link: Atlassian: Here Be Dragons'>Atlassian: Here Be Dragons</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/08/14/griffon-support-in-latest-intellij-eap/' rel='bookmark' title='Permanent Link: Griffon support in latest Intellij EAP'>Griffon support in latest Intellij EAP</a></li>
<li><a href='http://www.kellyrob99.com/blog/2010/01/07/bamboo-grails-and-git-for-continuous-integration/' rel='bookmark' title='Permanent Link: Bamboo, Grails and Git for Continuous Integration'>Bamboo, Grails and Git for Continuous Integration</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Once upon a time I used <a class="zem_slink" href="http://www.eclipse.org/" title="Eclipse (software)" rel="homepage">Eclipse</a> as a development environment. It had a lot of things going for it: free(as in beer), rich community involvement, a plethora of plugins and probably my favorite feature: <a href="http://www.eclipse.org/mylyn/">Mylyn</a>. The problem was that it seemed everytime I wanted to upgrade to a newer version, inevitably half of the integrations broke.   Please don&#8217;t get me wrong, Eclipse is AMAZING software and I do still use it occasionally for specific tasks &#8211; but nevertheless I now spend most of my day in <a class="zem_slink" href="http://www.jetbrains.com/idea/" title="IntelliJ IDEA" rel="homepage">IntelliJ</a>. In particular it had better support for Groovy/Grails development and Maven integration &#8211; both of which were essential to my everyday work. Throw in default included support for <a class="zem_slink" href="http://www.seamframework.org" title="JBoss Seam" rel="homepage">JBoss Seam</a>, JSF/Facelets, html and css and I didn&#8217;t really need a lot of plugins anymore. One of the ones I have been using, and that I&#8217;ve watched mature over the course of the last year, is the <a href="http://www.atlassian.com/software/ideconnector/intellij.jsp">Atlassian IntelliJ Connector</a>. Between it and the greatly improved changeset functionality I finally feel like I have a solid replacement for Mylyn&#8217;s excellent task management facilities.</p>
<p>This plugin integrates the IDE with one or more components of the <a class="zem_slink" href="http://www.atlassian.com/" title="Atlassian" rel="homepage">Atlassian</a> application suite. Multiple instances of <a class="zem_slink" href="http://atlassian.com/software/jira" title="JIRA (software)" rel="homepage">Jira</a>, <a class="zem_slink" href="http://www.atlassian.com/software/fisheye" title="FishEye (software)" rel="homepage">Fisheye</a>, <a class="zem_slink" href="http://www.atlassian.com/software/bamboo" title="Bamboo (software)" rel="homepage">Bamboo</a> and <a href="http://www.atlassian.com/software/crucible/">Crucible</a> can all be configured and used to streamline the development workflow.</p>
<p></p>
<h2>Jira</h2>
<p>This is perhaps the most essential piece of the puzzle, and inevitably the part a developer is going to interact with the most &#8211; the issue tracker. From within the IDE Jira master view you can load filters(basically stored searches for issues), do ad hoc searches and start work on a particular issue. If you drill down to a particular issue you can comment on it, assign it to yourself or another user, log work against it and generally manage it in most of the ways you can from the Jira web interface. Granted it&#8217;s not quite as pretty as the web interface, but the essential information and interaction is all there, and if you&#8217;re missing something an action is provided to open any issue in a web browser.</p>
<p>What really works for me is how the interaction supports my general workflow so closely:</p>
<div style="padding-left: 10px;">
<ul>
<li>Look in Jira for an issue to work on</li>
<li>Assign it to myself(if it&#8217;s not already)</li>
<li>Start progress on the issue, which starts a timer and creates a corresponding changeset</li>
<li>Do whatever development work that is required to satisfy the issue, pausing and resuming as necessary for<br />
            the duration of the task
        </li>
<li>Commit the changeset, optionally logging time against the issue and creating a Crucible review for later
        </li>
<li>Rinse and repeat</li>
</ul>
</div>
<p>Granted, I&#8217;m not the best at remembering to pause the timer, but being confronted with the time when I commit forces me to honestly evaluate how much time it took to complete the task when it&#8217;s clearest in my mind. And incidentally, while we&#8217;re here, the option to automatically organize imports in the commit dialog, a built in IDE function, has saved my butt from maven dependency-analyze any number of times.</p>
<p>It&#8217;s also convenient that you can see all comments and attachments for issues &#8211; viewing a screenshot describing a UI issue is pretty much essential after all, don&#8217;t you think?<br />

<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/jiraissuedetailview.png" title="Jira detail view for an issue, including access to commentary and attachments." class="shutterset_singlepic53" >
	<img class="ngg-singlepic" src="http://www.kellyrob99.com/blog/wp-content/gallery/cache/53__x_jiraissuedetailview.png" alt="jiraissuedetailview" title="jiraissuedetailview" />
</a>
</p>
<h2>Bamboo</h2>
<p>So once your code is committed, a build is kicked off on Bamboo. Hopefully all goes well, but if any build you&#8217;re listening to fails the IDE will give you a message to that effect. You also have access to changes, tests and any associated build logs. And whether or not your build does fail, stacktraces from the log are immediately available and clickable in the IDE. In addition, you can manually trigger builds and label or comment them.<br />

<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/bamboologview.png" title="Linking Bamboo logs to code in the IDE." class="shutterset_singlepic46" >
	<img class="ngg-singlepic" src="http://www.kellyrob99.com/blog/wp-content/gallery/cache/46__x_bamboologview.png" alt="bamboologview" title="bamboologview" />
</a>
</p>
<h2>Fisheye</h2>
<p>Integration with Fisheye is bi-directional between the IDE and the Fisheye webview. Context menus are available on right clicks in the IDE that open a file in Fisheye. And in the Fisheye web app clicking an IntelliJ icon will open a file in the IDE. It should be noted that this feature only appears to be available with Fisheye 2. I know because I&#8217;ve been missing it in Jira Studio, which still uses the 1.6 version of Fisheye.<br />

<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/fisheyealtf1menu.png" title="Alt-F1 context menu for a file linked to Fisheye." class="shutterset_singlepic50" >
	<img class="ngg-singlepic" src="http://www.kellyrob99.com/blog/wp-content/gallery/cache/50__x_fisheyealtf1menu.png" alt="fisheyealtf1menu" title="fisheyealtf1menu" />
</a>
<br />

<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/fisheyerightclickmenu.png" title="Right click context menu for a file linked to Fisheye." class="shutterset_singlepic52" >
	<img class="ngg-singlepic" src="http://www.kellyrob99.com/blog/wp-content/gallery/cache/52__x_fisheyerightclickmenu.png" alt="fisheyerightclickmenu" title="fisheyerightclickmenu" />
</a>
</p>
<h2>Crucible</h2>
<p>This is the one integration I&#8217;ve used the least so far, primarily because I don&#8217;t have Crucible installed locally for testing and again it seems a lot of the power of the integration is only available with version 2. The documentation certainly seems to suggest more rich functionality than I&#8217;ve found available anyhow. Fisheye and Crucible are actually bundled together for installation, so the Jira Studio version appears also restricted to the 1.6 version &#8211; for the time being at least. Mostly the Crucible integration is convenient because it provides messaging when reviews are assigned or commented.</p>
<p></p>
<h2>Documentation</h2>
<p>To be perfectly honest, I didn&#8217;t even look for these until writing this blog post. Configuring and using the plugin is very straightforward, provided you&#8217;re familiar with using these Atlassian tools at least. Nevertheless, I did discover a few additional bonuses and as usual <a href="http://confluence.atlassian.com/display/IDEPLUGIN/Atlassian+Connector+for+IntelliJ+IDEA">the docs are both complete and up to date</a>.</p>
<p></p>
<h2>Overall</h2>
<p>Really the point of using this plugin is to significantly reduce context switching; as much as possible your work is concentrated in one interface, and for the vast majority of cases you only need one piece of software running to get the job done. Where context switching is inevitable, this software tries to make it as &#8220;one-click&#8221; as possible. The end result is to put the power of your Atlassian products front and center in the IDE, where us developer types spend most of our working lives. Now, if only Jira Studio gets updated to the latest available software versions, because I&#8217;m dying to try out side-by-side diffs for Crucible reviews in IntelliJ!</p>
<p>Anyhow, if you use Atlassian tools the Connector is well worth checking out. And you Eclipse users aren&#8217;t left in the dark either. I can&#8217;t vouch for it&#8217;s quality, but there is an equivalent plugin for Eclipse available as well. </p>

<div class="ngg-galleryoverview" id="ngg-gallery-10-1051">


	<!-- Piclense link -->
	<div class="piclenselink">
		<a class="piclenselink" href="javascript:PicLensLite.start({feedUrl:'http://www.kellyrob99.com/blog/wp-content/plugins/nextgen-gallery/xml/media-rss.php?gid=10&amp;mode=gallery'});">
			[View with PicLens]		</a>
	</div>
	
	<!-- Thumbnails -->
		
	<div id="ngg-image-42" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/atlassianconnectorautoupdate.png" title="The plugin includes its own auto-update functionality, very handy!" class="shutterset_set_10" >
								<img title="atlassianconnectorautoupdate" alt="atlassianconnectorautoupdate" src="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/thumbs/thumbs_atlassianconnectorautoupdate.png" width="81" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-43" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/atlassianconnectorgeneralsettings.png" title="Preferences page of general settings for each application type." class="shutterset_set_10" >
								<img title="atlassianconnectorgeneralsettings" alt="atlassianconnectorgeneralsettings" src="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/thumbs/thumbs_atlassianconnectorgeneralsettings.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-44" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/bamboobuildcomment.png" title="Adding a comment to a completed Bamboo build." class="shutterset_set_10" >
								<img title="bamboobuildcomment" alt="bamboobuildcomment" src="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/thumbs/thumbs_bamboobuildcomment.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-45" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/bamboobuildpopup.png" title="This is the overview information presented when hovering over a build in the Bamboo view." class="shutterset_set_10" >
								<img title="bamboobuildpopup" alt="bamboobuildpopup" src="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/thumbs/thumbs_bamboobuildpopup.png" width="96" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-46" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/bamboologview.png" title="Linking Bamboo logs to code in the IDE." class="shutterset_set_10" >
								<img title="bamboologview" alt="bamboologview" src="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/thumbs/thumbs_bamboologview.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-47" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/bamboooverview.png" title="Overview of Bamboo builds you have configured." class="shutterset_set_10" >
								<img title="bamboooverview" alt="bamboooverview" src="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/thumbs/thumbs_bamboooverview.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-48" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/configuringnewapplications.png" title="Host specific configuration for each of the Atlassian applications." class="shutterset_set_10" >
								<img title="configuringnewapplications" alt="configuringnewapplications" src="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/thumbs/thumbs_configuringnewapplications.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-49" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/createajiraissue.png" title="Creating a new Jira issue from the IDE." class="shutterset_set_10" >
								<img title="createajiraissue" alt="createajiraissue" src="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/thumbs/thumbs_createajiraissue.png" width="77" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-50" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/fisheyealtf1menu.png" title="Alt-F1 context menu for a file linked to Fisheye." class="shutterset_set_10" >
								<img title="fisheyealtf1menu" alt="fisheyealtf1menu" src="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/thumbs/thumbs_fisheyealtf1menu.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-51" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/fisheyeexamplemacroview.png" title="Fisheye view, complete with IntelliJ button to open file directly in IDE." class="shutterset_set_10" >
								<img title="fisheyeexamplemacroview" alt="fisheyeexamplemacroview" src="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/thumbs/thumbs_fisheyeexamplemacroview.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-52" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/fisheyerightclickmenu.png" title="Right click context menu for a file linked to Fisheye." class="shutterset_set_10" >
								<img title="fisheyerightclickmenu" alt="fisheyerightclickmenu" src="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/thumbs/thumbs_fisheyerightclickmenu.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-53" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/jiraissuedetailview.png" title="Jira detail view for an issue, including access to commentary and attachments." class="shutterset_set_10" >
								<img title="jiraissuedetailview" alt="jiraissuedetailview" src="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/thumbs/thumbs_jiraissuedetailview.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-54" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/jiraissuepopup.png" title="This is the overview information presented when hovering over an issue in the Jira view." class="shutterset_set_10" >
								<img title="jiraissuepopup" alt="jiraissuepopup" src="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/thumbs/thumbs_jiraissuepopup.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-55" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/jiraissuesoverview.png" title="Overview of all Jira issues matching a filter or search." class="shutterset_set_10" >
								<img title="jiraissuesoverview" alt="jiraissuesoverview" src="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/thumbs/thumbs_jiraissuesoverview.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-56" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/jirastopwork.png" title="Dialog presented when 'stopping work' on a Jira issue; includes the ability to change the Jira state and log work against the issue." class="shutterset_set_10" >
								<img title="jirastopwork" alt="jirastopwork" src="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/thumbs/thumbs_jirastopwork.png" width="89" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-57" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/jiratoolbaradditions.png" title="Buttons the Connector adds to the top IDE button bar." class="shutterset_set_10" >
								<img title="jiratoolbaradditions" alt="jiratoolbaradditions" src="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian-intellij-connector/thumbs/thumbs_jiratoolbaradditions.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 	 	
	<!-- Pagination -->
 	<div class='ngg-clear'></div>
 	
</div>


<div class="zemanta-pixie"><a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/51641feb-8bfa-4376-b1dc-c90be9a1987f/" title="Reblog this post [with Zemanta]"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_c.png?x-id=51641feb-8bfa-4376-b1dc-c90be9a1987f" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related pretty-attribution"><script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"></script></span></div>
<!-- AdSense Now! V1.77 -->
<!-- Post[count: 2] -->
<div class="adsense adsense-leadout" style="float:right;margin: 12px;"><script type="text/javascript"><!--
google_ad_client = "pub-6955914197200080";
/* 728x90, created 8/3/09 */
google_ad_slot = "4051815125";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div><p align="left"><a class="tt" href="http://twitter.com/home/?status=Developing+Faster+with+the+Atlassian+IntelliJ+Connector+http://574fx.th8.us" title="Post to Twitter"><img class="nothumb" src="http://www.kellyrob99.com/blog/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Developing+Faster+with+the+Atlassian+IntelliJ+Connector+http://574fx.th8.us" title="Post to Twitter">Tweet This Post</a></p>

<p>Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2010/01/02/atlassian-here-be-dragons/' rel='bookmark' title='Permanent Link: Atlassian: Here Be Dragons'>Atlassian: Here Be Dragons</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/08/14/griffon-support-in-latest-intellij-eap/' rel='bookmark' title='Permanent Link: Griffon support in latest Intellij EAP'>Griffon support in latest Intellij EAP</a></li>
<li><a href='http://www.kellyrob99.com/blog/2010/01/07/bamboo-grails-and-git-for-continuous-integration/' rel='bookmark' title='Permanent Link: Bamboo, Grails and Git for Continuous Integration'>Bamboo, Grails and Git for Continuous Integration</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.kellyrob99.com/blog/2010/02/21/developing-faster-with-the-atlassian-intellij-connector/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A One Day Griffon Application/Presentation</title>
		<link>http://www.kellyrob99.com/blog/2010/02/11/a-one-day-griffon-applicationpresentation/</link>
		<comments>http://www.kellyrob99.com/blog/2010/02/11/a-one-day-griffon-applicationpresentation/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 05:15:57 +0000</pubDate>
		<dc:creator>TheKaptain</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[beta]]></category>
		<category><![CDATA[Collections]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Griffon]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[kellyrob99]]></category>
		<category><![CDATA[plugin architecture]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[slideware]]></category>
		<category><![CDATA[Source code]]></category>
		<category><![CDATA[Swing]]></category>
		<category><![CDATA[TestNG]]></category>
		<category><![CDATA[theKaptain]]></category>
		<category><![CDATA[Transitions2D]]></category>

		<guid isPermaLink="false">http://www.kellyrob99.com/blog/?p=1072</guid>
		<description><![CDATA[I took the opportunity this past weekend to test drive the latest beta version of Griffon and along with it the as-of-yet unreleased slideware plugin. If you&#8217;re not already aware, Griffon is a Grails inspired framework for creating Java Swing applications. The project lead, Andres Almiray, has given several presentations using this plugin and it [...]


Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/08/27/vijug-griffongroovy-presentation/' rel='bookmark' title='Permanent Link: VIJUG Griffon/Groovy Presentation'>VIJUG Griffon/Groovy Presentation</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/04/03/swingset-on-griffon/' rel='bookmark' title='Permanent Link: SwingSet on Griffon'>SwingSet on Griffon</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/04/08/griffon-swingx-fest-testing/' rel='bookmark' title='Permanent Link: Griffon SwingX Fest testing'>Griffon SwingX Fest testing</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>I took the opportunity this past weekend to test drive the latest beta version of <a href="http://griffon.codehaus.org/">Griffon</a> and along with it the as-of-yet unreleased slideware plugin. If you&#8217;re not already aware, Griffon is a Grails inspired framework for creating <a class="zem_slink" href="http://en.wikipedia.org/wiki/Swing_%28Java%29" title="Swing (Java)" rel="wikipedia">Java Swing</a> applications. The project lead, Andres Almiray, has given several presentations using this plugin and it provides an excellent platform for showcasing both the power of Swing and the capabilities of Griffon to make it all look so easy.</p>
<p>The slideware plugin provides a framework for creating presentations with a little twist &#8211; you can execute code live from the presentation software.  If you&#8217;ve ever given a presentation about programming you probably are fully aware of the transition from presentation software to your preferred environment for demonstrating code samples. Well, now you can stay entirely within the same application, editing and running code live.</p>
<p>The plugin itself isn&#8217;t available from the Griffon repository but source code and a built 0.2 version can be <a href="http://github.com/aalmiray/Presentations">found on github</a>.  Considering both the youth of the plugin and the beta status of the framework, it worked impressively well AND had a rich feature set.  All of the expected &#8220;powerpoint&#8221; features are there: themes, layout control, styling, slide transitions and export are all pretty easy to incorporate and configure. The code editor view also works very well. A great variety of additional plugins are harnessed to put all the pieces together and as a result building one of these applications is a great way to tour the platform.</p>
<p></p>
<h2>Theming</h2>
<p>Applying a theme to the presentation is simply selecting a Java Look and Feel to apply in Initialize.groovy. The Substance jar is included with the plugin so I test drove a few of the nice setups in there and finally settled on the SubstanceMagmaLookAndFeel. There is definitely a wide variety of L&amp;F&#8217;s to choose from in that bundle alone and, although I haven&#8217;t done it myself, they seem pretty tweakable as well. Plus any old L&amp;F should plug in nicely, I would imagine. </p>
<pre class="brush: groovy;">
//Initialize.groovy
SwingBuilder.lookAndFeel('org.jvnet.substance.skin.SubstanceMagmaLookAndFeel',
       'mac', 'nimbus', 'gtk', ['metal', [boldFonts: false]])
</pre>
<p></p>
<h2>Layout</h2>
<p>Controlling the page composition is a standard Swing Layout or, in the case of the default slide you get with the included &#8220;create-slide&#8221; script, a MigLayout. Framing the standard variety of slides is very simple. Bulleted pages, title slides, code slides and custom layouts are very easy to accomplish. I don&#8217;t have a lot of experience using this particular layout but the presentations Andres has made available on github have a good diversity of examples of how they look in practice.</p>
<pre class="brush: groovy;">
//the default create-slide generated template
import net.miginfocom.swing.MigLayout

slide(id: &quot;slide0&quot;, layout: new MigLayout(&quot;fill&quot;,&quot;[center]&quot;,&quot;[center]&quot;)) {
    label(&quot;Insert your text here&quot;)
}
</pre>
<p></p>
<h2>Styling</h2>
<p>Styling is supplied by the css plugin, on which slideware has a dependency. The default style.css file sets out just some reasonable defaults for the fonts used in different parts of the app, and I didn&#8217;t see any real need to fiddle with it. Especially happy to see the nice monospace code font. On a totally related note I recently installed the <a href="http://www.levien.com/type/myfonts/inconsolata.html">Inconsolata</a> monospace font to try for development and I&#8217;ve been very happy seeing it in my editor, but it&#8217;s still nice to see this kind of polish applied to the presentation. The code editor view even includes syntax highlighting! More on that coming right up&#8230;</p>
<p></p>
<h2>Slide Transitions</h2>
<p>Moving between slides with style is the responsibility of the <a href="http://griffon.codehaus.org/Transitions+Plugin">transitions plugin</a>. You can see see all of the animations this plugin enables over here at <a href="http://javagraphics.blogspot.com/2007/04/slideshows-transitions-swf.html">this page describing Transitions and Transition2Ds</a>. Pretty slick stuff and defined as simply as a parameter to each &#8220;slide&#8221; node in a script.</p>
<pre class="brush: groovy;">
slide(id: &quot;slide3&quot;, layout: new MigLayout(&quot;fill&quot;,&quot;3%[center]3%&quot;,&quot;3%[center]3%&quot;),
        title: &quot;Junit3&quot;,
        transition: new FlurryTransition2D(Transition2D.OUT)) {
    scrollPane(constraints: &quot;grow&quot;) {
        widget(createEditor(text: script))
    }
}
</pre>
<p></p>
<h2>Code Editor</h2>
<p>Code slides embed an editable widget and allow for composing and executing Groovy scripts or classes of arbitrary complexity. You can execute the code with a keyboard shortcut and a window will open displaying the console output. The code itself is executed through a GroovyShell, enabling pretty much anything you might want to do. If you have an internet connection and the required repositories configured, Grapes simplifies packaging the dependencies for the application as your code samples can directly Grab the jars they need. Basically, the first time you execute a code slide you&#8217;ll have to put up with a small pause while Ivy downloads to your local repository, unless of course the required dependencies are already there.  In my case I changed strategies from including jars in the application lib directory to a Grapes approach and I think it&#8217;s a better way to go.</p>
<p>I was surprised to find that the editor even included undo functionality. It&#8217;s definitely not close to a full blown IDE, and there&#8217;s absolutely no reason that it should be. For the task of demoing simple code examples it&#8217;s more than up to the task, even to the point of maintaining your edits between slide transitions, allowing you to move back and forth through the slide deck without any state problems.<br />

<a href="http://www.kellyrob99.com/blog/wp-content/gallery/groovy-testing-presentation-with-griffon/screen-shot-2010-02-11-at-7-47-04-pm.png" title="Code slide with JUnit4 and Hamcrest matcher example" class="shutterset_singlepic38" >
	<img class="ngg-singlepic" src="http://www.kellyrob99.com/blog/wp-content/gallery/cache/38__x_screen-shot-2010-02-11-at-7-47-04-pm.png" alt="Code slide with JUnit4 and Hamcrest matcher example" title="Code slide with JUnit4 and Hamcrest matcher example" />
</a>
</p>
<p></p>
<h2>Export</h2>
<p>The application includes a &#8220;Print&#8221; feature which iterates through the entire slide deck and renders it to a pdf. Distribution of one of these presentations is really very easy, including the ability to create installers for all major platforms simply by adding the packaging plugin.</p>
<p></p>
<h2>Test Application</h2>
<p>The test app I built while looking into this is pretty simple. It&#8217;s got a title slide, a bullet slide and 4 code slides. The code simply demonstrates how you can create test classes and make assertions for Junit 3(with GroovyTestCase), Junit 4 and TestNG. GroovyShell recognizes all 3 of these test files by interface or annotation and executes them appropriately. In each case the console output of the test framework is the result, including the new Spock inspired ascii art assert failure renderings. The Test result files are also written to disk, and that TestNG html output is what I&#8217;m used to looking at anyhow. Show me the Green!</p>
<p>The last code slide is just a slightly updated version of an example script on the Grapes page, using the current version of Google Collections and intentionally introducing a failure- mostly just to show off that new assert rendering I mentioned a moment ago. VERY helpful at highlighting the exact nature of a failure. It also encourages me to pay more attention to how I name variables, something I&#8217;m sure every developer that has ever worked with me will cheer at. Man, I suck at naming things.</p>
<p>I also developed a brute force test that loads each slide and executes scripts if finds embedded there. Failures are hard to detect since the direct output is simply a text block, but some fairly simple regex&#8217;s applied to the output make me at least moderately confident that the code won&#8217;t fail at show time.</p>
<p></p>
<h2>Overall Impression</h2>
<p>It took a couple of afternoons(six hours or so total) to download the source code from github, explore it, create a simple presentation and document the experience. I won&#8217;t begin to suggest that I&#8217;m fully aware of all the details happening behind the scenes, but the end user experience is pretty fluid: create a slide, tailor the layout, add content and then repeat. The included examples were more than enough documentation on how to hit the ground running. The plugin code itself is a great example of the MVC nature of Griffon, not a whole lot of code, but a great deal of power and expressability. There were a couple of glitches happening in the background, mostly just logging to the console with no visible effect to the application, but overall it functioned as well as (not) advertised. For publicly unreleased software it was an absolute pleasure to work with and I plan on continuing with the development of this particular presentation.</p>
<p>Everything you need to build and run this stuff yourself is publicly available. In my case, Griffon generally has a recent Macport available for both the released(griffon @0.2.1) and development versions(griffon-devel @0.3-BETA-2). Switching versions is relatively painless and, for applications this simple, testing out upgrades is basically just going through the presentation once in a functional test. Versions for other platforms can be downloaded from the <a href="http://griffon.codehaus.org/Download">Griffon download page</a>.</p>
<p></p>
<h2>Deliverables</h2>
<p>Source code for the sample application is <a href="http://github.com/kellyrob99/Groovy-Testing-Presentation">available on github here</a>. Please just leave a comment on this page if you have any problems running it.</p>
<p>Here&#8217;s the pdf produced by the application &#8216;Print&#8217; feature: <a class="downloadlink" href="http://www.kellyrob99.com/blog/wp-content/plugins/download-monitor/download.php?id=2" title="Version0.1 downloaded 44 times" >Groovy Testing Presentation (44)</a></p>
<p>And if you don&#8217;t feel like downloading anything, here&#8217;s how it all looks in pretty pictures.<br />

<div class="ngg-galleryoverview" id="ngg-gallery-9-1072">


	<!-- Piclense link -->
	<div class="piclenselink">
		<a class="piclenselink" href="javascript:PicLensLite.start({feedUrl:'http://www.kellyrob99.com/blog/wp-content/plugins/nextgen-gallery/xml/media-rss.php?gid=9&amp;mode=gallery'});">
			[View with PicLens]		</a>
	</div>
	
	<!-- Thumbnails -->
		
	<div id="ngg-image-35" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/groovy-testing-presentation-with-griffon/screen-shot-2010-02-11-at-7-46-46-pm.png" title="Title slide" class="shutterset_set_9" >
								<img title="Title slide" alt="Title slide" src="http://www.kellyrob99.com/blog/wp-content/gallery/groovy-testing-presentation-with-griffon/thumbs/thumbs_screen-shot-2010-02-11-at-7-46-46-pm.png" width="99" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-36" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/groovy-testing-presentation-with-griffon/screen-shot-2010-02-11-at-7-46-50-pm.png" title="Bullet slide" class="shutterset_set_9" >
								<img title="Bullet slide" alt="Bullet slide" src="http://www.kellyrob99.com/blog/wp-content/gallery/groovy-testing-presentation-with-griffon/thumbs/thumbs_screen-shot-2010-02-11-at-7-46-50-pm.png" width="99" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-37" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/groovy-testing-presentation-with-griffon/screen-shot-2010-02-11-at-7-47-00-pm.png" title="Code slide with JUnit 3 example" class="shutterset_set_9" >
								<img title="Code slide with JUnit 3 example" alt="Code slide with JUnit 3 example" src="http://www.kellyrob99.com/blog/wp-content/gallery/groovy-testing-presentation-with-griffon/thumbs/thumbs_screen-shot-2010-02-11-at-7-47-00-pm.png" width="99" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-38" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/groovy-testing-presentation-with-griffon/screen-shot-2010-02-11-at-7-47-04-pm.png" title="Code slide with JUnit4 and Hamcrest matcher example" class="shutterset_set_9" >
								<img title="Code slide with JUnit4 and Hamcrest matcher example" alt="Code slide with JUnit4 and Hamcrest matcher example" src="http://www.kellyrob99.com/blog/wp-content/gallery/groovy-testing-presentation-with-griffon/thumbs/thumbs_screen-shot-2010-02-11-at-7-47-04-pm.png" width="99" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-39" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/groovy-testing-presentation-with-griffon/screen-shot-2010-02-11-at-7-47-08-pm.png" title="Code slide with TestNG example" class="shutterset_set_9" >
								<img title="Code slide with TestNG example" alt="Code slide with TestNG example" src="http://www.kellyrob99.com/blog/wp-content/gallery/groovy-testing-presentation-with-griffon/thumbs/thumbs_screen-shot-2010-02-11-at-7-47-08-pm.png" width="99" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-40" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/groovy-testing-presentation-with-griffon/screen-shot-2010-02-11-at-7-47-13-pm.png" title="Code slide with Google Collections example" class="shutterset_set_9" >
								<img title="Code slide with Google Collections example" alt="Code slide with Google Collections example" src="http://www.kellyrob99.com/blog/wp-content/gallery/groovy-testing-presentation-with-griffon/thumbs/thumbs_screen-shot-2010-02-11-at-7-47-13-pm.png" width="99" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-41" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/groovy-testing-presentation-with-griffon/screen-shot-2010-02-08-at-8-53-43-pm.png" title="Help screen showing keyboard shortcuts" class="shutterset_set_9" >
								<img title="Help screen showing keyboard shortcuts" alt="Help screen showing keyboard shortcuts" src="http://www.kellyrob99.com/blog/wp-content/gallery/groovy-testing-presentation-with-griffon/thumbs/thumbs_screen-shot-2010-02-08-at-8-53-43-pm.png" width="99" height="75" />
							</a>
		</div>
	</div>
	
		
 	 	
	<!-- Pagination -->
 	<div class='ngg-clear'></div>
 	
</div>

</p>
<div class="zemanta-pixie"><a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/a9a507d7-67b9-4178-bf0f-e90f2cc1d0a6/" title="Reblog this post [with Zemanta]"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_c.png?x-id=a9a507d7-67b9-4178-bf0f-e90f2cc1d0a6" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related pretty-attribution"><script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"></script></span></div>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=A+One+Day+Griffon+Application%2FPresentation+http://yi58w.th8.us" title="Post to Twitter"><img class="nothumb" src="http://www.kellyrob99.com/blog/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=A+One+Day+Griffon+Application%2FPresentation+http://yi58w.th8.us" title="Post to Twitter">Tweet This Post</a></p>

<p>Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/08/27/vijug-griffongroovy-presentation/' rel='bookmark' title='Permanent Link: VIJUG Griffon/Groovy Presentation'>VIJUG Griffon/Groovy Presentation</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/04/03/swingset-on-griffon/' rel='bookmark' title='Permanent Link: SwingSet on Griffon'>SwingSet on Griffon</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/04/08/griffon-swingx-fest-testing/' rel='bookmark' title='Permanent Link: Griffon SwingX Fest testing'>Griffon SwingX Fest testing</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.kellyrob99.com/blog/2010/02/11/a-one-day-griffon-applicationpresentation/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Thanks for the shirt Atlassian!</title>
		<link>http://www.kellyrob99.com/blog/2010/01/27/thanks-for-the-shirt-atlassian/</link>
		<comments>http://www.kellyrob99.com/blog/2010/01/27/thanks-for-the-shirt-atlassian/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 04:12:43 +0000</pubDate>
		<dc:creator>TheKaptain</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Atlassian]]></category>
		<category><![CDATA[Balsamiq]]></category>
		<category><![CDATA[Bamboo]]></category>
		<category><![CDATA[Confluence]]></category>
		<category><![CDATA[Dragon]]></category>
		<category><![CDATA[Jira]]></category>
		<category><![CDATA[kellyrob]]></category>
		<category><![CDATA[OmniGraffle]]></category>
		<category><![CDATA[theKaptain]]></category>
		<category><![CDATA[Wiki]]></category>

		<guid isPermaLink="false">http://www.kellyrob99.com/blog/?p=1052</guid>
		<description><![CDATA[So my t-shirt arrived today in the mail compliments of Atlassian. Bright green and well earned when I slayed the dragon, I&#8217;ll wear it with pride.&#160; So far I&#8217;ve been getting the most mileage out of Bamboo and Jira, but I&#8217;ve also been tweaking Confluence to make it just right. Following right along with Atlassian&#8217;s [...]


Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2010/01/02/atlassian-here-be-dragons/' rel='bookmark' title='Permanent Link: Atlassian: Here Be Dragons'>Atlassian: Here Be Dragons</a></li>
<li><a href='http://www.kellyrob99.com/blog/2010/02/21/developing-faster-with-the-atlassian-intellij-connector/' rel='bookmark' title='Permanent Link: Developing Faster with the Atlassian IntelliJ Connector'>Developing Faster with the Atlassian IntelliJ Connector</a></li>
<li><a href='http://www.kellyrob99.com/blog/2010/01/07/bamboo-grails-and-git-for-continuous-integration/' rel='bookmark' title='Permanent Link: Bamboo, Grails and Git for Continuous Integration'>Bamboo, Grails and Git for Continuous Integration</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>So my t-shirt arrived today in the mail compliments of <a class="zem_slink" href="http://www.atlassian.com/" title="Atlassian" rel="homepage">Atlassian</a>. Bright green and well earned <a href="http://www.kellyrob99.com/blog/2010/01/02/atlassian-here-be-dragons/">when I slayed the dragon</a>, I&#8217;ll wear it with pride.&nbsp; So far I&#8217;ve been getting the most mileage out of Bamboo and Jira, but I&#8217;ve also been tweaking Confluence to make it <em>just</em> right. Following right along with Atlassian&#8217;s lead, both <a href="https://plugins.atlassian.com/plugin/details/13744">TaskDock</a> and <a href="https://plugins.atlassian.com/plugin/details/254">Gliffy</a> are offering $10 donation licenses for less than ten user systems, so I&#8217;ve pretty much <strong>got</strong> to at least try them out right?</p>
<p>Actually I&#8217;ve used Gliffy in Confluence before, and it&#8217;s come in handy more than once or twice. But between <a href="http://www.balsamiq.com/products/mockups/desktop">Balsamiq</a> and <a href="http://www.omnigroup.com/applications/OmniGraffle/">OmniGraffle</a> I&#8217;m already well equipped to cover up the fact that my artistic abilities lie somewhere below drawing <a class="zem_slink" href="http://en.wikipedia.org/wiki/Stick_figure" title="Stick figure" rel="wikipedia">stick men</a>. TaskDock has however been installed and set up to nag me via email when I am getting behind schedule. Next will be Customware&#8217;s <a href="http://www.customware.net/repository/display/AtlassianPlugins/Scaffolding+Plugin">scaffolding</a> and <a href="http://www.customware.net/repository/display/AtlassianPlugins/Reporting+Plugin" class="broken_link" >reporting</a> plugins.  The scaffolding capabilities make dealing with tables in Confluence a breeze &#8211; almost(but not quite) enough to make me abandon the wiki editor completely. Why take my word for it when you can just <a href="http://www.customware.net/repository/download/attachments/2072/SCAFF101_Table.mov?version=1">watch the video</a>?</p>
<p>Anyhow, so far I&#8217;m very happy with the software and how it&#8217;s already helped me organize projects at home better. The t-shirt is just a nice bonus.</p>

<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian/img_1405.jpg" title="Well earned and bright green, I&amp;#039;ll wear it with pride." class="shutterset_singlepic34" >
	<img class="ngg-singlepic" src="http://www.kellyrob99.com/blog/wp-content/gallery/cache/34__770x_img_1405.jpg" alt="Here&#039;s the t-shirt" title="Here&#039;s the t-shirt" />
</a>

<div class="zemanta-pixie"><a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/d2e13ff0-ce55-4eb2-959f-765985ac709f/" title="Reblog this post [with Zemanta]"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_c.png?x-id=d2e13ff0-ce55-4eb2-959f-765985ac709f" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related pretty-attribution"><script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"></script></span></div>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Thanks+for+the+shirt+Atlassian%21+http://3ws8i.th8.us" title="Post to Twitter"><img class="nothumb" src="http://www.kellyrob99.com/blog/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Thanks+for+the+shirt+Atlassian%21+http://3ws8i.th8.us" title="Post to Twitter">Tweet This Post</a></p>

<p>Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2010/01/02/atlassian-here-be-dragons/' rel='bookmark' title='Permanent Link: Atlassian: Here Be Dragons'>Atlassian: Here Be Dragons</a></li>
<li><a href='http://www.kellyrob99.com/blog/2010/02/21/developing-faster-with-the-atlassian-intellij-connector/' rel='bookmark' title='Permanent Link: Developing Faster with the Atlassian IntelliJ Connector'>Developing Faster with the Atlassian IntelliJ Connector</a></li>
<li><a href='http://www.kellyrob99.com/blog/2010/01/07/bamboo-grails-and-git-for-continuous-integration/' rel='bookmark' title='Permanent Link: Bamboo, Grails and Git for Continuous Integration'>Bamboo, Grails and Git for Continuous Integration</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.kellyrob99.com/blog/2010/01/27/thanks-for-the-shirt-atlassian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bamboo, Grails and Git for Continuous Integration</title>
		<link>http://www.kellyrob99.com/blog/2010/01/07/bamboo-grails-and-git-for-continuous-integration/</link>
		<comments>http://www.kellyrob99.com/blog/2010/01/07/bamboo-grails-and-git-for-continuous-integration/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 05:13:53 +0000</pubDate>
		<dc:creator>TheKaptain</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Atlassian]]></category>
		<category><![CDATA[Bamboo]]></category>
		<category><![CDATA[Continuous integration]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Jira]]></category>
		<category><![CDATA[theKaptain]]></category>

		<guid isPermaLink="false">http://www.kellyrob99.com/blog/?p=1015</guid>
		<description><![CDATA[Following up on my recent installation of the Atlassian product suite at home, I had a really positive experience setting up Bamboo to work with several of my recent Grails projects.  Bamboo has proven to be a powerful and essential tool at my day job and I&#8217;ve really been looking forward to putting it [...]


Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/12/16/jira-grails-plugin/' rel='bookmark' title='Permanent Link: Jira Grails Plugin'>Jira Grails Plugin</a></li>
<li><a href='http://www.kellyrob99.com/blog/2010/02/21/developing-faster-with-the-atlassian-intellij-connector/' rel='bookmark' title='Permanent Link: Developing Faster with the Atlassian IntelliJ Connector'>Developing Faster with the Atlassian IntelliJ Connector</a></li>
<li><a href='http://www.kellyrob99.com/blog/2010/01/27/thanks-for-the-shirt-atlassian/' rel='bookmark' title='Permanent Link: Thanks for the shirt Atlassian!'>Thanks for the shirt Atlassian!</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Following up on my recent installation of the <a class="zem_slink" href="http://www.atlassian.com/" title="Atlassian" rel="homepage">Atlassian</a> product suite at home, I had a really positive experience setting up Bamboo to work with several of my recent Grails projects.  Bamboo has proven to be a powerful and essential tool at my day job and I&#8217;ve really been looking forward to putting it to work for my personal projects.   I&#8217;ve also been using <a class="zem_slink" href="http://git-scm.com/" title="Git (software)" rel="homepage">Git</a> for a repository lately, and while I have nothing but praise for my good friend svn, I have to say the ability to set up a new repository in 2 seconds flat is pretty damn convenient.</p>
<p>Since neither Grails nor Git are by default supported by Bamboo, I grabbed a couple of plugins to enable my home <a class="zem_slink" href="http://en.wikipedia.org/wiki/Continuous_integration" title="Continuous integration" rel="wikipedia">continuous integration</a> system. Bamboo has a very sensible plugin model that allows for adding new capabilites with only a jar file in the right place and a server restart, and a <a href="https://plugins.atlassian.com/plugin/home">fairly rich library of plugins</a>. It&#8217;s also encouraging to see a company that is committed to eating their own dog food &#8211; recently they&#8217;ve moved their plugin resources to <a class="zem_slink" href="http://www.atlassian.com/software/jira" title="JIRA" rel="homepage">Jira</a> studio as you can see on the <a href="https://labs.atlassian.com/wiki/display/GRAILS/Home">Grails plugin home page</a>. This gives you as the consumer of the software access to the wiki&#8217;d documentation, any open issues, and even visibility into when source code changes are committed. I&#8217;m assuming that last is subject to whether or not the plugin source code is open source or not, but still &#8211; pretty nifty.</p>
<p>The Grails plugin instructions speak for themselves in the 3 screen-shots on the one and only wiki page. Anything else you need to know is summarized in a one liner on the &#8220;Builder&#8221; tab when you select the Grails builder: &#8220;Use a new line to seperate Grails commands.&#8221; Gotta love clear, simple instructions. Drop the plugin jar into $BAMBOO_INSTALL_DIR/webapp/WEB-INF/lib, restart Bamboo and <a href="http://confluence.atlassian.com/display/BAMBOO/Configuring+a+new+Builder">configure a new builder for Grails</a>. Took a couple of minutes and knowing where my Grails install was located.</p>

<a href="http://www.kellyrob99.com/blog/wp-content/gallery/bamboo-grails-and-git/addingbamboograilsbuilder.png" title="Adding the builder definition to Bamboo" class="shutterset_singlepic30" >
	<img class="ngg-singlepic" src="http://www.kellyrob99.com/blog/wp-content/gallery/cache/30__750x_addingbamboograilsbuilder.png" alt="Adding the builder definition to Bamboo" title="Adding the builder definition to Bamboo" />
</a>

<p>A quick Google for &#8220;Bamboo git plugin&#8221; led to a bit of a hypertext chase that <a href="http://github.com/krosenvold/bgit">eventually ended up here</a>.  Looks like this particular plugin has passed through the hands of <a href="http://jira.atlassian.com/browse/BAM-2875">at least a couple of maintainers</a>, but so far it&#8217;s worked exactly as advertised.  And again, loving the dog food analogy, it&#8217;s nice to see a project enabling Git hosted on github. Thanks very much to <a href="http://incodewetrustinc.blogspot.com/">Kristian Rosenvold</a> for running with the ball on this one! Again, drop the jar into $BAMBOO_INSTALL_DIR/webapp/WEB-INF/lib and restart Bamboo. When creating a plan you will now have Git as a choice for a Source Repository. In my case I&#8217;m just using a plain file repository that resides on the build box, but it should work just as well with a remote repository.</p>

<a href="http://www.kellyrob99.com/blog/wp-content/gallery/bamboo-grails-and-git/bamboogitsetup.png" title="Select Git as the source repository for a Bamboo plan" class="shutterset_singlepic31" >
	<img class="ngg-singlepic" src="http://www.kellyrob99.com/blog/wp-content/gallery/cache/31__750x_bamboogitsetup.png" alt="Select Git as the source repository for a Bamboo plan" title="Select Git as the source repository for a Bamboo plan" />
</a>

<p>Setting up the Grails targets is similarly straightforward. Thanks to <a href="http://today.java.net/pub/a/today/2009/06/23/Grails-and-Continuous-Integration.html">this article</a>, which describes the Grails setup on Hudson, and reminded me about the &#8211;non-interactive flag since obviously the build server isn&#8217;t going to be able to interact with the console. I&#8217;m also using a couple of Grails plugins to provide static source code analysis so my parameters also include -coverage and a call to the codenarc script.</p>

<a href="http://www.kellyrob99.com/blog/wp-content/gallery/bamboo-grails-and-git/bamboograilssetup.png" title="Select Grails as a builder and specify which scripts to call for a Bamboo plan" class="shutterset_singlepic32" >
	<img class="ngg-singlepic" src="http://www.kellyrob99.com/blog/wp-content/gallery/cache/32__750x_bamboograilssetup.png" alt="Select Grails as a builder and specifying which scripts to call for a Bamboo plan" title="Select Grails as a builder and specifying which scripts to call for a Bamboo plan" />
</a>

<p>I had a little trepidation about how this would all turn out after <a href="http://www.dish2dish.com/confluence/display/NPB/2009/12/26/Grails+and+Tools+In+A+Corporate+World">reading this blog post</a>, but I&#8217;ve had much better results so far in my personal experience. It&#8217;s entirely possible that the key differentiator is wrapping Grails with Maven. It&#8217;s definitely not perfect, but it is <a href="http://www.guntheranderson.com/v/data/gettingb.htm">getting better all the time</a>. Hopefully you have better luck in the future Neil!</p>

<div class="ngg-galleryoverview" id="ngg-gallery-8-1015">


	<!-- Piclense link -->
	<div class="piclenselink">
		<a class="piclenselink" href="javascript:PicLensLite.start({feedUrl:'http://www.kellyrob99.com/blog/wp-content/plugins/nextgen-gallery/xml/media-rss.php?gid=8&amp;mode=gallery'});">
			[View with PicLens]		</a>
	</div>
	
	<!-- Thumbnails -->
		
	<div id="ngg-image-30" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/bamboo-grails-and-git/addingbamboograilsbuilder.png" title="Adding the builder definition to Bamboo" class="shutterset_set_8" >
								<img title="Adding the builder definition to Bamboo" alt="Adding the builder definition to Bamboo" src="http://www.kellyrob99.com/blog/wp-content/gallery/bamboo-grails-and-git/thumbs/thumbs_addingbamboograilsbuilder.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-31" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/bamboo-grails-and-git/bamboogitsetup.png" title="Select Git as the source repository for a Bamboo plan" class="shutterset_set_8" >
								<img title="Select Git as the source repository for a Bamboo plan" alt="Select Git as the source repository for a Bamboo plan" src="http://www.kellyrob99.com/blog/wp-content/gallery/bamboo-grails-and-git/thumbs/thumbs_bamboogitsetup.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-32" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/bamboo-grails-and-git/bamboograilssetup.png" title="Select Grails as a builder and specify which scripts to call for a Bamboo plan" class="shutterset_set_8" >
								<img title="Select Grails as a builder and specifying which scripts to call for a Bamboo plan" alt="Select Grails as a builder and specifying which scripts to call for a Bamboo plan" src="http://www.kellyrob99.com/blog/wp-content/gallery/bamboo-grails-and-git/thumbs/thumbs_bamboograilssetup.png" width="98" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-33" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/bamboo-grails-and-git/bamboorequirementssetup.png" title="All requirements satisfied to run a Bamboo plan!" class="shutterset_set_8" >
								<img title="All requirements satisfied to run a Bamboo plan!" alt="All requirements satisfied to run a Bamboo plan!" src="http://www.kellyrob99.com/blog/wp-content/gallery/bamboo-grails-and-git/thumbs/thumbs_bamboorequirementssetup.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 	 	
	<!-- Pagination -->
 	<div class='ngg-clear'></div>
 	
</div>


<div class="zemanta-pixie"><a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/38734ac1-c6ec-4339-aaf2-b09678979e9b/" title="Reblog this post [with Zemanta]"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_c.png?x-id=38734ac1-c6ec-4339-aaf2-b09678979e9b" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related pretty-attribution"><script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"></script></span></div>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Bamboo%2C+Grails+and+Git+for+Continuous+Integration+http://b4x66.th8.us" title="Post to Twitter"><img class="nothumb" src="http://www.kellyrob99.com/blog/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Bamboo%2C+Grails+and+Git+for+Continuous+Integration+http://b4x66.th8.us" title="Post to Twitter">Tweet This Post</a></p>

<p>Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/12/16/jira-grails-plugin/' rel='bookmark' title='Permanent Link: Jira Grails Plugin'>Jira Grails Plugin</a></li>
<li><a href='http://www.kellyrob99.com/blog/2010/02/21/developing-faster-with-the-atlassian-intellij-connector/' rel='bookmark' title='Permanent Link: Developing Faster with the Atlassian IntelliJ Connector'>Developing Faster with the Atlassian IntelliJ Connector</a></li>
<li><a href='http://www.kellyrob99.com/blog/2010/01/27/thanks-for-the-shirt-atlassian/' rel='bookmark' title='Permanent Link: Thanks for the shirt Atlassian!'>Thanks for the shirt Atlassian!</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.kellyrob99.com/blog/2010/01/07/bamboo-grails-and-git-for-continuous-integration/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Atlassian: Here Be Dragons</title>
		<link>http://www.kellyrob99.com/blog/2010/01/02/atlassian-here-be-dragons/</link>
		<comments>http://www.kellyrob99.com/blog/2010/01/02/atlassian-here-be-dragons/#comments</comments>
		<pubDate>Sat, 02 Jan 2010 18:16:12 +0000</pubDate>
		<dc:creator>TheKaptain</dc:creator>
				<category><![CDATA[Cool Toys]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Atlassian]]></category>
		<category><![CDATA[Bamboo]]></category>
		<category><![CDATA[Configuration Management]]></category>
		<category><![CDATA[Confluence]]></category>
		<category><![CDATA[Continuous integration]]></category>
		<category><![CDATA[Crowd]]></category>
		<category><![CDATA[Fisheye]]></category>
		<category><![CDATA[Jira]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[theKaptain]]></category>
		<category><![CDATA[Wiki]]></category>

		<guid isPermaLink="false">http://www.kellyrob99.com/blog/?p=956</guid>
		<description><![CDATA[I&#8217;ve been using Atlassian tools at work for a few years now, and it&#8217;s hard to imagine how much different developing software would be without them.  For those of you who aren&#8217;t familiar with Atlassian, here&#8217;s the 10,000 foot view.

The Atlassian Toolbox
Jira is the cornerstone of the stack and, with the addition of the [...]


Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2010/01/27/thanks-for-the-shirt-atlassian/' rel='bookmark' title='Permanent Link: Thanks for the shirt Atlassian!'>Thanks for the shirt Atlassian!</a></li>
<li><a href='http://www.kellyrob99.com/blog/2010/02/21/developing-faster-with-the-atlassian-intellij-connector/' rel='bookmark' title='Permanent Link: Developing Faster with the Atlassian IntelliJ Connector'>Developing Faster with the Atlassian IntelliJ Connector</a></li>
<li><a href='http://www.kellyrob99.com/blog/2010/01/07/bamboo-grails-and-git-for-continuous-integration/' rel='bookmark' title='Permanent Link: Bamboo, Grails and Git for Continuous Integration'>Bamboo, Grails and Git for Continuous Integration</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been using <a class="zem_slink" title="Atlassian" rel="homepage" href="http://www.atlassian.com/">Atlassian</a> tools at work for a few years now, and it&#8217;s hard to imagine how much different developing software would be without them.  For those of you who aren&#8217;t familiar with Atlassian, here&#8217;s the 10,000 foot view.</p>
<p></p>
<h2>The Atlassian Toolbox</h2>
<p><a class="zem_slink" title="JIRA" rel="homepage" href="http://www.atlassian.com/software/jira">Jira</a> is the cornerstone of the stack and, with the addition of the &#8216;Agile&#8217; <a href="http://www.atlassian.com/software/greenhopper/">GreenHopper</a> plugin, is an ideal tool for tying together issue tracking and project planning in one easy to work with bundle. <a href="http://www.atlassian.com/software/crucible/">Crucible</a> and <a class="zem_slink" title="FishEye (software)" rel="homepage" href="http://www.atlassian.com/software/fisheye">Fisheye</a> provide peer review and repository browsing. The <a class="zem_slink" title="Confluence (software)" rel="homepage" href="http://atlassian.com/confluence">Confluence</a> wiki provides a great framework for organizing and sharing knowledge. <a class="zem_slink" title="Bamboo (software)" rel="homepage" href="http://www.atlassian.com/software/bamboo">Bamboo</a> is an extremely versatile continuous integration platform. <a href="http://www.atlassian.com/software/crowd/">Crowd</a> provides SSO and identity management. And they all can link together nicely to provide consolidated views spanning the entire stack.</p>
<p></p>
<h2>Here Be Dragons</h2>
<p>Late in 2009 Atlassian started a <a href="http://www.atlassian.com/starter/all.jsp">new marketing campaign</a> geared towards smaller deployments: $60 to purchase 10 user licenses for the entire software stack, including 30 day trial licenses with support. Previously some of the applications were available for personal use(2 or 3 Users only) at no cost, and indeed I have a Confluence install I&#8217;ve been using for the last year, but this deal makes the entire stack available at what is really a very reasonable price. And they even include a <a href="http://confluence.atlassian.com/display/ATLAS/Here+Be+Dragons">fun, if slightly corny, tutorial</a> which guides you through installing and configuring all of the applications to link them together. So here&#8217;s my experience &#8216;Slaying the Dragon&#8217;.</p>

<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian/dragon_badge04.png" title="" class="shutterset_singlepic28" >
	<img class="ngg-singlepic" src="http://www.kellyrob99.com/blog/wp-content/gallery/cache/28__x_dragon_badge04.png" alt="dragon_badge04" title="dragon_badge04" />
</a>

<p>The very first thing I discovered was that my years old Intel iMac with 1GB of memory just wasn&#8217;t going to cut it. The recommendation is for 2GB of memory and &#8220;No other applications running — just the operating system, JAVA, <a class="zem_slink" href="http://www.postgresql.org/" title="PostgreSQL" rel="homepage">PostgreSQL</a> and the Atlassian applications&#8221; so I of course took that as an opportunity to ask Santa for a memory upgrade.</p>
<p>Ten days later, with 4GB of brand new RAM installed I got much further than the SLOW grind that was Crowd + Jira + Confluence + iTunes fighting with each other over 1 gig of memory(shudder). Aside from a couple of minor hiccups, everything installed without hassle and the instructions were nothing short of spectacular. I did have to make some tweaks to the postgres database configuration upping the number of allowed connections; apparently this setup is more than a little connection hungry, tsk tsk. Crowd is the one application I&#8217;m least familiar with, and integrating with it seemed to be the most actual &#8216;work&#8217; but hey &#8211; if manually copying around and modifying a couple of configuration files is the biggest hassle involved in providing SSO for 5 enterprise apps, I think I can live with it.&nbsp; I am probably going to have to bite the bullet and invest in a more practical server machine, but I&#8217;m pretty sure the 2010 budget can find room for at least one new computer. </p>
<p></p>
<h2>Been There, Done That, Where&#8217;s my T-shirt?</h2>
<p>I&#8217;ve already started to plan out milestones for the new year&#8217;s projects in Jira, so I guess I&#8217;m already committed to paying the $60 when my trial period expires. Especially when Atlassian is donating all proceeds to <a href="http://www.roomtoread.org/">Room to Read</a>. I get enterprise-ready software for cheap AND all the money goes to a good cause. Win-win in my books &#8211; and a great job by Atlassian(on both the software and the charitable good.) Did I mention they&#8217;re sending out free t-shirts to anyone who completes the challenge?<br />
 <img src='http://www.kellyrob99.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>In the gallery below is a screen shot for the single Jira Dashboard view you end up with at the end of the exercise. It ties together activity from each of the applications into one homogeneous view, and each widget is color coded to represent where the data is being drawn from. If you&#8217;re looking for an affordable solution to help streamline your work at home or in a small development team, check it out!<br />

<div class="ngg-galleryoverview" id="ngg-gallery-7-956">


	<!-- Piclense link -->
	<div class="piclenselink">
		<a class="piclenselink" href="javascript:PicLensLite.start({feedUrl:'http://www.kellyrob99.com/blog/wp-content/plugins/nextgen-gallery/xml/media-rss.php?gid=7&amp;mode=gallery'});">
			[View with PicLens]		</a>
	</div>
	
	<!-- Thumbnails -->
		
	<div id="ngg-image-28" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian/dragon_badge04.png" title=" " class="shutterset_set_7" >
								<img title="dragon_badge04" alt="dragon_badge04" src="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian/thumbs/thumbs_dragon_badge04.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-29" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian/slayedthedragon.png" title=" " class="shutterset_set_7" >
								<img title="slayedthedragon" alt="slayedthedragon" src="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian/thumbs/thumbs_slayedthedragon.png" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-34" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian/img_1405.jpg" title="Well earned and bright green, I&amp;#039;ll wear it with pride." class="shutterset_set_7" >
								<img title="Here&amp;#039;s the t-shirt" alt="Here&amp;#039;s the t-shirt" src="http://www.kellyrob99.com/blog/wp-content/gallery/atlassian/thumbs/thumbs_img_1405.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 	 	
	<!-- Pagination -->
 	<div class='ngg-clear'></div>
 	
</div>

</p>
<div class="zemanta-pixie"><a class="zemanta-pixie-a" title="Reblog this post [with Zemanta]" href="http://reblog.zemanta.com/zemified/c5c88f70-41dd-4e11-8a85-65f9707f5e09/"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_c.png?x-id=c5c88f70-41dd-4e11-8a85-65f9707f5e09" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Atlassian%3A+Here+Be+Dragons+http://heqn5.th8.us" title="Post to Twitter"><img class="nothumb" src="http://www.kellyrob99.com/blog/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Atlassian%3A+Here+Be+Dragons+http://heqn5.th8.us" title="Post to Twitter">Tweet This Post</a></p>

<p>Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2010/01/27/thanks-for-the-shirt-atlassian/' rel='bookmark' title='Permanent Link: Thanks for the shirt Atlassian!'>Thanks for the shirt Atlassian!</a></li>
<li><a href='http://www.kellyrob99.com/blog/2010/02/21/developing-faster-with-the-atlassian-intellij-connector/' rel='bookmark' title='Permanent Link: Developing Faster with the Atlassian IntelliJ Connector'>Developing Faster with the Atlassian IntelliJ Connector</a></li>
<li><a href='http://www.kellyrob99.com/blog/2010/01/07/bamboo-grails-and-git-for-continuous-integration/' rel='bookmark' title='Permanent Link: Bamboo, Grails and Git for Continuous Integration'>Bamboo, Grails and Git for Continuous Integration</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.kellyrob99.com/blog/2010/01/02/atlassian-here-be-dragons/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Jira Grails Plugin</title>
		<link>http://www.kellyrob99.com/blog/2009/12/16/jira-grails-plugin/</link>
		<comments>http://www.kellyrob99.com/blog/2009/12/16/jira-grails-plugin/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 08:31:16 +0000</pubDate>
		<dc:creator>TheKaptain</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Atlassian]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Jira]]></category>
		<category><![CDATA[MOP]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[theKaptain]]></category>
		<category><![CDATA[XML-RPC]]></category>

		<guid isPermaLink="false">http://www.kellyrob99.com/blog/?p=958</guid>
		<description><![CDATA[I set out to explore some of the Atlassian API&#8217;s this week, along with a test drive of Jira 4, and ended up developing a simple XML-RPC plugin for Grails. Utilizing little more than the Groovy XMLRPC library I was able to implement a client service for the Jira XmlRpcService in minutes.
Nothing terribly complicated going [...]


Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2010/01/07/bamboo-grails-and-git-for-continuous-integration/' rel='bookmark' title='Permanent Link: Bamboo, Grails and Git for Continuous Integration'>Bamboo, Grails and Git for Continuous Integration</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/10/25/grails-ui-datatable-using-xml-for-a-model/' rel='bookmark' title='Permanent Link: Grails-UI DataTable using XML for a model'>Grails-UI DataTable using XML for a model</a></li>
<li><a href='http://www.kellyrob99.com/blog/2010/02/21/developing-faster-with-the-atlassian-intellij-connector/' rel='bookmark' title='Permanent Link: Developing Faster with the Atlassian IntelliJ Connector'>Developing Faster with the Atlassian IntelliJ Connector</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>I set out to explore some of the Atlassian API&#8217;s this week, along with a test drive of <a href="http://www.atlassian.com/software/jira/">Jira 4</a>, and ended up developing a simple XML-RPC plugin for <a href="http://grails.org/">Grails</a>. Utilizing little more than the <a href="http://groovy.codehaus.org/XMLRPC">Groovy XMLRPC library</a> I was able to implement a client service for the Jira XmlRpcService in minutes.</p>
<p>Nothing terribly complicated going on for this plugin. Aside from the XMLRPC library and one more jar it depends upon there&#8217;s a service which implements calls for all of the methods on the XmlRpcService interface and a &#8216;helper&#8217; class that makes using it a little easier(removes the need to pass the host name into each method).  And any controller injected with the service gets a withJira(hostname, Closure) method which wraps the &#8216;helper&#8217; class. This might not be the optimal way to do things, but I was looking for some better experience with MOP&#8217;ing in Groovy along with this little project so it worked out perfectly for me.</p>
<p>The method added to Controller classes just creates a &#8216;helper&#8217; and sets it as the delegate for the closure.</p>
<pre class="brush: groovy;">
        cClass.metaClass.withJira = {String hostname, Closure closure -&gt;
            def helper = delegate.jiraXmlRpcService.createHelper(hostname)
            closure.setDelegate(helper)
            closure.setResolveStrategy(Closure.DELEGATE_FIRST)
            closure()
        }
</pre>
<p>Calling the withJira method looks like this, along with minimal exception handling:</p>
<pre class="brush: groovy;">
            try
            {
                def projects, priorities, serverInfo
                withJira(jiraInstance.baseUrl) {
                    def token = login(jiraInstance.userName, jiraInstance.password)
                    serverInfo = getServerInfo(token)
                    priorities = getPriorities(token)
                    projects = getProjectsNoSchemes(token)
                    logout(token)
                }
                [jiraInstance: jiraInstance, projects: projects, priorities: priorities, serverInfo: serverInfo]
            }
            catch (e)
            {
                flash.message = &quot;Failed to load data from ${jiraInstance.baseUrl}&quot;
                redirect(action: &quot;list&quot;)
            }
</pre>
<p>The &#8216;helper&#8217; class itself represents an experiment with the Groovy &#8216;methodMissing&#8217; behaviour. The idea is to store the &#8216;hostname&#8217; for a series of calls against the stateless service and add that as the first parameter for all wrapped methods. It was simple and quick, but right off the bat you lose the ability to use IDE syntax completion support on this object. I thought another possibility here would be to use the @Delegate annotation on the service and/or Closure currying to add the additional &#8216;hostname&#8217; parameter to methods.</p>
<pre class="brush: groovy;">
class JiraXmlRpcServiceHelper
{
    def hostname
    def JiraXmlRpcService service

    def methodMissing(String name, args)
    {
        assert hostname &amp;amp;&amp;amp; service
        def method = service.metaClass.methods.find {it.name == name}
        if(!method)
        {
            throw new NotImplementedException(&quot;The $name method is not implemented for ${this.getClass()}&quot;)
        }

        def newArgs = [hostname]
        args.each{newArgs &amp;lt;&amp;lt; it}
        return method.invoke(service, newArgs as Object[])
    }
}
</pre>
<p>This plugin works with Grails 1.2.0.RC1 and represents about 8 hours of work all told &#8211; and a lot of fun to make! Jira 4 is not too shappy either, especially with the GreenHopper plugin. But that&#8217;s a post for another day.</p>
<p>A special thank you to <a href="http://www.manning.com/gsmith/">Grails in Action</a> and <a href="http://naleid.com/blog/2009/06/25/groovy-closures-make-unit-testing-with-soft-asserts-simple/">this article by Ted Naleid</a> &#8211; both were extremely helpful putting this together. If you care to download it and take a spin here it is. Feedback is always welcome!</p>
<a class="downloadlink" href="http://www.kellyrob99.com/blog/wp-content/plugins/download-monitor/download.php?id=1" title="Version0.1 downloaded 63 times" >V0.1 of JiraGrailsPlugin (63)</a>
<div class="zemanta-pixie"><a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/3963a585-41c6-4cbb-a3b3-d2c006799a09/" title="Reblog this post [with Zemanta]"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=3963a585-41c6-4cbb-a3b3-d2c006799a09" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related pretty-attribution"><script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"></script></span></div>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Jira+Grails+Plugin+http://bfegq.th8.us" title="Post to Twitter"><img class="nothumb" src="http://www.kellyrob99.com/blog/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Jira+Grails+Plugin+http://bfegq.th8.us" title="Post to Twitter">Tweet This Post</a></p>

<p>Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2010/01/07/bamboo-grails-and-git-for-continuous-integration/' rel='bookmark' title='Permanent Link: Bamboo, Grails and Git for Continuous Integration'>Bamboo, Grails and Git for Continuous Integration</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/10/25/grails-ui-datatable-using-xml-for-a-model/' rel='bookmark' title='Permanent Link: Grails-UI DataTable using XML for a model'>Grails-UI DataTable using XML for a model</a></li>
<li><a href='http://www.kellyrob99.com/blog/2010/02/21/developing-faster-with-the-atlassian-intellij-connector/' rel='bookmark' title='Permanent Link: Developing Faster with the Atlassian IntelliJ Connector'>Developing Faster with the Atlassian IntelliJ Connector</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.kellyrob99.com/blog/2009/12/16/jira-grails-plugin/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Different Flavors of Embedded Groovy in Java Apps or &#8220;How To Make your Java Groovier!&#8221;</title>
		<link>http://www.kellyrob99.com/blog/2009/11/21/different-flavors-of-embedded-groovy-in-java-apps-or-how-to-make-your-java-groovier/</link>
		<comments>http://www.kellyrob99.com/blog/2009/11/21/different-flavors-of-embedded-groovy-in-java-apps-or-how-to-make-your-java-groovier/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 04:28:04 +0000</pubDate>
		<dc:creator>TheKaptain</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Console]]></category>
		<category><![CDATA[dynamic execution]]></category>
		<category><![CDATA[embedded]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[groovyConsole]]></category>
		<category><![CDATA[GroovyScriptEngine]]></category>
		<category><![CDATA[GroovyShell]]></category>
		<category><![CDATA[Hello world program]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[Source code]]></category>
		<category><![CDATA[theKaptain]]></category>

		<guid isPermaLink="false">http://www.kellyrob99.com/blog/?p=858</guid>
		<description><![CDATA[Lately I&#8217;ve been thinking about all the different ways to bring Groovy into a pure Java or command line environment, and ended up diving into some code to explore the various options.  Turns out there&#8217;s definitely a good variety of options for running Groovy dynamically inside and out of a Java application. I started [...]


Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/10/04/groovy-clibuilder-with-multiple-arguments/' rel='bookmark' title='Permanent Link: Groovy CliBuilder with multiple arguments'>Groovy CliBuilder with multiple arguments</a></li>
<li><a href='http://www.kellyrob99.com/blog/2010/02/11/a-one-day-griffon-applicationpresentation/' rel='bookmark' title='Permanent Link: A One Day Griffon Application/Presentation'>A One Day Griffon Application/Presentation</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/12/16/jira-grails-plugin/' rel='bookmark' title='Permanent Link: Jira Grails Plugin'>Jira Grails Plugin</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Lately I&#8217;ve been thinking about all the different ways to bring Groovy into a pure Java or command line environment, and ended up diving into some code to explore the various options.  Turns out there&#8217;s definitely a good variety of options for running Groovy dynamically inside and out of a Java application. I started out on <a href="http://groovy.codehaus.org/Embedding+Groovy">this page from the Groovy site</a>.<br />
In particular for the environments I&#8217;ve been working in lately it&#8217;s been important to be able to run the same code both from within a Java application and from the command line. It&#8217;s also been a &#8216;nice to have&#8217; to be able to package a jar with a bunch of the same scripts compiled together. Using maven as a harness also has the benefit of allowing for testing compiled scripts directly through instantiation even though the intended usage is from within a Java app using one of these methods. Source code is <a href="http://github.com/kellyrob99/running-groovy">available here on github</a>.</p>
<p></p>
<h3>Groovy on the command line</h3>
<p>The quickest and simplest way to run a Groovy Script or Class, command line arguments are automatically marshalled into an &#8216;args&#8217; String array. Please note that due to a problem I&#8217;m having with my syntax highlighter plugin the process execution is shown here in single quotes; the actual code requires a GString(double quoted) in order to do the replacement for the inline variable. <code>&amp;quot;</code> THAT Wordpress!</p>
<pre class="brush: groovy;">
//the script
myArgs = args
result = args.join(' ')
println result
println myArgs

//...and the test
    void testGroovyCall()
    {
        def proc = 'groovy $groovyScriptOne Hello World'.execute()
        proc.waitFor()
        def result = proc.text.split()
        assert result[0] == 'Hello'
        assert result[1] == 'World'
    }
</pre>
<p></p>
<h3>GroovyShell</h3>
<p>This is the basis of Groovy script execution. The <a href="http://groovy.codehaus.org/api/groovy/lang/GroovyShell.html">GroovyShell</a> allows for executing scripts, passing in a particular Binding context that allows for bi-directional communication between the script and the calling code. Parameters can be passed into the executing script in the Binding and results can be stored there to be returned to the calling context. GroovyShell also allows for running a class from the &#8216;main&#8217; method, passing in String arguments. It will also execute implementers of Runnable and test files for  JUnit or TestNG. Script text can also be declared inline and executed in the same way as files on disk. All in all, pretty bloody handy. Here&#8217;s a straightforward example of running a dirt simple Groovy script and inspecting the results. Note that this isn&#8217;t executable as shown, but I&#8217;ll provide the full source code on github for anyone who wants a closer look. Note that I&#8217;m also passing in an &#8216;out&#8217; variable in the Binding, which effectively redirect System.out to a specified Writer implementation &#8211; a nice touch for inspecting output.</p>
<pre class="brush: groovy;">
//the script
myArgs = args
result = args.join(' ')
println result
println myArgs

 //...and the test
    void testGroovyShell()
    {
        Binding binding = helper.createBinding()
        def shell = new GroovyShell(binding)
        shell.evaluate(new File(groovyScriptOne))
        helper.assertBinding(binding)
    }

//...and the Binding creation/assertion
     def static args = ['Hello', 'World'].asImmutable()
     /**
     * Create a Binding with a single parameter to be passed to scripts and an 'out' Writer to redirect console output.
     */
    private Binding createBinding()
    {
        Binding binding = new Binding()
        def sWriter = new StringWriter()
        def pWriter = new PrintWriter(sWriter)
        binding.setVariable ('args', new ArrayList(args))
        binding.setVariable ('out', pWriter)
        return binding
    }

    /**
     * Assert that the expected 'common' actions are done with the Binding by each of the use cases.
     * The original 'args' should be as expected.
     * A copy of 'args' should have been placed in the Binding during execution.
     * The 'result' should be the concatentation of 'args' separated by spaces.
     */
    private def assertBinding(Binding binding)
    {
        assert binding.variables.size() == 4
        assert binding.variables.args.value[0].toString() == args[0]
        assert binding.variables.args.value[1].toString() == args[1]
        assert binding.variables.result.value.toString() == args.join(' ')
        assert binding.variables.myArgs.value[0].toString() == args[0]
        assert binding.variables.myArgs.value[1].toString() == args[1]
    }
</pre>
<p></p>
<h3>GroovyScriptEngine</h3>
<p>The <a href="http://groovy.codehaus.org/api/groovy/util/GroovyScriptEngine.html">GroovyScriptEngine</a> enables dynamically running Groovy sources located in a fixed set of content roots,  complete with reloading modified scripts in between executions. Running a Groovy script this way is essentially the same as using GroovyShell.</p>
<pre class="brush: groovy;">
    void testGroovyScriptEngine()
    {
        Binding binding = helper.createBinding()
        def gse = new GroovyScriptEngine(new File('.').toURL())
        gse.run(groovyScriptOne, binding)
        helper.assertBinding(binding)
    }
</pre>
<p></p>
<h3>GroovyClassLoader</h3>
<p>An extension to URLClassLoader that enables parsing Groovy sources into Class representations. Once a Class object is created, instances of the class can be created easily and either cast to a known type or manipulated through convention by use of the standard Groovy &#8216;invokeMethod&#8217;.  This works equally well on Groovy and Java btw. Here&#8217;s an example of running a Java class using <a href="http://groovy.codehaus.org/api/groovy/lang/GroovyClassLoader.html">GroovyClassLoader</a>. In this case the Java file has a field called &#8216;binding&#8217; and implements a &#8216;run&#8217; method.</p>
<pre class="brush: groovy;">
    /**
     * Dynamically compile, instantiate, inspect and call methods on a POJO.
     */
    void testGroovyClassLoaderOnJava()
    {
        GroovyClassLoader loader = new GroovyClassLoader();
        Class javaClass = loader.parseClass(new File(javaFileOne));

        def groovyObject = javaClass.newInstance();
        def binding = helper.createBinding()
        groovyObject.binding = binding
        if(groovyObject.metaClass.respondsTo(groovyObject, 'run'))
        {
            groovyObject.invokeMethod('run', null);
            helper.assertBinding(binding)
        }
        if(groovyObject.metaClass.respondsTo(groovyObject, 'main'))
        {
            groovyObject.invokeMethod('main', new ArrayList(helper.args) as String[]);
        }
    }
</pre>
<p></p>
<h3>(Groovy)Console</h3>
<p>The <a href="http://groovy.codehaus.org/gapi/groovy/ui/Console.html">Console</a> can be embedded in Java or Groovy code to provide a dynamic interactive Swing environment. This is the same UI spawned from the command line invocation of &#8216;groovyConsole&#8217;. Internally it uses GroovyShell for actual execution, and so can do everything that GroovyShell can do &#8211; plus a couple of additions. For one, you can add jars and/or directories to the classpath used when executing your scripts.<br />
<a href="http://www.kellyrob99.com/blog/?attachment_id=885" rel="attachment wp-att-885"><img src="http://www.kellyrob99.com/blog/wp-content/uploads/2009/11/Picture-6.png" alt="Groovy Console" title="Groovy Console" class="size-full wp-image-885" width="651" height="457" /></a></p>
<p></p>
<h3>The Best of Both Worlds &#8211; at Least for my use case</h3>
<p>In actual practice these patterns can be used a lot more successfully by observing standard Java practices, like casting classes parsed using GroovyClassLoader to a known interface before interacting with them, or by using Classes to organize business logic inside of a Script that essentially functions as a &#8216;main&#8217; method.  This example defines two dependent internal classes, marshals parameters to them and then returns the results attached to the originally passed in Binding.</p>
<pre class="brush: groovy;">
/**
 * Classes inside of a Script.
 */
class TestableClass
{
    Binding binding

    def run()
    {
        binding.with
        {
            setVariable('myArgs', getVariable('args'))
            setVariable('result', getVariable('args')?.join(' '))
        }
        return binding
    }
}

class TestableClass2
{
    Binding binding

    public TestableClass2(Binding binding)
    {
        this.binding = binding;
    }

    def run()
    {
        return new TestableClass(binding: binding).run()
    }
}

if (args)
{
    def internalBinding = new Binding()
    internalBinding.setVariable('args', new ArrayList(args))
    internalBinding = new TestableClass2(internalBinding).run()
    args = internalBinding.args
    myArgs = internalBinding.myArgs
    result = internalBinding.result  //return value from script
}
else
{
    println 'no args!!'
}
</pre>
<h2 class="wp-table-reloaded-table-name">Summary of Groovy Execution Methods</h2>

<table id="wp-table-reloaded-id-1-no-1" class="wp-table-reloaded wp-table-reloaded-id-1">
<thead>
	<tr class="row-1 odd">
		<th class="column-1">Method</th><th class="column-2">Groovy Scripts</th><th class="column-3">Groovy Classes</th><th class="column-4">Java</th>
	</tr>
</thead>
<tbody>
	<tr class="row-2 even">
		<td class="column-1">groovy exec on the command line</td><td class="column-2">Yes, passes in String command line argments in a variable called 'args'</td><td class="column-3">Yes, calls the main method with String arguments</td><td class="column-4">No</td>
	</tr>
	<tr class="row-3 odd">
		<td class="column-1">GroovyShell</td><td class="column-2">Yes, parameters passed in a Binding object that the Script can mutate</td><td class="column-3">Yes, calls the main method with String arguments</td><td class="column-4">Yes, no apparent way to pass arguments</td>
	</tr>
	<tr class="row-4 even">
		<td class="column-1">GroovyScriptEngine</td><td class="column-2">Yes, parameters passed in a Binding object that the Script can mutate</td><td class="column-3">Yes, no apparent way to pass arguments</td><td class="column-4">Yes, no apparent way to pass arguments</td>
	</tr>
	<tr class="row-5 odd">
		<td class="column-1">GroovyClassLoader</td><td class="column-2">Yes, instantiate a parsed Class and either cast to a known type or use Groovy reflection methods to call methods</td><td class="column-3">Yes, instantiate a parsed Class and either cast to a known type or use Groovy reflection methods to call methods</td><td class="column-4">Yes, instantiate a parsed Class and either cast to a known type or use Groovy reflection methods to call methods</td>
	</tr>
	<tr class="row-6 even">
		<td class="column-1">(Groovy)Console</td><td class="column-2">Same as GroovyShell</td><td class="column-3">Same as GroovyShell</td><td class="column-4">Same as GroovyShell</td>
	</tr>
</tbody>
</table>
<span class="wp-table-reloaded-table-description"></span>

<div class="zemanta-pixie"><a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/8cba1f46-7f81-473a-8fe0-ce5f0a45ec40/" title="Reblog this post [with Zemanta]"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_c.png?x-id=8cba1f46-7f81-473a-8fe0-ce5f0a45ec40" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related pretty-attribution"><script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"></script></span></div>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Different+Flavors+of+Embedded+Groovy+in+Java+Apps+or+%E2%80%9CHow+To+Make+your+Java+Groovier%21%E2%80%9D+http://9bnoi.th8.us" title="Post to Twitter"><img class="nothumb" src="http://www.kellyrob99.com/blog/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Different+Flavors+of+Embedded+Groovy+in+Java+Apps+or+%E2%80%9CHow+To+Make+your+Java+Groovier%21%E2%80%9D+http://9bnoi.th8.us" title="Post to Twitter">Tweet This Post</a></p>

<p>Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/10/04/groovy-clibuilder-with-multiple-arguments/' rel='bookmark' title='Permanent Link: Groovy CliBuilder with multiple arguments'>Groovy CliBuilder with multiple arguments</a></li>
<li><a href='http://www.kellyrob99.com/blog/2010/02/11/a-one-day-griffon-applicationpresentation/' rel='bookmark' title='Permanent Link: A One Day Griffon Application/Presentation'>A One Day Griffon Application/Presentation</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/12/16/jira-grails-plugin/' rel='bookmark' title='Permanent Link: Jira Grails Plugin'>Jira Grails Plugin</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.kellyrob99.com/blog/2009/11/21/different-flavors-of-embedded-groovy-in-java-apps-or-how-to-make-your-java-groovier/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Grails-UI DataTable using XML for a model</title>
		<link>http://www.kellyrob99.com/blog/2009/10/25/grails-ui-datatable-using-xml-for-a-model/</link>
		<comments>http://www.kellyrob99.com/blog/2009/10/25/grails-ui-datatable-using-xml-for-a-model/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 07:06:05 +0000</pubDate>
		<dc:creator>TheKaptain</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Crucible]]></category>
		<category><![CDATA[DataTable]]></category>
		<category><![CDATA[Fisheye]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[google-charts]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[HTTPBuilder]]></category>
		<category><![CDATA[HttpClient]]></category>
		<category><![CDATA[Jira]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[RESTClient]]></category>
		<category><![CDATA[theKaptain]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.kellyrob99.com/blog/?p=836</guid>
		<description><![CDATA[I had a great chance to play with some new stuff this weekend, namely Grails 1.2-M3, the new Grails REST plugin and Groovy in general. Awhile back I wrote some Groovy code to explore the various Jira, Fisheye and Crucible REST api&#8217;s using Apache HttpClient directly, and I wanted to see what it would like [...]


Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/12/16/jira-grails-plugin/' rel='bookmark' title='Permanent Link: Jira Grails Plugin'>Jira Grails Plugin</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/10/24/groovy-reverse-map-sort-done-easy/' rel='bookmark' title='Permanent Link: Groovy reverse map sort done easy'>Groovy reverse map sort done easy</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/07/26/streamingmarkupbuilder-for-groovy-er-xml/' rel='bookmark' title='Permanent Link: StreamingMarkupBuilder for Groovy-er xml'>StreamingMarkupBuilder for Groovy-er xml</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>I had a great chance to play with some new stuff this weekend, namely <a href="http://grails.org/1.2-M3+Release+Notes">Grails 1.2-M3</a>, the new <a href="http://grails.org/plugin/rest">Grails REST plugin</a> and Groovy in general. Awhile back I wrote some Groovy code to explore the various Jira, Fisheye and Crucible REST api&#8217;s using Apache HttpClient directly, and I wanted to see what it would like abstracted behind <a href="http://groovy.codehaus.org/modules/http-builder/">HTTPBuilder</a>. With the help of the <a href="http://grails.org/GrailsUI+Plugin">Grails-UI</a> and <a href="http://grails.org/plugin/google-chart">Google-charts</a> plugins, I got some pretty nice views of the data as well.</p>
<p>First off, dealing with a RESTful call was about as simple as I&#8217;ve ever seen. This is the entire code that deals with creating the connection, authenticating, executing a GET, and parsing the returned XML into a &#8216;data&#8217; property on the response.</p>
<pre class="brush: groovy;">
    private withFisheye(String url, Map args) {
        withRest(uri: url) {
            auth.basic userName, password
            return get(query: args)
        }
    }
</pre>
<p>Getting XML using <a href="http://www.jroller.com/aalmiray/">Andres&#8217;</a> plugin is extremely simple and we can achieve some pretty nice visualizations of the resulting data very easily as well. In particular I wanted to share how to use an XML response as a backing model for DataTable. The excellent examples provided by <a href="http://weblog.dangertree.net/tag/grailsui/">Matthew Taylor on his blog</a> seemed to concentrate on using GORM to load and sort domain objects to utilize as data models. When using XML as an alternative way to represent the data, and using RESTful calls to populate that data, the available sorting options on a DataTable weren&#8217;t able to function properly without a little extra help.</p>
<p>Consider an list of XML elements like this, which represents a single review in Crucible.</p>
<pre class="brush: xml;">
&lt;reviewdata&gt;
    &lt;allowreviewerstojoin&gt;false&lt;/allowreviewerstojoin&gt;
    &lt;author&gt;
        &lt;displayname&gt;Kelly Robinson&lt;/displayname&gt;
        &lt;username&gt;TheKaptain&lt;/username&gt;
    &lt;/author&gt;
    &lt;closedate&gt;20010101T00::00.0000000&lt;/closedate&gt;
    &lt;createdate&gt;20010101T00::00.0000000&lt;/createdate&gt;
    &lt;creator&gt;
        &lt;displayname&gt;Kelly Robinson&lt;/displayname&gt;
        &lt;username&gt;TheKaptain&lt;/username&gt;
    &lt;/creator&gt;
    &lt;description&gt;
        Test review
    &lt;/description&gt;
    &lt;moderator&gt;
        &lt;displayname&gt;Kelly Robinson&lt;/displayname&gt;
        &lt;username&gt;TheKaptain&lt;/username&gt;
    &lt;/moderator&gt;
    &lt;name&gt;
        Test review
    &lt;/name&gt;
    &lt;permaid&gt;
        &lt;id&gt;CR1&lt;/id&gt;
    &lt;/permaid&gt;
    &lt;projectkey&gt;CR&lt;/projectkey&gt;
    &lt;state&gt;Closed&lt;/state&gt;
    &lt;summary&gt;
      Test review
    &lt;/summary&gt;
&lt;/reviewdata&gt;
</pre>
<p>You can leverage this list as a DataTable model by extracting specific elements from the XML, and providing a sorting mechanism based on dynamic map value lookups.</p>
<pre class="brush: groovy;">
    private def createReviewDataJson(HttpServletResponse response, Map params, reviews) {
        def list = []
        response.setHeader(&quot;Cache-Control&quot;, &quot;no-store&quot;)
       //build a List of Maps, one for each row in the DataTable
        reviews.reviewData.each {
            list &lt;&lt; [
                    id: it.permaId.id.text(),
                    author: it.author.displayName.text(),
                    creator: it.creator.displayName.text(),
                    moderator: it.moderator.displayName.text(),
                    description: it.description.text(),
                    state: it.state.text()
            ]
        }
       //sort by the 'order' and 'sort' parameters passed in by DataTable
        switch (params.order) {
            case 'asc':
                list.sort { it.&quot;${params.sort}&quot; } //sort by value where key == params.sort
                break
            case 'desc':
                list.sort {a, b -&gt; b.&quot;${params.sort}&quot; &lt;=&gt; a.&quot;${params.sort}&quot; } //reverse sort by value
                break
        }
       //the entire model
        def data = [totalRecords: list.size(), results: list]
        render data as JSON
    }
</pre>
<p>This model can then be rendered using the <gui :datatable=""> tag. Note that this is pretty much a direct copy of a provided example, nothing fancy here.</p>
<pre class="brush: xml;">
&lt;gui:datatable id=&quot;statDataTable&quot; draggablecolumns=&quot;true&quot; columndefs=&quot;[
        [id:'id', sortable:true, resizeable:true],
        [author:'author', sortable:true, resizeable:true],
        [creator:'creator', sortable:true, resizeable:true],
        [moderator:'moderator',  sortable:true, resizeable:true],
        [description:'description', sortable:true, resizeable:true, formatter:'textarea'],
        [state:'state', sortable:true, resizeable:true]
    ]&quot; paginatorconfig=&quot;[
        template:'{PreviousPageLink} {PageLinks} {NextPageLink} {CurrentPageReport}',
        pageReportTemplate:'{totalRecords} total records'
    ]&quot; sortedby=&quot;id&quot; controller=&quot;fisheye&quot; action=&quot;${action}&quot; resultslist=&quot;results&quot; rowsperpage=&quot;10&quot;&gt;
</pre>
<p>So for very little work you get a sortable, paginated DataTable, complete with column resizing and dragging. The DataTable is also being rendered using a template, allowing it to be used arbitrarily by controller methods that populate the model with different reviews. Pretty cool if you ask me. I also used the same backing XML model to drive some PieCharts, but that&#8217;s perhaps a topic for another post.</p>
<p> <img src='http://www.kellyrob99.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
</gui></p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Grails-UI+DataTable+using+XML+for+a+model+http://8mznn.th8.us" title="Post to Twitter"><img class="nothumb" src="http://www.kellyrob99.com/blog/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Grails-UI+DataTable+using+XML+for+a+model+http://8mznn.th8.us" title="Post to Twitter">Tweet This Post</a></p>

<p>Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/12/16/jira-grails-plugin/' rel='bookmark' title='Permanent Link: Jira Grails Plugin'>Jira Grails Plugin</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/10/24/groovy-reverse-map-sort-done-easy/' rel='bookmark' title='Permanent Link: Groovy reverse map sort done easy'>Groovy reverse map sort done easy</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/07/26/streamingmarkupbuilder-for-groovy-er-xml/' rel='bookmark' title='Permanent Link: StreamingMarkupBuilder for Groovy-er xml'>StreamingMarkupBuilder for Groovy-er xml</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.kellyrob99.com/blog/2009/10/25/grails-ui-datatable-using-xml-for-a-model/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Groovy reverse map sort done easy</title>
		<link>http://www.kellyrob99.com/blog/2009/10/24/groovy-reverse-map-sort-done-easy/</link>
		<comments>http://www.kellyrob99.com/blog/2009/10/24/groovy-reverse-map-sort-done-easy/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 06:54:31 +0000</pubDate>
		<dc:creator>TheKaptain</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[map]]></category>
		<category><![CDATA[sort]]></category>
		<category><![CDATA[theKaptain]]></category>

		<guid isPermaLink="false">http://www.kellyrob99.com/blog/?p=829</guid>
		<description><![CDATA[Sorting a Map by value with Groovy is very simple, due to the added &#8217;sort&#8217; method on the Map interface.

def map = [a:3, b:2, c:1]
map = map.sort {it.value}
assert map == [c:1, b:2, a:3]

Turns out doing a reverse sort on a Map by values is almost as easy.

def map = [a:1, b:2, c:3]
map = map.sort {a, [...]


Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/10/25/grails-ui-datatable-using-xml-for-a-model/' rel='bookmark' title='Permanent Link: Grails-UI DataTable using XML for a model'>Grails-UI DataTable using XML for a model</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/04/08/griffon-swingx-fest-testing/' rel='bookmark' title='Permanent Link: Griffon SwingX Fest testing'>Griffon SwingX Fest testing</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/02/08/my-favorite-new-groovy-trick/' rel='bookmark' title='Permanent Link: My favorite new Groovy trick'>My favorite new Groovy trick</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Sorting a Map by value with Groovy is very simple, due to the added &#8217;sort&#8217; method on the Map interface.</p>
<pre class="brush: groovy;">
def map = [a:3, b:2, c:1]
map = map.sort {it.value}
assert map == [c:1, b:2, a:3]
</pre>
<p>Turns out doing a reverse sort on a Map by values is almost as easy.</p>
<pre class="brush: groovy;">
def map = [a:1, b:2, c:3]
map = map.sort {a, b -&gt; b.value &lt;=&gt; a.value}
assert map == [c:3, b:2, a:1]
</pre>
<p>Using the spaceship operator (&#8216;< =>&#8216;) you can define a very terse syntax for accessing &#8216;compareTo&#8217;, as long as the values in the map implement Comparable that is.<br />
Nice!</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Groovy+reverse+map+sort+done+easy+http://c4m6x.th8.us" title="Post to Twitter"><img class="nothumb" src="http://www.kellyrob99.com/blog/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Groovy+reverse+map+sort+done+easy+http://c4m6x.th8.us" title="Post to Twitter">Tweet This Post</a></p>

<p>Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/10/25/grails-ui-datatable-using-xml-for-a-model/' rel='bookmark' title='Permanent Link: Grails-UI DataTable using XML for a model'>Grails-UI DataTable using XML for a model</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/04/08/griffon-swingx-fest-testing/' rel='bookmark' title='Permanent Link: Griffon SwingX Fest testing'>Griffon SwingX Fest testing</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/02/08/my-favorite-new-groovy-trick/' rel='bookmark' title='Permanent Link: My favorite new Groovy trick'>My favorite new Groovy trick</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.kellyrob99.com/blog/2009/10/24/groovy-reverse-map-sort-done-easy/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Twitter Weekly Updates for 2009-10-12</title>
		<link>http://www.kellyrob99.com/blog/2009/10/11/twitter-weekly-updates-for-2009-10-12/</link>
		<comments>http://www.kellyrob99.com/blog/2009/10/11/twitter-weekly-updates-for-2009-10-12/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 08:59:00 +0000</pubDate>
		<dc:creator>TheKaptain</dc:creator>
				<category><![CDATA[TweetTweet]]></category>
		<category><![CDATA[kellyrob99]]></category>
		<category><![CDATA[theKaptain]]></category>
		<category><![CDATA[tweet]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.kellyrob99.com/blog/2009/10/11/twitter-weekly-updates-for-2009-10-12/</guid>
		<description><![CDATA[
LOL! RT 37signals is now worth $100 billion.  Congrats guys!  http://bit.ly/11P45W #
Back working with JBoss Seam today.  And it seems I missed it too. Don&#39;t worry Grails, I still love you more   #
RT @aalmiray: ♺ @pledbrook How to test your Grails scripts: http://tinyurl.com/ycsjwc8 we&#39;re so borrowing that for #griffon  [...]


Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/09/06/twitter-weekly-updates-for-2009-09-07/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-09-07'>Twitter Weekly Updates for 2009-09-07</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/09/27/twitter-weekly-updates-for-2009-09-28-2/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-09-28'>Twitter Weekly Updates for 2009-09-28</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/05/03/twitter-weekly-updates-for-2009-05-03/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-05-03'>Twitter Weekly Updates for 2009-05-03</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<ul class="aktt_tweet_digest">
<li>LOL! RT 37signals is now worth $100 billion.  Congrats guys!  <a href="http://bit.ly/11P45W" rel="nofollow">http://bit.ly/11P45W</a> <a href="http://twitter.com/kellyrob99/statuses/4634056025" class="aktt_tweet_time">#</a></li>
<li>Back working with JBoss Seam today.  And it seems I missed it too. Don&#39;t worry Grails, I still love you more <img src='http://www.kellyrob99.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  <a href="http://twitter.com/kellyrob99/statuses/4642798758" class="aktt_tweet_time">#</a></li>
<li>RT @aalmiray: ♺ @<a href="http://twitter.com/pledbrook" class="aktt_username">pledbrook</a> How to test your Grails scripts: <a href="http://tinyurl.com/ycsjwc8" rel="nofollow">http://tinyurl.com/ycsjwc8</a> we&#39;re so borrowing that for #<a href="http://search.twitter.com/search?q=%23griffon" class="aktt_hashtag">griffon</a> <img src='http://www.kellyrob99.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  <a href="http://twitter.com/kellyrob99/statuses/4660253053" class="aktt_tweet_time">#</a></li>
<li>Out for lunch on the boss. Turns out hacking out awesome Groovy scripts has an added benefit <img src='http://www.kellyrob99.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  <a href="http://twitter.com/kellyrob99/statuses/4662086234" class="aktt_tweet_time">#</a></li>
<li>RT @feliciaday: Are you aware you&#39;re on the cover of USA Today? :O <a href="http://twitpic.com/kj71s" rel="nofollow">http://twitpic.com/kj71s</a> (via @<a href="http://twitter.com/FlawedHero" class="aktt_username">FlawedHero</a>) NO!What the?!? #<a href="http://search.twitter.com/search?q=%23momwillbeproud" class="aktt_hashtag">momwillbeproud</a> <a href="http://twitter.com/kellyrob99/statuses/4668188220" class="aktt_tweet_time">#</a></li>
<li>Thank you Atlassian! <a href="http://bit.ly/4tuetL" rel="nofollow">http://bit.ly/4tuetL</a> Jira 4 looks pretty awesome. <a href="http://twitter.com/kellyrob99/statuses/4676658122" class="aktt_tweet_time">#</a></li>
<li>@<a href="http://twitter.com/hansamann" class="aktt_username">hansamann</a> Snow Leopard brought my old iMac back to life &#8211; much better startup times and generally &#39;snappier&#39; response. <a href="http://twitter.com/hansamann/statuses/4686774658" class="aktt_tweet_reply">in reply to hansamann</a> <a href="http://twitter.com/kellyrob99/statuses/4686857380" class="aktt_tweet_time">#</a></li>
<li>Taking my father-in-law out for lunch. Happy birthday Ray!!! <a href="http://twitter.com/kellyrob99/statuses/4715491595" class="aktt_tweet_time">#</a></li>
<li>That is one fantastic demo. Nice job Andres! RT @aalmiray: Griffon @ SpringHispano <a href="http://ff.im/-9sJMU" rel="nofollow">http://ff.im/-9sJMU</a> <a href="http://twitter.com/kellyrob99/statuses/4720349982" class="aktt_tweet_time">#</a></li>
<li>RT: @<a href="http://twitter.com/Rod_Phillips" class="aktt_username">Rod_Phillips</a> &#8211; FUNDRAISER GREATER VICTORIA DOWN SYNDROME SOCIETY: <a href="http://ow.ly/tLHt" rel="nofollow">http://ow.ly/tLHt</a> All Liquor Plus stores #<a href="http://search.twitter.com/search?q=%23yyj" class="aktt_hashtag">yyj</a> (via @<a href="http://twitter.com/dillyh" class="aktt_username">dillyh</a>) <a href="http://twitter.com/kellyrob99/statuses/4780082117" class="aktt_tweet_time">#</a></li>
<li>Thanksgiving came a bit early. Tnx Beatles Rock Band for proving I would fail as a rock guitarist. <a href="http://twitter.com/kellyrob99/statuses/4780128294" class="aktt_tweet_time">#</a></li>
<li>@<a href="http://twitter.com/ajordens" class="aktt_username">ajordens</a> congrats on the run man <a href="http://twitter.com/ajordens/statuses/4787626946" class="aktt_tweet_reply">in reply to ajordens</a> <a href="http://twitter.com/kellyrob99/statuses/4787655860" class="aktt_tweet_time">#</a></li>
</ul>
<p class="aktt_credit">Powered by <a href="http://alexking.org/projects/wordpress">Twitter Tools</a></p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Twitter+Weekly+Updates+for+2009-10-12+http://k87ak.th8.us" title="Post to Twitter"><img class="nothumb" src="http://www.kellyrob99.com/blog/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Twitter+Weekly+Updates+for+2009-10-12+http://k87ak.th8.us" title="Post to Twitter">Tweet This Post</a></p>

<p>Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/09/06/twitter-weekly-updates-for-2009-09-07/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-09-07'>Twitter Weekly Updates for 2009-09-07</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/09/27/twitter-weekly-updates-for-2009-09-28-2/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-09-28'>Twitter Weekly Updates for 2009-09-28</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/05/03/twitter-weekly-updates-for-2009-05-03/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-05-03'>Twitter Weekly Updates for 2009-05-03</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.kellyrob99.com/blog/2009/10/11/twitter-weekly-updates-for-2009-10-12/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter Weekly Updates for 2009-10-05</title>
		<link>http://www.kellyrob99.com/blog/2009/10/04/twitter-weekly-updates-for-2009-10-05-2/</link>
		<comments>http://www.kellyrob99.com/blog/2009/10/04/twitter-weekly-updates-for-2009-10-05-2/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 08:59:00 +0000</pubDate>
		<dc:creator>TheKaptain</dc:creator>
				<category><![CDATA[TweetTweet]]></category>
		<category><![CDATA[kellyrob99]]></category>
		<category><![CDATA[theKaptain]]></category>
		<category><![CDATA[tweet]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.kellyrob99.com/blog/2009/10/04/twitter-weekly-updates-for-2009-10-05-2/</guid>
		<description><![CDATA[
RT @alphasimple http://alphasimple.com is now available! Please complete survey. Interested in alpha testing?Just drop us a line.RT@abstratt #
Is it an omen if your screensaver shows words from a Dictionary and you come back to your desk to find &#34;anomaly&#34; splashed across the screen? #
For all the times I&#39;m told to build(another) JTable visualization. RT @kirillcool: [...]


Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/09/06/twitter-weekly-updates-for-2009-09-07/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-09-07'>Twitter Weekly Updates for 2009-09-07</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/08/30/twitter-weekly-updates-for-2009-08-31/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-08-31'>Twitter Weekly Updates for 2009-08-31</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/08/30/twitter-weekly-updates-for-2009-08-31-2/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-08-31'>Twitter Weekly Updates for 2009-08-31</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<ul class="aktt_tweet_digest">
<li>RT @<a href="http://twitter.com/alphasimple" class="aktt_username">alphasimple</a> <a href="http://alphasimple.com" rel="nofollow">http://alphasimple.com</a> is now available! Please complete survey. Interested in alpha testing?Just drop us a line.RT@<a href="http://twitter.com/abstratt" class="aktt_username">abstratt</a> <a href="http://twitter.com/kellyrob99/statuses/4444452868" class="aktt_tweet_time">#</a></li>
<li>Is it an omen if your screensaver shows words from a Dictionary and you come back to your desk to find &quot;anomaly&quot; splashed across the screen? <a href="http://twitter.com/kellyrob99/statuses/4531166714" class="aktt_tweet_time">#</a></li>
<li>For all the times I&#39;m told to build(another) JTable visualization. RT @kirillcool: And yes, it’s really all Java Swing &#8211; <a href="http://bit.ly/uRFPE" rel="nofollow">http://bit.ly/uRFPE</a> <a href="http://twitter.com/kellyrob99/statuses/4533333039" class="aktt_tweet_time">#</a></li>
<li>RT @Rod_Phillips: #<a href="http://search.twitter.com/search?q=%23yyj" class="aktt_hashtag">yyj</a> 1st 50 replies or RT&#39;s gets choice of 1 of the 3 items. Pick up after 6:30pm today. <a href="http://twitter.com/kellyrob99/statuses/4538516247" class="aktt_tweet_time">#</a></li>
<li>@<a href="http://twitter.com/Rod_Phillips" class="aktt_username">Rod_Phillips</a> Royal Oak please <img src='http://www.kellyrob99.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  <a href="http://twitter.com/kellyrob99/statuses/4538526784" class="aktt_tweet_time">#</a></li>
<li>@<a href="http://twitter.com/Rod_Phillips" class="aktt_username">Rod_Phillips</a> Red at Royal Oak tyvm, sir <a href="http://twitter.com/kellyrob99/statuses/4538795603" class="aktt_tweet_time">#</a></li>
<li>@<a href="http://twitter.com/Rod_Phillips" class="aktt_username">Rod_Phillips</a> quality of live FTW! and if it&#39;s not too late &#8211; Hermans is my fave beer, so if I could get that instead of red? <a href="http://twitter.com/Rod_Phillips/statuses/4539010221" class="aktt_tweet_reply">in reply to Rod_Phillips</a> <a href="http://twitter.com/kellyrob99/statuses/4541382372" class="aktt_tweet_time">#</a></li>
<li>RT Happy 1st birthday @GroovyMag! (via @<a href="http://twitter.com/hartsock" class="aktt_username">hartsock</a>) <a href="http://twitter.com/kellyrob99/statuses/4557508277" class="aktt_tweet_time">#</a></li>
</ul>
<p class="aktt_credit">Powered by <a href="http://alexking.org/projects/wordpress">Twitter Tools</a></p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Twitter+Weekly+Updates+for+2009-10-05+http://g7q2f.th8.us" title="Post to Twitter"><img class="nothumb" src="http://www.kellyrob99.com/blog/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Twitter+Weekly+Updates+for+2009-10-05+http://g7q2f.th8.us" title="Post to Twitter">Tweet This Post</a></p>

<p>Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/09/06/twitter-weekly-updates-for-2009-09-07/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-09-07'>Twitter Weekly Updates for 2009-09-07</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/08/30/twitter-weekly-updates-for-2009-08-31/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-08-31'>Twitter Weekly Updates for 2009-08-31</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/08/30/twitter-weekly-updates-for-2009-08-31-2/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-08-31'>Twitter Weekly Updates for 2009-08-31</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.kellyrob99.com/blog/2009/10/04/twitter-weekly-updates-for-2009-10-05-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Groovy CliBuilder with multiple arguments</title>
		<link>http://www.kellyrob99.com/blog/2009/10/04/groovy-clibuilder-with-multiple-arguments/</link>
		<comments>http://www.kellyrob99.com/blog/2009/10/04/groovy-clibuilder-with-multiple-arguments/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 23:30:07 +0000</pubDate>
		<dc:creator>TheKaptain</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[cli]]></category>
		<category><![CDATA[CliBuilder]]></category>
		<category><![CDATA[command line interface]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[theKaptain]]></category>

		<guid isPermaLink="false">http://www.kellyrob99.com/blog/?p=797</guid>
		<description><![CDATA[I&#8217;ve been writing a lot of Groovy scripts lately and have developed quite a fondness for the CliBuilder along the way.
There&#8217;s lots of great examples on the internet, but I could only find one place that demonstrated how to easily consume an unknown number of parameters as a List and that was a copy of [...]


Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/11/21/different-flavors-of-embedded-groovy-in-java-apps-or-how-to-make-your-java-groovier/' rel='bookmark' title='Permanent Link: Different Flavors of Embedded Groovy in Java Apps or &#8220;How To Make your Java Groovier!&#8221;'>Different Flavors of Embedded Groovy in Java Apps or &#8220;How To Make your Java Groovier!&#8221;</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/10/25/grails-ui-datatable-using-xml-for-a-model/' rel='bookmark' title='Permanent Link: Grails-UI DataTable using XML for a model'>Grails-UI DataTable using XML for a model</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/08/09/using-the-testng-dataprovider-with-groovy/' rel='bookmark' title='Permanent Link: Using the TestNG DataProvider with Groovy'>Using the TestNG DataProvider with Groovy</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been writing a lot of Groovy scripts lately and have developed quite a fondness for the CliBuilder along the way.<br />
There&#8217;s lots of great examples on the internet, but I could only find one place that demonstrated how to easily consume an unknown number of parameters as a List and that was a copy of the <a href="http://www.koders.com/noncode/fidDB2306122CA9674CE22373B7C018173B53BF66A2.aspx">CliBuilderTest I found on Koders</a>.  There&#8217;s also some explanation for the different behavior inherent in the <a href="http://commons.apache.org/cli/">Apache Commons Cli</a> libraries V1.0 and V1.1 that CliBuilder encapsulates(there is a 1.2 version, but from the documentation it seems CliBuilder may not be fully compatible with it).</p>
<p>Here&#8217;s a GroovyTestCase that exercises CliBuilder with multiple arguments.</p>
<div>
<pre class="brush: groovy;">
package org.kar
import org.apache.commons.cli.Option
/**
 * Demonstrates usage of the CliBuilder with multiple arguments to create a List.
 */
class CliBuilderDemoTest
extends GroovyTestCase {
    /**
     * You can specify multiple arguments one at a time.
     */
    void testMultiOption() {
        CliBuilder cli = new CliBuilder()
        cli.with {
            a longOpt: 'arguments', args: 2, required: true, 'Two arguments'
        }
        def args = ['-a', 'arg1', '-a', 'arg2']
        def options = cli.parse(args)

        assert (options)
        assertEquals('First arg is available with the -a option. ', 'arg1', options.a)
        assertEquals('Should be two args, in order, available with the addition of an &quot;s&quot; to the option.',
                ['arg1', 'arg2'], options.as)
    }

    /**
     * You can specify multiple arguments together in a block, with a defined separator(in this case a comma).
     */
    void testMultiOptionWithSeparator() {
        CliBuilder cli = new CliBuilder()
        cli.with {
            a longOpt: 'arguments', args: 2, required: true, valueSeparator: ',' as char,
                    'Two arguments, separated by a comma'
        }
        def args = ['-a', 'arg1,arg2']
        def options = cli.parse(args)

        assert (options)
        assertEquals('First arg is available with the -a option. ', 'arg1', options.a)
        assertEquals('Should be two args, in order.', ['arg1', 'arg2'], options.as)
    }

    /**
     * You can also have any number of arguments by specifying UNLIMITED_VALUES.
     */
    void testUnlimitedArgs() {
        CliBuilder cli = new CliBuilder()
        cli.with {
            a longOpt: 'arguments', args: Option.UNLIMITED_VALUES, required: true, valueSeparator: ',' as char,
                    'Two arguments, separated by a comma'
        }
        def args = ['-a', 'arg1,arg2,arg3']
        def options = cli.parse(args)

        assert (options)
        assertEquals('First arg is available with the -a option. ', 'arg1', options.a)
        assertEquals('Should be a list of args, in order.', ['arg1', 'arg2', 'arg3'], options.as)

        def args2 = ['-a', 'argOnly']
        def options2 = cli.parse(args2)

        assert (options)
        assertEquals('First arg is available with the -a option.', 'argOnly', options2.a)
        assertEquals('Should be a list of args, with a single entry.', ['argOnly'], options2.as)

        def args3 = []
        //this will automagically print the usage string and any validation errors to System.out
        def options3 = cli.parse(args3)
        assertNull(options3)
    }
}
</pre>
</div>
<p>Anyhow, hope that the next guy finds this info useful &#8211; it certainly has made my recent work writing Groovy scripts much easier!</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Groovy+CliBuilder+with+multiple+arguments+http://fkxpp.th8.us" title="Post to Twitter"><img class="nothumb" src="http://www.kellyrob99.com/blog/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Groovy+CliBuilder+with+multiple+arguments+http://fkxpp.th8.us" title="Post to Twitter">Tweet This Post</a></p>

<p>Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/11/21/different-flavors-of-embedded-groovy-in-java-apps-or-how-to-make-your-java-groovier/' rel='bookmark' title='Permanent Link: Different Flavors of Embedded Groovy in Java Apps or &#8220;How To Make your Java Groovier!&#8221;'>Different Flavors of Embedded Groovy in Java Apps or &#8220;How To Make your Java Groovier!&#8221;</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/10/25/grails-ui-datatable-using-xml-for-a-model/' rel='bookmark' title='Permanent Link: Grails-UI DataTable using XML for a model'>Grails-UI DataTable using XML for a model</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/08/09/using-the-testng-dataprovider-with-groovy/' rel='bookmark' title='Permanent Link: Using the TestNG DataProvider with Groovy'>Using the TestNG DataProvider with Groovy</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.kellyrob99.com/blog/2009/10/04/groovy-clibuilder-with-multiple-arguments/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter Weekly Updates for 2009-09-28</title>
		<link>http://www.kellyrob99.com/blog/2009/09/27/twitter-weekly-updates-for-2009-09-28-2/</link>
		<comments>http://www.kellyrob99.com/blog/2009/09/27/twitter-weekly-updates-for-2009-09-28-2/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 08:59:00 +0000</pubDate>
		<dc:creator>TheKaptain</dc:creator>
				<category><![CDATA[TweetTweet]]></category>
		<category><![CDATA[kellyrob99]]></category>
		<category><![CDATA[theKaptain]]></category>
		<category><![CDATA[tweet]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.kellyrob99.com/blog/2009/09/27/twitter-weekly-updates-for-2009-09-28-2/</guid>
		<description><![CDATA[
RT @dillyh: Join the 2009/2010 Canary Hockey Pool, help raise funds for the early detection of cancer! http://tinyurl.com/canaryhockeypool #
Nice work @kirillcool  &#8211; and some sweet libraries!RT @alexRuiz: &#34;Using FEST Swing to test Flamingo components&#34; at DZone: http://bit.ly/HD58L #
ty #TheGuild for making my day. &#34;Do you want to date my avatar?&#34; HILARIOUS http://bit.ly/upz4 #
@aalmiray secrets!?!?! [...]


Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/04/05/twitter-weekly-updates-for-2009-04-05/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-04-05'>Twitter Weekly Updates for 2009-04-05</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/09/13/twitter-weekly-updates-for-2009-09-14/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-09-14'>Twitter Weekly Updates for 2009-09-14</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/04/26/twitter-weekly-updates-for-2009-04-26/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-04-26'>Twitter Weekly Updates for 2009-04-26</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<ul class="aktt_tweet_digest">
<li>RT @dillyh: Join the 2009/2010 Canary Hockey Pool, help raise funds for the early detection of cancer! <a href="http://tinyurl.com/canaryhockeypool" class="broken_link"  rel="nofollow">http://tinyurl.com/canaryhockeypool</a> <a href="http://twitter.com/kellyrob99/statuses/4334419023" class="aktt_tweet_time">#</a></li>
<li>Nice work @<a href="http://twitter.com/kirillcool" class="aktt_username">kirillcool</a>  &#8211; and some sweet libraries!RT @alexRuiz: &quot;Using FEST Swing to test Flamingo components&quot; at DZone: <a href="http://bit.ly/HD58L" rel="nofollow">http://bit.ly/HD58L</a> <a href="http://twitter.com/kellyrob99/statuses/4335622390" class="aktt_tweet_time">#</a></li>
<li>ty #<a href="http://search.twitter.com/search?q=%23TheGuild" class="aktt_hashtag">TheGuild</a> for making my day. &quot;Do you want to date my avatar?&quot; HILARIOUS <a href="http://bit.ly/upz4" rel="nofollow">http://bit.ly/upz4</a> <a href="http://twitter.com/kellyrob99/statuses/4350374579" class="aktt_tweet_time">#</a></li>
<li>@<a href="http://twitter.com/aalmiray" class="aktt_username">aalmiray</a> secrets!?!?! Come on &#8211; SHARE! lol <a href="http://twitter.com/aalmiray/statuses/4354485585" class="aktt_tweet_reply">in reply to aalmiray</a> <a href="http://twitter.com/kellyrob99/statuses/4354499639" class="aktt_tweet_time">#</a></li>
<li>@<a href="http://twitter.com/aalmiray" class="aktt_username">aalmiray</a> Looking forward to it &#8211; that and the new jgoodies form plugin. I think I was reading the doco when it&#8230; disapeared <a href="http://twitter.com/aalmiray/statuses/4354705410" class="aktt_tweet_reply">in reply to aalmiray</a> <a href="http://twitter.com/kellyrob99/statuses/4354878012" class="aktt_tweet_time">#</a></li>
<li>RT @kerrywright: Tato RT @tylerblack: @<a href="http://twitter.com/dillyh" class="aktt_username">dillyh</a> Would you say now that you&#39;re the Master of Puppets? <a href="http://twitter.com/kellyrob99/statuses/4354881574" class="aktt_tweet_time">#</a></li>
<li>@<a href="http://twitter.com/aalmiray" class="aktt_username">aalmiray</a> no worries. I&#39;ve got a fair bit of experience already with jgoodies forms, can muddle my way through in the meantime <img src='http://www.kellyrob99.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  <a href="http://twitter.com/aalmiray/statuses/4354926562" class="aktt_tweet_reply">in reply to aalmiray</a> <a href="http://twitter.com/kellyrob99/statuses/4354954888" class="aktt_tweet_time">#</a></li>
<li>@<a href="http://twitter.com/cfieber" class="aktt_username">cfieber</a> absotively. In TweetTweetLand RT == ++ <a href="http://twitter.com/cfieber/statuses/4355125668" class="aktt_tweet_reply">in reply to cfieber</a> <a href="http://twitter.com/kellyrob99/statuses/4355148603" class="aktt_tweet_time">#</a></li>
<li>thanks for the great presentations tonite @<a href="http://twitter.com/abstratt" class="aktt_username">abstratt</a> and @<a href="http://twitter.com/kerrywright" class="aktt_username">kerrywright</a>  and @<a href="http://twitter.com/mosabua" class="aktt_username">mosabua</a> for organizing #<a href="http://search.twitter.com/search?q=%23vijug" class="aktt_hashtag">vijug</a> had a good nite! <a href="http://twitter.com/kellyrob99/statuses/4361892286" class="aktt_tweet_time">#</a></li>
<li>Upgrading maven, git, svn and Groovy in one line. Thank you #<a href="http://search.twitter.com/search?q=%23macports" class="aktt_hashtag">macports</a> for making things so easy <img src='http://www.kellyrob99.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  <a href="http://twitter.com/kellyrob99/statuses/4361918002" class="aktt_tweet_time">#</a></li>
<li>hillarious RT @sbglasius: RT: @jbandi: #<a href="http://search.twitter.com/search?q=%23twitter" class="aktt_hashtag">twitter</a> #<a href="http://search.twitter.com/search?q=%23humor" class="aktt_hashtag">humor</a>: <a href="http://bit.ly/Wnh0P" rel="nofollow">http://bit.ly/Wnh0P</a> (via @<a href="http://twitter.com/mittie" class="aktt_username">mittie</a>) <a href="http://twitter.com/kellyrob99/statuses/4372735864" class="aktt_tweet_time">#</a></li>
<li>@<a href="http://twitter.com/abstratt" class="aktt_username">abstratt</a> Was too tired for tough questions. Looking forward to taking <a href="http://alphasimple.com/" rel="nofollow">http://alphasimple.com/</a>  for a spin tho &#8211; looks awesome <a href="http://twitter.com/abstratt/statuses/4372934350" class="aktt_tweet_reply">in reply to abstratt</a> <a href="http://twitter.com/kellyrob99/statuses/4377597460" class="aktt_tweet_time">#</a></li>
<li>@<a href="http://twitter.com/dillyh" class="aktt_username">dillyh</a> I&#39;ve got $5 on the printer &#8211; it outweighs you after all :0 <a href="http://twitter.com/dillyh/statuses/4377565550" class="aktt_tweet_reply">in reply to dillyh</a> <a href="http://twitter.com/kellyrob99/statuses/4377618806" class="aktt_tweet_time">#</a></li>
<li>Attending third wedding in 6 weeks. Did I remember to pack a tie this time? Only one more time and then I can have a weekend off! <a href="http://twitter.com/kellyrob99/statuses/4386119313" class="aktt_tweet_time">#</a></li>
</ul>
<p class="aktt_credit">Powered by <a href="http://alexking.org/projects/wordpress">Twitter Tools</a></p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Twitter+Weekly+Updates+for+2009-09-28+http://7bbgo.th8.us" title="Post to Twitter"><img class="nothumb" src="http://www.kellyrob99.com/blog/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Twitter+Weekly+Updates+for+2009-09-28+http://7bbgo.th8.us" title="Post to Twitter">Tweet This Post</a></p>

<p>Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/04/05/twitter-weekly-updates-for-2009-04-05/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-04-05'>Twitter Weekly Updates for 2009-04-05</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/09/13/twitter-weekly-updates-for-2009-09-14/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-09-14'>Twitter Weekly Updates for 2009-09-14</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/04/26/twitter-weekly-updates-for-2009-04-26/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-04-26'>Twitter Weekly Updates for 2009-04-26</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.kellyrob99.com/blog/2009/09/27/twitter-weekly-updates-for-2009-09-28-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter Weekly Updates for 2009-09-21</title>
		<link>http://www.kellyrob99.com/blog/2009/09/20/twitter-weekly-updates-for-2009-09-21/</link>
		<comments>http://www.kellyrob99.com/blog/2009/09/20/twitter-weekly-updates-for-2009-09-21/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 08:59:00 +0000</pubDate>
		<dc:creator>TheKaptain</dc:creator>
				<category><![CDATA[TweetTweet]]></category>
		<category><![CDATA[kellyrob99]]></category>
		<category><![CDATA[theKaptain]]></category>
		<category><![CDATA[tweet]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.kellyrob99.com/blog/2009/09/20/twitter-weekly-updates-for-2009-09-21/</guid>
		<description><![CDATA[
If only it were every morning   RT @jstrachan: I love the smell of a brand new MacBook Pro in the morning&#8230; #
@mosabua  @ajordens  Burndown charts are where it&#039;s at man. Without Burnination there can be no progress   #
Spread the word to vote for #maven in #ubuntu to be updated [...]


Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/08/23/twitter-weekly-updates-for-2009-08-24/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-08-24'>Twitter Weekly Updates for 2009-08-24</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/09/06/twitter-weekly-updates-for-2009-09-07/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-09-07'>Twitter Weekly Updates for 2009-09-07</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/09/27/twitter-weekly-updates-for-2009-09-28-2/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-09-28'>Twitter Weekly Updates for 2009-09-28</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<ul class="aktt_tweet_digest">
<li>If only it were every morning <img src='http://www.kellyrob99.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  RT @jstrachan: I love the smell of a brand new MacBook Pro in the morning&#8230; <a href="http://twitter.com/kellyrob99/statuses/3985926801" class="aktt_tweet_time">#</a></li>
<li>@<a href="http://twitter.com/mosabua" class="aktt_username">mosabua</a>  @<a href="http://twitter.com/ajordens" class="aktt_username">ajordens</a>  Burndown charts are where it&#039;s at man. Without Burnination there can be no progress <img src='http://www.kellyrob99.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  <a href="http://twitter.com/kellyrob99/statuses/4013057540" class="aktt_tweet_time">#</a></li>
<li>Spread the word to vote for #<a href="http://search.twitter.com/search?q=%23maven" class="aktt_hashtag">maven</a> in #<a href="http://search.twitter.com/search?q=%23ubuntu" class="aktt_hashtag">ubuntu</a> to be updated to the latest version as packaged in @debian. <a href="http://bit.ly/1ahEos" rel="nofollow">http://bit.ly/1ahEos</a> Please RT. <a href="http://twitter.com/kellyrob99/statuses/4013643172" class="aktt_tweet_time">#</a></li>
<li>@<a href="http://twitter.com/tylerblack" class="aktt_username">tylerblack</a>  Excellent choice! <a href="http://twitter.com/tylerblack/statuses/4022310894" class="aktt_tweet_reply">in reply to tylerblack</a> <a href="http://twitter.com/kellyrob99/statuses/4022337935" class="aktt_tweet_time">#</a></li>
<li>@<a href="http://twitter.com/tylerblack" class="aktt_username">tylerblack</a> Of a 100 balls crazily flying in the air, no one is capable of keeping them all afloat. And knowing you, it won&#039;t be repeated. <a href="http://twitter.com/tylerblack/statuses/4037044471" class="aktt_tweet_reply">in reply to tylerblack</a> <a href="http://twitter.com/kellyrob99/statuses/4038119366" class="aktt_tweet_time">#</a></li>
<li>RT @scottdavis99:&quot;Getting Started with Grails&quot; (2nd ed) is at the typesetter.It covers Grails 1.2. Should be available in a couple of weeks. <a href="http://twitter.com/kellyrob99/statuses/4064706693" class="aktt_tweet_time">#</a></li>
<li>@<a href="http://twitter.com/dillyh" class="aktt_username">dillyh</a> how&#039;s the noggin man? Paying the price for the good tunes? <a href="http://twitter.com/kellyrob99/statuses/4094105170" class="aktt_tweet_time">#</a></li>
<li>Arrrrgh. Love Pirate day so much I subverted me blog maties! <a href="http://twitter.com/kellyrob99/statuses/4105557069" class="aktt_tweet_time">#</a></li>
</ul>
<p class="aktt_credit">Powered by <a href="http://alexking.org/projects/wordpress">Twitter Tools</a></p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Twitter+Weekly+Updates+for+2009-09-21+http://g3kc8.th8.us" title="Post to Twitter"><img class="nothumb" src="http://www.kellyrob99.com/blog/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Twitter+Weekly+Updates+for+2009-09-21+http://g3kc8.th8.us" title="Post to Twitter">Tweet This Post</a></p>

<p>Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/08/23/twitter-weekly-updates-for-2009-08-24/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-08-24'>Twitter Weekly Updates for 2009-08-24</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/09/06/twitter-weekly-updates-for-2009-09-07/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-09-07'>Twitter Weekly Updates for 2009-09-07</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/09/27/twitter-weekly-updates-for-2009-09-28-2/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-09-28'>Twitter Weekly Updates for 2009-09-28</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.kellyrob99.com/blog/2009/09/20/twitter-weekly-updates-for-2009-09-21/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter Weekly Updates for 2009-09-14</title>
		<link>http://www.kellyrob99.com/blog/2009/09/13/twitter-weekly-updates-for-2009-09-14/</link>
		<comments>http://www.kellyrob99.com/blog/2009/09/13/twitter-weekly-updates-for-2009-09-14/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 08:59:00 +0000</pubDate>
		<dc:creator>TheKaptain</dc:creator>
				<category><![CDATA[TweetTweet]]></category>
		<category><![CDATA[kellyrob99]]></category>
		<category><![CDATA[theKaptain]]></category>
		<category><![CDATA[tweet]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.kellyrob99.com/blog/2009/09/13/twitter-weekly-updates-for-2009-09-14/</guid>
		<description><![CDATA[
Looks like a very nice day in Victoria is turning cold and rainy. Thankfully I got the dogs out for a great walk earlier   #
Finally getting a chance to give #GrailsInAction a thorough read. Up til now it&#39;s just proved essential for quick lookups of specific info. #
RT @wilw: New post on my [...]


Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/05/10/twitter-weekly-updates-for-2009-05-10/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-05-10'>Twitter Weekly Updates for 2009-05-10</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/03/29/twitter-weekly-updates-for-2009-03-29/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-03-29'>Twitter Weekly Updates for 2009-03-29</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/09/27/twitter-weekly-updates-for-2009-09-28-2/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-09-28'>Twitter Weekly Updates for 2009-09-28</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<ul class="aktt_tweet_digest">
<li>Looks like a very nice day in Victoria is turning cold and rainy. Thankfully I got the dogs out for a great walk earlier <img src='http://www.kellyrob99.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  <a href="http://twitter.com/kellyrob99/statuses/3850912285" class="aktt_tweet_time">#</a></li>
<li>Finally getting a chance to give #<a href="http://search.twitter.com/search?q=%23GrailsInAction" class="aktt_hashtag">GrailsInAction</a> a thorough read. Up til now it&#39;s just proved essential for quick lookups of specific info. <a href="http://twitter.com/kellyrob99/statuses/3851333924" class="aktt_tweet_time">#</a></li>
<li>RT @wilw: New post on my blog: in which a proclamation is made <a href="http://bit.ly/hg4yK" rel="nofollow">http://bit.ly/hg4yK</a> Listen and geek out to @<a href="http://twitter.com/jonathancoulton" class="aktt_username">jonathancoulton</a> ! <a href="http://twitter.com/kellyrob99/statuses/3852475207" class="aktt_tweet_time">#</a></li>
<li>just voted &quot;grails&quot; on &quot;jsf, grails, wicket?&quot; vote too ➔ <a href="http://bit.ly/ESVOB" rel="nofollow">http://bit.ly/ESVOB</a> <a href="http://twitter.com/kellyrob99/statuses/3856701268" class="aktt_tweet_time">#</a></li>
<li>Finally got around to doing maint on Windows box. Appreciated that Java update suggests #<a href="http://search.twitter.com/search?q=%23openoffice" class="aktt_hashtag">openoffice</a> &#8211; but  yahoo toolbar? Really? ummm, why? <a href="http://twitter.com/kellyrob99/statuses/3856747207" class="aktt_tweet_time">#</a></li>
<li>@<a href="http://twitter.com/mosabua" class="aktt_username">mosabua</a> @<a href="http://twitter.com/abstratt" class="aktt_username">abstratt</a> cheaper hosting solutions are bound to have problems. Dedicated server solutions are ++ on price point but no guarantees <a href="http://twitter.com/kellyrob99/statuses/3857339231" class="aktt_tweet_time">#</a></li>
<li>Please RT @mosabua: #<a href="http://search.twitter.com/search?q=%23scala" class="aktt_hashtag">scala</a> and Model Driven Prototyping at the upcoming  thx @<a href="http://twitter.com/kerrywright" class="aktt_username">kerrywright</a> @<a href="http://twitter.com/abstratt" class="aktt_username">abstratt</a> <a href="http://bit.ly/1apVek" rel="nofollow">http://bit.ly/1apVek</a> #<a href="http://search.twitter.com/search?q=%23VIJUG" class="aktt_hashtag">VIJUG</a> <a href="http://twitter.com/kellyrob99/statuses/3857380580" class="aktt_tweet_time">#</a></li>
<li>Support #<a href="http://search.twitter.com/search?q=%23Griffon" class="aktt_hashtag">Griffon</a>, add a #<a href="http://search.twitter.com/search?q=%23twibbon" class="aktt_hashtag">twibbon</a> to your avatar now! &#8211; <a href="http://twibbon.com/join/Griffon-2" rel="nofollow">http://twibbon.com/join/Griffon-2</a> <a href="http://twitter.com/kellyrob99/statuses/3865237146" class="aktt_tweet_time">#</a></li>
<li>Nothing too bad I hope! @<a href="http://twitter.com/ajordens" class="aktt_username">ajordens</a> @<a href="http://twitter.com/cfieber" class="aktt_username">cfieber</a> Something happened at the tech park? Mass mayhem? <a href="http://twitter.com/kellyrob99/statuses/3876628682" class="aktt_tweet_time">#</a></li>
<li>@<a href="http://twitter.com/cfieber" class="aktt_username">cfieber</a> @<a href="http://twitter.com/ajordens" class="aktt_username">ajordens</a>  Nasty! I hope it&#39;s nothing too serious. <a href="http://twitter.com/kellyrob99/statuses/3876910694" class="aktt_tweet_time">#</a></li>
<li>RT @aalmiray: gfxbuilder and griffon-gfxbuilder-plugin 0.2.1 released #<a href="http://search.twitter.com/search?q=%23griffon" class="aktt_hashtag">griffon</a> <a href="http://twitter.com/kellyrob99/statuses/3878663698" class="aktt_tweet_time">#</a></li>
<li>RT @groovyblogs: Griffon Year One &#8212; <a href="http://bit.ly/q7iAx" rel="nofollow">http://bit.ly/q7iAx</a> &#8212; Surviving IT w/o losing your mind (via <a href="http://ff.im/7Soux)" rel="nofollow">http://ff.im/7Soux)</a> <a href="http://ff.im/7Sr2p" rel="nofollow">http://ff.im/7Sr2p</a> <a href="http://twitter.com/kellyrob99/statuses/3882393352" class="aktt_tweet_time">#</a></li>
<li>Drinking the koolaid. #<a href="http://search.twitter.com/search?q=%23snowleopard" class="aktt_hashtag">snowleopard</a> now on order <a href="http://twitter.com/kellyrob99/statuses/3906028205" class="aktt_tweet_time">#</a></li>
<li>Nice work! RT @NathanFillion: And the Emmy goes to&#8230; <a href="http://yfrog.com/0rlyej" rel="nofollow">http://yfrog.com/0rlyej</a> <a href="http://twitter.com/kellyrob99/statuses/3948007381" class="aktt_tweet_time">#</a></li>
</ul>
<p class="aktt_credit">Powered by <a href="http://alexking.org/projects/wordpress">Twitter Tools</a></p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Twitter+Weekly+Updates+for+2009-09-14+http://4zg6a.th8.us" title="Post to Twitter"><img class="nothumb" src="http://www.kellyrob99.com/blog/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Twitter+Weekly+Updates+for+2009-09-14+http://4zg6a.th8.us" title="Post to Twitter">Tweet This Post</a></p>

<p>Related posts:<ol><li><a href='http://www.kellyrob99.com/blog/2009/05/10/twitter-weekly-updates-for-2009-05-10/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-05-10'>Twitter Weekly Updates for 2009-05-10</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/03/29/twitter-weekly-updates-for-2009-03-29/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-03-29'>Twitter Weekly Updates for 2009-03-29</a></li>
<li><a href='http://www.kellyrob99.com/blog/2009/09/27/twitter-weekly-updates-for-2009-09-28-2/' rel='bookmark' title='Permanent Link: Twitter Weekly Updates for 2009-09-28'>Twitter Weekly Updates for 2009-09-28</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.kellyrob99.com/blog/2009/09/13/twitter-weekly-updates-for-2009-09-14/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 9.522 seconds. -->
<!-- Live page served on 2010-03-11 10:42:26 -->
