<?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;AkQFQHw6fyp7ImA9WhRUEEs.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347</id><updated>2012-01-20T09:05:11.217-05:00</updated><category term="java training class" /><category term="GWT" /><category term="java 5" /><category term="Cygwin" /><category term="mock objects" /><category term="AJAX" /><category term="diversion" /><category term="java interview" /><category term="xml development" /><category term="routers" /><category term="java ide netBeans" /><category term="open source" /><category term="api" /><category term="jvm startup times" /><category term="motivation" /><category term="Swing" /><category term="grails" /><category term="deployments" /><category term="gradle" /><category term="seo optimization" /><category term="Google AppEngine" /><category term="unit test" /><category term="spring" /><category term="player" /><category term="consulting" /><category term="builds" /><category term="commons-vfs" /><category term="xpath" /><category term="windows" /><category term="load testing" /><category term="Apache" /><category term="8.0.2.11n" /><category term="development environment" /><category term="bdd" /><category term="X11" /><category term="Gaelyk" /><category term="science" /><category term="HTML5" /><category term="embedded systems" /><category term="stage" /><category term="scripting" /><category term="SCM" /><category term="overtime" /><category term="LAMP" /><category term="business" /><category term="VMWare" /><category term="MySQL" /><category term="scalability" /><category term="java" /><category term="Javascript" /><category term="java reflection" /><category term="programming" /><category term="Powerpoint statisitics" /><category term="korn" /><category term="software configuration management" /><category term="CJUG" /><category term="Prototype" /><category term="backups" /><category term="lambda" /><category term="blog" /><category term="computers" /><category term="Google App Engine" /><category term="home network" /><category term="SMF" /><category term="PHP" /><category term="wikipedia" /><category term="turing machine" /><category term="script.aculo.us" /><category term="SmartFrog" /><category term="firefox plugins" /><category term="Sun" /><category term="fat32" /><category term="screen scrape" /><category term="sql" /><category term="build" /><category term="database design" /><category term="GB networks" /><category term="groovy" /><category term="software" /><category term="method injection" /><category term="persistence" /><category term="easyb" /><category term="closure" /><category term="Eclipse" /><category term="history" /><category term="HTML" /><category term="JDK 5" /><category term="TimeZone" /><category term="version control" /><category term="java development" /><category term="slashdot" /><category term="ubuntu" /><category term="architecture" /><category term="EBay" /><category term="hedge funds" /><category term="google" /><title>Parthian Shot - Notes and Various Java Tidbits</title><subtitle type="html">Notes from my day to day Java and J2EE software development experiences and other related software development technologies.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://parthian-shot.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>67</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/blogspot/gjIrd" /><feedburner:info uri="blogspot/gjird" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DEEFSXkzfyp7ImA9WhRRGEk.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-7306192366684248201</id><published>2011-12-02T12:02:00.001-05:00</published><updated>2011-12-02T12:23:38.787-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-02T12:23:38.787-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="overtime" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="consulting" /><title>Computer Professionals Update(CPU)  Act (S1747)</title><content type="html">US developers (especially contractors) should read the new law working its way through the Senate.&amp;nbsp; It relates to the how the Department of Labor classifies developers, DBAs, and other computer professionals.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.govtrack.us/congress/billtext.xpd?bill=s112-1747"&gt;S1747 Computer Professionals Update Act&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background-color: white; font-weight: bold; margin-left: 0em;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="background-color: white; font-weight: bold; margin-left: 0em;"&gt;
&lt;span style="font-size: xx-small;"&gt;SEC. 2. AMENDMENT TO THE FAIR LABOR STANDARDS ACT OF 1938.&lt;/span&gt;&lt;/div&gt;
&lt;div class="section" style="background-color: white;"&gt;
&lt;div class="chooser"&gt;
&lt;span style="font-size: xx-small;"&gt;&lt;span class="expanded" title="Collapse this section"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="margin-left: 3em;"&gt;
&lt;span style="font-size: xx-small;"&gt;Section 13(a)(17) of the Fair Labor Standards Act of 1938 (&lt;a class="usclink" href="http://www.law.cornell.edu/usc-cgi/newurl?type=titlesect&amp;amp;title=29&amp;amp;section=213" rel="/perl/usc-popup.cgi?ref=29_213_a_17&amp;amp;context_before=2&amp;amp;context_after=4" target="_blank" title=""&gt;29 U.S.C. 213(a)(17)&lt;/a&gt;) is amended to read as follows:&lt;/span&gt;&lt;/div&gt;
&lt;div class="section"&gt;
&lt;div class="chooser"&gt;
&lt;span style="font-size: xx-small;"&gt;&lt;span class="expanded" title="Collapse this section"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="quote" style="margin-left: 6em;"&gt;
&lt;span style="font-size: xx-small;"&gt;‘(17)
 any employee working in a computer or information technology occupation
 (including, but not limited to, work related to computers, information 
systems, components, networks, software, hardware, databases, security, 
internet, intranet, or websites) as an analyst, programmer, engineer, 
designer, developer, administrator, or other similarly skilled worker, 
whose primary duty is--&lt;/span&gt;&lt;/div&gt;
&lt;div class="section"&gt;
&lt;div class="chooser"&gt;
&lt;span style="font-size: xx-small;"&gt;&lt;span class="expanded" title="Collapse this section"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="quote" style="margin-left: 9em;"&gt;
&lt;span style="font-size: xx-small;"&gt;‘(A)
 the application of systems, network or database analysis techniques and
 procedures, including consulting with users, to determine or modify 
hardware, software, network, database, or system functional 
specifications;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;div class="chooser"&gt;
&lt;span style="font-size: xx-small;"&gt;&lt;span class="expanded" title="Collapse this section"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="quote" style="margin-left: 9em;"&gt;
&lt;span style="font-size: xx-small;"&gt;‘(B)
 the design, development, documentation, analysis, creation, testing, 
securing, configuration, integration, debugging, modification of 
computer or information technology, or enabling continuity of systems 
and applications;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;div class="chooser"&gt;
&lt;span style="font-size: xx-small;"&gt;&lt;span class="expanded" title="Collapse this section"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="quote" style="margin-left: 9em;"&gt;
&lt;span style="font-size: xx-small;"&gt;‘(C)
 directing the work of individuals performing duties described in 
subparagraph (A) or (B), including training such individuals or leading 
teams performing such duties; or&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;div class="chooser"&gt;
&lt;span style="font-size: xx-small;"&gt;&lt;span class="expanded" title="Collapse this section"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="quote" style="margin-left: 9em;"&gt;
&lt;span style="font-size: xx-small;"&gt;‘(D)
 a combination of duties described in subparagraphs (A), (B), and (C), 
the performance of which requires the same level of skill;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section"&gt;
&lt;div class="chooser"&gt;
&lt;span style="font-size: xx-small;"&gt;&lt;span class="expanded" title="Collapse this section"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="margin-left: 6em;"&gt;
&lt;span style="font-size: xx-small;"&gt;who
 is compensated at an hourly rate of not less than $27.63 an hour or who
 is paid on a salary basis at a salary level as set forth by the 
Department of Labor in part 541 of title 29, Code of Federal 
Regulations. An employee described in this paragraph shall be considered
 an employee in a professional capacity pursuant to paragraph (1).’.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="background-color: white;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
As a contractor, I have been affected by the existing rules multiple times, and it is an entirely frustrating interference between the government and the client/contractor relationship.&lt;br /&gt;
&lt;br /&gt;
Consider this... time and material contractor Joe goes to work at the big regional utility.&amp;nbsp; He joins as a contractor for X$/hour.&amp;nbsp; Joe does a great job and is on a large project which after 2 years at the job, regional utility gets nervous about facing fines from the DOL because Joe may be "misclassified" and is being treated as a full time employee without benefits.&amp;nbsp; Joe was happy and the utility was happy. There was no reason for Joe or the utility to stop the existing relationship except for the threat of a lawsuit.&amp;nbsp; The utility tells Joe he has to leave but can return at some point in the future (usually months later).&amp;nbsp; Joe is out of a job, and utility loses a trained worker. These existing rules are convoluted to say the least.&lt;br /&gt;
&lt;br /&gt;
Here's a great article about the law written for the &lt;a href="http://www.google.com/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=newssearch&amp;amp;cd=2&amp;amp;ved=0CC0QqQIwAQ&amp;amp;url=http%3A%2F%2Fwww.lexology.com%2Flibrary%2Fdetail.aspx%3Fg%3D0937c58a-6ba7-4a4d-aa10-cdfdb4a5e3d2&amp;amp;ctbm=nws&amp;amp;ei=6P_YTq-YL8aJtwel6KDhBA&amp;amp;usg=AFQjCNFPMwIJZlpOfnJIZrGCBIzZqIdnyA&amp;amp;sig2=auemGubEWe3gLiePSh4FLQ"&gt;Association of Corporate Counsel&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-7306192366684248201?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OrPsKpdZkMCfmUU9Pk_aMRnGQ1E/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OrPsKpdZkMCfmUU9Pk_aMRnGQ1E/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/OrPsKpdZkMCfmUU9Pk_aMRnGQ1E/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OrPsKpdZkMCfmUU9Pk_aMRnGQ1E/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/RQKVkOQmutc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/7306192366684248201/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=7306192366684248201" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/7306192366684248201?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/7306192366684248201?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/RQKVkOQmutc/computer-professionals-updatecpu-act.html" title="Computer Professionals Update(CPU)  Act (S1747)" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2011/12/computer-professionals-updatecpu-act.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMBSXg6fCp7ImA9WhdbE0s.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-8371551375549201804</id><published>2011-10-11T16:14:00.001-04:00</published><updated>2011-10-11T16:20:58.614-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-11T16:20:58.614-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Cygwin" /><category scheme="http://www.blogger.com/atom/ns#" term="Swing" /><category scheme="http://www.blogger.com/atom/ns#" term="X11" /><title>Open Source XWin Solutions For Displaying Remote Clients</title><content type="html">Recently we built a nice desktop interface using Groovy's Griffon to 
manage several back-end tasks.&amp;nbsp; The idea was that data center and other 
support folks don't want to figure out our scripts/code and that we 
would provide a nice friendly interface to manage the complex tasks. So 
far so good, until we had users who wanted to keep the application on a remote 
Linux server and still have pretty GUIs locally. Nonchalantly, I recommended X11
 (ahh its like 1995 all over again only this time better tools!).&amp;nbsp; Umm 
yeah... well it took me over an hour to figure out how to make it work 
and how to make it work for free, so that's enough time for me to want 
to write down the steps so that I don't need to repeat researching this 
in the future.&lt;br /&gt;
&lt;br /&gt;
Steps:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Download &lt;a href="http://www.cygwin.org/"&gt;Cygwin&lt;/a&gt; via the Cygwin.exe installer!&lt;/li&gt;
&lt;li&gt;Select the xinit app under the X11 libraries.&amp;nbsp; The dependencies should be downloaded after being prompted to do so.&lt;/li&gt;
&lt;li&gt;Select openssh from the Cygwin libraries&lt;/li&gt;
&lt;li&gt;Open a Cygwin console.&amp;nbsp; Type startxwin.&amp;nbsp; More details on Cygwin/X can be found &lt;a href="http://x.cygwin.com/docs/ug/cygwin-x-ug.pdf"&gt;here&lt;/a&gt;. &lt;br /&gt;
  &lt;/li&gt;
&lt;li&gt;Install xauth on the remote server.&amp;nbsp; I am using RedHat so all it required was 'yum install xauth'.&amp;nbsp; You may also need to tweek the X11Forwarding setting in /etc/ssh/sshd_config file to allow X11 forwarding.&lt;br /&gt;
  &lt;/li&gt;
&lt;li&gt;type 'DISPLAY=&lt;local hostname=""&gt;:0.0' on you local machine&lt;br /&gt;
  &lt;/local&gt;&lt;/li&gt;
&lt;li&gt;type 'export DISPLAY' on your local machine&lt;br /&gt;
  &lt;/li&gt;
