<?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;DEYERX45fyp7ImA9WhRbFU4.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173</id><updated>2012-02-06T15:48:24.027+02:00</updated><category term="ruby" /><category term="proxy" /><category term="cli" /><category term="javascript" /><category term="workflow" /><category term="swing" /><category term="macosx" /><category term="jks" /><category term="care" /><category term="jira" /><category term="maven" /><category term="github" /><category term="selenium" /><category term="gadget" /><category term="settings" /><category term="syntax" /><category term="chrome" /><category term="delphi" /><category term="atlassian" /><category term="firefox" /><category term="www" /><category term="test" /><category term="console" /><category term="concurency" /><category term="popup" /><category term="mini-seminars" /><category term="css" /><category term="test_approach" /><category term="plugin" /><category term="fckeditor" /><category term="tips" /><category term="todo" /><category term="gist" /><category term="windows" /><category term="servlet" /><category term="atlas-cli" /><category term="eclipse" /><category term="image" /><category term="property-set-storage" /><category term="google-code" /><category term="JEE" /><category term="label-cloud" /><category term="jsr223" /><category term="EL" /><category term="JNI" /><category term="java" /><category term="mylyn" /><category term="seam" /><category term="patterns" /><category term="highlight" /><category term="JSR" /><category term="mockup" /><category term="rich-faces" /><category term="pros" /><category term="cd" /><category term="intellij" /><category term="maven2" /><category term="dashboard" /><category term="foreseeing" /><category term="tip" /><category term="rest" /><category term="issue-operations" /><category term="crud" /><category term="systray" /><category term="ui" /><category term="editor" /><category term="jira-rest-cli" /><category term="blogger" /><category term="scrum" /><category term="dynamic languages" /><category term="groovy" /><category term="upload" /><category term="sal" /><category term="unit_test" /><category term="dao" /><category term="ssl" /><category term="https" /><category term="operations" /><category term="exception" /><category term="mscapi" /><category term="tools-tools-tools" /><category term="release" /><category term="clipboard" /><category term="AJS" /><category term="google" /><category term="jdk7" /><title>coding paradigm: line by line</title><subtitle type="html">Public sale: humble opinions, CI and automation drugs, Atlassian silver bullet solutions.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://leonardinius.galeoconsulting.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>61</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/CodingParadigmLineByLine" /><feedburner:info uri="codingparadigmlinebyline" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;C0ENQXc_eSp7ImA9WhRUEEo.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-3376251766943922328</id><published>2012-01-20T17:01:00.002+02:00</published><updated>2012-01-20T17:01:30.941+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-20T17:01:30.941+02:00</app:edited><title>Maven Assembly Error on Ubuntu 11.10 (oneiric)</title><content type="html">I don't get it. I always expect OSS tools/utils to work correctly on Linux (especially on ubuntu). However, in the real life it's often not the case at all.&lt;br /&gt;
See&amp;nbsp;&lt;a href="https://jira.codehaus.org/browse/MASSEMBLY-588"&gt;https://jira.codehaus.org/browse/MASSEMBLY-588&lt;/a&gt;&amp;nbsp;for example (in two words maven assembly fails with some weird exception on Ubuntu while listing folder contents). Weird thing is - it works on Win7 no problem. During this particular project development (I use win7 as development box, this probably is the case) I have seen ~5 cases of weird maven behavior, all of them happend to be on Linux. Not judging, just saying.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-3376251766943922328?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2ay5DERYqrYZsip8KbcRuhgmFeE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2ay5DERYqrYZsip8KbcRuhgmFeE/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/2ay5DERYqrYZsip8KbcRuhgmFeE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2ay5DERYqrYZsip8KbcRuhgmFeE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=8mx1Y6sK1MM:NDaxzmFBYdY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=8mx1Y6sK1MM:NDaxzmFBYdY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=8mx1Y6sK1MM:NDaxzmFBYdY:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=8mx1Y6sK1MM:NDaxzmFBYdY:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=8mx1Y6sK1MM:NDaxzmFBYdY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=8mx1Y6sK1MM:NDaxzmFBYdY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=8mx1Y6sK1MM:NDaxzmFBYdY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=8mx1Y6sK1MM:NDaxzmFBYdY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=8mx1Y6sK1MM:NDaxzmFBYdY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/8mx1Y6sK1MM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/3376251766943922328/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=3376251766943922328" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/3376251766943922328?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/3376251766943922328?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/8mx1Y6sK1MM/maven-assembly-error-on-ubuntu-1110.html" title="Maven Assembly Error on Ubuntu 11.10 (oneiric)" /><author><name>Leonīds Maslovs</name><uri>https://profiles.google.com/114181879903295289339</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2012/01/maven-assembly-error-on-ubuntu-1110.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMNR3czfyp7ImA9WhRXFEs.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-4150335697272870111</id><published>2011-12-21T12:14:00.002+02:00</published><updated>2011-12-21T12:14:56.987+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-21T12:14:56.987+02:00</app:edited><title>Android multi-profile maven build</title><content type="html">Building the same Android app in different maven-profiles (backend connection urls ...) solved by copying projects pom.xml into different sub-folders and pointing them to andoid-application-original-source folder. The same (unduplicated) code, duplicated (adjusted) pom files. Any other recommendations?&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-4150335697272870111?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jdq5ziVkhg_jyP8iAsrlfzYjgfo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jdq5ziVkhg_jyP8iAsrlfzYjgfo/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/jdq5ziVkhg_jyP8iAsrlfzYjgfo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jdq5ziVkhg_jyP8iAsrlfzYjgfo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=ZBf9ZVMNLp0:o9yTkrNithU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=ZBf9ZVMNLp0:o9yTkrNithU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=ZBf9ZVMNLp0:o9yTkrNithU:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=ZBf9ZVMNLp0:o9yTkrNithU:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=ZBf9ZVMNLp0:o9yTkrNithU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=ZBf9ZVMNLp0:o9yTkrNithU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=ZBf9ZVMNLp0:o9yTkrNithU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=ZBf9ZVMNLp0:o9yTkrNithU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=ZBf9ZVMNLp0:o9yTkrNithU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/ZBf9ZVMNLp0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/4150335697272870111/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=4150335697272870111" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/4150335697272870111?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/4150335697272870111?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/ZBf9ZVMNLp0/android-multi-profile-maven-build.html" title="Android multi-profile maven build" /><author><name>Leonīds Maslovs</name><uri>https://profiles.google.com/114181879903295289339</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2011/12/android-multi-profile-maven-build.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQBRX0yeCp7ImA9WhZaF0o.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-5876714538026742883</id><published>2011-07-04T12:38:00.002+03:00</published><updated>2011-07-04T12:39:14.390+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-04T12:39:14.390+03:00</app:edited><title>Blog host is updated</title><content type="html">&lt;span class="Apple-style-span" style="font-family: Arial, 'Helvetica Neue', sans-serif; font-size: 15px; line-height: 19px;"&gt;My pers blog moved out to&amp;nbsp;&lt;a href="http://leonardinius.galeoconsulting.com/"&gt;http://leonardinius.galeoconsulting.com/&lt;/a&gt;&amp;nbsp;&amp;nbsp;RSS update might be needed&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-5876714538026742883?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QttSi-fcqyBUyNi0eIAxkOoQHrw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QttSi-fcqyBUyNi0eIAxkOoQHrw/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/QttSi-fcqyBUyNi0eIAxkOoQHrw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QttSi-fcqyBUyNi0eIAxkOoQHrw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=u5SQoVMfLsU:Rz2f-9wCEW0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=u5SQoVMfLsU:Rz2f-9wCEW0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=u5SQoVMfLsU:Rz2f-9wCEW0:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=u5SQoVMfLsU:Rz2f-9wCEW0:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=u5SQoVMfLsU:Rz2f-9wCEW0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=u5SQoVMfLsU:Rz2f-9wCEW0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=u5SQoVMfLsU:Rz2f-9wCEW0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=u5SQoVMfLsU:Rz2f-9wCEW0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=u5SQoVMfLsU:Rz2f-9wCEW0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/u5SQoVMfLsU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/5876714538026742883/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=5876714538026742883" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/5876714538026742883?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/5876714538026742883?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/u5SQoVMfLsU/blog-host-is-updated.html" title="Blog host is updated" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2011/07/blog-host-is-updated.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QGRHs8cCp7ImA9WhZRFUs.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-7739164965944206980</id><published>2011-04-12T02:29:00.006+03:00</published><updated>2011-04-12T02:42:05.578+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-12T02:42:05.578+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jira" /><category scheme="http://www.blogger.com/atom/ns#" term="jira-rest-cli" /><title>jira-rest-cli-1.1-SNAPSHOT work in progress</title><content type="html">At the moment working on &lt;a href="https://github.com/leonardinius/jira-rest-cli/tree/release/1.1"&gt;jira-rest-cli-1.1 release&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;What is done already?&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;console client improved (groovy): understands a whole set of command line options. See client help message below:&lt;pre&gt;&lt;code class="no-highlight"&gt;usage: rest-cli-groovy -h &amp;lt;host&amp;gt; -u &amp;lt;user&amp;gt; -w &amp;lt;password&amp;gt; [options]
 -c,--context &amp;lt;context&amp;gt;               application context (e.g.: jira)
 -d,--drop-session &amp;lt;cli-session-id&amp;gt;   will terminate cli session
 -f,--file &amp;lt;file&amp;gt;                     will read file and evaluate it's
                                      contents. use - for stdin
 -h,--host &amp;lt;host&amp;gt;                     server hostname
 -help                                prints this message
 -l,--list-sessions                   list cli session ids
 -n,--new-session                     will create new session and exit
                                      immediately
 -p,--port &amp;lt;port&amp;gt;                     server port. defaults to [80]
 -proto,--protocol &amp;lt;protocol&amp;gt;         http/https protocol; could be
                                      derived from port. defaults to
                                      [http]
 -s,--session &amp;lt;cli-session-id&amp;gt;        cli session id to connect to
 -u,--user &amp;lt;user&amp;gt;                     admin user name to connect with
 -w,--password &amp;lt;password&amp;gt;             password to authenticate with
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;class loader problem fixed, now it's possible to use import and reference Jira classes from the scripts. See example below:&lt;br /&gt;
&lt;pre&gt;&lt;code class="groovy"&gt;import com.a­tlassian.j­ira.projec­t.ProjectM­anager;
import com.a­tlassian.j­ira.Compon­entManager­;

