<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DEMAQXc7fSp7ImA9WhRRFE4.&quot;"><id>tag:blogger.com,1999:blog-450178863877167504</id><updated>2011-11-27T15:27:20.905-08:00</updated><title>Techscursions</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://techscursions.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://techscursions.blogspot.com/" /><author><name>Kallin Nagelberg</name><uri>http://www.blogger.com/profile/17889614518073531683</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="30" src="http://4.bp.blogspot.com/_ocOcZahIrcQ/SxCvbKSFUUI/AAAAAAAAABg/WYSyo9CjDFY/S220/blue_computer_plus_ships.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>2</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Techscursions" /><feedburner:info uri="techscursions" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CU8BQn44eip7ImA9WxFRE0Q.&quot;"><id>tag:blogger.com,1999:blog-450178863877167504.post-3961810891887806537</id><published>2010-04-27T09:42:00.000-07:00</published><updated>2010-04-27T11:44:13.032-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-27T11:44:13.032-07:00</app:edited><title>Easy RMI services in Grails with JSON controller</title><content type="html">My present client uses a middle-tier services layer to provide data to a front end CMS. Many services were developed here that respond to HTTP requests with JSON text. This has worked well for both front-end developers and QA. Developers simply invoked a JSP tag with a service's URL and were returned an object that could be easily traversed via the JSP EL. It has also become common place for QA to test these services directly through their browser, since the data is easily understandable via a JSON parsing plugin such as &lt;a href="http://addons.mozilla.org/en-US/firefox/addon/10869"&gt;JSONView&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;For reasons beyond my understanding/control the decision has been made declaring HTTP unfit for transferring our data. I believe there are concerns about I/O overhead but there are likely other reasons. At any rate, in it's place we must use Java RMI. There are some promising numbers comparing HTTP to RMI &lt;a href="http://daniel.gredler.net/2008/01/07/java-remoting-protocol-benchmarks/"&gt;here&lt;/a&gt;, so perhaps it's worthwhile.&lt;br /&gt;&lt;br /&gt;Another team here has already started using RMI on their new services, and I was very put off by the implementation I have seen. For quite a while the front-end teams were completely unable to use these services since there was no mechanism in place to deal with redistributing changing classes. Someone managed to whip together some scripts that holds it all together by a thread now, but it isn't pretty. What's worse, every new method requires middle-tier developers to write a custom JSP tag to support the new anemic data container classes being transferred. Of course QA is unable to see the data at all directly from the middle-tier anymore, and must rely on front-end developers finishing their implementations before testing can begin.&lt;br /&gt;&lt;br /&gt;I was &lt;span style="font-style:italic;"&gt;not &lt;/span&gt;thrilled at the prospect of jumping into this mess.&lt;br /&gt;&lt;br /&gt;My recent work has involved converting a legacy java project to Grails, and after witnessing the productivity benefits of this framework I knew I wanted to see how I could leverage it to provide the RMI functionality required. The first step involved installing the remoting plugin available &lt;a href="http://www.grails.org/Remoting+Plugin"&gt;here&lt;/a&gt;. It made it dead simple to add RMI, Burlap, Hessian or Spring Invoker remoting support to any grails service. All that is needed is to add a static property to the service declaring which protocols you want to expose. This made setting up RMI in my project quite simple, but didn't solve the problems of class distribution and testability inherent to RMI. What I really wanted to do was to provide access to my services via RMI OR HTTP/JSON as in the following diagram:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ocOcZahIrcQ/S9cqBCHiZUI/AAAAAAAAAC0/q6fJPpMxGQg/s1600/remoting-chart.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 126px;" src="http://4.bp.blogspot.com/_ocOcZahIrcQ/S9cqBCHiZUI/AAAAAAAAAC0/q6fJPpMxGQg/s400/remoting-chart.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5464882870074107202" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This way developers and QA can test the services in their browser, and the RMI support is there when it comes time to implement the service call in a JSP. &lt;br /&gt;&lt;br /&gt;The only requirement of the services is that they always return data that could be represented in JSON, ie. lists, maps, Strings, and primitives. What's really great is that the only class that will ever need to be distributed to clients is the remoteservice interface, and it's as simple as this:&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: html"&gt;&lt;![CDATA[&lt;br /&gt;public interface RemotingInterface extends Remote {&lt;br /&gt;&lt;br /&gt;    public Object executeService(String service, String method, Map params) throws RemoteException;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Our implementation of this service, using the remoting plugin, is also quite simple:&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: html"&gt;&lt;![CDATA[&lt;br /&gt;class RemotingService implements RemotingInterface, ApplicationContextAware {&lt;br /&gt;&lt;br /&gt;  static expose = ['rmi']&lt;br /&gt;&lt;br /&gt;  def applicationContext&lt;br /&gt;&lt;br /&gt;  Object executeService(String service, String method, Map params) {&lt;br /&gt;    def serviceObject = applicationContext.getBean("${service}Service")&lt;br /&gt;    return serviceObject."${method}"(params)&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  void setApplicationContext(ApplicationContext applicationContext) {&lt;br /&gt;    this.applicationContext=applicationContext;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;We use the Spring application context to grab the requested service, and some groovy meta-magic to call the desired method with a map of parameters.&lt;br /&gt;&lt;br /&gt;Now we just write our service which might look something like:&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: html"&gt;&lt;![CDATA[&lt;br /&gt;class TestService {&lt;br /&gt;  def testMethod(params){&lt;br /&gt;    println "hey we have some params, ${params}"&lt;br /&gt;    def result = [&lt;br /&gt;      x:1,y:2,z:['a','b','c']&lt;br /&gt;    ]&lt;br /&gt;    return result&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Now if your client wants to hit this up via RMI all they need to do is write a little code like:&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: html"&gt;&lt;![CDATA[&lt;br /&gt; def lookup = (RemotingInterface) Naming.lookup("rmi://localhost:1324/RemotingInterface")&lt;br /&gt;&lt;br /&gt;    def params = [&lt;br /&gt;            somevar: "xyz",&lt;br /&gt;            somevar2: "abc"&lt;br /&gt;    ]&lt;br /&gt;&lt;br /&gt;    println lookup.executeService("test", "testMethod", params)&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Magic! And if you want to be able to test your services over HTTP here's a little controller for you :&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: html"&gt;&lt;![CDATA[&lt;br /&gt;class RemotingController implements ApplicationContextAware{&lt;br /&gt;&lt;br /&gt;  def applicationContext&lt;br /&gt;&lt;br /&gt;  def execute = {&lt;br /&gt;&lt;br /&gt;    def service = params.service&lt;br /&gt;    def method = params.method&lt;br /&gt;&lt;br /&gt;    def serviceObject = applicationContext.getBean("${service}Service")&lt;br /&gt;    def serviceResult =  serviceObject."${method}"(params)&lt;br /&gt;&lt;br /&gt;    render serviceResult as JSON&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  void setApplicationContext(ApplicationContext applicationContext) {&lt;br /&gt;    this.applicationContext=applicationContext&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Now you can access the exact same service you hit with RMI before now with HTTP like, &lt;br /&gt;&lt;span style="font-style:italic;"&gt;http://localhost:1324/Remoting/execute?service=test&amp;method=testMethod&amp;somevar=xyz&amp;somevar2=abc&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;I hope someone finds this useful!&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var dzone_url = 'http://techscursions.blogspot.com/2010/04/easy-rmi-services-in-grails-with-json.html';&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var dzone_title = 'Easy RMI services in Grails with JSON controller';&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var dzone_blurb = 'A simple method to expose all of your services via RMI and HTTP when using grails.]';&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var dzone_style = '2';&lt;/script&gt;&lt;br /&gt;&lt;script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/450178863877167504-3961810891887806537?l=techscursions.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/A_rfA6duNNADgEm2eV2yBrrIwPc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/A_rfA6duNNADgEm2eV2yBrrIwPc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/A_rfA6duNNADgEm2eV2yBrrIwPc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/A_rfA6duNNADgEm2eV2yBrrIwPc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Techscursions/~4/2tUALHRB2Us" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://techscursions.blogspot.com/feeds/3961810891887806537/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://techscursions.blogspot.com/2010/04/easy-rmi-services-in-grails-with-json.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/450178863877167504/posts/default/3961810891887806537?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/450178863877167504/posts/default/3961810891887806537?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Techscursions/~3/2tUALHRB2Us/easy-rmi-services-in-grails-with-json.html" title="Easy RMI services in Grails with JSON controller" /><author><name>Kallin Nagelberg</name><uri>http://www.blogger.com/profile/17889614518073531683</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="30" src="http://4.bp.blogspot.com/_ocOcZahIrcQ/SxCvbKSFUUI/AAAAAAAAABg/WYSyo9CjDFY/S220/blue_computer_plus_ships.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ocOcZahIrcQ/S9cqBCHiZUI/AAAAAAAAAC0/q6fJPpMxGQg/s72-c/remoting-chart.JPG" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://techscursions.blogspot.com/2010/04/easy-rmi-services-in-grails-with-json.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UMRHwyeip7ImA9WxFTFUs.&quot;"><id>tag:blogger.com,1999:blog-450178863877167504.post-1775236740494493750</id><published>2010-04-05T14:31:00.001-07:00</published><updated>2010-04-06T07:48:05.292-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-06T07:48:05.292-07:00</app:edited><title>Managing Intellij dependencies with Gradle</title><content type="html">Here I am once again facing a legacy project in need of some dependency management love, and a general simplification/cleanup of its build process. I have been following the &lt;a href="http://www.gradle.org/"&gt;Gradle&lt;/a&gt; project for some time and decided to see how it performs. The short answer is &lt;span style="font-style:italic;"&gt;very well&lt;/span&gt;. I don't want to focus on all the details of building a project with Gradle, but instead look at one very important piece that I've found is often neglected with these build tools: IDE integration.&lt;br /&gt;&lt;br /&gt;I am a big fan of Intellij (currently using the latest 9.x), so I was hoping I could easily synchronize my project files with the Gradle build file. This is sort of a make or break feature for me, as having to hand-tune the XML project files every time I want to change a dependency is not practical; doubly so when other developers in the office are making changes to those dependencies and have zero inclination to understand how their project files work. Unfortunately I could find nothing in Intellij or Gradle that would perform this synchronization for me. Fortunately I was able to very easily roll my own!&lt;br /&gt;&lt;br /&gt;The XML processing capabilities of Groovy, Intellij's XML based project files, and Gradle's groovy-based dsl form a powerful build trifecta. If you're not already familiar with Gradle then you might want to browse the &lt;a href="http://www.gradle.org/tutorial_using_tasks.html"&gt;Build Script Basics&lt;/a&gt;. If you're already up to speed let's jump right in:&lt;br /&gt;&lt;br /&gt;You can create many different types of libraries in Intellij, but for this we are going to look exclusively at module libraries. They are sets of JARs that are associated to a specific module in your project, and are declared in that module's .iml file. A simplified view of your .iml with a couple of JARs might look something like:&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: html"&gt;&lt;![CDATA[&lt;br /&gt;&lt;br /&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;module type="JAVA_MODULE" version="4"&gt;&lt;br /&gt;  &lt;orderEntry type="module-library"&gt;&lt;br /&gt;      &lt;library name="Gradle Libraries"&gt;&lt;br /&gt;        &lt;CLASSES&gt;&lt;br /&gt;          &lt;root url="jar://$USER_HOME$/.gradle/cache/org.apache.solr/solr-core/jars/solr-core-1.4.0.jar!/" /&gt;&lt;br /&gt;          &lt;root url="jar://$USER_HOME$/.gradle/cache/org.opensymphony.quartz/quartz/jars/quartz-1.6.1.jar!/" /&gt;&lt;br /&gt;        &lt;/CLASSES&gt;&lt;br /&gt;        &lt;JAVADOC /&gt;&lt;br /&gt;        &lt;SOURCES /&gt;&lt;br /&gt;      &lt;/library&gt;&lt;br /&gt;    &lt;/orderEntry&gt;&lt;br /&gt;  &lt;/component&gt;&lt;br /&gt;&lt;/module&gt;&lt;br /&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So you can see that in order to setup our Intellij module's dependencies we need to update that &lt;span style="font-style:italic;"&gt;orderEntry&lt;/span&gt; element. Here is a gradle script that does that. A few dependencies are declared including some maven-style artifacts along with a couple of local directories. These are available in gradle via &lt;span style="font-weight:bold;"&gt;configurations.compile.asPath&lt;/span&gt;. The rest should be pretty straightforward if you are familiar with Gradle and &lt;a href="http://groovy.codehaus.org/Reading+XML+using+Groovy's+XmlParser"&gt;XMLParser&lt;/a&gt;.Just execute the &lt;span style="font-style:italic;"&gt;intellijSync &lt;/span&gt;task and you're good to go!&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: html"&gt;&lt;![CDATA[&lt;br /&gt;&lt;br /&gt;defaultTasks 'build'&lt;br /&gt;&lt;br /&gt;usePlugin 'groovy'&lt;br /&gt;&lt;br /&gt;sourceCompatibility = 1.6&lt;br /&gt;version = '0.1'&lt;br /&gt;&lt;br /&gt;// some recurring strings&lt;br /&gt;orderEntryType = 'module-library'&lt;br /&gt;gradleLibraryId = 'Gradle Libraries'&lt;br /&gt;&lt;br /&gt;task intellijSync &lt;&lt; {&lt;br /&gt;&lt;br /&gt;  // change this to the name of your module file&lt;br /&gt;  def moduleFileName = "jmeter.iml"&lt;br /&gt;  def root = new XmlParser().parse(moduleFileName)&lt;br /&gt;  def newModuleRootManager = root.component.find {it.'@name' == 'NewModuleRootManager'}&lt;br /&gt;&lt;br /&gt;  // if there is already a module library in place we should remove it&lt;br /&gt;  removeOldOrderEntry(newModuleRootManager)&lt;br /&gt;&lt;br /&gt;  // add the new module library with our current gradle dependencies&lt;br /&gt;  addNewOrderEntry(newModuleRootManager)&lt;br /&gt;&lt;br /&gt;  // output the .iml XML&lt;br /&gt;  def writer = new StringWriter()&lt;br /&gt;  new XmlNodePrinter(new PrintWriter(writer)).print(root)&lt;br /&gt;  def result = writer.toString()&lt;br /&gt;  print result&lt;br /&gt;&lt;br /&gt;  // overwrite our old .iml file&lt;br /&gt;  def moduleFile = new File(moduleFileName)&lt;br /&gt;  moduleFile.text = result&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private def addNewOrderEntry(newModuleRootManager) {&lt;br /&gt;  def newOrderEntry = newModuleRootManager.appendNode('orderEntry', [type: orderEntryType])&lt;br /&gt;  def newGradleLibrary = newOrderEntry.appendNode('library', [name: gradleLibraryId])&lt;br /&gt;  def classesNode = newGradleLibrary.appendNode('CLASSES')&lt;br /&gt;&lt;br /&gt;  def path = configurations.compile.asPath&lt;br /&gt;  def jars = path.split(';')&lt;br /&gt;  jars.each { jar -&gt;&lt;br /&gt;    classesNode.appendNode('root', [url: "jar://$jar!/"])&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private def removeOldOrderEntry(newModuleRootManager) {&lt;br /&gt;  def oldOrderEntry = newModuleRootManager.orderEntry.find {&lt;br /&gt;    (it.'@type' == orderEntryType) &amp;&amp; (it.library[0].'@name' == gradleLibraryId)&lt;br /&gt;  }&lt;br /&gt;  if (oldOrderEntry) {&lt;br /&gt;    newModuleRootManager.remove(oldOrderEntry)&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;repositories {&lt;br /&gt;  mavenCentral()&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;dependencies {&lt;br /&gt;  groovy group: 'org.codehaus.groovy', name: 'groovy', version: '1.7.0'&lt;br /&gt;  testCompile group: 'junit', name: 'junit', version: '4.7'&lt;br /&gt;&lt;br /&gt;  groovy fileTree(dir: 'C:/bin/jakarta-jmeter-2.3.4/lib', includes: ['*.jar'])&lt;br /&gt;  groovy fileTree(dir: 'C:/bin/jakarta-jmeter-2.3.4/lib/ext', includes: ['*.jar'])&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var dzone_url = 'http://techscursions.blogspot.com/2010/04/here-i-am-once-again-facing-legacy.html';&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var dzone_title = 'Managing Intellij dependencies with Gradle';&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var dzone_blurb = 'A brief tutorial on synchronizing your Intellij dependencies with your Gradle dependencies.]';&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var dzone_style = '2';&lt;/script&gt;&lt;br /&gt;&lt;script language="javascript" src="http://widgets.dzone.com/links/widgets/zoneit.js"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/450178863877167504-1775236740494493750?l=techscursions.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6gRE95L6HEM9wV10H5vM3u8u39g/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6gRE95L6HEM9wV10H5vM3u8u39g/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6gRE95L6HEM9wV10H5vM3u8u39g/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6gRE95L6HEM9wV10H5vM3u8u39g/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Techscursions/~4/fnxHQXRU_lw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://techscursions.blogspot.com/feeds/1775236740494493750/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://techscursions.blogspot.com/2010/04/here-i-am-once-again-facing-legacy.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/450178863877167504/posts/default/1775236740494493750?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/450178863877167504/posts/default/1775236740494493750?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Techscursions/~3/fnxHQXRU_lw/here-i-am-once-again-facing-legacy.html" title="Managing Intellij dependencies with Gradle" /><author><name>Kallin Nagelberg</name><uri>http://www.blogger.com/profile/17889614518073531683</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="30" src="http://4.bp.blogspot.com/_ocOcZahIrcQ/SxCvbKSFUUI/AAAAAAAAABg/WYSyo9CjDFY/S220/blue_computer_plus_ships.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://techscursions.blogspot.com/2010/04/here-i-am-once-again-facing-legacy.html</feedburner:origLink></entry></feed>