&lt;li&gt;ssh -Y username@remotehost (use -v option if errors occur)&lt;/li&gt;
&lt;li&gt;Start remote app.&lt;/li&gt;
&lt;/ol&gt;
The GUI should start up locally.&amp;nbsp; Good luck! &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-8371551375549201804?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/atBOzkGLZkp5RYt1_QIjtde3St4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/atBOzkGLZkp5RYt1_QIjtde3St4/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/atBOzkGLZkp5RYt1_QIjtde3St4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/atBOzkGLZkp5RYt1_QIjtde3St4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/lKu9wOU0Alc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/8371551375549201804/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=8371551375549201804" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/8371551375549201804?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/8371551375549201804?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/lKu9wOU0Alc/open-source-xwin-solutions-for.html" title="Open Source XWin Solutions For Displaying Remote Clients" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2011/10/open-source-xwin-solutions-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QAQH46eSp7ImA9WhdUF04.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-2690632415576264303</id><published>2011-10-04T09:34:00.000-04:00</published><updated>2011-10-04T09:35:41.011-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-04T09:35:41.011-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="HTML5" /><category scheme="http://www.blogger.com/atom/ns#" term="HTML" /><title>Getting Started on HTML5</title><content type="html">&lt;a href="http://www.queness.com/post/9375/tips-tricks-and-tools-you-will-need-to-start-using-html5-today"&gt;Here's a nice article&lt;/a&gt; on tools and methods used to design in HTML5.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-2690632415576264303?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YUL-jrIohJfoa7SegBToT5BTvwo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YUL-jrIohJfoa7SegBToT5BTvwo/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/YUL-jrIohJfoa7SegBToT5BTvwo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YUL-jrIohJfoa7SegBToT5BTvwo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/HiRvtGHmgz0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/2690632415576264303/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=2690632415576264303" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/2690632415576264303?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/2690632415576264303?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/HiRvtGHmgz0/getting-started-on-html5.html" title="Getting Started on HTML5" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2011/10/getting-started-on-html5.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8MSHc4cCp7ImA9WhdVFEU.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-6025289865126065051</id><published>2011-09-19T21:58:00.000-04:00</published><updated>2011-09-19T21:58:09.938-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-19T21:58:09.938-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="CJUG" /><category scheme="http://www.blogger.com/atom/ns#" term="gradle" /><category scheme="http://www.blogger.com/atom/ns#" term="builds" /><category scheme="http://www.blogger.com/atom/ns#" term="SCM" /><title>Gradle Overview Presentation</title><content type="html">Here is a copy of the Gradle presentation that will be given on Wednesday's Charleston Java User's Group (CJUG).&amp;nbsp; This is a 1 hour presentation, so the topics in no way get into the details of what is available in Gradle.&amp;nbsp; I highly encourage anyone interested in Gradle to visit &lt;a href="http://www.gradle.org/"&gt;www.gradle.org&lt;/a&gt;.&amp;nbsp; The documentation on &lt;a href="http://gradle.org/"&gt;gradle.org&lt;/a&gt; is well written.&amp;nbsp; In addition, there are plenty of examples in the absolute flexibility that Gradle provides as not only a Java build tool, but a wide variety of plugins and other incredible features.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://docs.google.com/present/edit?id=0AbPfjtUUq51FZGhmcmo3cXdfMzdmaHJyNjJjMw&amp;amp;hl=en_US"&gt;https://docs.google.com/present/edit?id=0AbPfjtUUq51FZGhmcmo3cXdfMzdmaHJyNjJjMw&amp;amp;hl=en_US&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-6025289865126065051?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/G0WrlpJBHHTTgdQrdw9Qup0STJM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/G0WrlpJBHHTTgdQrdw9Qup0STJM/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/G0WrlpJBHHTTgdQrdw9Qup0STJM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/G0WrlpJBHHTTgdQrdw9Qup0STJM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/gpuJkgTbT_M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/6025289865126065051/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=6025289865126065051" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/6025289865126065051?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/6025289865126065051?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/gpuJkgTbT_M/gradle-overview-presentation.html" title="Gradle Overview Presentation" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2011/09/gradle-overview-presentation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ECSHY8eSp7ImA9WhdVFEs.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-525651868044038163</id><published>2011-09-19T15:43:00.000-04:00</published><updated>2011-09-19T15:47:49.871-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-19T15:47:49.871-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Powerpoint statisitics" /><title>Evidence of the Danger of Too Many PowerPoint Presentations</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/--eoWQ2QDxds/TnebJoNLKpI/AAAAAAAAC6U/Vz6WkXXr9rI/s1600/chart_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="246" src="http://2.bp.blogspot.com/--eoWQ2QDxds/TnebJoNLKpI/AAAAAAAAC6U/Vz6WkXXr9rI/s400/chart_1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="font-size: xx-small;"&gt;&lt;i&gt;&lt;b&gt;Source : Random Sampling of 100 PowerPoint presentations.&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-525651868044038163?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZqULyYhOwC3DbA6NPHJ7EQ__5DI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZqULyYhOwC3DbA6NPHJ7EQ__5DI/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/ZqULyYhOwC3DbA6NPHJ7EQ__5DI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZqULyYhOwC3DbA6NPHJ7EQ__5DI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/UcmENR9JeY4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/525651868044038163/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=525651868044038163" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/525651868044038163?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/525651868044038163?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/UcmENR9JeY4/undeniable-truths-to-powerpoint.html" title="Evidence of the Danger of Too Many PowerPoint Presentations" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/--eoWQ2QDxds/TnebJoNLKpI/AAAAAAAAC6U/Vz6WkXXr9rI/s72-c/chart_1.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2011/09/undeniable-truths-to-powerpoint.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMDQnkzeyp7ImA9WhdWF0Q.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-7602147866143164033</id><published>2011-09-11T22:07:00.000-04:00</published><updated>2011-09-11T22:11:13.783-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-11T22:11:13.783-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="gradle" /><category scheme="http://www.blogger.com/atom/ns#" term="SCM" /><category scheme="http://www.blogger.com/atom/ns#" term="groovy" /><title>Introduction to Gradle Part 3</title><content type="html">In part 1 and 2, we built&amp;nbsp;a simple Gradle build file
for a Java project, war project, Groovy project , and finally a Gradle
multi-build project. &amp;nbsp;We saw how these Gradle plugins worked
and how to setup complex multi-project dependencies. &amp;nbsp;There is
so much that groovy Gradle can do including OSGi, Scala, reports, and much
more. &amp;nbsp;The documentation for Gradle builds can be found &lt;a href="http://www.gradle.org/userguide.html" style="padding: 0px;"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;