ProjectMan­ager manag­er = Compo­nentManage­r.getInsta­nce().getP­rojectMana­ger();
manager.pr­ojectObjec­ts.collect­ { it.na­me }&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Work on automated configuration deployment (mini-framework started). If you are interested - please track&amp;nbsp;&lt;a href="https://github.com/leonardinius/jira-rest-cli/issues/1"&gt;https://github.com/leonardinius/jira-rest-cli/issues/1&lt;/a&gt;&amp;nbsp;and submit comments/use-cases.&lt;/li&gt;
&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Plans&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Implement automated configuration deployment scripts, pre-alfa stage&lt;/li&gt;
&lt;li&gt;Port (license, reasoning??) &lt;a href="https://plugins.atlassian.com/plugin/details/6820"&gt;Script Runner&lt;/a&gt;&amp;nbsp;bundled scripts? Make them rest-callable.&lt;/li&gt;
&lt;li&gt;Get JRuby client to the state of groovy client.&lt;/li&gt;
&lt;li&gt;Documentation and tests.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-7739164965944206980?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/J-0TX0KqL4lK6vfhUQnfQ1kYHGk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/J-0TX0KqL4lK6vfhUQnfQ1kYHGk/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/J-0TX0KqL4lK6vfhUQnfQ1kYHGk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/J-0TX0KqL4lK6vfhUQnfQ1kYHGk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CdfhJnfjXtw:cPyRjGCyOso:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CdfhJnfjXtw:cPyRjGCyOso:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CdfhJnfjXtw:cPyRjGCyOso:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=CdfhJnfjXtw:cPyRjGCyOso:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CdfhJnfjXtw:cPyRjGCyOso:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=CdfhJnfjXtw:cPyRjGCyOso:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CdfhJnfjXtw:cPyRjGCyOso:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CdfhJnfjXtw:cPyRjGCyOso:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=CdfhJnfjXtw:cPyRjGCyOso:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/CdfhJnfjXtw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/7739164965944206980/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=7739164965944206980" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/7739164965944206980?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/7739164965944206980?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/CdfhJnfjXtw/jira-erst-cli-11-snapshot-work-in.html" title="jira-rest-cli-1.1-SNAPSHOT work in progress" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2011/04/jira-erst-cli-11-snapshot-work-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YFSH48eip7ImA9WhZSGE8.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-2600788006445844660</id><published>2011-03-29T01:47:00.027+03:00</published><updated>2011-04-03T14:11:59.072+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-03T14:11:59.072+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="jira" /><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="rest" /><category scheme="http://www.blogger.com/atom/ns#" term="jsr223" /><category scheme="http://www.blogger.com/atom/ns#" term="cli" /><category scheme="http://www.blogger.com/atom/ns#" term="github" /><category scheme="http://www.blogger.com/atom/ns#" term="jira-rest-cli" /><category scheme="http://www.blogger.com/atom/ns#" term="groovy" /><title>Release announcement: jira-rest-cli-1.0 (jsr223 powered interactive jira scripting console)</title><content type="html">&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;Check it out&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-mkFMoGxOFi8/TZTCeGgyWyI/AAAAAAAAELU/8cnUY43s_TI/s1600/1_2011-03-31_1946.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-mkFMoGxOFi8/TZTCeGgyWyI/AAAAAAAAELU/8cnUY43s_TI/s1600/1_2011-03-31_1946.png" /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;logo&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&amp;nbsp;&lt;a href="https://github.com/leonardinius/jira-rest-cli"&gt;jira-rest-cli&lt;/a&gt; is JIRA plugin which provides a possibility to use your favorite programming language to script and&amp;nbsp;interact&amp;nbsp;with JIRA server realtime. The plugin provide following working modes:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;JIRA web-executor interface - allows to execute script input from Jira admin interface, no&amp;nbsp;continuos&amp;nbsp;working session support and no working context preservation between&amp;nbsp;invocations.&lt;/li&gt;
&lt;li&gt;JIRA web-cli interface - allows to create and manage working scripting sessions from Jira admin interface, connect to them and execute script code in the scripting session context - state is preserved between invocations.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;The are sample console clients available (Ruby, Groovy) which works similar to interactive language shells (irb, groovysh).&lt;/li&gt;
&lt;/ul&gt;At the moment following&amp;nbsp;programming&amp;nbsp;languages are supported:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;JavaScript (Rhino) shipped with Oracle JDK - &lt;span class="Apple-style-span" style="color: #274e13;"&gt;default&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Groovy 1.7.9 - &lt;span class="Apple-style-span" style="color: #bf9000;"&gt;separate&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;JRuby 1.5.6 - &lt;span class="Apple-style-span" style="color: #bf9000;"&gt;separate&lt;/span&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Languages are implemented as standalone&amp;nbsp;plug-able&amp;nbsp;components, installed separately, except for Rhino available by default.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;The target is to come as close to Firebug / IRB / Groovysh as possible :)&lt;br /&gt;
&lt;br /&gt;
Project page:&amp;nbsp;&lt;a href="https://github.com/leonardinius/jira-rest-cli"&gt;https://github.com/leonardinius/jira-rest-cli&lt;/a&gt;&lt;br /&gt;
README: &lt;a href="https://github.com/leonardinius/jira-rest-cli/blob/master/README.md"&gt;README.md&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://github.com/leonardinius/jira-rest-cli/blob/master/README.md"&gt;&lt;/a&gt;Link to plugin exchange: &lt;span class="Apple-style-span" style="background-color: yellow;"&gt;at the moment not mature enough. Needs more documentation, specification and testing...&lt;/span&gt;&lt;a href="https://github.com/leonardinius/jira-rest-cli"&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="background-color: yellow;"&gt;&lt;/span&gt;Screenshots&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;&lt;div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-bottom: 0.5em; margin-left: auto; margin-right: auto; padding-bottom: 6px; padding-left: 6px; padding-right: 6px; padding-top: 6px; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-pXkS3i1_km0/TZECWFTFBSI/AAAAAAAAELQ/fM3T-kyrIVc/s1600/non+cli.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="232" src="http://1.bp.blogspot.com/-pXkS3i1_km0/TZECWFTFBSI/AAAAAAAAELQ/fM3T-kyrIVc/s640/non+cli.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="padding-top: 4px; text-align: center;"&gt;Web-executor mode (non-interactive)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-hS6PnineDH4/TZECSGv-rEI/AAAAAAAAELE/3fQXcd8Brlc/s1600/2011-03-28_2344.png" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-hS6PnineDH4/TZECSGv-rEI/AAAAAAAAELE/3fQXcd8Brlc/s640/2011-03-28_2344.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Web-cli mode, session management&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-bottom: 0.5em; margin-left: auto; margin-right: auto; padding-bottom: 6px; padding-left: 6px; padding-right: 6px; padding-top: 6px; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-cPW_TitsUx4/TZECS2LQOeI/AAAAAAAAELI/pPJr5WiVUuo/s1600/2011-03-28_2346.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="379" src="http://1.bp.blogspot.com/-cPW_TitsUx4/TZECS2LQOeI/AAAAAAAAELI/pPJr5WiVUuo/s640/2011-03-28_2346.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="padding-top: 4px; text-align: center;"&gt;Web-cli mode, script execution (jRuby)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="font-size: medium; margin-bottom: 0.5em; margin-left: auto; margin-right: auto; padding-bottom: 6px; padding-left: 6px; padding-right: 6px; padding-top: 6px; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-62GtLpXPg6s/TZECVaXpdZI/AAAAAAAAELM/qigOfVpp_zQ/s1600/jruby.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="427" src="http://3.bp.blogspot.com/-62GtLpXPg6s/TZECVaXpdZI/AAAAAAAAELM/qigOfVpp_zQ/s640/jruby.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="font-size: 13px; padding-top: 4px; text-align: center;"&gt;Remote console-cli mode, script execution (jRuby)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span" style="background-color: yellow; font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;Project goal / scratch the itch&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
The problem I periodically get with the JIRA is the&amp;nbsp;necessity&amp;nbsp;of creating and configuring multiple different JIRA instance. In some cases this is pilot version, prototype extension or some stage/perf tests related configuration. Let's say it as it is - it's&amp;nbsp;extremely&amp;nbsp;difficult to setup thing in JIRA from scratch: projects, issue types, fields and all the schemas; there are just so mane of them out there.&lt;br /&gt;
&lt;br /&gt;
So, I tried to automate certain things, at least at the local development environment. And I've found it extremely difficult to do so. So, I had this crazy idea - why couldn't I have some kind of JIRA API Firebug? Some environment I could actually script my environmental changes, experiment with the stuff and optionally save/reuse scripts later on. And yes: it would be cool if I would be able to use familiar to me ruby and maybe try out some different languages.&lt;br /&gt;
&lt;br /&gt;
Basically it's the core idea behind my pet&amp;nbsp;&lt;a href="https://github.com/leonardinius/jira-rest-cli"&gt;jira-rest-cli&lt;/a&gt;&amp;nbsp;project.&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Isn't something already available out there?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Before doing something I did my homework and looked for other available options:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;a href="https://plugins.atlassian.com/plugin/details/16346"&gt;Python CLI for JIRA&lt;/a&gt; - basically cli interface to JIRA SOAP interface;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;a href="https://plugins.atlassian.com/plugin/details/16346"&gt;Jira Scripting Suite&lt;/a&gt;&amp;nbsp;- p&lt;span class="Apple-style-span" style="color: #333333; line-height: 16px;"&gt;rovides a convenient way to put custom conditions, validators and post-functions into workflow in a form of Jython scripts..&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;a href="https://plugins.atlassian.com/plugin/details/6820"&gt;Script Runner&lt;/a&gt;&amp;nbsp;- provide ability to script (&lt;span class="Apple-style-span" style="color: #333333; line-height: 16px;"&gt;JSR-223&amp;nbsp;capable) workflow validators, conditions, etc..&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;What's wrong with? Actually - nothing. The&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Times, 'Times New Roman', serif; line-height: 16px;"&gt;y are great pieces of software and they excellently do they should do - extend JIRA functionality and provide possibility to easily extend workflows (Jira Scripting Suite, Script Runner) w/o need to restart Jira server, or provide access to built-in remote access (Python CLI for JIRA).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Times, 'Times New Roman', serif; line-height: 16px;"&gt;The thing I've missed here - is to play with Jira API in the realtime, see what's inside of teddy bear looks&amp;nbsp;&lt;/span&gt;like (latvian: kas lācītim vēderā) and the ability to use the same approach to automate certain operations.&lt;/div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;How could I use it?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
When working with it I have several use-cases in mind:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Use it as console-tool to script and automate certain configuration changes (local development; staging etc development rollout)&lt;/li&gt;
&lt;li&gt;Use it as a tool to play with JIRA system API at realtime (local development needs)&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;I would really appreciate if you will think out other use-cases and will report them back to me. So do it :)&amp;nbsp;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;How to start?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt; &lt;pre&gt;&lt;code class="no-highlight"&gt;git clone git@github.com:leonardinius/jira-rest-cli.git
cd jira-rest-cli/
git submodule init
cd jira-rest-cli-parent/
atlas-mvn clean install
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;To start play with the REST Cli - you need to install &lt;i&gt;jira-rest-cli-runner&lt;/i&gt;&amp;nbsp;plugin, which is a main entry point and Rhino language provider.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;If you want to try out JRuby or Groovy language support - then you should install &lt;i&gt;jira-rest-cli-jruby&lt;/i&gt; or &lt;i&gt;jira-rest-cli-groovy&lt;/i&gt; accordingly.&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 18px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;div style="line-height: 1.5em !important; margin-bottom: 1em !important; margin-left: 0px !important; margin-right: 0px !important; margin-top: 1em !important; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;OR you could get all this artifacts here&lt;/div&gt;&lt;ul style="line-height: 1.4em; margin-bottom: 1em !important; margin-left: 2em !important; margin-right: 0px !important; margin-top: 1em !important; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="line-height: 1.4em; margin-bottom: 0.5em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;a href="http://dl.dropbox.com/u/379506/jira-rest-cli/jira-rest-cli-runner-1.0.jar" style="color: #4183c4; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;jira-rest-cli-runner&lt;/a&gt;&amp;nbsp;- Script runner, web-console, session mgmt admin interface, Rhino language support.&lt;/li&gt;
&lt;li style="line-height: 1.4em; margin-bottom: 0.5em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;a href="http://dl.dropbox.com/u/379506/jira-rest-cli/jira-rest-cli-jruby-1.0.jar" style="color: #4183c4; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;jira-rest-cli-jruby&lt;/a&gt;&amp;nbsp;- JRuby support&lt;/li&gt;
&lt;li style="line-height: 1.4em; margin-bottom: 0.5em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;a href="http://dl.dropbox.com/u/379506/jira-rest-cli/jira-rest-cli-groovy-1.0.jar" style="color: #4183c4; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;jira-rest-cli-groovy&lt;/a&gt;&amp;nbsp;- Groovy support&lt;/li&gt;
&lt;li style="line-height: 1.4em; margin-bottom: 0.5em; margin-left: 0px; margin-right: 0px; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;cli-examples - browse on GitHub, fetch locally and play around yourselves :)&lt;/li&gt;
&lt;/ul&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;NB: on my local dev environment I install all the plugins using &lt;a href="http://confluence.atlassian.com/display/DEVNET/atlas-cli"&gt;atlas-cli&lt;/a&gt;&amp;nbsp;since I launch JIRA using &lt;a href="http://confluence.atlassian.com/display/DEVNET/atlas-run"&gt;atlas-run&lt;/a&gt; / &lt;a href="http://confluence.atlassian.com/display/DEVNET/atlas-debug"&gt;atlas-debug&lt;/a&gt; commands.&lt;/div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Ok, it's useful.&amp;nbsp;How could I help?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Cool. First of all you are in the right place with the right attitude :)&lt;br /&gt;
The areas I'm struggling with on my personal Roadmap:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;High priority: Documentation - both creating one and understanding what actually is missing. Even GitHub issues for this are welcome.&lt;/li&gt;
&lt;li&gt;Medium priority: Upload plugin to &lt;a href="https://plugins.atlassian.com/"&gt;Atlassian Plugin Exchange&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Medium priority: Improving console-cli modes sample applications (JRuby, Groovy) - cleaning up, since I'm not expert in those languages; adding command line options.&lt;/li&gt;
&lt;li&gt;Low priority: improving web-interface (more Ajax-like) etc...&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;PS: project is useful (at least for me) at the current stage and IMO documentation what is the only&amp;nbsp;crucial&amp;nbsp;piece missing.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
Thin badge: &lt;script src="http://www.ohloh.net/p/488909/widgets/project_thin_badge.js" type="text/javascript"&gt;
&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-2600788006445844660?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-NKsHgEEtXT96QiFOuxCpd5YF-U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-NKsHgEEtXT96QiFOuxCpd5YF-U/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/-NKsHgEEtXT96QiFOuxCpd5YF-U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-NKsHgEEtXT96QiFOuxCpd5YF-U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=JcjKLZVr-rw:khbN7il_zhQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=JcjKLZVr-rw:khbN7il_zhQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=JcjKLZVr-rw:khbN7il_zhQ:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=JcjKLZVr-rw:khbN7il_zhQ:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=JcjKLZVr-rw:khbN7il_zhQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=JcjKLZVr-rw:khbN7il_zhQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=JcjKLZVr-rw:khbN7il_zhQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=JcjKLZVr-rw:khbN7il_zhQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=JcjKLZVr-rw:khbN7il_zhQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/JcjKLZVr-rw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/2600788006445844660/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=2600788006445844660" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/2600788006445844660?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/2600788006445844660?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/JcjKLZVr-rw/release-announcement-jira-rest-cli-05.html" title="Release announcement: jira-rest-cli-1.0 (jsr223 powered interactive jira scripting console)" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-mkFMoGxOFi8/TZTCeGgyWyI/AAAAAAAAELU/8cnUY43s_TI/s72-c/1_2011-03-31_1946.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2011/03/release-announcement-jira-rest-cli-05.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYFSH8_fSp7ImA9Wx9aGU8.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-6631742143171443011</id><published>2011-03-12T12:23:00.003+02:00</published><updated>2011-03-12T12:51:59.145+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-12T12:51:59.145+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jdk7" /><category scheme="http://www.blogger.com/atom/ns#" term="macosx" /><title>OpenJDK 7 - Developer Preview on Mac OS X</title><content type="html">All the glory to &amp;nbsp;&lt;a href="http://blogs.sun.com/theaquarium/entry/oracle_now_ready_with_jdk"&gt;Oracle now ready with JDK 7 Developer Preview&lt;/a&gt;&amp;nbsp;article. Thanks guys for sharing this:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;There is no Mac OS X version yet, but&amp;nbsp;&lt;a href="http://code.google.com/p/openjdk-osx-build/" style="color: blue; font-weight: normal; text-decoration: none;"&gt;this link&lt;/a&gt;&amp;nbsp;should get the Apple aficionados happy.&lt;/span&gt;&lt;/blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will try to setup and see how it goes. Looking forward to enjoy out fork/join framework :)&lt;br /&gt;
Will keep you posted.&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-6631742143171443011?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/y2U2tnG7m5GYnoFsGK_UcPwWSF4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/y2U2tnG7m5GYnoFsGK_UcPwWSF4/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/y2U2tnG7m5GYnoFsGK_UcPwWSF4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/y2U2tnG7m5GYnoFsGK_UcPwWSF4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=90m_-95p0Lk:t3l8OJEFTSI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=90m_-95p0Lk:t3l8OJEFTSI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=90m_-95p0Lk:t3l8OJEFTSI:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=90m_-95p0Lk:t3l8OJEFTSI:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=90m_-95p0Lk:t3l8OJEFTSI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=90m_-95p0Lk:t3l8OJEFTSI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=90m_-95p0Lk:t3l8OJEFTSI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=90m_-95p0Lk:t3l8OJEFTSI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=90m_-95p0Lk:t3l8OJEFTSI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/90m_-95p0Lk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/6631742143171443011/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=6631742143171443011" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/6631742143171443011?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/6631742143171443011?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/90m_-95p0Lk/openjdk-7-developer-preview-on-mac-os-x.html" title="OpenJDK 7 - Developer Preview on Mac OS X" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2011/03/openjdk-7-developer-preview-on-mac-os-x.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUINQHw_eCp7ImA9Wx9aEEQ.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-2946208765119927430</id><published>2011-02-25T01:31:00.052+02:00</published><updated>2011-03-02T21:19:51.240+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-02T21:19:51.240+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="maven2" /><category scheme="http://www.blogger.com/atom/ns#" term="github" /><category scheme="http://www.blogger.com/atom/ns#" term="release" /><title>Maven2 project auto-release [@GitHub] example</title><content type="html">&lt;span class="Apple-style-span" style="font-size: large;"&gt;What's about?&lt;/span&gt;&lt;br /&gt;
So, I finally got my head around&amp;nbsp;&lt;a href="http://maven.apache.org/plugins/maven-release-plugin/index.html"&gt;maven-release-plugin&lt;/a&gt;&amp;nbsp;maven plugin.&amp;nbsp;And, yes, it's awesome.&lt;br /&gt;
I have not tried any kind of different/difficult scenarios yet, just plain basic ones.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;So, what I wanted to achieve in the first place?&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;G1 - maven artifact auto-versioning on build success&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt; 1.1-SNAPSHOT on master branch/TRUNK&amp;nbsp;gets promoted to 1.1 maven release, at the same time master/TRUNK becomes 1.2-SNAPSHOT&lt;/span&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;G2 -&amp;nbsp;some kind of tagging/branching on build success&lt;br /&gt;
G1 support on CVS level via tags/branches&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;G3 -&amp;nbsp;maven artifact deployment (from CVS repository to maven repository)&lt;/li&gt;
&lt;li&gt;G4 -&amp;nbsp;ability to launch it from CI tool&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Visually that could be depicted in the following way:&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-fbfXjYrNXKI/TWbxumA8D-I/AAAAAAAAEJo/EIHRJxBmTPM/s1600/branching.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-fbfXjYrNXKI/TWbxumA8D-I/AAAAAAAAEJo/EIHRJxBmTPM/s1600/branching.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Branching [&lt;a href="http://wiki.obiba.org/display/ONYX/Onyx+Branches,+Tags+and+Releases"&gt;source&lt;/a&gt;]&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;All the goals accomplished. Yada-ya-da!&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Ok, enough reading. Gimme the code&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;See&amp;nbsp;&lt;a href="https://github.com/leonardinius/test-maven-release"&gt;test-maven-release&lt;/a&gt;&amp;nbsp;Github project&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;How-to?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;G1, G2&lt;/b&gt; - are accomplished by &lt;a href="http://maven.apache.org/plugins/maven-release-plugin/prepare-mojo.html"&gt;release:prepare&lt;/a&gt;&amp;nbsp;goal.&lt;br /&gt;
&lt;b&gt; Input needed:&lt;/b&gt; scm info&lt;br /&gt;
&lt;b&gt;Input example:&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class="xml"&gt;&amp;lt;scm&amp;gt;
  &amp;lt;connection&amp;gt;
     scm:git:git://github.com/leonardinius/test-maven-release.git
  &amp;lt;/connection&amp;gt;
  &amp;lt;developerConnection&amp;gt;
     scm:git:ssh://git@github.com/leonardinius/test-maven-release.git
  &amp;lt;/developerConnection&amp;gt;
  &amp;lt;url&amp;gt;
     https://github.com/leonardinius/test-maven-release
  &amp;lt;/url&amp;gt;
&amp;lt;/scm&amp;gt;
&lt;/code&gt;&lt;/pre&gt;Execution sample:&lt;br /&gt;
&lt;pre&gt;&lt;code class="no-highlight"&gt;
prusax:test-maven-release leonidmaslov$ mvn release:clean release:prepare
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'release'.
[INFO] ------------------------------------------------------------------------
[INFO] Building test-maven-release
[INFO]    task-segment: [release:clean, release:prepare] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] [release:clean]
[INFO] Cleaning up after release...
[INFO] [release:prepare]
[INFO] Verifying that there are no local modifications...
[INFO] Executing: /bin/sh -c cd /Users/leonidmaslov/Documents/workspace/test-maven-release &amp;amp;&amp;amp; git status
[INFO] Working directory: /Users/leonidmaslov/Documents/workspace/test-maven-release
[INFO] Checking dependencies and plugins for snapshots ...
What is the release version for "test-maven-release"? (leonardinius-test:test-maven-release) 1.0: : 
What is SCM release tag or label for "test-maven-release"? (leonardinius-test:test-maven-release) test-maven-release-1.0: : myTag
What is the new development version for "test-maven-release"? (leonardinius-test:test-maven-release) 1.1-SNAPSHOT: : 
[INFO] Transforming 'test-maven-release'...
[INFO] Not generating release POMs
[INFO] Executing goals 'clean verify'...
[WARNING] Maven will be executed in interactive mode, but no input stream has been configured for this MavenInvoker instance.
[INFO] [INFO] Scanning for projects...
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] Building test-maven-release
[INFO] [INFO]    task-segment: [clean, verify]
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] [clean:clean]
[INFO] [INFO] [resources:resources]
[INFO] [WARNING] Using platform encoding (MacRoman actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] [INFO] skip non existing resourceDirectory /Users/leonidmaslov/Documents/workspace/test-maven-release/src/main/resources
[INFO] [INFO] [compiler:compile]
[INFO] [INFO] Compiling 1 source file to /Users/leonidmaslov/Documents/workspace/test-maven-release/target/classes
[INFO] [INFO] [resources:testResources]
[INFO] [WARNING] Using platform encoding (MacRoman actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] [INFO] Copying 1 resource
[INFO] [INFO] [compiler:testCompile]
[INFO] [INFO] Compiling 1 source file to /Users/leonidmaslov/Documents/workspace/test-maven-release/target/test-classes
[INFO] [INFO] [surefire:test]
[INFO] [INFO] Surefire report directory: /Users/leonidmaslov/Documents/workspace/test-maven-release/target/surefire-reports
[INFO] 
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running me.doautomate.ExampleServletTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.024 sec
[INFO] 
[INFO] Results :
[INFO] 
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] [INFO] [jar:jar]
[INFO] [INFO] Building jar: /Users/leonidmaslov/Documents/workspace/test-maven-release/target/test-maven-release-1.0.jar
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] BUILD SUCCESSFUL
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] Total time: 3 seconds
[INFO] [INFO] Finished at: Thu Feb 24 22:02:49 CET 2011
[INFO] [INFO] Final Memory: 22M/81M
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] Checking in modified POMs...
[INFO] Executing: /bin/sh -c cd /Users/leonidmaslov/Documents/workspace/test-maven-release &amp;amp;&amp;amp; git add pom.xml
[INFO] Working directory: /Users/leonidmaslov/Documents/workspace/test-maven-release
[INFO] Executing: /bin/sh -c cd /Users/leonidmaslov/Documents/workspace/test-maven-release &amp;amp;&amp;amp; git status
[INFO] Working directory: /Users/leonidmaslov/Documents/workspace/test-maven-release
[INFO] Executing: /bin/sh -c cd /Users/leonidmaslov/Documents/workspace/test-maven-release &amp;amp;&amp;amp; git commit --verbose -F /var/folders/IA/IA2V6NfrE84m+Fcb-LJguU+++TI/-Tmp-/maven-scm-811668125.commit pom.xml
[INFO] Working directory: /Users/leonidmaslov/Documents/workspace/test-maven-release
[INFO] Executing: /bin/sh -c cd /Users/leonidmaslov/Documents/workspace/test-maven-release &amp;amp;&amp;amp; git push
[INFO] Working directory: /Users/leonidmaslov/Documents/workspace/test-maven-release
[INFO] Tagging release with the label myTag...
[INFO] Executing: /bin/sh -c cd /Users/leonidmaslov/Documents/workspace/test-maven-release &amp;amp;&amp;amp; git tag -F /var/folders/IA/IA2V6NfrE84m+Fcb-LJguU+++TI/-Tmp-/maven-scm-1676785108.commit myTag
[INFO] Working directory: /Users/leonidmaslov/Documents/workspace/test-maven-release
[INFO] Executing: /bin/sh -c cd /Users/leonidmaslov/Documents/workspace/test-maven-release &amp;amp;&amp;amp; git push origin myTag
[INFO] Working directory: /Users/leonidmaslov/Documents/workspace/test-maven-release
[INFO] Executing: /bin/sh -c cd /Users/leonidmaslov/Documents/workspace/test-maven-release &amp;amp;&amp;amp; git ls-files
[INFO] Working directory: /Users/leonidmaslov/Documents/workspace/test-maven-release
[INFO] Transforming 'test-maven-release'...
[INFO] Not removing release POMs
[INFO] Checking in modified POMs...
[INFO] Executing: /bin/sh -c cd /Users/leonidmaslov/Documents/workspace/test-maven-release &amp;amp;&amp;amp; git add pom.xml
[INFO] Working directory: /Users/leonidmaslov/Documents/workspace/test-maven-release
[INFO] Executing: /bin/sh -c cd /Users/leonidmaslov/Documents/workspace/test-maven-release &amp;amp;&amp;amp; git status
[INFO] Working directory: /Users/leonidmaslov/Documents/workspace/test-maven-release
[INFO] Executing: /bin/sh -c cd /Users/leonidmaslov/Documents/workspace/test-maven-release &amp;amp;&amp;amp; git commit --verbose -F /var/folders/IA/IA2V6NfrE84m+Fcb-LJguU+++TI/-Tmp-/maven-scm-1157159798.commit pom.xml
[INFO] Working directory: /Users/leonidmaslov/Documents/workspace/test-maven-release
[INFO] Executing: /bin/sh -c cd /Users/leonidmaslov/Documents/workspace/test-maven-release &amp;amp;&amp;amp; git push
[INFO] Working directory: /Users/leonidmaslov/Documents/workspace/test-maven-release
[INFO] Release preparation complete.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1 minute 
[INFO] Finished at: Thu Feb 24 22:02:59 CET 2011
[INFO] Final Memory: 14M/81M
[INFO] ------------------------------------------------------------------------
prusax:test-maven-release leonidmaslov$ 
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;G3&lt;/b&gt; - is accomplished by &lt;a href="http://maven.apache.org/plugins/maven-release-plugin/perform-mojo.html"&gt;release:perform&lt;/a&gt;&amp;nbsp;plugin. The plugin checkouts the tag/branch from the CVS system, builds it and deploys to maven repository.&lt;br /&gt;
&lt;b&gt;NB: &lt;/b&gt;relies on &lt;i style="text-decoration: underline;"&gt;release:prepare&lt;/i&gt;&amp;nbsp;being called first (needs release.properties file).&lt;br /&gt;
&lt;b&gt; Input needed:&lt;/b&gt; scm info, distribution management&lt;br /&gt;
&lt;b&gt;Input example:&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class="xml"&gt;&amp;lt;scm&amp;gt;
    &amp;lt;connection&amp;gt;
      scm:git:git://github.com/leonardinius/test-maven-release.git
    &amp;lt;/connection&amp;gt;
    &amp;lt;developerConnection&amp;gt;
      scm:git:ssh://git@github.com/leonardinius/test-maven-release.git
    &amp;lt;/developerConnection&amp;gt;
    &amp;lt;url&amp;gt;https://github.com/leonardinius/test-maven-release&amp;lt;/url&amp;gt;
&amp;lt;/scm&amp;gt;

&amp;lt;distributionManagement&amp;gt;
    &amp;lt;site&amp;gt;
        &amp;lt;id&amp;gt;site-id&amp;lt;/id&amp;gt;
        &amp;lt;name&amp;gt;site-name&amp;lt;/name&amp;gt;
        &amp;lt;url&amp;gt;scp://host/path/to/repository/&amp;lt;/url&amp;gt;
    &amp;lt;/site&amp;gt;
    &amp;lt;repository&amp;gt;
        &amp;lt;id&amp;gt;repo-main&amp;lt;/id&amp;gt;
        &amp;lt;name&amp;gt;Repository Name&amp;lt;/name&amp;gt;
        &amp;lt;url&amp;gt;file://tmp/&amp;lt;/url&amp;gt;
    &amp;lt;/repository&amp;gt;
    &amp;lt;!-- use the following if you ARE using a snapshot version. --&amp;gt;
    &amp;lt;snapshotRepository&amp;gt;
        &amp;lt;id&amp;gt;repo-snapshot&amp;lt;/id&amp;gt;
        &amp;lt;name&amp;gt;Repository Name&amp;lt;/name&amp;gt;
        &amp;lt;url&amp;gt;file://tmp/&amp;lt;/url&amp;gt;
    &amp;lt;/snapshotRepository&amp;gt;