&lt;span style="font-size: small;"&gt;Gradle customizations &lt;/span&gt;&lt;/h3&gt;
&lt;code&gt;
&lt;/code&gt;
Last, let's design some custom tasks. &amp;nbsp;Since, we are
writing
build scripts in Groovy, Gradle build custom tasks are simple and straight-forward.
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h4&gt;
&lt;span style="font-size: x-small;"&gt;
(Project D/build.gradle)&lt;/span&gt;&lt;/h4&gt;
&lt;code&gt;&lt;br /&gt;
&lt;br /&gt;
import org.gradle.api.DefaultTask&lt;br /&gt;
import org.gradle.api.tasks.TaskAction&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class LumberghTask extends DefaultTask {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; def person = "Peter"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; def request = "Um... yah, I'm going to
have to ask you to work this weekend."&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; @TaskAction&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; def greetEmployee() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; println
"Hello ${person} ... How's it going?"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; println
request&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
task hello(type: LumberghTask)&lt;br /&gt;
&lt;br /&gt;
task requestWork(type: LumberghTask) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; person = 'Samir'&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; request = "Yah, if you could get those
TPS reports to me, yah that would be great"&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
The script above is a custom task called the
LumberghTask. &amp;nbsp;This task asks a variety of employees pointless
and useless queries, but demonstrates how custom tasks work in Gradle.&lt;br /&gt;
&lt;br /&gt;
The first step to run this task will be to call the hello
target.
&amp;nbsp;Execute the following task first:&lt;br /&gt;
gradle -q hello&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-small; font-weight: bold;"&gt;Output:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hello Peter ... How's it going?&lt;br /&gt;
Um... yah, I'm going to have to ask you to work this weekend.&lt;br /&gt;
&lt;br /&gt;
Next, execute the following:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gradle -q&amp;nbsp;requestWork&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small; font-weight: bold;"&gt;Output:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Hello Samir ... How's it going?&lt;br /&gt;
Yah, if you could get those TPS reports to me, yah that would be great&lt;br /&gt;
&lt;br /&gt;
The requestWork overrides the person and request variables
based on the task being called. &amp;nbsp;The taskHello is calling the
LumberghTask directly. There are so many combinations available in
Gradle, that reading the documentation provided&amp;nbsp;&lt;a href="http://www.gradle.org/userguide.html" style="padding: 0px;"&gt;here&lt;/a&gt;
is highly recommended. &amp;nbsp;Gradle and Groovy provides maximum
felxibility for any build environment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-7602147866143164033?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/S73lvoyw4a13U_eLsR1veGysdYQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/S73lvoyw4a13U_eLsR1veGysdYQ/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/S73lvoyw4a13U_eLsR1veGysdYQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/S73lvoyw4a13U_eLsR1veGysdYQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/eQu2uaJRY8g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/7602147866143164033/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=7602147866143164033" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/7602147866143164033?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/7602147866143164033?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/eQu2uaJRY8g/introduction-to-gradle-part-3.html" title="Introduction to Gradle Part 3" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2011/09/introduction-to-gradle-part-3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMESH08eip7ImA9WhdWF0Q.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-8711837235025062695</id><published>2011-09-11T22:06:00.000-04:00</published><updated>2011-09-11T22:10:09.372-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-11T22:10:09.372-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="gradle" /><category scheme="http://www.blogger.com/atom/ns#" term="SCM" /><category scheme="http://www.blogger.com/atom/ns#" term="groovy" /><title>Introduction to Gradle Part 2</title><content type="html">In part 1, we built project A, a simple Gradle build file that
compiled Java class files and built a jar file. &amp;nbsp;Next, we will
build a war project dependent on the jar file generated from project A.
&amp;nbsp;This uses Maven dependency managment. &amp;nbsp;It is
possible to setup your project completely using Maven or Ivy.
&amp;nbsp;Gradle also has a framework to manage it's own dependencies
and will be described shortly using subprojects.

One interesting extension of the war plugin is the Jetty
plugin. &amp;nbsp;Gradle provides a library that will wrap a war in a
self-contained web container. &amp;nbsp;This is nice if you have a
small web app and want to get it up and running quickly.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;

&lt;span style="font-size: small;"&gt;Build Project B (simple Java war build) &lt;/span&gt;&lt;/h3&gt;
&lt;br /&gt;
&lt;h4&gt;
&lt;span style="font-size: x-small;"&gt;
(Project B/build.gradle)&lt;/span&gt;&lt;br /&gt;
&lt;/h4&gt;
&lt;code&gt;&lt;br /&gt;
// We can add
comments to the build script using typical Java/Groovy notation&lt;br /&gt;
// We need to specify the java plugin which by
default
looks for src/main/java&lt;br /&gt;
usePlugin 'java'&lt;br /&gt;
usePlugin 'war' // Use the war plugin to build a war file&lt;br /&gt;
usePlugin 'maven'&lt;br /&gt;
&lt;br /&gt;
version = 1.0&lt;br /&gt;
artifactId='projectB'&lt;br /&gt;
&lt;br /&gt;
repositories { // reference all of the required Maven repositories.&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; mavenRepo(urls :
"file://localhost/tmp/repos/")&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mavenCentral() //
Setup the Maven repository&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dependencies { // Add external dependencies here&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; compile group: 'commons-cli',
name: 'commons-cli', version: '1.0'&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compile group:
'projectA', name: 'projectA', version:'1.0'&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
uploadArchives { // Again upload our final product into the local Maven
repository&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; repositories.mavenDeployer {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
repository(url: "file://localhost/tmp/repos/")&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
pom.groupId = 'projectB'&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
pom.version = '1.0'&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
pom.artifactId = 'projectB'&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
assemble.dependsOn ':uploadArchives'&lt;br /&gt;
&lt;br /&gt;
sourceSets { // Defines which source files to include in the build&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; main {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
java {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
resources {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}
&lt;/code&gt;&lt;br /&gt;
&lt;div style="margin: 0in 0in 0pt;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="margin: 0in 0in 0pt;"&gt;
ProjectB/.classpath&lt;br /&gt;
ProjectB/.settings/org.eclipse.jdt.core.prefs&lt;br /&gt;
ProjectB/bin/com/pac/domain/Manager.class&lt;br /&gt;
ProjectB/.project&lt;br /&gt;
ProjectB/build.gradle&lt;br /&gt;
ProjectB/build/libs/ProjectB-3.1.war&lt;br /&gt;
ProjectB/build/classes/main/com/pac/domain/Manager.class&lt;br /&gt;
ProjectB/build/classes/main/Manager.class&lt;br /&gt;
ProjectB/build/ivy.xml&lt;br /&gt;
ProjectB/build/poms/pom-default.xml&lt;br /&gt;
ProjectB/src/main/java/com/pac/domain/Manager.java&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;span style="font-size: small;"&gt;
Build Project C (Groovy Class build)&lt;/span&gt;&lt;/h3&gt;
In project C, we will build a Groovy based project that uses
Java libraries and is also dependent on our project A. &amp;nbsp;This
Gradle maven project will again use the Maven repository to dowload
dependencies and upload the final artifiact after the build.
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h4&gt;
&lt;span style="font-size: x-small;"&gt;
(Project C/build.gradle)&lt;/span&gt;&lt;br /&gt;
&lt;/h4&gt;
&lt;code&gt;&lt;br /&gt;
// We can add comments to the build script using typical Java/Groovy
notation
&lt;br /&gt;
// We need to specify the java plugin which by
default looks for src/main/java&lt;/code&gt;&lt;code&gt;&lt;br /&gt;
usePlugin 'groovy' &lt;br /&gt;
usePlugin 'maven'&lt;br /&gt;
usePlugin 'java'&lt;br /&gt;
&lt;br /&gt;
version = 1.0&lt;br /&gt;
&lt;br /&gt;
repositories {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; mavenRepo(urls :
"file://localhost/tmp/repos/")&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mavenCentral() //
Setup the Maven repository&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dependencies { // Add external dependencies here&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; groovy
module('org.codehaus.groovy:groovy-all:1.7.0') {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; dependency('commons-cli:commons-cli:1.0')&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;dependency('projectA:projectA:1.0')&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
uploadArchives {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; repositories.mavenDeployer {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
repository(url: "file://localhost/tmp/repos/")&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
pom.groupId = 'projectC'&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
pom.version = '1.0'&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
pom.artifactId = 'projectC'&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
assemble.dependsOn ':uploadArchives'&lt;br /&gt;
&lt;br /&gt;
sourceSets { // Defines which source files to include in the build&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; main {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
groovy {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
resources {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
Files in project C...&lt;code&gt;&lt;br /&gt;
ProjectC/.classpath&lt;br /&gt;
ProjectC/.settings/org.eclipse.jdt.core.prefs&lt;br /&gt;
ProjectC/bin/com/pac/domain/Company.class&lt;br /&gt;
ProjectC/.project&lt;br /&gt;
ProjectC/build.gradle&lt;br /&gt;
ProjectC/build/libs/ProjectC-1.0.jar&lt;br /&gt;
ProjectC/build/classes/main/com/pac/domain/Company.class&lt;br /&gt;
ProjectC/build/ivy.xml&lt;br /&gt;
ProjectC/build/poms/pom-default.xml&lt;br /&gt;
ProjectC/src/main/groovy/com/pac/domain/Company.groovy&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
&lt;span style="font-size: small;"&gt;
Configuring Gradle Multi-Project Builds&lt;/span&gt;&lt;/h3&gt;
&lt;br /&gt;
Next, let's setup a Gradle multi-project build called
UberProject which will contain projectA, project B, and project C.
&amp;nbsp;This mult-project build will contain the following structure:&lt;br /&gt;
&lt;br /&gt;
UberProject/&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;settings.gradle&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
/ProjectA&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
/ProjectA/build.gradle&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
/ProjectB&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
/ProjectB/build.gradle&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
/ProjectC&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
/ProjectC/build.gradle&lt;br /&gt;
&lt;br /&gt;
settings.gradle will contain the following line:&lt;br /&gt;
include 'ProjectA', 'ProjectB', 'ProjectC'&lt;br /&gt;
&lt;br /&gt;
What is nice about the Gradle multi-project build is that the
main settings.gradle and build.gradle (if existing) will be inherited
and can be re-used in all of the subprojects. &amp;nbsp;This is similar
in concept to the Maven pom, but much easier to read and appears on the
surface more straight-forward.&lt;br /&gt;
&lt;br /&gt;
Next, in each project we need to use the 'dependsOn' call to
manage inter-project dependencies. &amp;nbsp;Remove any reference to
projectA, projectB, or projectC in the dependencies section.
&amp;nbsp;Leave all of the third party libraries, so that we can still
download these dependencies as needed.&lt;br /&gt;
&lt;br /&gt;
Add the following line to project C:&lt;br /&gt;
dependsOn(':ProjectA')&lt;br /&gt;
&lt;br /&gt;
Add the following line to project B:&lt;br /&gt;
dependsOn(':ProjectA')&lt;br /&gt;
&lt;br /&gt;
Run gradle assemble on project C. &amp;nbsp;You should see the
following output.&lt;br /&gt;
&lt;br /&gt;
:ProjectA:compileJava&lt;br /&gt;
:ProjectA:processResources&lt;br /&gt;
:ProjectA:classes&lt;br /&gt;
:ProjectA:jar&lt;br /&gt;
:ProjectA:assemble&lt;br /&gt;
:ProjectC:compileJava&lt;br /&gt;
:ProjectC:compileGroovy&lt;br /&gt;
:ProjectC:processResources&lt;br /&gt;
:ProjectC:classes&lt;br /&gt;
:ProjectC:jar&lt;br /&gt;
:ProjectC:assemble&lt;br /&gt;
&lt;br /&gt;
BUILD SUCCESSFUL&lt;br /&gt;
&lt;br /&gt;
Total time: 16.298 secs&lt;br /&gt;
&lt;br /&gt;
Notice how building project C now, automatically builds the
dependency of project A. &amp;nbsp;Nice right?&lt;br /&gt;
&lt;br /&gt;
Now, let's have some fun with our projects and flex the
depedency
management features in Gradle&amp;nbsp;by adding a circular dependency
to
project A. &amp;nbsp;One of the best ways to understand how Gradle
works is to break the build.&lt;br /&gt;
&lt;br /&gt;
Add the following line to project A:&lt;br /&gt;
dependsOn(':ProjectC')&lt;br /&gt;
&lt;br /&gt;
You should see the following output:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: red;"&gt;FAILURE: Build failed
with an exception.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: red;"&gt;* Where:&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;Build file
'/home/robert/workspace/UberProject/ProjectC/build.gradle' line: 12&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: red;"&gt;* What went wrong:&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;A problem occurred evaluating
project ':ProjectC'.&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;Cause: Circular referencing
during evaluation for project ':ProjectA'.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: red;"&gt;* Try:&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red;"&gt;Run with -s or -d option to get
more details. Run with -S option to get the full (very verbose)
stacktrace.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: red;"&gt;BUILD FAILED&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: red;"&gt;Total time: 8.698 secs&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
By adding a reference to projectC to projectA, we have added a
circular dependency. &amp;nbsp;Gradle finds circular dependencies in
multi-project builds and does not allow a build to continue once the
circular dependency is found.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-8711837235025062695?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/roBpbgrWd0aKcFTDnrD6cI_YHQ4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/roBpbgrWd0aKcFTDnrD6cI_YHQ4/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/roBpbgrWd0aKcFTDnrD6cI_YHQ4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/roBpbgrWd0aKcFTDnrD6cI_YHQ4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/xK4tPNciVPM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/8711837235025062695/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=8711837235025062695" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/8711837235025062695?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/8711837235025062695?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/xK4tPNciVPM/introduction-to-gradle-part-2.html" title="Introduction to Gradle Part 2" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2011/09/introduction-to-gradle-part-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQBRHg4eSp7ImA9WhdWF0Q.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-6079363565819313036</id><published>2011-09-11T22:04:00.003-04:00</published><updated>2011-09-11T22:09:15.631-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-11T22:09:15.631-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="gradle" /><category scheme="http://www.blogger.com/atom/ns#" term="SCM" /><category scheme="http://www.blogger.com/atom/ns#" term="groovy" /><title>Introduction to Gradle Part 1</title><content type="html">&lt;h2&gt;


&lt;/h2&gt;
Many
build tools have been created for building and packaging software.
Make, Ant, Maven,
etc., all seem to have their own frameworks of completing tasks that
are driven by the structure of each build tool.&amp;nbsp;&amp;nbsp; The
industry while
successfully using existing tools constantly requires more features in
a build tool to adapt to newer technologies that are emerging (OSGi,
Grails, Scala, Jetty, numerous advances in IDEs, etc.).&lt;br /&gt;
&lt;br /&gt;
This
article focuses on using Gradle, because of the wide usage of Java and
J2EE as an enterprise platform along with Groovy as a Java meta-language.&amp;nbsp; &amp;nbsp;Gradle is also
poised to become the
next widely adopted build tool in the world of software build tools and
configuration management because Gradle bridges the feature gap between
Ant and Maven.&lt;br /&gt;
&lt;br /&gt;
Gradle
is a build tool based on the popular language Groovy.&amp;nbsp; Groovy
is an
extension of Java and has many built-in features and frameworks for
completing complex tasks.&amp;nbsp; Gradle has many features which will
be
described briefly. &lt;br /&gt;
&lt;br /&gt;
Gradle
fills in the build tool feature gaps that the two most commonly used
build tools, Maven and Ant.&amp;nbsp; Either tool may have one or less
of the
following features, but neither tool has all of the following features:
&lt;br /&gt;
&lt;ul style="margin-left: 40px;"&gt;
&lt;li&gt;Both
Ant and Maven build scripts are based in xml.&amp;nbsp; A build tool
that allows
the flexibility of a true language allows the developer to include
libraries into the build file.&amp;nbsp; The semantics of a language
based build
tool also allow flexible development and lower learning curves if the
Domain Specific Language (DSL) used in the build tool are already
known.
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="margin-left: 40px;"&gt;
&lt;li&gt;Software
configuration managers are often the keepers of all build knowledge.
&amp;nbsp;A
build tool that does not require special knowledge either due to
complexity of a project or intimate knowledge about a build tool
configuration keeps both developers and software configuration managers
involved in the process at all times.
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="margin-left: 40px;"&gt;
&lt;li&gt;The
choice of being able to create builds by convention ala Maven or in a
more free manner such as Ant is an either/or choice of build
tools.&amp;nbsp; &lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="margin-left: 40px;"&gt;
&lt;li&gt;Good
dependency management.&amp;nbsp; While Ant has dependency management in
Ivy and
Maven has its own dependency management.&amp;nbsp; A tool that is
simple and
excels in dependency management is needed.
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="margin-left: 40px;"&gt;
&lt;li&gt;Partial
builds.&amp;nbsp; In Maven when building a multi-project module it is
difficult
to build only specific projects without building all projects.
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="margin-left: 40px;"&gt;
&lt;li&gt;A potpourri of
plugins and
other 3&lt;sup&gt;rd&lt;/sup&gt;
party modules that are easy to integrate into a build.&amp;nbsp; Also,
a build
tool should allow users to easily build their own customizations with
minimum hassle.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
The
history of software build tools has always had challenges.&amp;nbsp;
Builds in
Make for instance used tabs in the semantics of a build file, Ant
without ant-contrib or other 3&lt;sup&gt;rd&lt;/sup&gt; party libraries
was never
meant to run a for loop, Maven pom files are difficult to manage for
the average developer trying to include a custom task not in the
standard lifecycle.&amp;nbsp; Each build tool had its own
idiosyncrasies.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;

&lt;span style="font-size: small;"&gt;
Gradle Features&lt;/span&gt;&lt;/h2&gt;
Gradle provides the following features:&lt;br /&gt;
&lt;ul style="margin-left: 40px;"&gt;
&lt;li&gt;Robust
dependency management.&amp;nbsp; Gradle uses Ivy to resolve
dependencies on
third party libraries or even inter-project dependencies.&amp;nbsp;
Circular
dependencies will also cause build failures.&amp;nbsp; Gradle also
builds on Ivy
with its own distinct features not found in the standard Ivy
distribution.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="margin-left: 40px;"&gt;
&lt;li&gt;Gradle allows you to build by
convention, &lt;b&gt;&lt;u&gt;IF&lt;/u&gt; &lt;/b&gt;you
choose to build by convention.&amp;nbsp; The alternative of building by
non-convention or a unique non-standard convention is just as easy to
select.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="margin-left: 40px;"&gt;
&lt;li&gt;Ant
tasks can be called directly from Gradle.&amp;nbsp; If a project
already is
written in ANT, it is possible to convert all, some, or none of the
build scripts to Gradle.
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="margin-left: 40px;"&gt;
&lt;li&gt;Gradle
being a meta-language of Java allows many of the same object types to
be introduced into the build scripts.&amp;nbsp; The richness of
Java/Groovy&amp;nbsp;
objects introduce a higher level of flexibility when writing build
scripts.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="margin-left: 40px;"&gt;
&lt;li&gt;Gradle
executes builds by phases.&amp;nbsp; Maven has a similar architecture,
but
Gradle makes configuring special hooks by execution phase simple.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="margin-left: 40px;"&gt;
&lt;li&gt;Support for existing Maven
and Ivy repositories exists through client modules.
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="margin-left: 40px;"&gt;
&lt;li&gt;Multiproject
builds are made simple in Gradle with features such as configuration
injection across projects, partial builds, and robust transitive
dependency management.
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="margin-left: 40px;"&gt;
&lt;li&gt;Since
Gradle is based on Groovy, it is possible to include third party
libraries and customize build scripts based on the Groovy and Java
languages.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="margin-left: 40px;"&gt;
&lt;li&gt;Numerous plugins for Jetty,
wars, Scala, Maven, code quality (metrics), OSGi, Eclipse, and
Reporting.
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style="margin-left: 40px;"&gt;
&lt;li&gt;A Gradle wrapper, that will setup Gradle-free
machines with a fresh new copy of Gradle from your repository.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="margin: 0in 0in 10pt;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;


&lt;span style="font-size: small;"&gt;A Simple Build Script&lt;/span&gt;&lt;/h2&gt;
Let us start by creating a simple Gradle build script for Java
code.&amp;nbsp; The installation and setup of Gradle can be found &lt;a href="http://www.gradle.org/installation.html" id="kpf4" style="padding: 0px;" title="here"&gt;here&lt;/a&gt;. Project A is a simple java
project that follows Java naming conventions and uses a Maven central
repository and a local maven repository located&amp;nbsp;in the local
file system at /tmp/repos/.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;


&lt;span style="font-size: small;"&gt;Build Project A (simple Java
jar build) &lt;/span&gt;&lt;/h3&gt;
&lt;br /&gt;
&lt;h4&gt;


&lt;span style="font-size: x-small;"&gt;(Project A/build.gradle)&lt;/span&gt;&lt;/h4&gt;
&lt;code&gt;&lt;br /&gt;
// We can add comments to the build script using
typical
Java/Groovy notation&lt;br /&gt;
//We need to specify the java plugin which by
default
looks for&amp;nbsp;src/main/java&lt;/code&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
usePlugin 'java'&lt;br /&gt;
usePlugin 'maven'&lt;br /&gt;
&lt;br /&gt;
version = 1.0&lt;br /&gt;
&lt;br /&gt;
configure(install.repositories.mavenInstaller) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; pom.version = '1.0'&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; pom.artifactId = 'project-A'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
repositories {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mavenCentral() //
Setup the Maven repository&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; mavenRepo(urls :
"file://localhost/tmp/repos/")&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// call uploadArchives to deploy to repository&lt;br /&gt;
uploadArchives {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; repositories.mavenDeployer {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
repository(url: "file://localhost/tmp/repos/")&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
pom.groupId = 'projectA'&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
pom.version = '1.0'&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
pom.artifactId = 'projectA'&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
install.dependsOn ':uploadArchives'&lt;br /&gt;
&lt;br /&gt;
dependencies { // Add external dependencies here&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compile group:
'commons-cli', name: 'commons-cli', version: '1.0'&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compile group:
'commons-logging', name: 'commons-logging', version: '1.0.4'&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compile group:
'commons-net', name: 'commons-net', version: '1.4.1'&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compile group:
'junit', name: 'junit', version: '4.7'&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compile group:
'org.codehaus.groovy', name: 'groovy-all', version: '1.6.2'&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compile group:
'quartz', name: 'quartz', version: '1.5.1'&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compile group:
'xstream', name: 'xstream', version: '1.2.1'&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compile group:
'commons-net', name: 'commons-net', version: '2.0'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sourceSets { // Defines which source files to include in the build&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; main {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
java {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
resources {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;div style="margin: 0in 0in 0pt;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="margin: 0in 0in 0pt;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="margin: 0in 0in 0pt;"&gt;
Run 'gradle assemble'&lt;/div&gt;
&lt;blockquote&gt;
&lt;div style="margin: 0in 0in 0pt;"&gt;
Output:&lt;/div&gt;
&lt;div style="margin: 0in 0in 0pt;"&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;small&gt;&lt;code&gt;:compileJava&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (2 KB)
http://repo1.maven.org/maven2/commons-cli/commons-cli/1.0/commons-cli-1.0.pom&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;..&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (2 KB)
http://repo1.maven.org/maven2/commons-lang/commons-lang/1.0/commons-lang-1.0.pom&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;...&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (5 KB)
http://repo1.maven.org/maven2/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.pom&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;.....&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (1 KB)
http://repo1.maven.org/maven2/junit/junit/4.7/junit-4.7.pom&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;..&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (24 KB)
http://repo1.maven.org/maven2/org/codehaus/groovy/groovy-all/1.6.2/groovy-all-1.6.2.pom&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;...................&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (9 KB)
http://repo1.maven.org/maven2/org/apache/ant/ant/1.7.1/ant-1.7.1.pom&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;........&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (4 KB)
http://repo1.maven.org/maven2/org/apache/ant/ant-parent/1.7.1/ant-parent-1.7.1.pom&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;.....&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (2 KB)
http://repo1.maven.org/maven2/org/apache/ant/ant-launcher/1.7.1/ant-launcher-1.7.1.pom&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;...&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (6 KB)
http://repo1.maven.org/maven2/jline/jline/0.9.94/jline-0.9.94.pom&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;.....&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (146 B)
http://repo1.maven.org/maven2/quartz/quartz/1.5.1/quartz-1.5.1.pom&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;..&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (371 B)
http://repo1.maven.org/maven2/xstream/xstream/1.2.1/xstream-1.2.1.pom&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;..&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (6 KB)
http://repo1.maven.org/maven2/com/thoughtworks/xstream/xstream/1.2.1/xstream-1.2.1.pom&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;......&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (7 KB)
http://repo1.maven.org/maven2/com/thoughtworks/xstream/xstream-parent/1.2.1/xstream-parent-1.2.1.pom&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;.......&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (638 B)
http://repo1.maven.org/maven2/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.pom&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;..&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (7 KB)
http://repo1.maven.org/maven2/commons-net/commons-net/2.0/commons-net-2.0.pom&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;.......&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (24 KB)
http://repo1.maven.org/maven2/org/apache/commons/commons-parent/11/commons-parent-11.pom&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;...................&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (4 KB)
http://repo1.maven.org/maven2/org/apache/apache/4/apache-4.pom&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;.....&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (30 KB)
http://repo1.maven.org/maven2/commons-cli/commons-cli/1.0/commons-cli-1.0.jar&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;.......................&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (38 KB)
http://repo1.maven.org/maven2/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;............................&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (232 KB)
http://repo1.maven.org/maven2/junit/junit/4.7/junit-4.7.jar&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;..................................................................................&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (4.45 MB)
http://repo1.maven.org/maven2/org/codehaus/groovy/groovy-all/1.6.2/groovy-all-1.6.2.jar&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;.........................................................................&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (353 KB)
http://repo1.maven.org/maven2/quartz/quartz/1.5.1/quartz-1.5.1.jar&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;........................................................................&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (63 KB)
http://repo1.maven.org/maven2/commons-lang/commons-lang/1.0/commons-lang-1.0.jar&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;..............................................&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (1.32 MB)
http://repo1.maven.org/maven2/org/apache/ant/ant/1.7.1/ant-1.7.1.jar&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;...............................................................................&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (87 KB)
http://repo1.maven.org/maven2/jline/jline/0.9.94/jline-0.9.94.jar&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;..............................................................&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (12 KB)
http://repo1.maven.org/maven2/org/apache/ant/ant-launcher/1.7.1/ant-launcher-1.7.1.jar&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;..........&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (349 KB)
http://repo1.maven.org/maven2/com/thoughtworks/xstream/xstream/1.2.1/xstream-1.2.1.jar&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;..................................................................................&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;downloading (24 KB)
http://repo1.maven.org/maven2/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;...................&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;:processResources&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;:classes&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;:jar&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;:assemble&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;&lt;br /&gt;
BUILD SUCCESSFUL&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;code&gt;&lt;br /&gt;
Total time: 1 mins 13.323 secs&lt;/code&gt;&lt;/small&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The build will generate classes and a final jar file in the
following
directories:&lt;br /&gt;
&lt;br /&gt;
ProjectA/.classpath&lt;br /&gt;
ProjectA/.classpath.old&lt;br /&gt;
ProjectA/.settings/org.eclipse.jdt.core.prefs&lt;br /&gt;
ProjectA/bin/com/pac/domain/Employee.class&lt;br /&gt;
ProjectA/.project&lt;br /&gt;
ProjectA/build.gradle&lt;br /&gt;
ProjectA/build/libs/ProjectA-1.0.jar&lt;br /&gt;
ProjectA/build/classes/main/com/pac/domain/Employee.class&lt;br /&gt;
ProjectA/build/ivy.xml&lt;br /&gt;
ProjectA/build/poms/pom-default.xml&lt;br /&gt;
ProjectA/src/main/java/com/pac/domain/Employee.java&lt;br /&gt;
&lt;br /&gt;
One thing to note. &amp;nbsp;If all of the dependencies have
not been added to the gradle an error will occur. &amp;nbsp;The list of
dependencies includes transitive dependencies or libraries that are
required by libraries listed in your dependency list. &amp;nbsp;One way
to automate the compilation of transitive dependencies is to add the
following line to the build script...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
configurations.compile.transitive
= true&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Any library that is required, but is not explicitly defined in
the build script will be managed automatically with this entry.
&amp;nbsp;Also, it is possible to manage transitive dependencies at a
more granular level (disabling for specific libraries). &amp;nbsp;One
example of this is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;
dependency("commons-cli:commons-cli:1.0") {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp; transitive = false&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.blogger.com/blogger.g?blogID=5397717562617098347"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-6079363565819313036?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FpfYuONN2uGLrMKRNCD9FNcxfXk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FpfYuONN2uGLrMKRNCD9FNcxfXk/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/FpfYuONN2uGLrMKRNCD9FNcxfXk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FpfYuONN2uGLrMKRNCD9FNcxfXk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/JoIFo-DNY-g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/6079363565819313036/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=6079363565819313036" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/6079363565819313036?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/6079363565819313036?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/JoIFo-DNY-g/introduction-to-gradle-part-1.html" title="Introduction to Gradle Part 1" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2011/09/introduction-to-gradle-part-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEAGR38-cSp7ImA9WhdWF0Q.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-8764086550515630101</id><published>2011-09-11T13:30:00.004-04:00</published><updated>2011-09-11T21:58:46.159-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-11T21:58:46.159-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="AJAX" /><category scheme="http://www.blogger.com/atom/ns#" term="firefox plugins" /><title>Useful Firefox Plugins For Web Development</title><content type="html">I found &lt;a href="http://web-dev-blog.com/2011/09/essential-7-firefox-webmaster-plugins/"&gt;this article&lt;/a&gt; useful in my AJAX development.&amp;nbsp; Thought I would share.&amp;nbsp; Enjoy!&lt;br /&gt;
&lt;br /&gt;
Here's another personal &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/tamper-data/"&gt;favorite plugin&lt;/a&gt; that reads/modifies HTTP headers. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-8764086550515630101?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hd9ggjgTcTvIxuNIGfxqpzMz4Ck/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hd9ggjgTcTvIxuNIGfxqpzMz4Ck/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/hd9ggjgTcTvIxuNIGfxqpzMz4Ck/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hd9ggjgTcTvIxuNIGfxqpzMz4Ck/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/LSHOGuvmLV0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/8764086550515630101/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=8764086550515630101" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/8764086550515630101?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/8764086550515630101?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/LSHOGuvmLV0/useful-firefox-plugins-for-web.html" title="Useful Firefox Plugins For Web Development" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2011/09/useful-firefox-plugins-for-web.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8DQH4_cCp7ImA9Wx5SEk8.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-420688088244335813</id><published>2010-08-07T20:54:00.000-04:00</published><updated>2010-08-07T20:54:31.048-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-07T20:54:31.048-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GWT" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><title>Google Web Tool Kit on 64 bit Ubuntu OS</title><content type="html">&lt;pre&gt;&lt;code&gt;I see many posts abut trying to run Google Web Toolkit in a 64 bit Linux environment, the toolkit seems to be trying&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;to use 32 bit libraries when automatically starting Mozilla for testing. &lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;The error looks something like this...&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt; &lt;/code&gt;&lt;/pre&gt;&lt;pre style="color: #e06666;"&gt;&lt;i&gt;&lt;b&gt;&lt;code&gt;** Unable to load Mozilla for hosted mode **
java.lang.UnsatisfiedLinkError: /opt/app/eclipse/plugins/org.eclipse.platform_3.5.0_155965261/
plugins/com.google.gwt.eclipse.sdkbundle.linux_1.7.1.v200909221731/gwt-linux-1.7.1/
mozilla-1.7.12/libxpcom.so:
libstdc++.so.5: cannot open shared object file: No such file or directory&lt;/code&gt;&lt;/b&gt;&lt;/i&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&amp;nbsp; &lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;My solution to this was to force install a 32bit library (libstdc++5.so) into my 32 bit Ubuntu OS.&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt; &lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;strong&gt;sudo dpkg -i --force-architecture ./libstdc++5_3.3.6-17ubuntu1_i386.deb&lt;/strong&gt;
&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;GWT should now be able to start up using the Mozilla libraries.  Good luck! &lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-420688088244335813?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mbKJk-o-v_Z5HNnffTcX0LTbP64/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mbKJk-o-v_Z5HNnffTcX0LTbP64/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/mbKJk-o-v_Z5HNnffTcX0LTbP64/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mbKJk-o-v_Z5HNnffTcX0LTbP64/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/2JqVdrCZV00" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/420688088244335813/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=420688088244335813" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/420688088244335813?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/420688088244335813?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/2JqVdrCZV00/google-web-tool-kit-on-64-bit-ubuntu-os.html" title="Google Web Tool Kit on 64 bit Ubuntu OS" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2010/08/google-web-tool-kit-on-64-bit-ubuntu-os.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUER3w-eSp7ImA9Wx5SEUQ.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-500860167575129449</id><published>2010-08-07T12:20:00.004-04:00</published><updated>2010-08-07T12:23:26.251-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-07T12:23:26.251-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="load testing" /><title>JMeter for Load Testing</title><content type="html">JMeter released a 2.4 version a couple of weeks ago, and I decided to download the tool.&amp;nbsp; So far, I love it!&amp;nbsp; Here is why:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Apache JMeter is simple and there is very little barrier to starting up a simple load test from your desktop.&amp;nbsp; Perfect for my development load tests.&lt;/li&gt;
&lt;li&gt;It is free and licensed under Apache.&lt;/li&gt;
&lt;li&gt;JMeter runs on the JVM, so the tool is multi-platform.&lt;/li&gt;
&lt;li&gt;JMeter allows testing of the following server types...&lt;br /&gt;
&lt;br /&gt;
Web - HTTP, HTTPS&lt;br /&gt;
SOAP&lt;br /&gt;
Database via JDBC&lt;br /&gt;
LDAP&lt;br /&gt;
JMS&lt;br /&gt;
Mail - POP3(S) and IMAP(S) &lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;In JMeter, you can configure the number of thread groups for both sending requests and sampling initiated during tests. &lt;/li&gt;
&lt;li&gt;The results can be dumped into CSV format for graphing via Excel or some other spreadsheet.&amp;nbsp; JMeter also contains plugins, several of which will generate jpg graphs that can be copied into documentation.&lt;/li&gt;
&lt;li&gt;You can record manual web click interactions to create HTTP tests.&amp;nbsp; These interactions can be saved as a test case and run later during load testing.&lt;/li&gt;
&lt;li&gt; Supports JUnit testing too!&lt;/li&gt;
&lt;li&gt;JMeter can be distributed in a cluster for simulating requests from multisite locations. &lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
There are many comprehensive suites of test tools available: JRunner, Selenium, etc. However, for quick turnaround in a development environment JMeter cannot be beat.&amp;nbsp; It is easy and it is simple to show others how to run the tool with very little training.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-500860167575129449?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QErsS5aKFoBslge3BKqnBv4TtfQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QErsS5aKFoBslge3BKqnBv4TtfQ/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/QErsS5aKFoBslge3BKqnBv4TtfQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QErsS5aKFoBslge3BKqnBv4TtfQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/gmn1ddLEeDQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/500860167575129449/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=500860167575129449" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/500860167575129449?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/500860167575129449?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/gmn1ddLEeDQ/jmeter-for-load-testing.html" title="JMeter for Load Testing" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2010/08/jmeter-for-load-testing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUICQ3s9fip7ImA9WxFbFUg.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-6777379993676128073</id><published>2010-07-07T22:36:00.005-04:00</published><updated>2010-07-07T22:52:42.566-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-07T22:52:42.566-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="lambda" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="closure" /><title>Java Lambda Expressions - Groovy Closure's Evil Twin?</title><content type="html">Java lambda expressions appear to be an uglier version of Groovy closures.  InfoQ provides some good information about the latest Oracle implementation.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.infoq.com/news/2010/06/lambda-syntax-debate"&gt;http://www.infoq.com/news/2010/06/lambda-syntax-debate&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-6777379993676128073?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/oZ19HSD-iJcb2Hsy_-qh3_ahr2E/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oZ19HSD-iJcb2Hsy_-qh3_ahr2E/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/oZ19HSD-iJcb2Hsy_-qh3_ahr2E/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oZ19HSD-iJcb2Hsy_-qh3_ahr2E/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/J6NNLvw42xA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/6777379993676128073/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=6777379993676128073" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/6777379993676128073?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/6777379993676128073?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/J6NNLvw42xA/java-lambda-expressions-groovy-closures.html" title="Java Lambda Expressions - Groovy Closure's Evil Twin?" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2010/07/java-lambda-expressions-groovy-closures.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEDSHk4cCp7ImA9WxFUEEg.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-2981600246510034291</id><published>2010-06-20T14:10:00.003-04:00</published><updated>2010-06-20T14:14:39.738-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-20T14:14:39.738-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="motivation" /><category scheme="http://www.blogger.com/atom/ns#" term="business" /><title>The surprising truth about motivation...</title><content type="html">An interesting video about what motivates us technical folks.&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/u6XAPnuFjJc&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/u6XAPnuFjJc&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-2981600246510034291?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rW4bkKZefbJhIiakZ1YYDXonTa4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rW4bkKZefbJhIiakZ1YYDXonTa4/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/rW4bkKZefbJhIiakZ1YYDXonTa4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rW4bkKZefbJhIiakZ1YYDXonTa4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/p8o9x7IDt08" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/2981600246510034291/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=2981600246510034291" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/2981600246510034291?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/2981600246510034291?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/p8o9x7IDt08/surprising-truth-about-motivation.html" title="The surprising truth about motivation..." /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2010/06/surprising-truth-about-motivation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEERng5fip7ImA9WxFUEEg.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-2000906963941963775</id><published>2010-06-19T08:55:00.004-04:00</published><updated>2010-06-20T14:13:27.626-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-20T14:13:27.626-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="deployments" /><category scheme="http://www.blogger.com/atom/ns#" term="SmartFrog" /><title>SmartFrog distributed system management</title><content type="html">I'm impressed with the depth of distributed environment management knowledge in the &lt;a href="http://wiki.smartfrog.org/wiki/display/sf/SmartFrog+Home"&gt;SmartFrog&lt;/a&gt;.  SmartFrog is a Java based framework that manages, configures, and deploys distributed software. &lt;br /&gt;&lt;br /&gt;Many companies I have worked with have created some form of home grown solution to manage their environments, but the SmartFrog guys seem to have taken this need for environment management to the next level.  SmartFrog has plugins for Amazon EC2, ssh, Hadoop, jetty, RPM, more.. and more...  This tool is open source too, so there is no limit to the growth of plugins for managing different systems.&lt;br /&gt;&lt;br /&gt;The SmartFrog group has addressed the different types of deployments.  Continuous integration deployment, MSI deployments, and many&lt;a href="http://wiki.smartfrog.org/wiki/display/sf/API+and+Component+Model"&gt; more&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;I'm setting up SmartFrog for my personal projects and more details about the Smart Frog system will follow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-2000906963941963775?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wTP7kvXSlO_9LwiVq2gS8aN9cd8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wTP7kvXSlO_9LwiVq2gS8aN9cd8/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/wTP7kvXSlO_9LwiVq2gS8aN9cd8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wTP7kvXSlO_9LwiVq2gS8aN9cd8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/rNGDk7QjqgE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/2000906963941963775/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=2000906963941963775" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/2000906963941963775?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/2000906963941963775?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/rNGDk7QjqgE/smartfrog-distributed-system-management.html" title="SmartFrog distributed system management" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2010/06/smartfrog-distributed-system-management.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YHQHg-fyp7ImA9WxFXF0g.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-7674716772211932218</id><published>2010-05-24T22:33:00.002-04:00</published><updated>2010-05-24T22:38:51.657-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-24T22:38:51.657-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="gradle" /><category scheme="http://www.blogger.com/atom/ns#" term="build" /><category scheme="http://www.blogger.com/atom/ns#" term="SCM" /><category scheme="http://www.blogger.com/atom/ns#" term="groovy" /><title>Gradle Introduction</title><content type="html">I love Gradle (&lt;a href="http://www.gradle.org"&gt;http://www.gradle.org&lt;/a&gt;)!  Gradle introduces so many needed concepts to the world of build scripts and allows developers enough flexibility to either customize to the Nth degree or simply use cookie cutter build scripts. &lt;br /&gt;&lt;br /&gt;I have added notes about my adventures with Gradle and &lt;a href="http://www.software-configuration.com/articles/software_configuration_management_with_gradle_builds_part1.html"&gt;some real world examples for Java, Groovy, War, multi-project builds, and even some Gradle customizations&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-7674716772211932218?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hHwK24z4ZgmSHjNo0SM9OtFIbKw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hHwK24z4ZgmSHjNo0SM9OtFIbKw/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/hHwK24z4ZgmSHjNo0SM9OtFIbKw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hHwK24z4ZgmSHjNo0SM9OtFIbKw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/2hjhGJnln3Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/7674716772211932218/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=7674716772211932218" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/7674716772211932218?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/7674716772211932218?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/2hjhGJnln3Y/gradle-introduction.html" title="Gradle Introduction" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2010/05/gradle-introduction.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMBRn4_eyp7ImA9WxBTGEk.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-1927419705935900134</id><published>2009-12-11T00:33:00.002-05:00</published><updated>2009-12-14T21:17:37.043-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-14T21:17:37.043-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="Eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="Gaelyk" /><category scheme="http://www.blogger.com/atom/ns#" term="Google AppEngine" /><category scheme="http://www.blogger.com/atom/ns#" term="groovy" /><title>Groovy on Google App Engine Part II</title><content type="html">In the previous post, I linked to the &lt;a href="http://www.vimeo.com/6844104"&gt;demo&lt;/a&gt; of the Atlanta Groovy on Grails User Group presentation from August given by Pratik Patel.  In this, post we will review the steps required to create a Groovy app in the demo, and in addtion create some nice little Groovy features to the application.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Recap&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Using Eclipse 3.5 Galileo the following plugins were installed for this demo..&lt;br /&gt;- &lt;a href="http://groovy.codehaus.org/Eclipse+Plugin"&gt;Groovy Eclipse Plugin&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://code.google.com/eclipse/"&gt;Google AppEngine Eclipse Plugin&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://www.aptana.org/"&gt;Aptana Studio Plugin&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Before starting you will need a Google AppEngine Account.  Google AppEngine now supports Python and Java.  We will be running Groovy over Java using the Groovy Gaelyk library that allows Groovy libraries to run on the Google App Engine.  The data service is also on Google's servers and is using DataStore.&lt;br /&gt;&lt;br /&gt;Next, create a Google AppEngine project in Eclipse.  The Google AppEngine plugin should add this feature into your Eclipse IDE.  We should treat the project as if we were creating a Google AppEngine java project, and then we will include the Gaelyk libraries to allow Groovlets to run on the server.&lt;br /&gt;&lt;br /&gt;Update the appengine-web.xml&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;appengine-web-app xmlns="http://appengine.google.com/ns/1.0"&amp;gt;&lt;br /&gt;&amp;lt;application&amp;gt;pac-gcloud&amp;lt;/application&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;1&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Configure java.util.logging --&amp;gt;&lt;br /&gt;&amp;lt;system-properties&amp;gt;&lt;br /&gt;&amp;lt;property name="java.util.logging.config.file"&lt;br /&gt;value="WEB-INF/logging.properties"/&amp;gt;&lt;br /&gt;&amp;lt;/system-properties&amp;gt;&lt;br /&gt;&amp;lt;static-files&amp;gt;&lt;br /&gt;  &amp;lt;exclude path="/WEB-INF/**.groovy" /&amp;gt;&lt;br /&gt;  &amp;lt;exclude path="**.gtpl" /&amp;gt;&lt;br /&gt;&amp;lt;/static-files&amp;gt;&lt;br /&gt;&amp;lt;/appengine-web-app&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Update web.xml to handle Gaelyk servlets&lt;br /&gt;&lt;span class="content"&gt;&lt;span class="block" style="margin-left: 0px ! important;"&gt;&lt;code class="plain"&gt;&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5"&amp;gt;&lt;br /&gt;&amp;lt;!-- The Gaelyk Groovlet servlet --&amp;gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;   &amp;lt;servlet-name&amp;gt;GroovletServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;   &amp;lt;servlet-class&amp;gt;groovyx.gaelyk.GaelykServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- The Gaelyk template servlet --&amp;gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;  &amp;lt;servlet-name&amp;gt;TemplateServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;   &amp;lt;servlet-class&amp;gt;groovyx.gaelyk.GaelykTemplateServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Specify a mapping between *.groovy URLs and Groovlets --&amp;gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;  &amp;lt;servlet-name&amp;gt;GroovletServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;  &amp;lt;url-pattern&amp;gt;*.groovy&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Specify a mapping between *.gtpl URLs and templates --&amp;gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;  &amp;lt;servlet-name&amp;gt;TemplateServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;  &amp;lt;url-pattern&amp;gt;*.gtpl&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Define index.gtpl as a welcome file --&amp;gt;&lt;br /&gt;&amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;   &amp;lt;welcome-file&amp;gt;index.gtpl&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;&amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Copy Gaelyk and Groovy jar file into your webapp/lib directory.&lt;br /&gt;&lt;br /&gt;Next, we need an index.gtpl that will be the landing page for this application.  The index.gtpl used in this demo can be found &lt;a href="http://pac-gcloud.appspot.com/code/Items.groovy.txt"&gt;here&lt;/a&gt;.  In this index page we provide links to all the source code for this project.  The application starts at the &lt;a href="http://pac-gcloud.appspot.com/code/edititems.gtpl.txt"&gt;edititems.gtpl&lt;/a&gt; page.&lt;br /&gt;&lt;br /&gt;The edititems.gtpl will load the data from Google DataStore with the following lines...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;%     def query = new Query("Item")&lt;br /&gt; def entityList = datastoreService.prepare(query).asList(FetchOptions.Builder.withLimit(100))&lt;br /&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://pac-gcloud.appspot.com/code/Items.groovy.txt"&gt;Items.groovy&lt;/a&gt; entity seen above is used to handle the different types of requests as well.&lt;br /&gt;&lt;br /&gt;All of the code can be found &lt;a href="http://pac-gcloud.appspot.com/"&gt;here&lt;/a&gt;.  There is a good bit of code for each function of the Items.groovy file, so the exercise of reviewing those functions can be completed outside of this article.&lt;br /&gt;&lt;br /&gt;Also, one unique item is a screen scraper which is executed when selecting the "import" button in the edititems.gtpl file.  This function uses the XMLSlurper and TagSoup to screen scrape an html file in a wikipedia table.  The function then generates a list of buildings in Jacksonville, FL sorted by height and imports the list into the Google DataStore database.  The list will be displayed next time the edititems.gtpl is viewed.&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;public class Building {&lt;br /&gt;&lt;br /&gt; def findTallestInJacksonville = {&lt;br /&gt;     def xmlReader = new XmlSlurper(new org.ccil.cowan.tagsoup.Parser())&lt;br /&gt;     def url = new URL("http://en.wikipedia.org/wiki/List_of_tallest_buildings_in_Jacksonville")&lt;br /&gt;     url.withReader { reader -&gt;&lt;br /&gt;         def html = xmlReader.parse(reader)&lt;br /&gt;         def listTable =  html.body.div.div[0].div.div[1].table[0].tr&lt;br /&gt;         return listTable.list()&lt;br /&gt;     }&lt;br /&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The code can be deployed from Eclipse to Google by selecting the project and right click &gt; Google &gt; Deploy to App Engine.  The entire code base and functoning application that was deployed can be found here...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pac-gcloud.appspot.com/"&gt;http://pac-gcloud.appspot.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Also, I recommend Google AppEngine, since it also has some nice management features and is free up to certain limits.  This is a great way to start up an application for free until it is successful.  Good luck.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-1927419705935900134?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dnKQAi8rG7m3nYu8ODomnHxvRIA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dnKQAi8rG7m3nYu8ODomnHxvRIA/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/dnKQAi8rG7m3nYu8ODomnHxvRIA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dnKQAi8rG7m3nYu8ODomnHxvRIA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/e1xqVLcqSLY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/1927419705935900134/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=1927419705935900134" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/1927419705935900134?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/1927419705935900134?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/e1xqVLcqSLY/groovy-on-google-app-engine-part-ii.html" title="Groovy on Google App Engine Part II" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2009/10/groovy-on-google-app-engine-part-ii.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkAFQHs4eSp7ImA9WxNXFks.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-4614550764961261216</id><published>2009-10-04T08:40:00.007-04:00</published><updated>2009-10-04T08:51:51.531-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-04T08:51:51.531-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="Google App Engine" /><category scheme="http://www.blogger.com/atom/ns#" term="Eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="Gaelyk" /><category scheme="http://www.blogger.com/atom/ns#" term="groovy" /><title>Groovy on Google App Engine Using Gaelyk</title><content type="html">There is an&lt;a href="http://www.vimeo.com/6844104"&gt; interesting post&lt;/a&gt; by &lt;a href="http://www.jroller.com/prpatel/"&gt;Pratik Patel&lt;/a&gt; from last month's Atlanta Groovy and Grails (ATL2G) meeting.  This video demonstrates using Groovy on Google AppEngine using the Groovy Gaelyk libraries.  If you are interested in taking advantage of Google's cloud computing resources using Groovy, this is a good presentation.&lt;br /&gt;&lt;br /&gt;More posts will follow with a brief written "How-to" and some twists on Pratik's demo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-4614550764961261216?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zVbtuoxi9fVNX_-riqAYq9hEp1Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zVbtuoxi9fVNX_-riqAYq9hEp1Q/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/zVbtuoxi9fVNX_-riqAYq9hEp1Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zVbtuoxi9fVNX_-riqAYq9hEp1Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/b_fp3pDTql4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/4614550764961261216/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=4614550764961261216" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/4614550764961261216?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/4614550764961261216?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/b_fp3pDTql4/groovy-on-google-app-engine-using.html" title="Groovy on Google App Engine Using Gaelyk" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2009/10/groovy-on-google-app-engine-using.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkACSHgzcSp7ImA9WxJbFkg.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-870859287434548696</id><published>2009-07-26T21:27:00.004-04:00</published><updated>2009-07-26T21:39:29.689-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-26T21:39:29.689-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="TimeZone" /><title>Java TimeZones</title><content type="html">There seems to be a lack of documented TimeZone ids for Java 6.  For anyone searching for their timezone, the list is below.  Yah, I know not terribly exciting.  More interesting Java posts will follow.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Code snippet:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;import java.util.TimeZone&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;for (String id:TimeZone.getAvailableIDs()){println id + ",  "}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;TimeZones:&lt;/span&gt;&lt;br /&gt;Etc/GMT+12,  Etc/GMT+11,  MIT,  Pacific/Apia,  Pacific/Midway,  Pacific/Niue,  Pacific/Pago_Pago,  Pacific/Samoa,  US/Samoa,  America/Adak,  America/Atka,  Etc/GMT+10,  HST,  Pacific/Fakaofo,  Pacific/Honolulu,  Pacific/Johnston,  Pacific/Rarotonga,  Pacific/Tahiti,  SystemV/HST10,  US/Aleutian,  US/Hawaii,  Pacific/Marquesas,  AST,  America/Anchorage,  America/Juneau,  America/Nome,  America/Yakutat,  Etc/GMT+9,  Pacific/Gambier,  SystemV/YST9,  SystemV/YST9YDT,  US/Alaska,  America/Dawson,  America/Ensenada,  America/Los_Angeles,  America/Tijuana,  America/Vancouver,  America/Whitehorse,  Canada/Pacific,  Canada/Yukon,  Etc/GMT+8,  Mexico/BajaNorte,  PST,  PST8PDT,  Pacific/Pitcairn,  SystemV/PST8,  SystemV/PST8PDT,  US/Pacific,  US/Pacific-New,  America/Boise,  America/Cambridge_Bay,  America/Chihuahua,  America/Dawson_Creek,  America/Denver,  America/Edmonton,  America/Hermosillo,  America/Inuvik,  America/Mazatlan,  America/Phoenix,  America/Shiprock,  America/Yellowknife,  Canada/Mountain,  Etc/GMT+7,  MST,  MST7MDT,  Mexico/BajaSur,  Navajo,  PNT,  SystemV/MST7,  SystemV/MST7MDT,  US/Arizona,  US/Mountain,  America/Belize,  America/Cancun,  America/Chicago,  America/Costa_Rica,  America/El_Salvador,  America/Guatemala,  America/Indiana/Knox,  America/Indiana/Tell_City,  America/Knox_IN,  America/Managua,  America/Menominee,  America/Merida,  America/Mexico_City,  America/Monterrey,  America/North_Dakota/Center,  America/North_Dakota/New_Salem,  America/Rainy_River,  America/Rankin_Inlet,  America/Regina,  America/Swift_Current,  America/Tegucigalpa,  America/Winnipeg,  CST,  CST6CDT,  Canada/Central,  Canada/East-Saskatchewan,  Canada/Saskatchewan,  Chile/EasterIsland,  Etc/GMT+6,  Mexico/General,  Pacific/Easter,  Pacific/Galapagos,  SystemV/CST6,  SystemV/CST6CDT,  US/Central,  US/Indiana-Starke,  America/Atikokan,  America/Bogota,  America/Cayman,  America/Coral_Harbour,  America/Detroit,  America/Eirunepe,  America/Fort_Wayne,  America/Grand_Turk,  America/Guayaquil,  America/Havana,  America/Indiana/Indianapolis,  America/Indiana/Marengo,  America/Indiana/Petersburg,  America/Indiana/Vevay,  America/Indiana/Vincennes,  America/Indiana/Winamac,  America/Indianapolis,  America/Iqaluit,  America/Jamaica,  America/Kentucky/Louisville,  America/Kentucky/Monticello,  America/Lima,  America/Louisville,  America/Montreal,  America/Nassau,  America/New_York,  America/Nipigon,  America/Panama,  America/Pangnirtung,  America/Port-au-Prince,  America/Porto_Acre,  America/Resolute,  America/Rio_Branco,  America/Thunder_Bay,  America/Toronto,  Brazil/Acre,  Canada/Eastern,  Cuba,  EST,  EST5EDT,  Etc/GMT+5,  IET,  Jamaica,  SystemV/EST5,  SystemV/EST5EDT,  US/East-Indiana,  US/Eastern,  US/Michigan,  America/Caracas,  America/Anguilla,  America/Antigua,  America/Aruba,  America/Asuncion,  America/Barbados,  America/Blanc-Sablon,  America/Boa_Vista,  America/Campo_Grande,  America/Cuiaba,  America/Curacao,  America/Dominica,  America/Glace_Bay,  America/Goose_Bay,  America/Grenada,  America/Guadeloupe,  America/Guyana,  America/Halifax,  America/La_Paz,  America/Manaus,  America/Marigot,  America/Martinique,  America/Moncton,  America/Montserrat,  America/Port_of_Spain,  America/Porto_Velho,  America/Puerto_Rico,  America/Santiago,  America/Santo_Domingo,  America/St_Barthelemy,  America/St_Kitts,  America/St_Lucia,  America/St_Thomas,  America/St_Vincent,  America/Thule,  America/Tortola,  America/Virgin,  Antarctica/Palmer,  Atlantic/Bermuda,  Atlantic/Stanley,  Brazil/West,  Canada/Atlantic,  Chile/Continental,  Etc/GMT+4,  PRT,  SystemV/AST4,  SystemV/AST4ADT,  America/St_Johns,  CNT,  Canada/Newfoundland,  AGT,  America/Araguaina,  America/Argentina/Buenos_Aires,  America/Argentina/Catamarca,  America/Argentina/ComodRivadavia,  America/Argentina/Cordoba,  America/Argentina/Jujuy,  America/Argentina/La_Rioja,  America/Argentina/Mendoza,  America/Argentina/Rio_Gallegos,  America/Argentina/San_Juan,  America/Argentina/San_Luis,  America/Argentina/Tucuman,  America/Argentina/Ushuaia,  America/Bahia,  America/Belem,  America/Buenos_Aires,  America/Catamarca,  America/Cayenne,  America/Cordoba,  America/Fortaleza,  America/Godthab,  America/Jujuy,  America/Maceio,  America/Mendoza,  America/Miquelon,  America/Montevideo,  America/Paramaribo,  America/Recife,  America/Rosario,  America/Sao_Paulo,  Antarctica/Rothera,  BET,  Brazil/East,  Etc/GMT+3,  America/Noronha,  Atlantic/South_Georgia,  Brazil/DeNoronha,  Etc/GMT+2,  America/Scoresbysund,  Atlantic/Azores,  Atlantic/Cape_Verde,  Etc/GMT+1,  Africa/Abidjan,  Africa/Accra,  Africa/Bamako,  Africa/Banjul,  Africa/Bissau,  Africa/Casablanca,  Africa/Conakry,  Africa/Dakar,  Africa/El_Aaiun,  Africa/Freetown,  Africa/Lome,  Africa/Monrovia,  Africa/Nouakchott,  Africa/Ouagadougou,  Africa/Sao_Tome,  Africa/Timbuktu,  America/Danmarkshavn,  Atlantic/Canary,  Atlantic/Faeroe,  Atlantic/Faroe,  Atlantic/Madeira,  Atlantic/Reykjavik,  Atlantic/St_Helena,  Eire,  Etc/GMT,  Etc/GMT+0,  Etc/GMT-0,  Etc/GMT0,  Etc/Greenwich,  Etc/UCT,  Etc/UTC,  Etc/Universal,  Etc/Zulu,  Europe/Belfast,  Europe/Dublin,  Europe/Guernsey,  Europe/Isle_of_Man,  Europe/Jersey,  Europe/Lisbon,  Europe/London,  GB,  GB-Eire,  GMT,  GMT0,  Greenwich,  Iceland,  Portugal,  UCT,  UTC,  Universal,  WET,  Zulu,  Africa/Algiers,  Africa/Bangui,  Africa/Brazzaville,  Africa/Ceuta,  Africa/Douala,  Africa/Kinshasa,  Africa/Lagos,  Africa/Libreville,  Africa/Luanda,  Africa/Malabo,  Africa/Ndjamena,  Africa/Niamey,  Africa/Porto-Novo,  Africa/Tunis,  Africa/Windhoek,  Arctic/Longyearbyen,  Atlantic/Jan_Mayen,  CET,  ECT,  Etc/GMT-1,  Europe/Amsterdam,  Europe/Andorra,  Europe/Belgrade,  Europe/Berlin,  Europe/Bratislava,  Europe/Brussels,  Europe/Budapest,  Europe/Copenhagen,  Europe/Gibraltar,  Europe/Ljubljana,  Europe/Luxembourg,  Europe/Madrid,  Europe/Malta,  Europe/Monaco,  Europe/Oslo,  Europe/Paris,  Europe/Podgorica,  Europe/Prague,  Europe/Rome,  Europe/San_Marino,  Europe/Sarajevo,  Europe/Skopje,  Europe/Stockholm,  Europe/Tirane,  Europe/Vaduz,  Europe/Vatican,  Europe/Vienna,  Europe/Warsaw,  Europe/Zagreb,  Europe/Zurich,  MET,  Poland,  ART,  Africa/Blantyre,  Africa/Bujumbura,  Africa/Cairo,  Africa/Gaborone,  Africa/Harare,  Africa/Johannesburg,  Africa/Kigali,  Africa/Lubumbashi,  Africa/Lusaka,  Africa/Maputo,  Africa/Maseru,  Africa/Mbabane,  Africa/Tripoli,  Asia/Amman,  Asia/Beirut,  Asia/Damascus,  Asia/Gaza,  Asia/Istanbul,  Asia/Jerusalem,  Asia/Nicosia,  Asia/Tel_Aviv,  CAT,  EET,  Egypt,  Etc/GMT-2,  Europe/Athens,  Europe/Bucharest,  Europe/Chisinau,  Europe/Helsinki,  Europe/Istanbul,  Europe/Kaliningrad,  Europe/Kiev,  Europe/Mariehamn,  Europe/Minsk,  Europe/Nicosia,  Europe/Riga,  Europe/Simferopol,  Europe/Sofia,  Europe/Tallinn,  Europe/Tiraspol,  Europe/Uzhgorod,  Europe/Vilnius,  Europe/Zaporozhye,  Israel,  Libya,  Turkey,  Africa/Addis_Ababa,  Africa/Asmara,  Africa/Asmera,  Africa/Dar_es_Salaam,  Africa/Djibouti,  Africa/Kampala,  Africa/Khartoum,  Africa/Mogadishu,  Africa/Nairobi,  Antarctica/Syowa,  Asia/Aden,  Asia/Baghdad,  Asia/Bahrain,  Asia/Kuwait,  Asia/Qatar,  Asia/Riyadh,  EAT,  Etc/GMT-3,  Europe/Moscow,  Europe/Volgograd,  Indian/Antananarivo,  Indian/Comoro,  Indian/Mayotte,  W-SU,  Asia/Riyadh87,  Asia/Riyadh88,  Asia/Riyadh89,  Mideast/Riyadh87,  Mideast/Riyadh88,  Mideast/Riyadh89,  Asia/Tehran,  Iran,  Asia/Baku,  Asia/Dubai,  Asia/Muscat,  Asia/Tbilisi,  Asia/Yerevan,  Etc/GMT-4,  Europe/Samara,  Indian/Mahe,  Indian/Mauritius,  Indian/Reunion,  NET,  Asia/Kabul,  Asia/Aqtau,  Asia/Aqtobe,  Asia/Ashgabat,  Asia/Ashkhabad,  Asia/Dushanbe,  Asia/Karachi,  Asia/Oral,  Asia/Samarkand,  Asia/Tashkent,  Asia/Yekaterinburg,  Etc/GMT-5,  Indian/Kerguelen,  Indian/Maldives,  PLT,  Asia/Calcutta,  Asia/Colombo,  Asia/Kolkata,  IST,  Asia/Katmandu,  Antarctica/Mawson,  Antarctica/Vostok,  Asia/Almaty,  Asia/Bishkek,  Asia/Dacca,  Asia/Dhaka,  Asia/Novosibirsk,  Asia/Omsk,  Asia/Qyzylorda,  Asia/Thimbu,  Asia/Thimphu,  BST,  Etc/GMT-6,  Indian/Chagos,  Asia/Rangoon,  Indian/Cocos,  Antarctica/Davis,  Asia/Bangkok,  Asia/Ho_Chi_Minh,  Asia/Hovd,  Asia/Jakarta,  Asia/Krasnoyarsk,  Asia/Phnom_Penh,  Asia/Pontianak,  Asia/Saigon,  Asia/Vientiane,  Etc/GMT-7,  Indian/Christmas,  VST,  Antarctica/Casey,  Asia/Brunei,  Asia/Chongqing,  Asia/Chungking,  Asia/Harbin,  Asia/Hong_Kong,  Asia/Irkutsk,  Asia/Kashgar,  Asia/Kuala_Lumpur,  Asia/Kuching,  Asia/Macao,  Asia/Macau,  Asia/Makassar,  Asia/Manila,  Asia/Shanghai,  Asia/Singapore,  Asia/Taipei,  Asia/Ujung_Pandang,  Asia/Ulaanbaatar,  Asia/Ulan_Bator,  Asia/Urumqi,  Australia/Perth,  Australia/West,  CTT,  Etc/GMT-8,  Hongkong,  PRC,  Singapore,  Australia/Eucla,  Asia/Choibalsan,  Asia/Dili,  Asia/Jayapura,  Asia/Pyongyang,  Asia/Seoul,  Asia/Tokyo,  Asia/Yakutsk,  Etc/GMT-9,  JST,  Japan,  Pacific/Palau,  ROK,  ACT,  Australia/Adelaide,  Australia/Broken_Hill,  Australia/Darwin,  Australia/North,  Australia/South,  Australia/Yancowinna,  AET,  Antarctica/DumontDUrville,  Asia/Sakhalin,  Asia/Vladivostok,  Australia/ACT,  Australia/Brisbane,  Australia/Canberra,  Australia/Currie,  Australia/Hobart,  Australia/Lindeman,  Australia/Melbourne,  Australia/NSW,  Australia/Queensland,  Australia/Sydney,  Australia/Tasmania,  Australia/Victoria,  Etc/GMT-10,  Pacific/Guam,  Pacific/Port_Moresby,  Pacific/Saipan,  Pacific/Truk,  Pacific/Yap,  Australia/LHI,  Australia/Lord_Howe,  Asia/Magadan,  Etc/GMT-11,  Pacific/Efate,  Pacific/Guadalcanal,  Pacific/Kosrae,  Pacific/Noumea,  Pacific/Ponape,  SST,  Pacific/Norfolk,  Antarctica/McMurdo,  Antarctica/South_Pole,  Asia/Anadyr,  Asia/Kamchatka,  Etc/GMT-12,  Kwajalein,  NST,  NZ,  Pacific/Auckland,  Pacific/Fiji,  Pacific/Funafuti,  Pacific/Kwajalein,  Pacific/Majuro,  Pacific/Nauru,  Pacific/Tarawa,  Pacific/Wake,  Pacific/Wallis,  NZ-CHAT,  Pacific/Chatham,  Etc/GMT-13,  Pacific/Enderbury,  Pacific/Tongatapu,  Etc/GMT-14,  Pacific/Kiritimati&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-870859287434548696?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Em0mYfz-abaNte1sMmJNchtUU9M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Em0mYfz-abaNte1sMmJNchtUU9M/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/Em0mYfz-abaNte1sMmJNchtUU9M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Em0mYfz-abaNte1sMmJNchtUU9M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/DdBxmmFyRmA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/870859287434548696/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=870859287434548696" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/870859287434548696?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/870859287434548696?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/DdBxmmFyRmA/java-timezones.html" title="Java TimeZones" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2009/07/java-timezones.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQBQHg4eSp7ImA9WxJUE08.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-567372849148666695</id><published>2009-07-11T11:27:00.003-04:00</published><updated>2009-07-11T11:32:31.631-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-11T11:32:31.631-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="EBay" /><category scheme="http://www.blogger.com/atom/ns#" term="scalability" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><title>JavaOne Notes on EBAY Architecture</title><content type="html">Ever wonder how to architect a system with 2 billion pages views and 48 billion sql executes daily? Chief architect of EBay, Randy Shoup, gives his &lt;a href="http://java.sun.com/javaone/2009/articles/gen_ebay.jsp"&gt;insights&lt;/a&gt; at JavaOne 2009.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-567372849148666695?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gyiI_c6lffJjydLwh8YL5MUwlis/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gyiI_c6lffJjydLwh8YL5MUwlis/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/gyiI_c6lffJjydLwh8YL5MUwlis/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gyiI_c6lffJjydLwh8YL5MUwlis/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/hLjZw-xdzW8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/567372849148666695/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=567372849148666695" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/567372849148666695?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/567372849148666695?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/hLjZw-xdzW8/javaone-notes-on-ebay-architecture.html" title="JavaOne Notes on EBAY Architecture" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2009/07/javaone-notes-on-ebay-architecture.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cEQng7fip7ImA9WxJWF08.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-522131087100529862</id><published>2009-06-22T22:30:00.005-04:00</published><updated>2009-06-22T22:43:23.606-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-22T22:43:23.606-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fat32" /><category scheme="http://www.blogger.com/atom/ns#" term="korn" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><category scheme="http://www.blogger.com/atom/ns#" term="backups" /><title>Homegrown Ubuntu Backups</title><content type="html">sbackup on Ubuntu is a nice backup utility, but I needed to copy my backup files across network to a Windows server with a 1TB external drive formatted in FAT32.  What sbackup needed was a way to samba mount my external drive, a way to break up files larger than 4GB, and to breakup the backups into nice size chunks that can be copied nicely over my network.&lt;br /&gt;&lt;br /&gt;Here's my quick script to backup my /home dir.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;font-size:85%;" &gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;BACKUP_DIR=/home/robert&lt;br /&gt;&lt;br /&gt;DATESTAMP=`date '+%Y%m%d'`&lt;br /&gt;echo "Backing up Copernicus laptop..."&lt;br /&gt;&lt;br /&gt;ls -1 $BACKUP_DIR | while read dir&lt;br /&gt;do&lt;br /&gt; echo "Backing up $dir"&lt;br /&gt; TARFILENAME="${dir}_${DATESTAMP}"&lt;br /&gt; tar cvpjf /var/backup/local_backups/backup_${TARFILENAME}.tar.bz2 --exclude=*.log --exclude=lost+found $BACKUP_DIR/$dir&lt;br /&gt; split -b4GB /var/backup/local_backups/backup_${TARFILENAME}.tar.bz2&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;sudo smbmount //192.168.0.122/copernicus/backup /mnt/backup -o username=YYY,password=XXX&lt;br /&gt;&lt;br /&gt;mkdir -p /mnt/backup/backup_${DATESTAMP}&lt;br /&gt;&lt;br /&gt;mv /var/backup/local_backups/backup_*_${DATESTAMP}.tar.bz2* /mnt/backup/backup_${DATESTAMP}&lt;br /&gt;echo "Finished backing up Copernicus laptop..."&lt;br /&gt;exit 0&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-522131087100529862?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1MpyYDUORWYpsdL4kgelgkWXHos/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1MpyYDUORWYpsdL4kgelgkWXHos/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/1MpyYDUORWYpsdL4kgelgkWXHos/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1MpyYDUORWYpsdL4kgelgkWXHos/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/xQau-tsmWOk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/522131087100529862/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=522131087100529862" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/522131087100529862?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/522131087100529862?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/xQau-tsmWOk/homegrown-ubuntu-backups.html" title="Homegrown Ubuntu Backups" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2009/06/homegrown-ubuntu-backups.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcFQHk-fyp7ImA9WxJWEUU.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-8959733292973253558</id><published>2009-06-15T21:12:00.001-04:00</published><updated>2009-06-16T15:20:11.757-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-16T15:20:11.757-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MySQL" /><category scheme="http://www.blogger.com/atom/ns#" term="PHP" /><category scheme="http://www.blogger.com/atom/ns#" term="LAMP" /><category scheme="http://www.blogger.com/atom/ns#" term="SMF" /><category scheme="http://www.blogger.com/atom/ns#" term="Apache" /><title>SMF Review</title><content type="html">SMF or simple machines forum is a php-based forum software with many features and an active developer community.  After searching for several forum software packages, and checking ratings, maturity of the code base, frequency of updates, helpful forums, SMF appeared to be one of the top packages available.  Also, my hosting company (GoDaddy) provided free install and setup (another plus!).  Pretty much what I wanted, because this wasn't to be a main focus of one of my sites, but I also wanted a forum that was low maintenance, so that I could do other work that was more interesting.  SMF also appeared to also have many useful&lt;a href="http://www.simplemachines.org/about/features.php"&gt; features&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So everything looks good right?  Well almost.  As a java developer, I learned several things good and bad about php.  I also waged a small battle with security.  My hats off to the guys that manage LAMP apps full time.&lt;br /&gt;&lt;br /&gt;Lessons learned...&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Remote file inclusion&lt;/span&gt; - PHP without the correct barriers set can allow hackers to send a url that references a remote file.  These remote scripts serve different purposes, but in my case a script was used to customize php files and drop in redirects for certain URLs that boost different websites rankings in Google.&lt;br /&gt;There is a great description about remote file inclusion&lt;a href="http://blogingenuity.com/2009/05/14/remote-file-inclusion-rfi-attempts-detecting-tracking-and-mitigating/"&gt; here&lt;/a&gt;.  The article also provides a great description and some remedies for this issue.&lt;br /&gt;&lt;br /&gt;Here's the first fix to keep remote file inclusion from being used on my site...&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:78%;"&gt;                                   Set &lt;strong&gt;allow_url_fopen&lt;/strong&gt; to OFF&lt;br /&gt;                                 Set &lt;strong&gt;allow_url_include&lt;/strong&gt; to OFF&lt;br /&gt;                                 Set &lt;strong&gt;register_globals&lt;/strong&gt; to OFF&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  2.  &lt;span style="font-weight: bold; font-style: italic;"&gt;Do not allow users to register themselves&lt;/span&gt; -  As much as I don't want to keep up with users, I soon found that this is the best way to see whats happening on your site after setup especially since I am by no means an SMF expert.  After setting up my final SMF 1.1.9 forum, I had 16 spam bots attempt to register users between 1AM and 7AM.  The first setup, was to add admin approval for all users.  SMF sent me a nice little email that Viagara28 and other creative users were interested in joining.  Yeah right!&lt;br /&gt;&lt;br /&gt;Allowing users to register themselves will open the doors for spambots, and you will soon have hordes of nefarious advertisements posted on your forum.&lt;br /&gt;&lt;br /&gt;One really nice feature about SMF is that with a click you can view and lookup the IP of the requesting member.  This helps give you an idea of with whom you are dealing.  The 16 member requests were all from spamlands Ukraine and Russia.  SMF also allows you to block certain IP ranges if you wish to block out an entire country.  Sorry Ukraine!&lt;br /&gt;&lt;br /&gt;3. &lt;span style="font-weight: bold;"&gt;Set the captcha to the highest level of difficulty&lt;/span&gt; - This one step filtered out numerous emails from spambots.  This article&lt;a href="http://astricon.tmcnet.com/topics/broadband-mobile/articles/18772-yahoos-captcha-brokenis-spam-tsunami-the-offing.htm"&gt; here&lt;/a&gt; explains that Captcha can be hacked and should be made as difficult as possible to filter out the bots.&lt;br /&gt;&lt;br /&gt;These 3 suggestions kept my &lt;a href="http://www.software-configuration.com/forums/"&gt;SMF forum&lt;/a&gt; from being decimated into a heaping pile of ash.  Overall, though I believe that SMF/php is a little bit rough around the edges on security, it is by no means a reason to stay away from SMF or php in general.  I must note that I did start with SMF 1.1.5 which is the default SMF install from godaddy.com.  After reading newsgroups about security enhancements, I decided to go out on my own and install 1.1.9.  A good move and all remote file inclusions seemed to be wiped clean by making this move.&lt;br /&gt;&lt;br /&gt;So here's my analysis on SMF experiences.&lt;br /&gt;&lt;br /&gt;1.) Install - (B+) Overall pretty good install.  There seems to be a low barrier to setup SMF which is nice.  I didn't quite understand upgrade paths.. can i go from 1.1.5 -&gt; 1.1.9 with a simple upgrade package? but in my situation everything appeared to work.  Also, the learning curve on setup was pretty small.  I had a few issues installing themes and understanding if a theme would fit 1.1.9 but this issue was soon resolved.  Also, you have to go back and remove the php pages for install.php and upgrade.php.  It would be nice not to need to do that.&lt;br /&gt;&lt;br /&gt;2.) Security - (C) Spambots are ready for SMF, but I think following the suggestions above and upgrading to the latest version of SMF will keep you a few steps ahead of the spammers and hackers. Default settings are prone to hacking, and I believe spambots prey on this fact.&lt;br /&gt;&lt;br /&gt;3.) User Community (A-) There is  large SMF community out there which in my book is worth more than the app itself sometimes.  There was a lot of good information and the developers seem to be actively posting.  Good job on this!&lt;br /&gt;&lt;br /&gt;Another note on this... SMF allows homegrown pre-packaged themes to be installed which I really liked.  You can visit a site and browse many different types of themes, pick one, download it and install it.&lt;br /&gt;&lt;br /&gt;4.) Features - (A) Lots of features have been added to SMF.  Almost too much really for what I needed, but I was able to navigate through the menus and using IP tracking, style sheet editing, and many more.&lt;br /&gt;&lt;br /&gt;5.) Usability - (B) Well this is good and bad.  The good is that there are a lot of features.  The bad is that there are a lot of features.  Overall, I was able to navigate, setup, and configure a site pretty quickly.  However, there were times where it took me some time to figure out the right way to do something.  One example is setting the current theme.  After installing the theme I liked, do I simply change the paths on the current theme?  I tried changing the path, but for some reason my site turned into garbled mush and couldn't find URLs etc.  I soon found the install theme button, and everything cleared up.  There were other small things like that, which kept SMF from becoming stupidly simple to use.  Some level of technical knowledge is useful for SMF without a doubt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-8959733292973253558?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pP5RHvETSrzTePbXW8PP446ibwg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pP5RHvETSrzTePbXW8PP446ibwg/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/pP5RHvETSrzTePbXW8PP446ibwg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pP5RHvETSrzTePbXW8PP446ibwg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/oTiw2Hv-8Tc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/8959733292973253558/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=8959733292973253558" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/8959733292973253558?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/8959733292973253558?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/oTiw2Hv-8Tc/smf-review.html" title="SMF Review" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2009/06/smf-review.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYBQH08eip7ImA9WxJQGU0.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-9143551710492812025</id><published>2009-06-01T21:41:00.003-04:00</published><updated>2009-06-01T22:02:31.372-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-01T22:02:31.372-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="PHP" /><category scheme="http://www.blogger.com/atom/ns#" term="AJAX" /><category scheme="http://www.blogger.com/atom/ns#" term="script.aculo.us" /><category scheme="http://www.blogger.com/atom/ns#" term="Prototype" /><title>PHP and script.aculo.us Web 2.0 Application Interfaces</title><content type="html">I just recently finished reviewing &lt;a href="http://www.packtpub.com/php-and-script-aculo-us-web-2-0-application-interface/book/rk/php-script-abr1/0409?utm_source=rk_php_script_abr1_0409&amp;amp;utm_medium=content&amp;amp;utm_campaign=ramsai#indetail"&gt;PHP and script.aculo.us Web 2.0 Application Interfaces&lt;/a&gt; by Sridhar Rao.  Sridhar provides many hands-on examples of the Script.aculo.us library and explains in detail many of the effects used in many of our favorite web 2.0 applications i.e. tadalist, digg, delicious, and 43things.com.  If you have ever struggled to get JavaScript to play nicely this is a must read. &lt;br /&gt;&lt;br /&gt;Sridhar explains the concepts of Script.aculo.us, Prototype, and AJAX in PHP.  The chapters are well-written and follow up with many useful examples.  The author weaves those concepts into reality and explains how many of the effects that we enjoy on the web are done.  My favorite was creating a Delicio.us / Digg -like bookmark application along with many effects such as search with real-time autocompletion, realtime updates, and tag clouds. Another useful chapter describes an AJAX enabled shopping cart that provides awesome features like drag and drop, and applies some of the interesting Script.aculo.us effects to the online store.  Very cool.&lt;br /&gt;&lt;br /&gt;The author also writes in a fun tone, and gives the reader a lot of interesting tidbits to chew on.  A good read overall.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-9143551710492812025?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ppn6Xg5zBL9VAXxpsZoXonwDty0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ppn6Xg5zBL9VAXxpsZoXonwDty0/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/ppn6Xg5zBL9VAXxpsZoXonwDty0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ppn6Xg5zBL9VAXxpsZoXonwDty0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/r1kB4gpj7Is" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/9143551710492812025/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=9143551710492812025" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/9143551710492812025?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/9143551710492812025?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/r1kB4gpj7Is/php-and-scriptaculous-web-20.html" title="PHP and script.aculo.us Web 2.0 Application Interfaces" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2009/06/php-and-scriptaculous-web-20.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MGRXY5eSp7ImA9WxVbEE4.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-4123908507314257887</id><published>2009-03-22T22:24:00.031-04:00</published><updated>2009-03-25T23:50:24.821-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-25T23:50:24.821-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="unit test" /><category scheme="http://www.blogger.com/atom/ns#" term="mock objects" /><category scheme="http://www.blogger.com/atom/ns#" term="commons-vfs" /><title>Designing Java Mock Objects with Commons-VFS</title><content type="html">Unit tests and mock objects can get messy when dealing with file objects, but recently I have had the chance to throw in another tool into the old Java toolbox.  &lt;a href="http://commons.apache.org/vfs"&gt;Commons-VFS&lt;/a&gt; allows developers to create a virtual file system, where the files spanning multiple drives/formats/protocols can be made to appear as a single drive accessible through the VFSManager.&lt;br /&gt;&lt;br /&gt;Common-VFS allows the developers to span the following file systems and formats...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://commons.apache.org/vfs/filesystems.html#FTP"&gt;FTP&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://commons.apache.org/vfs/filesystems.html#Local%20Files"&gt;Local Files&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://commons.apache.org/vfs/filesystems.html#HTTP%20and%20HTTPS"&gt;HTTP and HTTPS&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://commons.apache.org/vfs/filesystems.html#SFTP"&gt;SFTP&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://commons.apache.org/vfs/filesystems.html#Temporary%20Files"&gt;Temporary Files&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://commons.apache.org/vfs/filesystems.html#Zip,%20Jar%20and%20Tar"&gt;Zip, Jar and Tar (uncompressed, tgz or tbz2)&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://commons.apache.org/vfs/filesystems.html#gzip%20and%20bzip2"&gt;gzip and bzip2&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://commons.apache.org/vfs/filesystems.html#res"&gt;res&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://commons.apache.org/vfs/filesystems.html#ram"&gt;ram&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://commons.apache.org/vfs/filesystems.html#mime"&gt;mime&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Commons-VFS is a very useful library with many possible applications.  In the following case, I would like to demonstrate using a commons-VFS FileObject in a mock object to simulate a basic runtime file manipulation.  This is a bit more realistic than creating a mock object or fakes with no true file changes and is simple and easy to use while only making a virtual file updates in memory.&lt;br /&gt;&lt;br /&gt;First, I will create an interface named PACFileHandler.  The interface will define the contract for any implementation of the PACFileHandler.&lt;style type="text/css"&gt; &lt;!--code { font-family: Courier New, Courier; font-size: 10pt; margin: 0px; }--&gt;&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;!-- =     Further information: http://www.java2html.de     = --&gt;&lt;br /&gt;&lt;div class="java" align="left"&gt;&lt;table bg="" style="color: rgb(255, 255, 255);" border="0" cellpadding="3" cellspacing="0"&gt;   &lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;&lt;!-- start source code --&gt;&lt;br /&gt;&lt;td align="left" nowrap="nowrap" valign="top"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;* &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;package &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;com.pac.ps.file;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;* &lt;/span&gt;&lt;span style="color: rgb(127, 159, 191);"&gt;@author &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;robert&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public interface &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PACFileHandler &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;open&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String fileName&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;StringBuffer read&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;boolean &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;write&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;StringBuffer sbf&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;boolean &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;append&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;StringBuffer sbf&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;close&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String fileName&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;br /&gt;&lt;!-- end source code --&gt;&lt;br /&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;Next, you can create an implementation of this class for runtime. The implementation is not important at this point since we are reviewing commons-VFS with mock objects.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The mock class of the implementation will implement PACFileHandler and will look like this...&lt;br /&gt;&lt;br /&gt;&lt;!-- ======================================================== --&gt; &lt;!-- = Java Sourcecode to HTML automatically converted code = --&gt; &lt;!-- =   Java2Html Converter 5.0 [2006-02-26] by Markus Gebhard  markus@jave.de   = --&gt; &lt;!-- =     Further information: http://www.java2html.de     = --&gt; &lt;div class="java" align="left"&gt; &lt;table bg="" style="color: rgb(255, 255, 255);" border="0" cellpadding="3" cellspacing="0"&gt;    &lt;tbody&gt;&lt;tr&gt;   &lt;!-- start source code --&gt;    &lt;td align="left" nowrap="nowrap" valign="top"&gt;     &lt;code&gt; &lt;span style="color: rgb(63, 95, 191);"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;* &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;package &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;com.pac.ps.file;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;java.io.ByteArrayOutputStream;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;java.io.IOException;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;java.io.OutputStream;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;java.io.PrintWriter;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;org.apache.commons.vfs.FileContent;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;org.apache.commons.vfs.FileObject;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;org.apache.commons.vfs.FileSystemException;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;org.apache.commons.vfs.FileSystemManager;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;org.apache.commons.vfs.FileUtil;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;org.apache.commons.vfs.VFS;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;* &lt;/span&gt;&lt;span style="color: rgb(127, 159, 191);"&gt;@author &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;robert&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public class &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PACFileHandlerMock &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;implements &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PACFileHandler &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;FileObject jarFile ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;/* (non-Javadoc)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;* @see com.pac.ps.file.PACFileHandler#append(java.lang.StringBuffer)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;boolean &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;append&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;StringBuffer sbf&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;// TODO Auto-generated method stub&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;return false&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;/* (non-Javadoc)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;* @see com.pac.ps.file.PACFileHandler#open(java.lang.String)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;open&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String fileName&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;try &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;FileSystemManager fsManager = VFS.getManager&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String fileString = &lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"ram://" &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;+ fileName;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;jarFile = fsManager.resolveFile&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;fileString&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;} &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;catch &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;FileSystemException fse&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;System.out.println&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"ERROR: " &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;+ fse.toString&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;())&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;/* (non-Javadoc)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;* @see com.pac.ps.file.PACFileHandler#read()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;StringBuffer read&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;StringBuffer fileContents = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;StringBuffer&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;try &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;ByteArrayOutputStream outputStream = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;ByteArrayOutputStream&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;FileUtil.writeContent&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;jarFile, outputStream&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;fileContents.append&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;outputStream&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;} &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;catch &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;IOException fse&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;System.out.println&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"ERROR: " &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;+ fse&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;return &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;fileContents ;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;/* (non-Javadoc)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;* @see com.pac.ps.file.PACFileHandler#write(java.lang.StringBuffer)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 127, 95);"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;boolean &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;write&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;StringBuffer sbf&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;try &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;jarFile.createFile&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;FileContent fc = jarFile.getContent&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;OutputStream outputStream = fc.getOutputStream&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PrintWriter bw = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PrintWriter&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;outputStream&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;bw.write&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;sbf.toString&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;())&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;bw.close&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;outputStream.close&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;} &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;catch &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;IOException fse&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;System.out.println&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"ERROR: " &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;+ fse&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;return true&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;close&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String fileName&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;try &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;jarFile.close&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;} &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;catch &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;FileSystemException fse&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;){&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;System.out.println&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"ERROR: " &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;+ fse&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/code&gt;         &lt;/td&gt;   &lt;!-- end source code --&gt;    &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt; &lt;!-- =       END of automatically generated HTML code       = --&gt; &lt;!-- ======================================================== --&gt;&lt;br /&gt;&lt;br /&gt;The following code from the mock open() method will initialize the commons-VFS File System Manager.  Notice, how the file name is referenced.  The path to our virtual file will start with "ram://".  Other tests could easily be created using the formats discussed earlier, but in this case we will be creating the virtual file in the ram://&lt;xxx&gt; path in memory.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;FileSystemManager fsManager = VFS.getManager&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String fileString = &lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"ram://" &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;+ fileName;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;      &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;jarFile = fsManager.resolveFile&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;fileString&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The above mock class will be passed into a PACFile object which will read and write the contents of the file using the PACFileHandlerMock class.   In runtime the PACFile object will reference the PACFileHandlerImpl, and our mock object should imitate a true File object without many differences.&lt;br /&gt;&lt;br /&gt; &lt;!-- ======================================================== --&gt; &lt;!-- = Java Sourcecode to HTML automatically converted code = --&gt; &lt;!-- =   Java2Html Converter 5.0 [2006-02-26] by Markus Gebhard  markus@jave.de   = --&gt; &lt;!-- =     Further information: http://www.java2html.de     = --&gt; &lt;div class="java" align="left"&gt; &lt;table bg="" style="color: rgb(255, 255, 255);" border="0" cellpadding="3" cellspacing="0"&gt;    &lt;tbody&gt;&lt;tr&gt;   &lt;!-- start source code --&gt;    &lt;td align="left" nowrap="nowrap" valign="top"&gt;     &lt;code&gt; &lt;span style="color: rgb(63, 95, 191);"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;* &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;package &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;com.pac.ps.file;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;* &lt;/span&gt;&lt;span style="color: rgb(127, 159, 191);"&gt;@author &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;robert&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public class &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PACFile &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PACFileHandler pfh ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PACFile&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PACFileHandler pfHandler&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;){&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.pfh = pfHandler ;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;boolean &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;write&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String fileName,String contents&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;){&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;pfh.open&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;fileName&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;StringBuffer line = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;StringBuffer&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;contents&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;pfh.write&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;line&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;pfh.close&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;fileName&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;return true &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;StringBuffer read&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String fileName&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;){&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;StringBuffer line = pfh.read&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;return &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;line;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/code&gt;         &lt;/td&gt;   &lt;!-- end source code --&gt;    &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt; &lt;!-- =       END of automatically generated HTML code       = --&gt; &lt;!-- ======================================================== --&gt; &lt;br /&gt;Last, let's create a JUnit 4 test case called PACFileTest...&lt;br /&gt;&lt;br /&gt; &lt;!-- ======================================================== --&gt; &lt;!-- = Java Sourcecode to HTML automatically converted code = --&gt; &lt;!-- =   Java2Html Converter 5.0 [2006-02-26] by Markus Gebhard  markus@jave.de   = --&gt; &lt;!-- =     Further information: http://www.java2html.de     = --&gt; &lt;div class="java" align="left"&gt; &lt;table bg="" style="color: rgb(255, 255, 255);" border="0" cellpadding="3" cellspacing="0"&gt;    &lt;tbody&gt;&lt;tr&gt;   &lt;!-- start source code --&gt;    &lt;td align="left" nowrap="nowrap" valign="top"&gt;     &lt;code&gt; &lt;span style="color: rgb(63, 95, 191);"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;* &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;package &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;com.pac.ps.file;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;org.junit.Test;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;junit.framework.TestCase;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;* &lt;/span&gt;&lt;span style="color: rgb(127, 159, 191);"&gt;@author &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;robert&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt; &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public class &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PACFileTest &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;extends &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;TestCase &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;* Test method for &lt;/span&gt;&lt;span style="color: rgb(63, 63, 191);"&gt;{@link com.pac.ps.file.PACFile#PACFile(com.pac.ps.file.PACFileHandler)}&lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;   &lt;/span&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(100, 100, 100);"&gt;@Test&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;testPACFile&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PACFileHandlerMock pfhm = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PACFileHandlerMock&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PACFile pacFile = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;PACFile&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;pfhm&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String fileName = &lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"testFile"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;pacFile.write&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;fileName,&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Four score and seven years ago"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;StringBuffer sb = pacFile.read&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;fileName&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;assertEquals&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Four score and seven years ago"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,sb.toString&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;())&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/code&gt;         &lt;/td&gt;   &lt;!-- end source code --&gt;    &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt; &lt;!-- =       END of automatically generated HTML code       = --&gt; &lt;!-- ======================================================== --&gt; &lt;br /&gt;Next run the previous unit test...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;font-size:100%;" &gt;Output:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 102);"&gt;Mar 25, 2009 11:45:58 PM org.apache.commons.vfs.VfsLog info&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 102);"&gt;INFO: Using "/tmp/vfs_cache" as temporary files store.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The previous code will create the mock PACFileHandler, and after create and write a virtual file to memory with the contents &lt;code&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;"Four score and seven years ago". &lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The file will then be read back and regurgitated back into the unit test assertion for a final check.  Many permutations of this example can be made for test cases. Many of the commons-VFS library formats outside of ram:// can be used instead (ftp, http, smb, etc.)&lt;/xxx&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-4123908507314257887?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/T1NNdGg3MIZb6yd0NcNQAcul0h4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/T1NNdGg3MIZb6yd0NcNQAcul0h4/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/T1NNdGg3MIZb6yd0NcNQAcul0h4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/T1NNdGg3MIZb6yd0NcNQAcul0h4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/Q4i33FRwmpo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/4123908507314257887/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=4123908507314257887" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/4123908507314257887?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/4123908507314257887?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/Q4i33FRwmpo/designing-java-mock-objects-with.html" title="Designing Java Mock Objects with Commons-VFS" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2009/03/designing-java-mock-objects-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcERHo_eyp7ImA9WxVUFE8.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-3881977167777759879</id><published>2009-03-18T21:48:00.004-04:00</published><updated>2009-03-18T22:00:05.443-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-18T22:00:05.443-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="Sun" /><category scheme="http://www.blogger.com/atom/ns#" term="hedge funds" /><title>IBM in talks to buy Sun</title><content type="html">Say it aint so.. &lt;a href="http://www.channelregister.co.uk/2009/03/18/ibm_buying_sun/"&gt;IBM is in talks to buy Sun&lt;/a&gt;.  Southeastern Asset Management, an activist investment group and largest shareholder of Sun is looking for ways to turn a quick profit on its shares of Sun. &lt;br /&gt;&lt;br /&gt;Well what better way to make a profit than to carve up their holdings and auction them off to the highest bidder!  IBM is apparently the first bidder.  HP has also been rumored to have been approached to bid on Sun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-3881977167777759879?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7sJxhepAlpIvBk5AvUENKm250yM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7sJxhepAlpIvBk5AvUENKm250yM/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/7sJxhepAlpIvBk5AvUENKm250yM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7sJxhepAlpIvBk5AvUENKm250yM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/WQB22Uohyro" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/3881977167777759879/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=3881977167777759879" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/3881977167777759879?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/3881977167777759879?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/WQB22Uohyro/ibm-in-talks-to-buy-sun.html" title="IBM in talks to buy Sun" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2009/03/ibm-in-talks-to-buy-sun.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQFRn0-eyp7ImA9WxVXEEs.&quot;"><id>tag:blogger.com,1999:blog-5397717562617098347.post-8030632218863182563</id><published>2009-02-07T21:25:00.004-05:00</published><updated>2009-02-07T21:31:57.353-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-07T21:31:57.353-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="stage" /><category scheme="http://www.blogger.com/atom/ns#" term="embedded systems" /><category scheme="http://www.blogger.com/atom/ns#" term="player" /><title>Self Assembling Robotics</title><content type="html">I was reading some information on the &lt;a href="http://playerstage.sourceforge.net/"&gt;Player/Stage&lt;/a&gt; project which is a Hardware Abstraction Layer (HAL) and simulator for robotics, and ran into this... enjoy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/uIn-sMq8-Ls&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=en&amp;amp;feature=player_embedded&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;embed src="http://www.youtube.com/v/uIn-sMq8-Ls&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=en&amp;amp;feature=player_embedded&amp;amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5397717562617098347-8030632218863182563?l=parthian-shot.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wzI3AhB41SjpMK4BYcliciGZx38/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wzI3AhB41SjpMK4BYcliciGZx38/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/wzI3AhB41SjpMK4BYcliciGZx38/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wzI3AhB41SjpMK4BYcliciGZx38/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/gjIrd/~4/T_uxcl1ENLI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://parthian-shot.blogspot.com/feeds/8030632218863182563/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5397717562617098347&amp;postID=8030632218863182563" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/8030632218863182563?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5397717562617098347/posts/default/8030632218863182563?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/gjIrd/~3/T_uxcl1ENLI/self-assembling-robotics.html" title="Self Assembling Robotics" /><author><name>Rob Castellow</name><uri>http://www.blogger.com/profile/17369801817245904560</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="33" height="26" src="http://1.bp.blogspot.com/_OXyiHMjHT0c/SKXUNkeXHMI/AAAAAAAAA9k/vNmsAjTHsLo/S220/0011.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://parthian-shot.blogspot.com/2009/02/self-assembling-robotics.html</feedburner:origLink></entry></feed>