&amp;lt;/distributionManagement&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;G4&lt;/b&gt;&amp;nbsp;is accomplished by launching maven in the batch mode.&lt;br /&gt;
&lt;b&gt;Example:&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;mvn clean --batch-mode  release:prepare release:perform&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;
Adding automated maven project versioning is not so hard and could be easily automated.&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-2946208765119927430?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZImWQZ62zBB398SHpq97I--WlN4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZImWQZ62zBB398SHpq97I--WlN4/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/ZImWQZ62zBB398SHpq97I--WlN4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZImWQZ62zBB398SHpq97I--WlN4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=lTTDkkAJaQc:mK2iE-lYXFA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=lTTDkkAJaQc:mK2iE-lYXFA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=lTTDkkAJaQc:mK2iE-lYXFA:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=lTTDkkAJaQc:mK2iE-lYXFA:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=lTTDkkAJaQc:mK2iE-lYXFA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=lTTDkkAJaQc:mK2iE-lYXFA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=lTTDkkAJaQc:mK2iE-lYXFA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=lTTDkkAJaQc:mK2iE-lYXFA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=lTTDkkAJaQc:mK2iE-lYXFA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/lTTDkkAJaQc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/2946208765119927430/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=2946208765119927430" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/2946208765119927430?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/2946208765119927430?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/lTTDkkAJaQc/maven2-project-license-check-and-auto.html" title="Maven2 project auto-release [@GitHub] example" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-fbfXjYrNXKI/TWbxumA8D-I/AAAAAAAAEJo/EIHRJxBmTPM/s72-c/branching.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2011/02/maven2-project-license-check-and-auto.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEFR3czeip7ImA9Wx9bE08.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-865833225683161023</id><published>2011-02-21T23:25:00.005+02:00</published><updated>2011-02-22T00:16:56.982+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-22T00:16:56.982+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mini-seminars" /><category scheme="http://www.blogger.com/atom/ns#" term="mylyn" /><title>#oldstuff - 3. Mini seminar 2  - Mylyn</title><content type="html">Check out this SlideShare Presentation: &lt;br /&gt;
&lt;div id="__ss_7002467" style="width: 425px;"&gt;&lt;strong style="display: block; margin: 12px 0 4px;"&gt;&lt;a href="http://www.slideshare.net/leonidmaslov/mini-seminar-2-mylyn" title="3. Mini seminar 2  - Mylyn"&gt;3. Mini seminar 2  - Mylyn&lt;/a&gt;&lt;/strong&gt;&lt;object height="355" id="__sse7002467" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=miniseminar2-mylyn-110221142622-phpapp01&amp;stripped_title=mini-seminar-2-mylyn&amp;userName=leonidmaslov" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse7002467" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=miniseminar2-mylyn-110221142622-phpapp01&amp;stripped_title=mini-seminar-2-mylyn&amp;userName=leonidmaslov" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;div style="padding: 5px 0 12px;"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/leonidmaslov"&gt;Leonid Maslov&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
This presentation was part of the mini-seminars periodical sessions I've prepared and led in my spare time while being employed at &lt;a href="http://www.exigenservices.lv/"&gt;Exigen Services&lt;/a&gt;. Kudos, guys!&lt;br /&gt;
Since these presentations were spare time hobby - I've decided to share them :)&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-865833225683161023?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zo7i3iWBzPTcGOPR8GyO0gp516E/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zo7i3iWBzPTcGOPR8GyO0gp516E/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/zo7i3iWBzPTcGOPR8GyO0gp516E/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zo7i3iWBzPTcGOPR8GyO0gp516E/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=B79GhepoV7A:5IE_XYTf324:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=B79GhepoV7A:5IE_XYTf324:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=B79GhepoV7A:5IE_XYTf324:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=B79GhepoV7A:5IE_XYTf324:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=B79GhepoV7A:5IE_XYTf324:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=B79GhepoV7A:5IE_XYTf324:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=B79GhepoV7A:5IE_XYTf324:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=B79GhepoV7A:5IE_XYTf324:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=B79GhepoV7A:5IE_XYTf324:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/B79GhepoV7A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/865833225683161023/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=865833225683161023" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/865833225683161023?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/865833225683161023?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/B79GhepoV7A/oldstuff-3-mini-seminar-2-mylyn.html" title="#oldstuff - 3. Mini seminar 2  - Mylyn" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2011/02/oldstuff-3-mini-seminar-2-mylyn.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUBRn08fyp7ImA9Wx9bE08.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-636751449663981923</id><published>2011-02-21T23:21:00.007+02:00</published><updated>2011-02-21T23:37:37.377+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-21T23:37:37.377+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mini-seminars" /><category scheme="http://www.blogger.com/atom/ns#" term="patterns" /><title>#oldstuff - 2. Design patterns. part #2</title><content type="html">Check out this SlideShare Presentation: &lt;br /&gt;
&lt;div id="__ss_7002464" style="width: 425px;"&gt;&lt;strong style="display: block; margin: 12px 0 4px;"&gt;&lt;a href="http://www.slideshare.net/leonidmaslov/design-patterns-seriespresentation2" title="2. Design patterns. part #2"&gt;2. Design patterns. part #2&lt;/a&gt;&lt;/strong&gt;&lt;object height="355" id="__sse7002464" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=designpatternsseriespresentation2-110221142615-phpapp01&amp;stripped_title=design-patterns-seriespresentation2&amp;userName=leonidmaslov" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse7002464" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=designpatternsseriespresentation2-110221142615-phpapp01&amp;stripped_title=design-patterns-seriespresentation2&amp;userName=leonidmaslov" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;div style="padding: 5px 0 12px;"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/leonidmaslov"&gt;Leonid Maslov&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;This presentation was part of the mini-seminars periodical sessions I've prepared and led in my spare time while being employed at&amp;nbsp;&lt;a href="http://www.exigenservices.lv/"&gt;Exigen Services&lt;/a&gt;. Kudos, guys!&amp;nbsp;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Since these presentations were spare time hobby - I've decided to share them :)&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-636751449663981923?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/joWH7gcXrgqGft2yE22dBx0O3_g/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/joWH7gcXrgqGft2yE22dBx0O3_g/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/joWH7gcXrgqGft2yE22dBx0O3_g/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/joWH7gcXrgqGft2yE22dBx0O3_g/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=PdrA69H0qm8:3gGktq2b7Cg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=PdrA69H0qm8:3gGktq2b7Cg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=PdrA69H0qm8:3gGktq2b7Cg:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=PdrA69H0qm8:3gGktq2b7Cg:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=PdrA69H0qm8:3gGktq2b7Cg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=PdrA69H0qm8:3gGktq2b7Cg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=PdrA69H0qm8:3gGktq2b7Cg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=PdrA69H0qm8:3gGktq2b7Cg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=PdrA69H0qm8:3gGktq2b7Cg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/PdrA69H0qm8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/636751449663981923/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=636751449663981923" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/636751449663981923?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/636751449663981923?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/PdrA69H0qm8/oldstuff-2-design-patterns-part-2.html" title="#oldstuff - 2. Design patterns. part #2" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2011/02/oldstuff-2-design-patterns-part-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUDQXw8eyp7ImA9Wx9bE08.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-3596007584934089627</id><published>2011-02-21T23:20:00.004+02:00</published><updated>2011-02-21T23:37:50.273+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-21T23:37:50.273+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mini-seminars" /><category scheme="http://www.blogger.com/atom/ns#" term="patterns" /><title>#oldstuff - 1. Mini seminar intro</title><content type="html">Check out this SlideShare Presentation: &lt;br /&gt;
&lt;div id="__ss_7002465" style="width: 425px;"&gt;&lt;strong style="display: block; margin: 12px 0 4px;"&gt;&lt;a href="http://www.slideshare.net/leonidmaslov/mini-seminar-intro" title="1. Mini seminar intro"&gt;1. Mini seminar intro&lt;/a&gt;&lt;/strong&gt;&lt;object height="355" id="__sse7002465" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=miniseminar-intro-110221142617-phpapp01&amp;stripped_title=mini-seminar-intro&amp;userName=leonidmaslov" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse7002465" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=miniseminar-intro-110221142617-phpapp01&amp;stripped_title=mini-seminar-intro&amp;userName=leonidmaslov" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;div style="padding: 5px 0 12px;"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/leonidmaslov"&gt;Leonid Maslov&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;This presentation was part of the mini-seminars periodical sessions I've prepared and led in my spare time while being employed at&amp;nbsp;&lt;a href="http://www.exigenservices.lv/"&gt;Exigen Services&lt;/a&gt;. Kudos, guys!&amp;nbsp;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Since these presentations were spare time hobby - I've decided to share them :)&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-3596007584934089627?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vaX758uAnLcpuAnax78qcIuFFus/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vaX758uAnLcpuAnax78qcIuFFus/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/vaX758uAnLcpuAnax78qcIuFFus/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vaX758uAnLcpuAnax78qcIuFFus/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=Ox-GaFrsumQ:ymgN_PshMzU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=Ox-GaFrsumQ:ymgN_PshMzU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=Ox-GaFrsumQ:ymgN_PshMzU:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=Ox-GaFrsumQ:ymgN_PshMzU:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=Ox-GaFrsumQ:ymgN_PshMzU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=Ox-GaFrsumQ:ymgN_PshMzU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=Ox-GaFrsumQ:ymgN_PshMzU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=Ox-GaFrsumQ:ymgN_PshMzU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=Ox-GaFrsumQ:ymgN_PshMzU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/Ox-GaFrsumQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/3596007584934089627/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=3596007584934089627" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/3596007584934089627?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/3596007584934089627?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/Ox-GaFrsumQ/oldstuff-1-mini-seminar-intro.html" title="#oldstuff - 1. Mini seminar intro" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2011/02/oldstuff-1-mini-seminar-intro.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8HQHg9fyp7ImA9Wx9bEkk.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-7911275070751284373</id><published>2011-02-21T00:20:00.007+02:00</published><updated>2011-02-21T01:17:11.667+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-21T01:17:11.667+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jira" /><category scheme="http://www.blogger.com/atom/ns#" term="maven2" /><category scheme="http://www.blogger.com/atom/ns#" term="selenium" /><category scheme="http://www.blogger.com/atom/ns#" term="atlassian" /><title>Atlassian Plugin SDK - how to provide optional selenium tests</title><content type="html">You probably are familiar with one of the most popular web UI testing tool - &lt;a href="http://seleniumhq.org/"&gt;Selenium&lt;/a&gt; and it's most famous tool &lt;a href="http://seleniumhq.org/projects/ide/"&gt;Selenium IDE&lt;/a&gt;.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;I don't want to read all this, give me the code&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;You could find all the code you need on &lt;a href="https://gist.github.com/836325#file_pom_updated.xml"&gt;github&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Sorry for not embedding all the code in the article. That way the article becomes clumsy unreadable monster. If anyone could recommend me some collapsable/expandable solution - I would appreciate it a lot.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;Why do I need to bother with yet-another-testing-tool?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
The main advantages or features of the tools are (imo):&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;real UI behavior testing - tests are run inside the &lt;b&gt;real browser&lt;/b&gt; and will fire/use real end-user key, mouse, etc events&lt;/li&gt;
&lt;li&gt;ability to export the test in whole bunch of &lt;b&gt;programming languages&lt;/b&gt; (java, python, ruby etc ...) &lt;/li&gt;
&lt;li&gt;ability to run tests on &lt;b&gt;multiple target web-drivers&lt;/b&gt; (firefox, internet explorer, etc ..)&lt;/li&gt;
&lt;li&gt;Selenium IDE (mentioned earlier) is really nice tool which allows to create simple tests cases &lt;b&gt;very fast&lt;/b&gt;, in few minutes or even seconds, literally&lt;/li&gt;
&lt;li&gt;basically the only way to automate difficult &lt;b&gt;Ajax/RIA component&lt;/b&gt; testing on different target environments; other httpUnit like approaches are not good enough&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;How could I automate that?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span class="Apple-style-span"&gt;Selenium has child project - &lt;a href="http://seleniumhq.org/projects/remote-control/"&gt;Selenium Remote Control&lt;/a&gt; which could be used.&lt;/span&gt;&lt;br /&gt;
&lt;u&gt;&lt;span class="Apple-style-span"&gt;Quote and image from &lt;/span&gt;Selenium Remote Control site:&lt;/u&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: verdana, sans-serif; font-size: x-small; line-height: 16px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="line-height: 18px; margin-bottom: 0.6em; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: verdana, sans-serif; font-size: x-small; line-height: 16px;"&gt;Selenium RC comes in two parts. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;ol&gt;&lt;li style="margin-bottom: 0.2em; margin-top: 0.2em;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: verdana, sans-serif; font-size: x-small; line-height: 16px;"&gt;A server which automatically launches and kills browsers, and acts as a HTTP proxy for web requests from them.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: verdana, sans-serif; font-size: x-small; line-height: 16px;"&gt;
&lt;li style="margin-bottom: 0.2em; margin-top: 0.2em;"&gt;Client libraries for your favorite computer language.&lt;/li&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/ol&gt;&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://selenium.openqa.org/selenium-rc.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="312" src="http://selenium.openqa.org/selenium-rc.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;Lucky to us, selenium has maven artifacts available to be used to plug-in into Atlassian PDK build procedure.&lt;br /&gt;
&lt;b&gt;Goals:&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;make this optional (enabled by default) option&lt;/li&gt;
&lt;li&gt;selenium-rc server side should be forked before integration tests will be executed&lt;/li&gt;
&lt;li&gt;selenium-rc client side tests should be executed as part of the integration test suite&lt;/li&gt;
&lt;li&gt;selenium-rc should be revoked upon integration-test completion&lt;/li&gt;
&lt;/ol&gt;&lt;b&gt;Solution:&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;is achieved by default maven profile (activated by !property)&lt;/li&gt;
&lt;li&gt;is achieved by maven - specifying selenium-rc start-server g&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;oal to be run on &lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre;"&gt;pre-integration-test &lt;/span&gt;&lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre;"&gt;phase&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre;"&gt;to achieve this please refer to Atlassian article - &lt;/span&gt;&lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre;"&gt;&lt;a href="http://confluence.atlassian.com/display/DEVNET/Plugin+Tutorial+-+Writing+Integration+Tests+for+your+JIRA+plugin#PluginTutorial-WritingIntegrationTestsforyourJIRAplugin-Step6.WriteUnitandIntegrationTests"&gt;Writing Integration Tests&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre;"&gt;. Basically that means - you should put your code inside src/test/java/it/ folder and specifying proper locatest.properties file.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre;"&gt;is achieved by maven - specifying that selenium-rc stop-server goal should be executed on post-integration-test phase.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre;"&gt;To get pom.xml file snippet - see this &lt;a href="https://gist.github.com/836325#file_pom.xml"&gt;pom.xml gist&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;b&gt;How to check:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
execute &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;atlas-integration-test&lt;/span&gt; command from the project home folder.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Recommendations:&lt;/b&gt;&lt;br /&gt;
Atlassian &lt;a href="http://docs.atlassian.com/software/jira/docs/api/latest/func-test-javadoc/"&gt;FuncTestCase&lt;/a&gt; (Jira in this case. There should be one for other Atlassian products as well) contains a lot of useful utilities and setup methods, which personally I've found very useful. So, the idea is to reuse it as much as possible. That could be done in you create your own abstract base MySeleniumTestCase which would contain &lt;i&gt;FuncTestCase&lt;/i&gt; instance as &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;testHelper&lt;/span&gt; member field and   would make it available via &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;getHelper()&lt;/span&gt; or other similar way.&lt;br /&gt;
Still, you should use your own loginAs method on top of Selenium, cause helper object  will have different (not in-browser) http session.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
Benefits:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;ability to reuse utility methods (such as create new custom fields, restore from xml dump etc ..)&lt;/li&gt;
&lt;li&gt;ability to configure your Selenium test against jira integration test environment - using helper to obtain JiraEvironmentData's host, port, context path etc..&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Unlucky I'm not able to share that piece of code, so you should to create it on your own. Still, it should be pretty straightforward, since all you need to do - is do declare member field and delegate to is in your test setUp/tearDown, as well as using it to configure your Selenium test host, port etc ..&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Problems with Continuous Integration&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span class="Apple-style-span"&gt;Ok, so we think we have automated our process so far and it runs locally. On my machine it launches internet explorer and executes the test. Awesome. The next thing is putting the test on our CI, which should be pretty straightforward, right? Wrong!&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span"&gt;Problems with CI:&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;CI slave might be Linux terminal machine, no UI and therefore no real launch browser capabilities.&lt;/li&gt;
&lt;li&gt;There is a bug with previous &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;pom.xml&lt;/span&gt; file. Yes, the profile is optional, however Atlassian PDK framework execute all the it/ tests regardless what type of tests are they, therefore all the Selenium tests will fail.&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;The former one is solvable by using Selenium-RC &lt;a href="http://mojo.codehaus.org/selenium-maven-plugin/examples/headless-with-xvfb.html"&gt;Headless X11 with XVFB&lt;/a&gt; maven goal. The solution is to execute the goal on Linux  machine and skip one on a Windows box. That could be achieved by additional profile setting &lt;a href="http://mojo.codehaus.org/selenium-maven-plugin/xvfb-mojo.html#skip"&gt;xvfb skip&lt;/a&gt; flag to true and activated on windows platform only.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;The later one could be solved by specifying AMPS plugin &lt;a href="http://confluence.atlassian.com/display/DEVNET/AMPS+Plugin+for+Maven#AMPSPluginforMaven-testGroups"&gt;testGroups&lt;/a&gt;. Using that we could specify different sets of independent functional tests, located in different locations (it/functests* and it/selenium/*). We could use &lt;a href="http://confluence.atlassian.com/display/DEVNET/AMPS+Plugin+for+Maven#AMPSPluginforMaven-configuredTestGroupsToRun"&gt;configuredTestGroupsToRun&lt;/a&gt; property as well, but I decided not to. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre;"&gt;&lt;a href="https://gist.github.com/836325#file_pom.xml"&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre;"&gt;So, as a result we have completely independent sets of integration/functional tests, with ability to launch them all-together or pick just one of them. &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;The code&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre;"&gt;Please see &lt;a href="https://gist.github.com/836325#file_pom_updated.xml"&gt;updated_pom.xml&lt;/a&gt; file.  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-7911275070751284373?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/19vdHk6f64E6jOHvtTE9y2Ypb4E/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/19vdHk6f64E6jOHvtTE9y2Ypb4E/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/19vdHk6f64E6jOHvtTE9y2Ypb4E/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/19vdHk6f64E6jOHvtTE9y2Ypb4E/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CXFLX2KvAK4:BsSbyXX7C3A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CXFLX2KvAK4:BsSbyXX7C3A:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CXFLX2KvAK4:BsSbyXX7C3A:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=CXFLX2KvAK4:BsSbyXX7C3A:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CXFLX2KvAK4:BsSbyXX7C3A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=CXFLX2KvAK4:BsSbyXX7C3A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CXFLX2KvAK4:BsSbyXX7C3A:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CXFLX2KvAK4:BsSbyXX7C3A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=CXFLX2KvAK4:BsSbyXX7C3A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/CXFLX2KvAK4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/7911275070751284373/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=7911275070751284373" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/7911275070751284373?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/7911275070751284373?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/CXFLX2KvAK4/atlassian-plugin-sdk-how-to-provide.html" title="Atlassian Plugin SDK - how to provide optional selenium tests" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><thr:total>4</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2011/02/atlassian-plugin-sdk-how-to-provide.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4MQXY5cSp7ImA9Wx9XFkU.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-6386500740940323662</id><published>2011-01-10T20:26:00.000+02:00</published><updated>2011-01-10T20:26:20.829+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-10T20:26:20.829+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jira" /><category scheme="http://www.blogger.com/atom/ns#" term="AJS" /><category scheme="http://www.blogger.com/atom/ns#" term="popup" /><category scheme="http://www.blogger.com/atom/ns#" term="gadget" /><category scheme="http://www.blogger.com/atom/ns#" term="issue-operations" /><category scheme="http://www.blogger.com/atom/ns#" term="dashboard" /><title>HowTo: Reusing JIRA gadgets on the issue operations</title><content type="html">Hi everybody,&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Problem description&lt;/span&gt;&lt;br /&gt;
Recently I had to&amp;nbsp;implement&amp;nbsp;the following use case:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Customer has very strict defined issue creation policy and wants to control the every bit of issue creation (things like enhanced priority etc support).&lt;/li&gt;
&lt;li&gt;The main focus is on usability and rich user interface support.&lt;/li&gt;
&lt;li&gt;Basically it's &lt;b&gt;multi-step&lt;/b&gt;&amp;nbsp;procedure.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;After reviewing customer requirements it was decided to go with custom &lt;a href="http://www.atlassian.com/software/jira/tour/opensocial-dashboards.jsp"&gt;Dashboard Open Social Gadgets&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;So the initial solution mockup looked like that:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y9XTlNGJRTQ/TSs3vAI5F_I/AAAAAAAAEGo/t7KYGj-pxLY/s1600/wizard1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="217" src="http://2.bp.blogspot.com/_Y9XTlNGJRTQ/TSs3vAI5F_I/AAAAAAAAEGo/t7KYGj-pxLY/s400/wizard1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The wizard-gadget itself was tricky to implement as well, but's an another story.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;For the sake of this article let's consider that we already have out plugin implemented with the REST &amp;nbsp;services to create / update, read issue data.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Transforming gadget to it an Issue operation&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;At some complicated updates are required from the user interface.We want to &lt;b&gt;reuse&lt;/b&gt;&amp;nbsp;the wizard created previously. The way I decided to proceed is to implement issue operation. So, that does it mean for end user? See the mockup below:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/_Y9XTlNGJRTQ/TSs522EooNI/AAAAAAAAEGs/QXDDPVzZOKo/s1600/wizard2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="248" src="http://2.bp.blogspot.com/_Y9XTlNGJRTQ/TSs522EooNI/AAAAAAAAEGs/QXDDPVzZOKo/s400/wizard2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;But! Jira does not provide this kind of functionality. So, we need to implement this on out own.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;First of all we will create our own issue operation (useful information &lt;a href="http://confluence.atlassian.com/display/JIRA/Web+Fragments"&gt;web-fragments&lt;/a&gt;, &lt;a href="http://confluence.atlassian.com/display/JIRA/Updating+JIRA+Plugins+for+JIRA+4.1#UpdatingJIRAPluginsforJIRA4.1-IssueOperationmoduletypeisnolongeravailable"&gt;updating jira plugins for jira 4.1&lt;/a&gt;).&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;1. &lt;/b&gt;See the atlassian-plugin.xml snippet for that&lt;/div&gt;&lt;script src="https://gist.github.com/773063.js?file=issue-operation-snippet.xml"&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;So, we have implemented new Issue Operation which will open web-work action page we have not defined yet so far. Let's do so.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;2.&lt;/b&gt; See action code.&lt;/div&gt;&lt;script src="https://gist.github.com/773088.js?file=MyWebAction.java"&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;3. &lt;/b&gt;As you may see, &lt;i&gt;MyWebAction&lt;/i&gt; depends on&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 16px; white-space: pre;"&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;GadgetRequestContextFactory&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 16px; white-space: pre;"&gt; and &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 16px; white-space: pre;"&gt;GadgetViewFactory&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 16px; white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre;"&gt;which are OSGi components, so you should import them as component dependencies.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;script src="https://gist.github.com/773100.js?file=component-import-snippet.xml"&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre;"&gt;&lt;b&gt;4.&lt;/b&gt; Let's add add web-action definition to attlasian-plugin.xml&lt;/span&gt;&lt;/div&gt;&lt;script src="https://gist.github.com/773113.js?file=mywebaction-atlassian-plugin.xml"&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre;"&gt;&lt;b&gt;5.&lt;/b&gt;  Lets specify&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 16px; white-space: pre;"&gt;&lt;i&gt;/templates/mywebaction/render.vm&lt;/i&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre;"&gt;template.&lt;/span&gt;&lt;/div&gt;&lt;script src="https://gist.github.com/773138.js?file=render.vm"&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;And we are finally done. Note&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 16px; white-space: pre;"&gt;&lt;i&gt;xx.yy.zz.arguments.issueId&lt;/i&gt; &lt;/span&gt;javascript assignment.&amp;nbsp;It's done to pass in arguments to gadget instance.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;6.&lt;/b&gt; The following code could be used to get the overall idea:&lt;/div&gt;&lt;script src="https://gist.github.com/773145.js?file=gadget-load-issue-data-snippet.js"&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Implementing issue operations the&amp;nbsp;Jira&amp;nbsp;way - using&amp;nbsp;AJS&amp;nbsp;popup&amp;nbsp;dialogs&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;At this stage you have working and complete issue-gadget-operation. Cool? Yeah!&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;anyway, purists would argue that it's not inline with Jira Look&amp;amp;Feel. At the moment it does open as separate action, which is not inline with the rest of issue operation actions.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Basically we want our action too look like that (in the popup dialog as all the other actions):&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TStKNB9teyI/AAAAAAAAEGw/VTx9jS28uZw/s1600/wizard3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="317" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TStKNB9teyI/AAAAAAAAEGw/VTx9jS28uZw/s400/wizard3.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Is it possible? Yes, it is.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;To make our wizard to appear as popup dialog box we need to include some javascript to browse issue page. The easiest way to do so is via servlet filter.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;b&gt;1. &lt;/b&gt;See atlassian-plugin.xml snippet for defining the servlet filter and javascript resource.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;script src="https://gist.github.com/773162.js?file=resources-snippet.xml"&gt;
&lt;/script&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;b&gt;2.&lt;/b&gt;&amp;nbsp;See the filter definition itself&lt;/span&gt;&lt;br /&gt;
&lt;script src="https://gist.github.com/773173.js?file=IncludeResourcesFilter.java"&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;b&gt;3.&lt;/b&gt;&amp;nbsp;And the AJS javascript magic itself&lt;/span&gt;&lt;br /&gt;
&lt;script src="https://gist.github.com/773182.js?file=xxx-yyy.js"&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
And finally, all the pieces are tight together and you have Jira-AJS-POPUP style issue operation. And the cool part is - it reuses gadget instance created previously.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Hopefully you will find this stuff useful.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-6386500740940323662?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fQMahNxYQH22xeh9NgKr6Z0fdas/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fQMahNxYQH22xeh9NgKr6Z0fdas/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/fQMahNxYQH22xeh9NgKr6Z0fdas/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fQMahNxYQH22xeh9NgKr6Z0fdas/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CsNYlhwEals:PWGy4lh2kmU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CsNYlhwEals:PWGy4lh2kmU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CsNYlhwEals:PWGy4lh2kmU:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=CsNYlhwEals:PWGy4lh2kmU:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CsNYlhwEals:PWGy4lh2kmU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=CsNYlhwEals:PWGy4lh2kmU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CsNYlhwEals:PWGy4lh2kmU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CsNYlhwEals:PWGy4lh2kmU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=CsNYlhwEals:PWGy4lh2kmU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/CsNYlhwEals" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/6386500740940323662/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=6386500740940323662" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/6386500740940323662?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/6386500740940323662?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/CsNYlhwEals/howto-reusing-jira-gadgets-on-issue_10.html" title="HowTo: Reusing JIRA gadgets on the issue operations" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_Y9XTlNGJRTQ/TSs3vAI5F_I/AAAAAAAAEGo/t7KYGj-pxLY/s72-c/wizard1.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2011/01/howto-reusing-jira-gadgets-on-issue_10.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MEQX87cSp7ImA9Wx9QEk4.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-6675798704450679660</id><published>2010-12-25T01:57:00.003+02:00</published><updated>2010-12-25T02:03:20.109+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-25T02:03:20.109+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jira" /><category scheme="http://www.blogger.com/atom/ns#" term="exception" /><category scheme="http://www.blogger.com/atom/ns#" term="workflow" /><title>JIRA workflows -Postfunction exceptions, database commits and Pretty workflow exception</title><content type="html">&lt;a href="http://images.zaazu.com/img/Hohoho--merry-christmas-xmas-christmas-smiley-emoticon-000364-large.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://images.zaazu.com/img/Hohoho--merry-christmas-xmas-christmas-smiley-emoticon-000364-large.gif" /&gt;&lt;/a&gt;Hi again,&lt;br /&gt;For all of you who happens to be catholic - Happy Xmas &lt;a href="http://en.wikipedia.org/wiki/Xmas_Story"&gt;futurama style&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So, back to coding again.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I assume most of you are familiar with JIRA &lt;a href="http://confluence.atlassian.com/display/JIRA/Workflow+Plugin+Modules"&gt;post functions&lt;/a&gt;. So, would like to share my 0.02$ on the subject though. Boring stuff.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;OS Workflow&lt;/span&gt;&lt;a href="http://today.java.net/images/tiles/111-oswflow.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://today.java.net/images/tiles/111-oswflow.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The less known things about post functions are:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Workflow, steps and history are stored in different database tables than issue data. So Jira uses database commits to enforce data consistency.&lt;/li&gt;&lt;li&gt;Post functions might throw &lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;WorkflowException &lt;/span&gt;exception and workflow manager will rollback transaction in this case. Actually if the other exception will be thrown the transaction won't be commit (see Ofbiz Workflow et cetera), but imo it's implementation specific nuances and I wouldn't recommend that&lt;/li&gt;&lt;li&gt;In case you use MySQl - please ensure you have configured it properly - to use &lt;a href="http://confluence.atlassian.com/display/JIRA/Connecting+JIRA+to+MySQL#ConnectingJIRAtoMySQL-2.ConfigureMySQL"&gt;transactional database engine&lt;/a&gt;. If you haven't - let's say you do &lt;i&gt;Resolve&lt;/i&gt; transition from status &lt;u&gt;&lt;i&gt;Opened&lt;/i&gt;&lt;/u&gt; -&gt; to &lt;i style="text-decoration: underline;"&gt;Closed&lt;/i&gt; and exception occurs.  The workflow engine will think (no transaction rollback) the issue is closed, while the rest of the JIRA (issue view etc, issue.getStatus()) will think the issue is still &lt;u&gt;&lt;i&gt;Opened&lt;/i&gt;&lt;/u&gt;. Happened with me :). &lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;The pain&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;I've found myself to put some conditioning into my custom wf functions, like if smth has ben selected in the transition screen view - the function should fail. The same could be achieved my using wf validators and  &lt;b&gt;for sure!&lt;/b&gt; would be more correct solution - it's the type of component that should do the validation thing. However - think about it - I have 1 thing to do during transition - it's one post function. And I have 3-8 validations for it, like is it configured properly, are all fields entered from the UI etc. It would be more flexible to do it using wf postfunction and  3-5 validations, but it's so much more work (at least configuration and maintenance). So I decided to stick with 1 postfunction approach.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The way to implement this would be to throw exceptionn during the wf transition. In the regular case I would throw smth like IllegalArgumentException, but for reasons mentioned earlier I decided to convert it to general WorkflowException. The thing with it is - in case it does contain exception cause (and I like to preserve stacktrace as long I can) - it messes the exception getMessage() result and user on-screen output is smth like &lt;i&gt;&lt;b&gt;"rootCause: Please specify ..."&lt;/b&gt;&lt;/i&gt;, which is ... wrong. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, the approach i decided to go with is:&lt;br /&gt;&lt;pre&gt;&lt;code class="java"&gt;&lt;br /&gt;&lt;br /&gt;//... postfunction class declaration&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;public void execute(java.util.Map transientVars, java.util.Map args, com.opensymphony.module.propertyset.PropertySet ps) throws com.opensymphony.workflow.WorkflowException {&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt; //..&lt;br /&gt; doStuff();&lt;br /&gt;}&lt;br /&gt;catch(XYZIssueException e){ throw new WorkflowException(e); }&lt;br /&gt;//...&lt;br /&gt;catch(IllegalArgumentException e) { throw new PrettyMessageWorkflowException(e); }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// ... rest the postfunction&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// And the pretty lady herself&lt;br /&gt;class PrettyMessageWorkflowException extends WorkflowException&lt;br /&gt;{&lt;br /&gt;// ------------------------------ FIELDS ------------------------------&lt;br /&gt;&lt;br /&gt; private final String prettyMessage;&lt;br /&gt;&lt;br /&gt;// --------------------------- CONSTRUCTORS ---------------------------&lt;br /&gt;&lt;br /&gt; public PrettyMessageWorkflowException()&lt;br /&gt; {&lt;br /&gt;     super();&lt;br /&gt;     this.prettyMessage = null;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public PrettyMessageWorkflowException(String message)&lt;br /&gt; {&lt;br /&gt;     super(message);&lt;br /&gt;     this.prettyMessage = message;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public PrettyMessageWorkflowException(Throwable rootCause)&lt;br /&gt; {&lt;br /&gt;     super(rootCause);&lt;br /&gt;     this.prettyMessage = null;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public PrettyMessageWorkflowException(String message, Throwable rootCause)&lt;br /&gt; {&lt;br /&gt;     super(message, rootCause);&lt;br /&gt;     this.prettyMessage = message;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;// -------------------------- OTHER METHODS --------------------------&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public String getMessage()&lt;br /&gt; {&lt;br /&gt;     if (this.prettyMessage == null || this.prettyMessage.isEmpty())&lt;br /&gt;     {&lt;br /&gt;         return super.getMessage();&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     return this.prettyMessage;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It saves a day as usually :) &lt;/div&gt;&lt;div&gt;&lt;code class="html"&gt;&lt;span class="Apple-style-span" style="color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="line-height: 18px;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-6675798704450679660?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/RtVKS7X3h6k-4m_1Dv0PwfzV50k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RtVKS7X3h6k-4m_1Dv0PwfzV50k/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/RtVKS7X3h6k-4m_1Dv0PwfzV50k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RtVKS7X3h6k-4m_1Dv0PwfzV50k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=oE2vdKPioYE:Eem4jAEkGJ4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=oE2vdKPioYE:Eem4jAEkGJ4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=oE2vdKPioYE:Eem4jAEkGJ4:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=oE2vdKPioYE:Eem4jAEkGJ4:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=oE2vdKPioYE:Eem4jAEkGJ4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=oE2vdKPioYE:Eem4jAEkGJ4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=oE2vdKPioYE:Eem4jAEkGJ4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=oE2vdKPioYE:Eem4jAEkGJ4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=oE2vdKPioYE:Eem4jAEkGJ4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/oE2vdKPioYE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/6675798704450679660/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=6675798704450679660" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/6675798704450679660?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/6675798704450679660?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/oE2vdKPioYE/jira-workflows-postfunction-exceptions.html" title="JIRA workflows -Postfunction exceptions, database commits and Pretty workflow exception" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><thr:total>1</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2010/12/jira-workflows-postfunction-exceptions.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIMRHg4fyp7ImA9Wx9RGEU.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-8157021303234034510</id><published>2010-12-21T00:19:00.000+02:00</published><updated>2010-12-21T00:19:45.637+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-21T00:19:45.637+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sal" /><category scheme="http://www.blogger.com/atom/ns#" term="settings" /><category scheme="http://www.blogger.com/atom/ns#" term="atlassian" /><title>Atlassian SAL Plugin Settings</title><content type="html">Has just discovered &lt;a href="http://confluence.atlassian.com/display/SAL/SAL+Services#SALServices-%21package2.gif%21%7B%7Bcom.atlassian.sal.api.pluginsettings%7D%7D"&gt;SAL PluginSettings&lt;/a&gt;&amp;nbsp;entry point. No more painful plugin configuration storage for me. Good-bye&amp;nbsp;&lt;a href="https://github.com/leonardinius/propertyset-storage-toolkit"&gt;propertyset-storage-toolkit&lt;/a&gt;, you was so young, so brave, so dumb :)&lt;br /&gt;
&lt;br /&gt;
However, if you have more sophisticated needs than&amp;nbsp;&lt;a href="http://docs.atlassian.com/sal-api/2.0.16-SNAPSHOT/com/atlassian/sal/api/pluginsettings/PluginSettings.html"&gt;PluginSettings API&lt;/a&gt;, smth more than get, put, remove and you want all the power PropertySet could provide you - like lookup, more sophisticated data types, more sophisticated scopes (not like Global and Project-level only, but anything you could map to id, prefix and entityName) then you still might take a look into&amp;nbsp;&lt;a href="https://github.com/leonardinius/propertyset-storage-toolkit"&gt;propertyset-storage-toolkit&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Note: please you&amp;nbsp;&lt;a href="http://confluence.atlassian.com/display/SAL/SAL+Services#SALServices-%21package2.gif%21%7B%7Bcom.atlassian.sal.api.pluginsettings%7D%7D"&gt;SAL PluginSettings&lt;/a&gt;&amp;nbsp;until you are &lt;i style="font-weight: bold;"&gt;really &lt;/i&gt;forced not to.&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-8157021303234034510?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/X05N_Bw_MOIZgkoZCV4l0gBJ3Q4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/X05N_Bw_MOIZgkoZCV4l0gBJ3Q4/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/X05N_Bw_MOIZgkoZCV4l0gBJ3Q4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/X05N_Bw_MOIZgkoZCV4l0gBJ3Q4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=RCdaFoUv334:KgS85k8GK9Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=RCdaFoUv334:KgS85k8GK9Y:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=RCdaFoUv334:KgS85k8GK9Y:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=RCdaFoUv334:KgS85k8GK9Y:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=RCdaFoUv334:KgS85k8GK9Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=RCdaFoUv334:KgS85k8GK9Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=RCdaFoUv334:KgS85k8GK9Y:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=RCdaFoUv334:KgS85k8GK9Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=RCdaFoUv334:KgS85k8GK9Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/RCdaFoUv334" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/8157021303234034510/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=8157021303234034510" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/8157021303234034510?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/8157021303234034510?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/RCdaFoUv334/atlassian-sal-plugin-settings.html" title="Atlassian SAL Plugin Settings" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2010/12/atlassian-sal-plugin-settings.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIAQn8zcCp7ImA9Wx9RF0w.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-3488279439314095404</id><published>2010-12-19T02:10:00.001+02:00</published><updated>2010-12-19T02:12:23.188+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-19T02:12:23.188+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jira" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="crud" /><category scheme="http://www.blogger.com/atom/ns#" term="operations" /><category scheme="http://www.blogger.com/atom/ns#" term="gist" /><title>Jira - let's code update, edit issue operations (CRUD)</title><content type="html">If you are familiar with JIRA and it's API then you might agree, that some easy operations become a little difficult when it comes to coding  (all the workflows, overall JIRA stack understanding, configuration items, integration with other systems etc).&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The same is especially true when it comes to creating / updating JIRAs issues, which definitely is backbone for issue tracking systems. Some might argue that this type of things should be done by JIRA itself only. And I couldn't agree more. However JIRA tend to become issue-tracking puzzle-building machinery, where JIRA itself is LEGO puzzle only, so plenty of crazy stuff "you better shouldn't do this" or "you are not supposed to do that" is very popular in the JIRA plugin development world.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, back to issue creation/update problem. This is kind of task I code almost in every plugin. And anyway, it bugs me every time :) It's difficult for me to remember all the nuances and it's context dependent as well. Lets see that JIRA development form says about this - &lt;a href="http://forums.atlassian.com/search.jspa?threadID=&amp;amp;q=create+issue&amp;amp;objID=f100&amp;amp;dateRange=all&amp;amp;numResults=15&amp;amp;rankBy=10001"&gt;create&lt;/a&gt;, &lt;a href="http://forums.atlassian.com/search.jspa?objID=f100&amp;amp;q=update+issue"&gt;update&lt;/a&gt;. Seems already solved problem, isn't it? However it takes me a plenty time to solve it out if I don't have out-the box solution in my local repository.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, this time I decided to share a little code with you, and just a reminder to myself as well (I tend to forget things all the time).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/746976.js?file=IssueCrudOperations.java"&gt;&lt;/script&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;And here comes the implementation itself:&lt;br /&gt;&lt;div&gt;&lt;script src="https://gist.github.com/746976.js?file=IssueCrudOperationsImpl.java"&gt;&lt;/script&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-3488279439314095404?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pfvdYGHCSfhkiB22e1awYkzsFgg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pfvdYGHCSfhkiB22e1awYkzsFgg/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/pfvdYGHCSfhkiB22e1awYkzsFgg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pfvdYGHCSfhkiB22e1awYkzsFgg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=a01JV0nhPZE:BYB1cXNhiXQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=a01JV0nhPZE:BYB1cXNhiXQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=a01JV0nhPZE:BYB1cXNhiXQ:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=a01JV0nhPZE:BYB1cXNhiXQ:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=a01JV0nhPZE:BYB1cXNhiXQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=a01JV0nhPZE:BYB1cXNhiXQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=a01JV0nhPZE:BYB1cXNhiXQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=a01JV0nhPZE:BYB1cXNhiXQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=a01JV0nhPZE:BYB1cXNhiXQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/a01JV0nhPZE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/3488279439314095404/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=3488279439314095404" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/3488279439314095404?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/3488279439314095404?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/a01JV0nhPZE/jira-lets-code-update-edit-issue.html" title="Jira - let's code update, edit issue operations (CRUD)" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2010/12/jira-lets-code-update-edit-issue.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAGQng7eyp7ImA9Wx9REk0.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-4228725487758837558</id><published>2010-12-13T01:33:00.005+02:00</published><updated>2010-12-13T04:52:03.603+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-13T04:52:03.603+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jira" /><category scheme="http://www.blogger.com/atom/ns#" term="intellij" /><category scheme="http://www.blogger.com/atom/ns#" term="atlas-cli" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="maven" /><category scheme="http://www.blogger.com/atom/ns#" term="atlassian" /><title>atlas-cli IntelliJ support</title><content type="html">I assume most of you, Atlassian Plugin SDK consumers are well familiar with &lt;a href="http://confluence.atlassian.com/display/DEVNET/atlas-cli"&gt;atlas-cli&lt;/a&gt; command.&lt;br /&gt;&lt;br /&gt;After reading Down's Browns great article titled &lt;a href="http://www.jroller.com/mrdon/entry/maven_without_all_the_slowness"&gt;Maven without all the slowness - now with IDEA support&lt;/a&gt; decided to give it a try. I wish it would be so straightforward :) See the &lt;a href="https://github.com/mrdon/maven-cli-plugin/issues/#issue/13"&gt;bugreport&lt;/a&gt;. It seems the &lt;i&gt;cli:idea&lt;/i&gt; artifact is broken.&lt;br /&gt;&lt;br /&gt;So, of course, you could get the &lt;a href="https://github.com/mrdon/maven-cli-plugin/tree/master/idea"&gt;sources&lt;/a&gt; and compile it by your own. However I have found what JBoss repository have compiled Intellij Artifact itself, get it &lt;a href="https://repository.jboss.org/nexus/index.html#nexus-search;gav~org.twdata.maven~maven-cli-idea-plugin~~~~kw,versionexpand"&gt;here&lt;/a&gt;. Copy the jar file in the plugin directory (in my case it's &lt;span class="Apple-style-span" style="font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 13px; line-height: 20px;"&gt;/Users/leonidmaslov/Library/Application Support/IntelliJIdea10CE/&lt;/span&gt;) and viola, you are done.&lt;br /&gt;&lt;br /&gt;Let'see it in action, configuration first:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Y9XTlNGJRTQ/TQVbM5NBgiI/AAAAAAAAEGM/oVngN5u7Uug/s1600/2010-12-13_0030.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="265" src="http://3.bp.blogspot.com/_Y9XTlNGJRTQ/TQVbM5NBgiI/AAAAAAAAEGM/oVngN5u7Uug/s400/2010-12-13_0030.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;And now 3 more build commands/shortcuts are available &lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Y9XTlNGJRTQ/TQVbbTjEd7I/AAAAAAAAEGQ/hWmRMO7XDHM/s1600/2010-12-13_0028.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="201" src="http://1.bp.blogspot.com/_Y9XTlNGJRTQ/TQVbbTjEd7I/AAAAAAAAEGQ/hWmRMO7XDHM/s320/2010-12-13_0028.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Enjoy :)&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-4228725487758837558?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/io6ZR1enfTO9ZBZl6alhGGRbTts/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/io6ZR1enfTO9ZBZl6alhGGRbTts/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/io6ZR1enfTO9ZBZl6alhGGRbTts/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/io6ZR1enfTO9ZBZl6alhGGRbTts/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=xMz8JE9KajA:W0Kzswgl8xU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=xMz8JE9KajA:W0Kzswgl8xU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=xMz8JE9KajA:W0Kzswgl8xU:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=xMz8JE9KajA:W0Kzswgl8xU:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=xMz8JE9KajA:W0Kzswgl8xU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=xMz8JE9KajA:W0Kzswgl8xU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=xMz8JE9KajA:W0Kzswgl8xU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=xMz8JE9KajA:W0Kzswgl8xU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=xMz8JE9KajA:W0Kzswgl8xU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/xMz8JE9KajA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/4228725487758837558/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=4228725487758837558" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/4228725487758837558?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/4228725487758837558?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/xMz8JE9KajA/atlas-cli-with-intellij-support.html" title="atlas-cli IntelliJ support" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_Y9XTlNGJRTQ/TQVbM5NBgiI/AAAAAAAAEGM/oVngN5u7Uug/s72-c/2010-12-13_0030.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2010/12/atlas-cli-with-intellij-support.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4AQHs5eSp7ImA9Wx9REUw.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-7184813203957551914</id><published>2010-12-12T02:15:00.000+02:00</published><updated>2010-12-12T02:15:41.521+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-12T02:15:41.521+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jira" /><category scheme="http://www.blogger.com/atom/ns#" term="property-set-storage" /><title>HOW-TO: propertyset-storage-toolkit - Jira configuration data storage made easy</title><content type="html">&lt;b&gt;Q:&lt;/b&gt; What is your favorite type of job? Atlassian Plugin SDK? &lt;b&gt;A:&lt;/b&gt; Sure!&lt;br /&gt;
&lt;b&gt;Q:&lt;/b&gt; How exactly you like to code? &lt;b&gt;A:&lt;/b&gt; As little as possibe!&lt;br /&gt;
&lt;br /&gt;
Here it comes -&amp;nbsp;&lt;a href="https://github.com/leonardinius/propertyset-storage-toolkit"&gt;propertyset-storage-toolkit&lt;/a&gt;&amp;nbsp;with as bare minimal API set as it could be.&lt;br /&gt;
&lt;br /&gt;
Let's see what the standard project for me as Jira plugin developer is? The answer probably would be - to make this thing A, that thing B and yeah, almost forgot - to make this configurable, there definitely should be a switch et cetera and this should be administration UI dialog.&lt;br /&gt;
&lt;br /&gt;
And yeah, there are a lots of data persistence options available, but they all too complic-API-cated. So after&amp;nbsp;scratching&amp;nbsp;my head several times I remembered one piece of code I've written before while being employed &amp;nbsp; by some company and decided to re-implement the idea from the scratch on my own and to use in my current project&amp;nbsp;assignment.&lt;br /&gt;
&lt;br /&gt;
So, to illustrate how EASY is to do plugin configuration from now on, see the code snippet below&lt;br /&gt;
&lt;pre&gt;&lt;code class="java"&gt;
private final StorageService storageService; // IoC by framework via Constructor Dependency Injection
 ...

 // data fields
 private boolean adminOnly;
 private String helloText;
 private String welcomeText;

 private StorageFacade getStorage()
 {
     return storageService.actionStorage(this);
 }


 private void loadConfig(StorageFacade storage)
 {
     setAdminOnly(storage.getBoolean(ADMIN_ONLY));
     setHelloText(StringUtils.defaultString(storage.getString(HELLO_TEXT), 
         "Hello, "));
     setWelcomeText(StringUtils
         .defaultString(storage.getString(WELCOME_TEXT), "World"));
 }

 private void saveConfig(StorageFacade storage)
 {
     storage.setBoolean(ADMIN_ONLY, isAdminOnly());
     storage.setString(HELLO_TEXT, getHelloText());
     storage.setString(WELCOME_TEXT, getWelcomeText());
 }
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
And voila, it's as easy as this, no strings attached. &lt;br /&gt;
&lt;br /&gt;
Please take a look into&amp;nbsp;&lt;a href="https://github.com/leonardinius/propertyset-storage-toolkit/blob/master/README.md"&gt;README&lt;/a&gt; file for more details.&lt;br /&gt;
&lt;br /&gt;
And, please, do not shy to contact me in case of any problems, issues, thoughts or comments. Your feedback is always appreciated. &lt;br /&gt;
&lt;br /&gt;
See ya ;)&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-7184813203957551914?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LjJBccTg5B6PKCR8piFhp6bsCzU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LjJBccTg5B6PKCR8piFhp6bsCzU/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/LjJBccTg5B6PKCR8piFhp6bsCzU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LjJBccTg5B6PKCR8piFhp6bsCzU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=BTJ_vpqVOnw:Y7ZudQzS-Bg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=BTJ_vpqVOnw:Y7ZudQzS-Bg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=BTJ_vpqVOnw:Y7ZudQzS-Bg:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=BTJ_vpqVOnw:Y7ZudQzS-Bg:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=BTJ_vpqVOnw:Y7ZudQzS-Bg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=BTJ_vpqVOnw:Y7ZudQzS-Bg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=BTJ_vpqVOnw:Y7ZudQzS-Bg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=BTJ_vpqVOnw:Y7ZudQzS-Bg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=BTJ_vpqVOnw:Y7ZudQzS-Bg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/BTJ_vpqVOnw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/7184813203957551914/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=7184813203957551914" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/7184813203957551914?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/7184813203957551914?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/BTJ_vpqVOnw/how-to-propertyset-storage-toolkit-jira.html" title="HOW-TO: propertyset-storage-toolkit - Jira configuration data storage made easy" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2010/12/how-to-propertyset-storage-toolkit-jira.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ICSXk-cCp7ImA9Wx9REUw.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-194419764830611610</id><published>2010-12-12T01:52:00.000+02:00</published><updated>2010-12-12T01:52:48.758+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-12T01:52:48.758+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jira" /><category scheme="http://www.blogger.com/atom/ns#" term="plugin" /><category scheme="http://www.blogger.com/atom/ns#" term="property-set-storage" /><category scheme="http://www.blogger.com/atom/ns#" term="github" /><title>Announcement: propertyset-storage-toolkit plugin has been released</title><content type="html">&lt;span class="Apple-style-span" style="color: #222222; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px;"&gt;Hi folks,&lt;br style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" /&gt;&lt;br style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" /&gt;I assume many of you are Jira developers and I think I will express the overall feeling that configuration data storage in the Jira is a tricky moment many of you spent a lot of time on.&lt;br style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" /&gt;&lt;br style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" /&gt;&lt;a class="jive-link-external" href="https://github.com/leonardinius/propertyset-storage-toolkit" style="color: #003366; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;propertyset-storage-toolkit&lt;/a&gt;&amp;nbsp;- is plugin to rescue from boilerplate configuration data storage coding. The plugin itself is more like library for configuration data persistence and retrieval (and a sample application along to start rolling).&lt;br style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" /&gt;&lt;br style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" /&gt;Hopefully you will find it as useful as I do. The reason for me of creating one is - to help newcomers come on board the Jira Plugin Development process.&lt;br style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" /&gt;&lt;br style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" /&gt;This said, here theere are list of feature available:&lt;/span&gt;&lt;br /&gt;
&lt;ul class="jive-dash" style="margin-bottom: 0px; margin-left: 1.5em; margin-right: 0px; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Database persistence using PropertySet for underlying data storage&lt;/li&gt;
&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Has no additional JIRA dependencies and provides enhanced PropertySet API sub-set&lt;/li&gt;
&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Could be used both as JAR dependency bundled with your plugin OR as separate plugin, depending one your current needs.&lt;/li&gt;
&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Provides a rich set of out-of box list of Scope objects. (Scope defines the sandbox of the PropertySet storage instance). At the moment following configuration options are supported&lt;/li&gt;
&lt;/ul&gt;&lt;div class="jive-quote" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: url(http://forums.atlassian.com/images/quote-background-1.gif); background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(238, 238, 238); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 2px; border-right-color: rgb(238, 238, 238); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(238, 238, 238); border-top-style: solid; border-top-width: 1px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; font-style: italic; margin-bottom: 0.5em; margin-left: 2em; margin-right: 2em; margin-top: 1em; overflow-x: auto; overflow-y: auto; padding-bottom: 10px; padding-left: 1em; padding-right: 10px; padding-top: 10px;"&gt;&lt;br style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" /&gt;&lt;ul class="jive-dash" style="margin-bottom: 0px; margin-left: 1.5em; margin-right: 0px; margin-top: 0.5em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Named configuration scope (Example: My Gadget1 Configuration)&lt;/li&gt;
&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Action configuration scope (Example: your plugin may contain Administration action, which may require to persist and access administrator input).&lt;/li&gt;
&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Project configuration scope (Example: you may associate configuration information with project object)&lt;/li&gt;
&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Issue configuration scope (Example: you may associate configuration information with issue object)&lt;/li&gt;
&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;The list of scopes is not limited and you may come-up with your own Scope&lt;/li&gt;
&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Apache 2 license&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;br style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" /&gt;If you are interested to use, provide a feedback, review or any type of comments - you are always welcome to contribute.&lt;br style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" /&gt;&lt;a class="jive-link-external" href="https://github.com/leonardinius/propertyset-storage-toolkit/blob/master/README.md" style="color: #003366; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Readme&lt;/a&gt;&amp;nbsp;file is your place to start.&lt;br style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" /&gt;Hopefully with the help of you guys, will end-up with something really useful.&lt;br style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" /&gt;&lt;br style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" /&gt;PS&amp;gt; Really enjoyable and productive weekend at the end of the day&amp;nbsp;&lt;img alt=":)" border="0" class="jive-emoticon" src="http://forums.atlassian.com/images/emoticons/happy.gif" style="border-bottom-color: transparent; border-bottom-style: none; border-bottom-width: 0px; border-left-color: transparent; border-left-style: none; border-left-width: 0px; border-right-color: transparent; border-right-style: none; border-right-width: 0px; border-top-color: transparent; border-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-194419764830611610?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/i7kEmQXjejCVmBplp6ZQe9rSKRc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/i7kEmQXjejCVmBplp6ZQe9rSKRc/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/i7kEmQXjejCVmBplp6ZQe9rSKRc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/i7kEmQXjejCVmBplp6ZQe9rSKRc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=Owh8jYsa5Pg:iEytx6lH9F0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=Owh8jYsa5Pg:iEytx6lH9F0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=Owh8jYsa5Pg:iEytx6lH9F0:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=Owh8jYsa5Pg:iEytx6lH9F0:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=Owh8jYsa5Pg:iEytx6lH9F0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=Owh8jYsa5Pg:iEytx6lH9F0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=Owh8jYsa5Pg:iEytx6lH9F0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=Owh8jYsa5Pg:iEytx6lH9F0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=Owh8jYsa5Pg:iEytx6lH9F0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/Owh8jYsa5Pg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/194419764830611610/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=194419764830611610" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/194419764830611610?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/194419764830611610?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/Owh8jYsa5Pg/announcement-propertyset-storage.html" title="Announcement: propertyset-storage-toolkit plugin has been released" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2010/12/announcement-propertyset-storage.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MEQnkzeSp7ImA9WhZSFUw.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-8695324463011725834</id><published>2010-12-07T02:33:00.003+02:00</published><updated>2011-03-31T00:10:03.781+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-31T00:10:03.781+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jira" /><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="ui" /><category scheme="http://www.blogger.com/atom/ns#" term="atlassian" /><category scheme="http://www.blogger.com/atom/ns#" term="css" /><title>Jira - How to Include JSS and CSS resources on every page</title><content type="html">Hi all,&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;Disclaimer 1: The post and approach is 99% based on &lt;a href="https://studio.plugins.atlassian.com/wiki/display/JBHV/JIRA+Behaviours+Plugin"&gt;Jira&amp;nbsp;Behaviors&amp;nbsp;Plugin&lt;/a&gt;&amp;nbsp;source code.&lt;/blockquote&gt;&lt;blockquote&gt;Disclaimer 2: The approach described here should be considered a hack/workaround and does not inline with Atlassian Jira Plugin structture and maintainability.&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;Update: &lt;/b&gt;See the comments section. I would recommend better approach using Servlet Filter.&amp;nbsp;&lt;/blockquote&gt;You may find yourself requiring to either show/hide some part of Jira UI elements, or extend JIRA built-in edit/search capabilities. If it's custom field we are talking about - you might consider to implement Jira Custom Field (See &lt;a href="http://confluence.atlassian.com/display/JIRA/How+to+create+a+new+Custom+Field+Type#HowtocreateanewCustomFieldType-AQuickCustomFieldTypesPrimer"&gt;Quick Custom Field Types Primer&lt;/a&gt;&amp;nbsp;on render options and capabilities).&lt;br /&gt;
&lt;br /&gt;
For some other cases - like &lt;a href="http://blogs.onresolve.com/?author=3"&gt;Jamie Eclin&lt;/a&gt;&amp;nbsp;awesome Behaviors Plugin, or like in my example - hiding some always visible JIRA UI built-in &amp;nbsp;elements - you might consider different approach to implement. Your options basically are:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Hack and modify velocity/JSP file whatever does render the element in context. It even might be system level plugin - like system Issue operations. In some cases it might require JIRA instance restart and even re-compilation&amp;nbsp;and re-deployment. And thus we will increase&amp;nbsp;maintainability&amp;nbsp;technical debt a lot.&lt;/li&gt;
&lt;li&gt;We could manually configure&amp;nbsp;&lt;a href="http://confluence.atlassian.com/display/JIRA/Configuring+an+Announcement+Banner"&gt;Jira Announcement Banner&lt;/a&gt;&amp;nbsp;to include required resources on every page. Thus it will be one-time configuration option and it will be our responsibility to do so and maintain that piece of JSS/CSS snippet. In case our product consists of several plugins - we will endup with long list of configuration items + 1 more unrelated item - which is kind of implementation details only item. So, not so good afterwards (good enough for internal stuff, not so good for giving away).&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;So, after reconsidering those options - I've chosen the second one + basically the Jamie Eclin approach on Behaviors Plugin. The main reasons to do so were:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Not really a complete hack - could be implemented as valid Atlassian Plugin v2 plugin&lt;/li&gt;
&lt;li&gt;Could be automated - no additional configuration needed&lt;/li&gt;
&lt;li&gt;Source code for Behaviors Plugin is provided :)&lt;/li&gt;
&lt;li&gt;See pt 3.&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Implementation&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;1. Component&lt;/b&gt;&lt;br /&gt;
Simple interface with the only method - void setup(); Serves only as an entry point for resource injection during Jira startup procedure.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2. ComponentImpl&lt;/b&gt;&lt;br /&gt;
The actual component implementation. The purpose is to check whether Jira announcement banner already contains required JSS/CSS and it doesn't the inject them to the banner contents.&lt;br /&gt;
&lt;pre&gt;&lt;code class="java"&gt;
public class ComponentImpl implements Component, Startable {
    private static final String HIDE_CREATE_ISSUE_MARKER = "XYZ Plugin Marker - Do not modify!";
    private static final String CREATE_ISSUE_MARKER_START = "&amp;lt;!-- --Start--[" + HIDE_CREATE_ISSUE_MARKER + "]--Start--";
    private static final String CREATE_ISSUE_MARKER_END = "&amp;lt;!-- --End--[" + HIDE_CREATE_ISSUE_MARKER + "]--End-- --&amp;gt;";

    private final ApplicationProperties applicationProperties;

    public ComponentImpl(ApplicationProperties applicationProperties) {
        this.applicationProperties = applicationProperties;
    }

    @Override
    public void setup() throws RuntimeException {
        String alertHeader = applicationProperties.getDefaultBackedText(APKeys.JIRA_ALERT_HEADER);
        String injectedAlertHeader = installHideCreateIssue(alertHeader);
        if (!StringUtils.equals(alertHeader, injectedAlertHeader)) {
            applicationProperties.setText(APKeys.JIRA_ALERT_HEADER, injectedAlertHeader);
            //applicationProperties.setString(APKeys.JIRA_ALERT_HEADER_VISIBILITY, EditAnnouncementBanner.PUBLIC_BANNER);
        }
    }

    @Override
    public void start() throws Exception {
        setup();
    }

    
    private boolean isIncludesCreateIssueMarker(String input) {
        return StringUtils.contains(input, CREATE_ISSUE_MARKER_START)
                &amp;amp;&amp;amp; StringUtils.contains(input, CREATE_ISSUE_MARKER_END);
    }

    String getInjection(String comment, String cssDefinitions, String javascript) {
        StringBuilder injection = new StringBuilder(CREATE_ISSUE_MARKER_START).append(comment).append(" --&amp;gt;");

        if (StringUtils.isNotBlank(cssDefinitions)) {
            injection = injection.append("\n&amp;lt;style type=\"text/css\"&amp;gt;\n")
                    .append(prepareCleanInject(cssDefinitions))
                    .append("\n&amp;lt;/style&amp;gt;");
        }

        if (StringUtils.isNotBlank(javascript)) {
            injection = injection.append("\n&amp;lt;script type=\"text/javascript\"&amp;gt;\n")
                    .append(prepareCleanInject(javascript))
                    .append("\n&amp;lt;/script&amp;gt;");
        }

        injection = injection.append(CREATE_ISSUE_MARKER_END);

        return injection.toString();
    }

    public String installHideCreateIssue(String alertHeader) throws RuntimeException {
        if (!isIncludesCreateIssueMarker(alertHeader)) {
            alertHeader = new StringBuilder()
                    // PROOF OF concept Items - it really should be done with Permission Schemes, not this hacky way
                    .append(getInjection("", "div#create-issue, div#createItem, ul#opsbar-edit li a#editIssue { display : none; }", ""))

                    .append("\n")
                    .append(StringUtils.defaultString(alertHeader)).toString();
        }

        return alertHeader;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;3. atlassian-plugin.xml snippet&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Component and ComponentImpl registration snippet&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code class="xml"&gt;
&amp;lt;component key="myJSSCSSInjectionSnippet" name="My CSS/JSS injection snippet"
    class="com.xyz.ComponentImpl"&amp;gt;
    &amp;lt;interface&amp;gt;com.xyz.Component&amp;lt;/interface&amp;gt;
&amp;lt;/component&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
and Voile, we are done :)&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-8695324463011725834?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HoxwUrr5U-b1-rolf-EmnL6eybc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HoxwUrr5U-b1-rolf-EmnL6eybc/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/HoxwUrr5U-b1-rolf-EmnL6eybc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HoxwUrr5U-b1-rolf-EmnL6eybc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=TJ6PCWOXI8Q:np07BQScu2c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=TJ6PCWOXI8Q:np07BQScu2c:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=TJ6PCWOXI8Q:np07BQScu2c:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=TJ6PCWOXI8Q:np07BQScu2c:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=TJ6PCWOXI8Q:np07BQScu2c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=TJ6PCWOXI8Q:np07BQScu2c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=TJ6PCWOXI8Q:np07BQScu2c:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=TJ6PCWOXI8Q:np07BQScu2c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=TJ6PCWOXI8Q:np07BQScu2c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/TJ6PCWOXI8Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/8695324463011725834/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=8695324463011725834" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/8695324463011725834?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/8695324463011725834?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/TJ6PCWOXI8Q/jira-how-to-include-jss-and-css.html" title="Jira - How to Include JSS and CSS resources on every page" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><thr:total>3</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2010/12/jira-how-to-include-jss-and-css.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4BQnw4fyp7ImA9Wx9bE0w.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-3915184955199936163</id><published>2010-12-07T01:53:00.006+02:00</published><updated>2011-02-21T19:55:53.237+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-21T19:55:53.237+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="highlight" /><title>My source code highlight updates - blogger.com</title><content type="html">Hi everyone,&lt;br /&gt;
&lt;br /&gt;
After updating my template I noticed that I have JS source code highlighting broken.&lt;br /&gt;
What do do - setup once again :)&lt;br /&gt;
&lt;br /&gt;
So,m after a little research I found one I liked the most - &lt;a href="http://softwaremaniacs.org/soft/highlight/en/"&gt;Highlight.js&lt;/a&gt; - See &lt;a href="http://softwaremaniacs.org/media/soft/highlight/test.html"&gt;Demo Page&lt;/a&gt;.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;So, step by step instruction on putting this in Your blog:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Go To &lt;u&gt;&lt;i&gt;Design&lt;/i&gt;&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;Goto &lt;u&gt;&lt;i&gt;Edit HTML&lt;/i&gt;&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&amp;lt;/head&amp;gt; tag&lt;/li&gt;
&lt;li&gt;Place the code just before the closing &amp;lt;/head&amp;gt; tag&lt;br /&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;script src='http://yandex.st/highlightjs/5.16/highlight.min.js'/&amp;gt;
&amp;lt;link href='http://yandex.st/highlightjs/5.16/styles/school_book.min.css'
           rel='stylesheet'/&amp;gt;

&amp;lt;script language='javascript'&amp;gt;
hljs.tabReplace = &amp;amp;quot;    &amp;amp;quot;;
hljs.initHighlightingOnLoad();
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Save the template - the result you mas see above. Note: put you code in &amp;lt;pre&amp;gt;&amp;lt;code class="html"&amp;gt; tags (or whatsever is your language name)&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-3915184955199936163?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qCkLKYoc40cS8nrmjlIeOYZ5MZA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qCkLKYoc40cS8nrmjlIeOYZ5MZA/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/qCkLKYoc40cS8nrmjlIeOYZ5MZA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qCkLKYoc40cS8nrmjlIeOYZ5MZA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=V03APZn52o4:pqJuWdn1D8g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=V03APZn52o4:pqJuWdn1D8g:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=V03APZn52o4:pqJuWdn1D8g:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=V03APZn52o4:pqJuWdn1D8g:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=V03APZn52o4:pqJuWdn1D8g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=V03APZn52o4:pqJuWdn1D8g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=V03APZn52o4:pqJuWdn1D8g:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=V03APZn52o4:pqJuWdn1D8g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=V03APZn52o4:pqJuWdn1D8g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/V03APZn52o4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/3915184955199936163/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=3915184955199936163" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/3915184955199936163?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/3915184955199936163?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/V03APZn52o4/my-source-code-highlight-updates.html" title="My source code highlight updates - blogger.com" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2010/12/my-source-code-highlight-updates.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8NSHo9fyp7ImA9Wx9SFko.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-8935263827424133077</id><published>2010-11-10T14:15:00.020+02:00</published><updated>2010-12-07T01:41:39.467+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-07T01:41:39.467+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tip" /><category scheme="http://www.blogger.com/atom/ns#" term="maven" /><category scheme="http://www.blogger.com/atom/ns#" term="atlassian" /><category scheme="http://www.blogger.com/atom/ns#" term="proxy" /><title>Atlassian Plugin SDK / maven proxy issues</title><content type="html">Recent problem: maven repositories on https behind proxy.&lt;br /&gt;&lt;pre&gt;&lt;code class="xml"&gt;&lt;br /&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;proxy&amp;gt;&lt;br /&gt;    &amp;lt;id&amp;gt;http.XXX.global&amp;lt;/id&amp;gt;&lt;br /&gt;    &amp;lt;active&amp;gt;true&amp;lt;/active&amp;gt;&lt;br /&gt;    &amp;lt;protocol&amp;gt;http&amp;lt;/protocol&amp;gt;&lt;br /&gt;    &amp;lt;host&amp;gt;XXXt&amp;lt;/host&amp;gt;&lt;br /&gt;    &amp;lt;port&amp;gt;8080&amp;lt;/port&amp;gt;&lt;br /&gt;    &amp;lt;nonproxyhosts&amp;gt;localhost|127.0.*.*|191.168.*.*&amp;lt;/nonproxyhosts&amp;gt;&lt;br /&gt;&amp;lt;/proxy&amp;gt;   &lt;br /&gt; &amp;lt;proxy&amp;gt;&lt;br /&gt;&amp;lt;id&amp;gt;https.XXX.global&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;lt;active&amp;gt;true&amp;lt;/active&amp;gt;&lt;br /&gt;&amp;lt;protocol&amp;gt;https&amp;lt;/protocol&amp;gt;&lt;br /&gt;&amp;lt;host&amp;gt;XXXt&amp;lt;/host&amp;gt;&lt;br /&gt;&amp;lt;port&amp;gt;8080&amp;lt;/port&amp;gt;&lt;br /&gt;&amp;lt;nonproxyhosts&amp;gt;localhost|127.0.*.*|191.168.*.*&amp;lt;/nonproxyhosts&amp;gt;&lt;br /&gt;&amp;lt;/proxy&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;and it failed until I switched http proxy of (set active to false)&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-8935263827424133077?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rWcgFMTxzRrGmd2uatsfXBsrYbE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rWcgFMTxzRrGmd2uatsfXBsrYbE/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/rWcgFMTxzRrGmd2uatsfXBsrYbE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rWcgFMTxzRrGmd2uatsfXBsrYbE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CG6dMkhz-o4:U7M597pvi-A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CG6dMkhz-o4:U7M597pvi-A:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CG6dMkhz-o4:U7M597pvi-A:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=CG6dMkhz-o4:U7M597pvi-A:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CG6dMkhz-o4:U7M597pvi-A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=CG6dMkhz-o4:U7M597pvi-A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CG6dMkhz-o4:U7M597pvi-A:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=CG6dMkhz-o4:U7M597pvi-A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=CG6dMkhz-o4:U7M597pvi-A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/CG6dMkhz-o4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/8935263827424133077/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=8935263827424133077" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/8935263827424133077?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/8935263827424133077?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/CG6dMkhz-o4/atlassian-plugin-sdk-maven-proxy-issues.html" title="Atlassian Plugin SDK / maven proxy issues" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2010/11/atlassian-plugin-sdk-maven-proxy-issues.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQGQXo7eyp7ImA9WxNWFko.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-3923129877069332650</id><published>2009-10-16T02:27:00.016+03:00</published><updated>2009-10-16T08:52:00.403+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-16T08:52:00.403+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="test_approach" /><category scheme="http://www.blogger.com/atom/ns#" term="unit_test" /><category scheme="http://www.blogger.com/atom/ns#" term="test" /><title>Unit tests, What they should be like? (2)</title><content type="html">&lt;b&gt;My humble opinion only&lt;/b&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;u&gt;&lt;i&gt;Every test should be story (scenario) test&lt;/i&gt;&lt;/u&gt;. &lt;/li&gt;&lt;/ul&gt;It could either be User story (&lt;i&gt;user logins in, does A, soes B)&lt;/i&gt;, Engineering story (&lt;i&gt;the application developer will create component A, pass in reference for component B, will invoke #xxx(), #yyy() in turn and will await for something&lt;/i&gt;). It doesn't mean, it couldn't test just like one function, ore just one invocation. It's about check separation to different coherent &lt;i&gt;scenarios&lt;/i&gt;.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;u&gt;&lt;i&gt;Tests should not calculate.&lt;/i&gt;&lt;/u&gt;&lt;/li&gt;&lt;/ul&gt;Test logics is logics too. It easily becomes clumsy, buggy and all the stuff like that. It should be supported too. &lt;/div&gt;&lt;div&gt;&lt;i&gt;a) If one (wrong!) application logics value equals to some other (wrong too!) value it doesn't mean the test is true (false positive) . &lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;b) the efforts to support tests should be minimized&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;c) tests should be readable. assertEquals("concrete-value", calculate()) is the way more readable than &lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;assertEquals(calculateA(calculateB()), calculateC(calculateD())) .&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;&lt;u&gt;Tests should be as readable as they could be.&lt;/u&gt;&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;In my opinion &lt;/span&gt;&lt;span class="Apple-style-span"&gt;automated tests&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt; could be considered as separate maintenance project. Test code is  not throwaway code, otherwise it could be 1 time successfully executed and safely removed. &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;Test code is  the most fragile part of the application, but it needs hands-on all the time. The developers tend to write unreadable test code and when, obviously, don't want to spend lot's of time maintaining it. As a result, tests stories degrade over the time and become useless at some point (&lt;/span&gt;&lt;span class="Apple-style-span"&gt;no one knows for sure that the hell does this story test check...).&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt; So, the more readable the test would be, the more time it would take to degrade to such as state&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;.&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;&lt;u&gt;Monogamy&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/u&gt;&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;Testcase, test story (continue this sequence on your own) should stick to one particular component, one particular User/Usage Use Case (UUC) and should not influence or gets influnced by any other subsystems, logics, components, whatever. The test should create Well Known, Hardcode, As Small as Possible sexy &lt;u&gt;&lt;i&gt;&lt;b&gt;Universe&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;  and marry and have children with her.&lt;/div&gt;&lt;div&gt;a) Well-known (see &lt;i&gt;Don't calculate; Readable&lt;/i&gt;)&lt;/div&gt;&lt;div&gt;b) Hardcode (see &lt;i&gt;Don't calculate; Readable&lt;/i&gt;)&lt;/div&gt;&lt;div&gt;&lt;i&gt;c) Universe &lt;/i&gt;(&lt;i&gt;all the space, objects as needed&lt;/i&gt;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As the result, no &lt;u&gt;&lt;i&gt;affairs&lt;/i&gt;&lt;/u&gt; are allowed. If TestA testCase fails, only &lt;i&gt;A&lt;/i&gt; should be blamed. No chances of getting children with &lt;i&gt;B&lt;/i&gt; should be allowed. If test scenario (story) testScenarioA fails, there shouldn't be option for testScenarionB to be blamed. Doing so, we will easily find the root cause and understand the possible impact on both the application and business behind it. &lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;u&gt;&lt;i&gt;Tests should fail&lt;/i&gt;&lt;/u&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;See &lt;i&gt;Readable&lt;/i&gt;. If the test will not ever fail, that is the reason for keeping it? It will never fail anyway (run once and purge from your eyes away). The test should test&lt;/div&gt;&lt;div&gt;a) will probably fail someday (or we do change this component a lot and rely on it tightly)&lt;/div&gt;&lt;div&gt;b) something having high value (business probably) we want to have a eye on it. No one likes receiving urgent emails, night calls or working Sundays' eves. &lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;u&gt;&lt;i&gt;Test "stories" should be as minimal as possible, without any any additional assumptions (temporally true).&lt;/i&gt;&lt;/u&gt;&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;a) The smaller the "story" (the code) is the less maintenance effort will be required.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;b) Test developer should not add any non-business/non specified assumptions into unit tests. Consider this, POJO_A contains #toString() method delegating to Object#toString(). The test developer might considering to add additional assumption that #toString () would return a string with '@' character. Since this is not a requirement at all, at some point we might considering to provide some meaningful (business point of view) implementation. Thus we will not only to write new xUnit tests, but will also spend some effort due to previous assumptions maintenance (those in this particular cases could be omitted).&lt;/i&gt;&lt;/div&gt;&lt;div&gt;If for some reason the test story / test setup is unreasonable big (&lt;i&gt;put your threshold here&lt;/i&gt;) you might consider refactoring, or starting from some point - complete rewrite of this particular application logics/or test part. It's like a doorbell, jing, the application code will rot soon.&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;Will reread this twice and continue the listing.. Someday :)&lt;/div&gt;&lt;div&gt;&lt;i&gt; &lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-3923129877069332650?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_XfzfzTuEROW3Lu34CmeSJBA9gA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_XfzfzTuEROW3Lu34CmeSJBA9gA/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/_XfzfzTuEROW3Lu34CmeSJBA9gA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_XfzfzTuEROW3Lu34CmeSJBA9gA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=QrSEY-6Xmi0:ZDGIK32k08Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=QrSEY-6Xmi0:ZDGIK32k08Y:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=QrSEY-6Xmi0:ZDGIK32k08Y:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=QrSEY-6Xmi0:ZDGIK32k08Y:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=QrSEY-6Xmi0:ZDGIK32k08Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=QrSEY-6Xmi0:ZDGIK32k08Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=QrSEY-6Xmi0:ZDGIK32k08Y:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=QrSEY-6Xmi0:ZDGIK32k08Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=QrSEY-6Xmi0:ZDGIK32k08Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/QrSEY-6Xmi0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/3923129877069332650/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=3923129877069332650" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/3923129877069332650?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/3923129877069332650?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/QrSEY-6Xmi0/xunit-tests-what-they-should-be-like-2.html" title="Unit tests, What they should be like? (2)" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><thr:total>1</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2009/10/xunit-tests-what-they-should-be-like-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04BQHc8fip7ImA9Wx9bE00.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-5286246627920099822</id><published>2009-10-16T02:07:00.008+03:00</published><updated>2011-02-21T19:39:11.976+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-21T19:39:11.976+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="unit_test" /><category scheme="http://www.blogger.com/atom/ns#" term="pros" /><category scheme="http://www.blogger.com/atom/ns#" term="test" /><title>Automated Tests, Unit tests, Pros (1)</title><content type="html">&lt;div&gt;&lt;b&gt;My humble opinion only&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;u&gt;&lt;i&gt;Improves design.&lt;/i&gt;&lt;/u&gt;&lt;/li&gt;&lt;/ul&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt; At least +1 client, decoupling from the Application.main([]) method.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;u&gt;&lt;i&gt;Regression tests, cost of running them VS cost of manual retesting.&lt;/i&gt;&lt;/u&gt;&lt;/li&gt;&lt;li&gt;&lt;u&gt;&lt;i&gt;Difficult to test by mortal hand areas&lt;/i&gt;&lt;/u&gt; &lt;/li&gt;&lt;/ul&gt;(multi-threading issues, timing, DB connectivity loses). As extra point, the cost of such hand-made tests are extremely high and won't disappear on 2nd/3rd/... run. &lt;i&gt;_Not my opinion, but I share this point of view_&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;u&gt;&lt;i&gt;Easier to explore internal (unclear from user point's of view) Grey Areas or Unpredictability Corners (more commonly known as old plain Boundary Values).&lt;/i&gt;&lt;/u&gt; &lt;/li&gt;&lt;/ul&gt;It's not always clear from User Story or User Interface that the boundary values would be, or other subsystem boundary values influence on this particular component. Or the boundary value application will eventually hit is very-hard to prepare by mortal hand. For example  tester should repeat Long.MAX_VALUE operations to hit this one.&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-5286246627920099822?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eAH1BbNey2xI09mDhSoxWzE2gAY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eAH1BbNey2xI09mDhSoxWzE2gAY/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/eAH1BbNey2xI09mDhSoxWzE2gAY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eAH1BbNey2xI09mDhSoxWzE2gAY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=qTDsoV9reBM:h6KBrK5zLmw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=qTDsoV9reBM:h6KBrK5zLmw:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=qTDsoV9reBM:h6KBrK5zLmw:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=qTDsoV9reBM:h6KBrK5zLmw:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=qTDsoV9reBM:h6KBrK5zLmw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=qTDsoV9reBM:h6KBrK5zLmw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=qTDsoV9reBM:h6KBrK5zLmw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=qTDsoV9reBM:h6KBrK5zLmw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=qTDsoV9reBM:h6KBrK5zLmw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/qTDsoV9reBM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/5286246627920099822/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=5286246627920099822" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/5286246627920099822?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/5286246627920099822?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/qTDsoV9reBM/automated-tests-xunit-pros-1.html" title="Automated Tests, Unit tests, Pros (1)" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2009/10/automated-tests-xunit-pros-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08NQ38zeSp7ImA9Wx9bE00.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-5192615248661080483</id><published>2008-12-16T09:25:00.004+02:00</published><updated>2011-02-21T19:38:12.181+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-21T19:38:12.181+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><title>Anti-Plag API design</title><content type="html">Trying to get some hours of spare time to make a API  design to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;index documents&lt;/li&gt;&lt;li&gt;remove document from the index&lt;/li&gt;&lt;li&gt;Query document&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Requirements&amp;amp;Considerations: &lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;API should be domain problem agnostic&lt;/li&gt;&lt;li&gt;It's not worth trying to left Lucene behind the scene (I mean hide it).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;!!!! &lt;a href="http://xtf.wiki.sourceforge.net/programming_Faceted_Browsing"&gt;XFT&lt;/a&gt; is another TaxonomyOverLucene framework with structural document processing features ( See &lt;a href="http://www.marktwainproject.org/xtf/search?category=letters;style=mtp;facet-written="&gt;demo&lt;/a&gt;). Worth to investigate it a little.&lt;br /&gt;&lt;br /&gt;I will post API extracts to make some kind of the public plasce to judge it :)))))))))))&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-5192615248661080483?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VCbsVZb-qsYeANRStjlz1en6Prg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VCbsVZb-qsYeANRStjlz1en6Prg/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/VCbsVZb-qsYeANRStjlz1en6Prg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VCbsVZb-qsYeANRStjlz1en6Prg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=hi8QJxZrU4Y:RY0hIjG5Raw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=hi8QJxZrU4Y:RY0hIjG5Raw:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=hi8QJxZrU4Y:RY0hIjG5Raw:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=hi8QJxZrU4Y:RY0hIjG5Raw:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=hi8QJxZrU4Y:RY0hIjG5Raw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=hi8QJxZrU4Y:RY0hIjG5Raw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=hi8QJxZrU4Y:RY0hIjG5Raw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=hi8QJxZrU4Y:RY0hIjG5Raw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=hi8QJxZrU4Y:RY0hIjG5Raw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/hi8QJxZrU4Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/5192615248661080483/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=5192615248661080483" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/5192615248661080483?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/5192615248661080483?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/hi8QJxZrU4Y/api-design.html" title="Anti-Plag API design" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2008/12/api-design.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08DRXk9fCp7ImA9Wx9bE00.&quot;"><id>tag:blogger.com,1999:blog-8155687522109037173.post-2923329051451705426</id><published>2008-12-03T03:38:00.001+02:00</published><updated>2011-02-21T19:37:54.764+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-21T19:37:54.764+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mockup" /><title>Antiplagiarism mockup session continued</title><content type="html">Mockup session continued. Mockups were published &lt;a href="http://code.google.com/p/anti-plagiarism-academic/wiki/Mockups"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Preview:&lt;br /&gt;
&lt;table style="width: auto;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/c0j5_WYD52Y3KpHhHbQnDQ?authkey=1Mhg0pFm1TI"&gt;&lt;img src="http://lh3.ggpht.com/_Y9XTlNGJRTQ/STXUW9GKRMI/AAAAAAAACYo/QlzBP6SKufg/s288/Topic%20Search%20Results.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From &lt;a href="http://picasaweb.google.com/leonidms/DropBox?authkey=1Mhg0pFm1TI"&gt;Drop Box&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;table style="width: auto;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/puetG7h1iQswItcsvwPCpg?authkey=1Mhg0pFm1TI"&gt;&lt;img src="http://lh3.ggpht.com/_Y9XTlNGJRTQ/STXicYmcVjI/AAAAAAAACa0/sgLmk4JjUyk/s288/Anonymous%20Search_2.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="font-family: arial,sans-serif; font-size: 11px; text-align: right;"&gt;From &lt;a href="http://picasaweb.google.com/leonidms/DropBox?authkey=1Mhg0pFm1TI"&gt;Drop Box&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Design was done in the wonderful &lt;a href="http://www.balsamiq.com/"&gt;Balsamiq Studo&lt;/a&gt;, which is completely free for OSS projects as mentioned &lt;a href="http://www.balsamiq.com/products/mockups/desktop"&gt;here&lt;/a&gt;. This is really a superior tool to draw mockups. Thank Balsamiq Studio.&lt;br /&gt;
&lt;br /&gt;
Mockup files:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&amp;nbsp;&lt;a href="http://www.box.net/shared/8becemc4c4"&gt;Anonymous search&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.box.net/shared/8vho74k3vk"&gt;Topic Search&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Visit &lt;a href="http://leonardinius.galeoconsulting.com/"&gt;coding paradigm: line by line&lt;/a&gt; to find more...&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8155687522109037173-2923329051451705426?l=leonardinius.galeoconsulting.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VJfUXJjL9pnnORDMgCPrnJ1_R_8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VJfUXJjL9pnnORDMgCPrnJ1_R_8/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/VJfUXJjL9pnnORDMgCPrnJ1_R_8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VJfUXJjL9pnnORDMgCPrnJ1_R_8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=b078G8EPRcg:NlgjMKUQ_FM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=b078G8EPRcg:NlgjMKUQ_FM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=b078G8EPRcg:NlgjMKUQ_FM:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=b078G8EPRcg:NlgjMKUQ_FM:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=b078G8EPRcg:NlgjMKUQ_FM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=b078G8EPRcg:NlgjMKUQ_FM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=b078G8EPRcg:NlgjMKUQ_FM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?a=b078G8EPRcg:NlgjMKUQ_FM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodingParadigmLineByLine?i=b078G8EPRcg:NlgjMKUQ_FM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingParadigmLineByLine/~4/b078G8EPRcg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://leonardinius.galeoconsulting.com/feeds/2923329051451705426/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8155687522109037173&amp;postID=2923329051451705426" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/2923329051451705426?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8155687522109037173/posts/default/2923329051451705426?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodingParadigmLineByLine/~3/b078G8EPRcg/antiplagiarism-mockup-session-continued.html" title="Antiplagiarism mockup session continued" /><author><name>Leonid</name><uri>http://www.blogger.com/profile/00010464386345266104</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_Y9XTlNGJRTQ/TNrPFs91aiI/AAAAAAAAEDs/OlCI804RRWA/S220/AIbEiAIAAABECIzPmuO_17i9vAEiC3ZjYXJkX3Bob3RvKig2YzliOWZiNmY4YWQ5Njc4YjBiOTU5MjMzODhhMzE0ZmU1ZjFlYjkwMAHvITM0fTDYH3dIkm7IHZF6uaZNXA.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_Y9XTlNGJRTQ/STXUW9GKRMI/AAAAAAAACYo/QlzBP6SKufg/s72-c/Topic%20Search%20Results.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://leonardinius.galeoconsulting.com/2008/12/antiplagiarism-mockup-session-continued.html</feedburner:origLink></entry></feed>

